Eli Zaretskii's DOSish file name patches.
This commit is contained in:
parent
010c70e10f
commit
5af11cab92
31 changed files with 692 additions and 616 deletions
|
@ -1,3 +1,22 @@
|
|||
2000-05-26 Alan Modra <alan@linuxcare.com.au>
|
||||
|
||||
* sysdep.h (gettext, dgettext, dcgettext, textdomain,
|
||||
bindtextdomain): Replace defines with those from intl/libgettext.h
|
||||
to quieten gcc warnings.
|
||||
|
||||
2000-05-26 Eli Zaretskii <eliz@is.elta.co.il>
|
||||
|
||||
* aoutx.h (find_nearest_line): Use IS_ABSOLUTE_PATH.
|
||||
|
||||
* archive.c (normalize, bfd_bsd_truncate_arname,
|
||||
bfd_gnu_truncate_arname) [HAVE_DOS_BASED_FILE_SYSTEM]: Support
|
||||
file names with backslashes.
|
||||
|
||||
* cache.c (bfd_open_file) [__MSDOS__]: Don't unlink the file
|
||||
before opening it.
|
||||
|
||||
* sysdep.h: Include filenames.h.
|
||||
|
||||
2000-05-26 Alan Modra <alan@linuxcare.com.au>
|
||||
|
||||
* opncls.c (bfd_close_all_done): Mask file perms with 0777 not 0x777.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* BFD semi-generic back-end for a.out binaries.
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||
Free Software Foundation, Inc.
|
||||
Written by Cygnus Support.
|
||||
|
||||
|
@ -2833,7 +2833,7 @@ NAME(aout,find_nearest_line)
|
|||
}
|
||||
|
||||
if (main_file_name == NULL
|
||||
|| main_file_name[0] == '/'
|
||||
|| IS_ABSOLUTE_PATH (main_file_name)
|
||||
|| directory_name == NULL)
|
||||
filelen = 0;
|
||||
else
|
||||
|
@ -2857,7 +2857,7 @@ NAME(aout,find_nearest_line)
|
|||
|
||||
if (main_file_name != NULL)
|
||||
{
|
||||
if (main_file_name[0] == '/' || directory_name == NULL)
|
||||
if (IS_ABSOLUTE_PATH (main_file_name) || directory_name == NULL)
|
||||
*filename_ptr = main_file_name;
|
||||
else
|
||||
{
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* BFD back-end for archive files (libraries).
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||
Free Software Foundation, Inc.
|
||||
Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault.
|
||||
|
||||
|
@ -1183,6 +1183,17 @@ normalize (abfd, file)
|
|||
{
|
||||
const char *filename = strrchr (file, '/');
|
||||
|
||||
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
{
|
||||
/* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
|
||||
char *bslash = strrchr (file, '\\');
|
||||
if (bslash > filename)
|
||||
filename = bslash;
|
||||
if (filename == NULL && file[0] != '\0' && file[1] == ':')
|
||||
filename = file + 1;
|
||||
}
|
||||
#endif
|
||||
if (filename != (char *) NULL)
|
||||
filename++;
|
||||
else
|
||||
|
@ -1566,6 +1577,17 @@ bfd_bsd_truncate_arname (abfd, pathname, arhdr)
|
|||
CONST char *filename = strrchr (pathname, '/');
|
||||
int maxlen = ar_maxnamelen (abfd);
|
||||
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
{
|
||||
/* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
|
||||
char *bslash = strrchr (pathname, '\\');
|
||||
if (bslash > filename)
|
||||
filename = bslash;
|
||||
if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':')
|
||||
filename = pathname + 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (filename == NULL)
|
||||
filename = pathname;
|
||||
else
|
||||
|
@ -1606,6 +1628,17 @@ bfd_gnu_truncate_arname (abfd, pathname, arhdr)
|
|||
CONST char *filename = strrchr (pathname, '/');
|
||||
int maxlen = ar_maxnamelen (abfd);
|
||||
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
{
|
||||
/* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
|
||||
char *bslash = strrchr (pathname, '\\');
|
||||
if (bslash > filename)
|
||||
filename = bslash;
|
||||
if (filename == NULL && pathname[0] != '\0' && pathname[1] == ':')
|
||||
filename = pathname + 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (filename == NULL)
|
||||
filename = pathname;
|
||||
else
|
||||
|
|
10
bfd/cache.c
10
bfd/cache.c
|
@ -1,5 +1,6 @@
|
|||
/* BFD library -- caching of file descriptors.
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 1996, 2000
|
||||
Free Software Foundation, Inc.
|
||||
Hacked by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
|
@ -300,10 +301,17 @@ bfd_open_file (abfd)
|
|||
|
||||
So we unlink the output file if and only if it has
|
||||
non-zero size. */
|
||||
#ifndef __MSDOS__
|
||||
/* Don't do this for MSDOS: it doesn't care about overwriting
|
||||
a running binary, but if this file is already open by
|
||||
another BFD, we will be in deep trouble if we delete an
|
||||
open file. In fact, objdump does just that if invoked with
|
||||
the --info option. */
|
||||
struct stat s;
|
||||
|
||||
if (stat (abfd->filename, &s) == 0 && s.st_size != 0)
|
||||
unlink (abfd->filename);
|
||||
#endif
|
||||
abfd->iostream = (PTR) fopen (abfd->filename, FOPEN_WB);
|
||||
abfd->opened_once = true;
|
||||
}
|
||||
|
|
19
bfd/sysdep.h
19
bfd/sysdep.h
|
@ -1,5 +1,5 @@
|
|||
/* sysdep.h -- handle host dependencies for the BFD library
|
||||
Copyright 1995, 96, 97, 98, 1999 Free Software Foundation, Inc.
|
||||
Copyright 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
|
||||
Written by Cygnus Support.
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
|
@ -102,6 +102,8 @@ extern char *strrchr ();
|
|||
#define SEEK_CUR 1
|
||||
#endif
|
||||
|
||||
#include "filenames.h"
|
||||
|
||||
#ifdef NEED_DECLARATION_STRSTR
|
||||
extern char *strstr ();
|
||||
#endif
|
||||
|
@ -131,14 +133,13 @@ extern char *getenv ();
|
|||
#define N_(String) (String)
|
||||
#endif
|
||||
#else
|
||||
/* Stubs that do something close enough. */
|
||||
#define textdomain(String) (String)
|
||||
#define gettext(String) (String)
|
||||
#define dgettext(Domain,Message) (Message)
|
||||
#define dcgettext(Domain,Message,Type) (Message)
|
||||
#define bindtextdomain(Domain,Directory) (Domain)
|
||||
#define _(String) (String)
|
||||
#define N_(String) (String)
|
||||
# define gettext(Msgid) (Msgid)
|
||||
# define dgettext(Domainname, Msgid) (Msgid)
|
||||
# define dcgettext(Domainname, Msgid, Category) (Msgid)
|
||||
# define textdomain(Domainname) while (0) /* nothing */
|
||||
# define bindtextdomain(Domainname, Dirname) while (0) /* nothing */
|
||||
# define _(String) (String)
|
||||
# define N_(String) (String)
|
||||
#endif
|
||||
|
||||
#endif /* ! defined (BFD_SYSDEP_H) */
|
||||
|
|
|
@ -1,3 +1,42 @@
|
|||
2000-05-26 Eli Zaretskii <eliz@is.elta.co.il>
|
||||
|
||||
* ar.c: Include filenames.h.
|
||||
(normalize) [HAVE_DOS_BASED_FILE_SYSTEM]: Support backslashes
|
||||
and drive letters in file names.
|
||||
(main): Support backslashes and drive letters in argv[0]. Drop
|
||||
the .exe suffix, if any, in argv[0] if is_ranlib is negative. Use
|
||||
FILENAME_CMP instead of strcmp to compare file names.
|
||||
(open_inarch) [__GO32__]: Don't ifdef errno != ENOENT test for
|
||||
DJGPP v2.
|
||||
(do_quick_append) [__GO32__]: Ditto.
|
||||
(get_pos_bfd, delete_members, move_members, replace_members):
|
||||
Compare file names with FILENAME_CMP.
|
||||
|
||||
* bucomm.c: Include filenames.h.
|
||||
(make_tempname) [HAVE_DOS_BASED_FILE_SYSTEM]: Support mixed
|
||||
forward/backward slashes and drive letters in file names.
|
||||
|
||||
* ieee.c (ieee_start_compilation_unit, ieee_add_bb11): Support
|
||||
mixed forward/backward slashes and drive letters in file names.
|
||||
|
||||
* strings.c (O_BINARY, setmode, SET_BINARY): Define.
|
||||
(main) [SET_BINARY]: Use SET_BINARY to switch stdin into binary
|
||||
mode.
|
||||
|
||||
* objcopy.c: Include filenames.h.
|
||||
(main) [HAVE_DOS_BASED_FILE_SYSTEM]: Drop the .exe suffix
|
||||
before comparing to "strip".
|
||||
Use FILENAME_CMP to compare file names.
|
||||
|
||||
* arsup.c: Include filenames.h.
|
||||
(map_over_list, ar_delete, ar_replace, ar_extract): Use
|
||||
FILENAME_CMP to compare file names.
|
||||
(ar_open): Prepend "tmp-" instead of appending "-tmp", to create
|
||||
the temporary file name.
|
||||
|
||||
* configure.in: Check for setmode.
|
||||
* configure: Regenerate.
|
||||
|
||||
2000-05-24 Alan Modra <alan@linuxcare.com.au>
|
||||
|
||||
* objdump.c (display_target_list): Close the bfd.
|
||||
|
|
|
@ -32,6 +32,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
#include "aout/ar.h"
|
||||
#include "libbfd.h"
|
||||
#include "arsup.h"
|
||||
#include "filenames.h"
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifdef __GO32___
|
||||
|
@ -215,7 +216,7 @@ map_over_members (arch, function, files, count)
|
|||
bfd_stat_arch_elt (head, &buf);
|
||||
}
|
||||
if ((head->filename != NULL) &&
|
||||
(!strcmp (normalize (*files, arch), head->filename)))
|
||||
(!FILENAME_CMP (normalize (*files, arch), head->filename)))
|
||||
{
|
||||
++match_count;
|
||||
if (counted_name_mode
|
||||
|
@ -302,6 +303,16 @@ normalize (file, abfd)
|
|||
return file;
|
||||
|
||||
filename = strrchr (file, '/');
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
{
|
||||
/* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
|
||||
char *bslash = strrchr (file, '\\');
|
||||
if (bslash > filename)
|
||||
filename = bslash;
|
||||
if (filename == NULL && file[0] != '\0' && file[1] == ':')
|
||||
filename = file + 1;
|
||||
}
|
||||
#endif
|
||||
if (filename != (char *) NULL)
|
||||
filename++;
|
||||
else
|
||||
|
@ -377,12 +388,22 @@ main (argc, argv)
|
|||
char *temp;
|
||||
|
||||
temp = strrchr (program_name, '/');
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
{
|
||||
/* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
|
||||
char *bslash = strrchr (program_name, '\\');
|
||||
if (bslash > temp)
|
||||
temp = bslash;
|
||||
if (temp == NULL && program_name[0] != '\0' && program_name[1] == ':')
|
||||
temp = program_name + 1;
|
||||
}
|
||||
#endif
|
||||
if (temp == NULL)
|
||||
temp = program_name;
|
||||
else
|
||||
++temp;
|
||||
if (strlen (temp) >= 6
|
||||
&& strcmp (temp + strlen (temp) - 6, "ranlib") == 0)
|
||||
&& FILENAME_CMP (temp + strlen (temp) - 6, "ranlib") == 0)
|
||||
is_ranlib = 1;
|
||||
else
|
||||
is_ranlib = 0;
|
||||
|
@ -697,12 +718,15 @@ open_inarch (archive_filename, file)
|
|||
|
||||
if (stat (archive_filename, &sbuf) != 0)
|
||||
{
|
||||
#ifndef __GO32__
|
||||
#if !defined(__GO32__) || defined(__DJGPP__)
|
||||
|
||||
/* FIXME: I don't understand why this fragment was ifndef'ed
|
||||
away for __GO32__; perhaps it was in the days of DJGPP v1.x.
|
||||
stat() works just fine in v2.x, so I think this should be
|
||||
removed. For now, I enable it for DJGPP v2. -- EZ. */
|
||||
|
||||
/* KLUDGE ALERT! Temporary fix until I figger why
|
||||
* stat() is wrong ... think it's buried in GO32's IDT
|
||||
* - Jax
|
||||
*/
|
||||
stat() is wrong ... think it's buried in GO32's IDT - Jax */
|
||||
if (errno != ENOENT)
|
||||
bfd_fatal (archive_filename);
|
||||
#endif
|
||||
|
@ -932,12 +956,18 @@ do_quick_append (archive_filename, files_to_append)
|
|||
if (stat (archive_filename, &sbuf) != 0)
|
||||
{
|
||||
|
||||
#ifndef __GO32__
|
||||
#if !defined(__GO32__) || defined(__DJGPP__)
|
||||
|
||||
/* FIXME: I don't understand why this fragment was ifndef'ed
|
||||
away for __GO32__; perhaps it was in the days of DJGPP v1.x.
|
||||
stat() works just fine in v2.x, so I think this should be
|
||||
removed. For now, I enable it for DJGPP v2.
|
||||
|
||||
(And yes, I know this is all unused, but somebody, someday,
|
||||
might wish to resurrect this again... -- EZ. */
|
||||
|
||||
/* KLUDGE ALERT! Temporary fix until I figger why
|
||||
* stat() is wrong ... think it's buried in GO32's IDT
|
||||
* - Jax
|
||||
*/
|
||||
stat() is wrong ... think it's buried in GO32's IDT - Jax */
|
||||
|
||||
if (errno != ENOENT)
|
||||
bfd_fatal (archive_filename);
|
||||
|
@ -1107,7 +1137,7 @@ get_pos_bfd (contents, default_pos, default_posname)
|
|||
else
|
||||
{
|
||||
for (; *after_bfd; after_bfd = &(*after_bfd)->next)
|
||||
if (strcmp ((*after_bfd)->filename, realposname) == 0)
|
||||
if (FILENAME_CMP ((*after_bfd)->filename, realposname) == 0)
|
||||
{
|
||||
if (realpos == pos_after)
|
||||
after_bfd = &(*after_bfd)->next;
|
||||
|
@ -1147,7 +1177,7 @@ delete_members (arch, files_to_delete)
|
|||
current_ptr_ptr = &(arch->next);
|
||||
while (*current_ptr_ptr)
|
||||
{
|
||||
if (strcmp (normalize (*files_to_delete, arch),
|
||||
if (FILENAME_CMP (normalize (*files_to_delete, arch),
|
||||
(*current_ptr_ptr)->filename) == 0)
|
||||
{
|
||||
++match_count;
|
||||
|
@ -1204,8 +1234,8 @@ move_members (arch, files_to_move)
|
|||
while (*current_ptr_ptr)
|
||||
{
|
||||
bfd *current_ptr = *current_ptr_ptr;
|
||||
if (strcmp (normalize (*files_to_move, arch),
|
||||
current_ptr->filename) == 0)
|
||||
if (FILENAME_CMP (normalize (*files_to_move, arch),
|
||||
current_ptr->filename) == 0)
|
||||
{
|
||||
/* Move this file to the end of the list - first cut from
|
||||
where it is. */
|
||||
|
@ -1260,8 +1290,8 @@ replace_members (arch, files_to_move, quick)
|
|||
|
||||
/* For compatibility with existing ar programs, we
|
||||
permit the same file to be added multiple times. */
|
||||
if (strcmp (normalize (*files_to_move, arch),
|
||||
normalize (current->filename, arch)) == 0
|
||||
if (FILENAME_CMP (normalize (*files_to_move, arch),
|
||||
normalize (current->filename, arch)) == 0
|
||||
&& current->arelt_data != NULL)
|
||||
{
|
||||
if (newer_only)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* arsup.c - Archive support for MRI compatibility
|
||||
Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 1999
|
||||
Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Binutils.
|
||||
|
@ -31,6 +31,7 @@ style librarian command syntax + 1 word LIST
|
|||
#include "arsup.h"
|
||||
#include "libiberty.h"
|
||||
#include "bucomm.h"
|
||||
#include "filenames.h"
|
||||
|
||||
static void map_over_list
|
||||
PARAMS ((bfd *, void (*function) (bfd *, bfd *), struct list *));
|
||||
|
@ -76,7 +77,7 @@ map_over_list (arch, function, list)
|
|||
for (head = arch->next; head; head = head->next)
|
||||
{
|
||||
if (head->filename != NULL
|
||||
&& strcmp (ptr->name, head->filename) == 0)
|
||||
&& FILENAME_CMP (ptr->name, head->filename) == 0)
|
||||
{
|
||||
found = true;
|
||||
function (head, prev);
|
||||
|
@ -160,7 +161,9 @@ DEFUN(ar_open,(name, t),
|
|||
{
|
||||
char *tname = (char *) xmalloc (strlen (name) + 10);
|
||||
real_name = name;
|
||||
sprintf(tname, "%s-tmp", name);
|
||||
/* Prepend tmp- to the beginning, to avoid file-name clashes after
|
||||
truncation on filesystems with limited namespaces (DOS). */
|
||||
sprintf(tname, "tmp-%s", name);
|
||||
obfd = bfd_openw(tname, NULL);
|
||||
|
||||
if (!obfd) {
|
||||
|
@ -289,7 +292,7 @@ DEFUN(ar_delete, (list),
|
|||
bfd **prev = &(obfd->archive_head);
|
||||
int found = 0;
|
||||
while (member) {
|
||||
if (strcmp(member->filename, list->name) == 0) {
|
||||
if (FILENAME_CMP(member->filename, list->name) == 0) {
|
||||
*prev = member->next;
|
||||
found = 1;
|
||||
}
|
||||
|
@ -346,7 +349,7 @@ DEFUN(ar_replace, (list),
|
|||
int found = 0;
|
||||
while (member)
|
||||
{
|
||||
if (strcmp(member->filename, list->name) == 0)
|
||||
if (FILENAME_CMP(member->filename, list->name) == 0)
|
||||
{
|
||||
/* Found the one to replace */
|
||||
bfd *abfd = bfd_openr(list->name, 0);
|
||||
|
@ -437,7 +440,7 @@ DEFUN(ar_extract,(list),
|
|||
int found = 0;
|
||||
while (member && !found)
|
||||
{
|
||||
if (strcmp(member->filename, list->name) == 0)
|
||||
if (FILENAME_CMP(member->filename, list->name) == 0)
|
||||
{
|
||||
extract_file(member);
|
||||
found = 1;
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "bfd.h"
|
||||
#include "libiberty.h"
|
||||
#include "bucomm.h"
|
||||
#include "filenames.h"
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <time.h> /* ctime, maybe time_t */
|
||||
|
@ -214,9 +215,15 @@ make_tempname (filename)
|
|||
char *tmpname;
|
||||
char *slash = strrchr (filename, '/');
|
||||
|
||||
#if defined (__DJGPP__) || defined (__GO32__) || defined (_WIN32)
|
||||
if (slash == NULL)
|
||||
slash = strrchr (filename, '\\');
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
{
|
||||
/* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
|
||||
char *bslash = strrchr (filename, '\\');
|
||||
if (bslash > slash)
|
||||
slash = bslash;
|
||||
if (slash == NULL && filename[0] != '\0' && filename[1] == ':')
|
||||
slash = filename + 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (slash != (char *) NULL)
|
||||
|
@ -225,8 +232,15 @@ make_tempname (filename)
|
|||
|
||||
c = *slash;
|
||||
*slash = 0;
|
||||
tmpname = xmalloc (strlen (filename) + sizeof (template) + 1);
|
||||
tmpname = xmalloc (strlen (filename) + sizeof (template) + 2);
|
||||
strcpy (tmpname, filename);
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
/* If tmpname is "X:", appending a slash will make it a root
|
||||
directory on drive X, which is NOT the same as the current
|
||||
directory on drive X. */
|
||||
if (tmpname[1] == ':' && tmpname[2] == '\0')
|
||||
strcat (tmpname, ".");
|
||||
#endif
|
||||
strcat (tmpname, "/");
|
||||
strcat (tmpname, template);
|
||||
mktemp (tmpname);
|
||||
|
|
|
@ -82,6 +82,9 @@
|
|||
/* Define if you have the setlocale function. */
|
||||
#undef HAVE_SETLOCALE
|
||||
|
||||
/* Define if you have the setmode function. */
|
||||
#undef HAVE_SETMODE
|
||||
|
||||
/* Define if you have the stpcpy function. */
|
||||
#undef HAVE_STPCPY
|
||||
|
||||
|
|
2
binutils/configure
vendored
2
binutils/configure
vendored
|
@ -4325,7 +4325,7 @@ EOF
|
|||
|
||||
fi
|
||||
|
||||
for ac_func in sbrk utimes
|
||||
for ac_func in sbrk utimes setmode
|
||||
do
|
||||
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
||||
echo "configure:4332: checking for $ac_func" >&5
|
||||
|
|
|
@ -96,7 +96,7 @@ AC_SUBST(DEMANGLER_NAME)
|
|||
AC_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h)
|
||||
AC_HEADER_SYS_WAIT
|
||||
AC_FUNC_ALLOCA
|
||||
AC_CHECK_FUNCS(sbrk utimes)
|
||||
AC_CHECK_FUNCS(sbrk utimes setmode)
|
||||
|
||||
# Some systems have frexp only in -lm, not in -lc.
|
||||
AC_SEARCH_LIBS(frexp, m)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* ieee.c -- Read and write IEEE-695 debugging information.
|
||||
Copyright (C) 1996, 1998, 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1998, 1999, 2000 Free Software Foundation, Inc.
|
||||
Written by Ian Lance Taylor <ian@cygnus.com>.
|
||||
|
||||
This file is part of GNU Binutils.
|
||||
|
@ -30,6 +30,7 @@
|
|||
#include "libiberty.h"
|
||||
#include "debug.h"
|
||||
#include "budbg.h"
|
||||
#include "filenames.h"
|
||||
|
||||
/* This structure holds an entry on the block stack. */
|
||||
|
||||
|
@ -4926,6 +4927,7 @@ ieee_start_compilation_unit (p, filename)
|
|||
{
|
||||
struct ieee_handle *info = (struct ieee_handle *) p;
|
||||
const char *modname;
|
||||
const char *backslash;
|
||||
char *c, *s;
|
||||
unsigned int nindx;
|
||||
|
||||
|
@ -4937,16 +4939,20 @@ ieee_start_compilation_unit (p, filename)
|
|||
|
||||
info->filename = filename;
|
||||
modname = strrchr (filename, '/');
|
||||
/* We could have a mixed forward/back slash case. */
|
||||
backslash = strrchr (modname, '\\');
|
||||
if (backslash > modname)
|
||||
modname = backslash;
|
||||
|
||||
if (modname != NULL)
|
||||
++modname;
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
else if (filename[0] && filename[1] == ':')
|
||||
modname = filename + 2;
|
||||
#endif
|
||||
else
|
||||
{
|
||||
modname = strrchr (filename, '\\');
|
||||
if (modname != NULL)
|
||||
++modname;
|
||||
else
|
||||
modname = filename;
|
||||
}
|
||||
modname = filename;
|
||||
|
||||
c = xstrdup (modname);
|
||||
s = strrchr (c, '.');
|
||||
if (s != NULL)
|
||||
|
@ -5194,22 +5200,25 @@ ieee_add_bb11 (info, sec, low, high)
|
|||
}
|
||||
else
|
||||
{
|
||||
const char *filename, *modname;
|
||||
const char *filename, *modname, *backslash;
|
||||
char *c, *s;
|
||||
|
||||
/* Start the enclosing BB10 block. */
|
||||
filename = bfd_get_filename (info->abfd);
|
||||
modname = strrchr (filename, '/');
|
||||
backslash = strrchr (modname, '\\');
|
||||
if (backslash > modname)
|
||||
modname = backslash;
|
||||
|
||||
if (modname != NULL)
|
||||
++modname;
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
else if (filename[0] && filename[1] == ':')
|
||||
modname = filename + 2;
|
||||
#endif
|
||||
else
|
||||
{
|
||||
modname = strrchr (filename, '\\');
|
||||
if (modname != NULL)
|
||||
++modname;
|
||||
else
|
||||
modname = filename;
|
||||
}
|
||||
modname = filename;
|
||||
|
||||
c = xstrdup (modname);
|
||||
s = strrchr (c, '.');
|
||||
if (s != NULL)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* objcopy.c -- copy object file from input to output, optionally massaging it.
|
||||
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 1999
|
||||
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Binutils.
|
||||
|
@ -25,6 +25,7 @@
|
|||
#include "getopt.h"
|
||||
#include "libiberty.h"
|
||||
#include "budbg.h"
|
||||
#include "filenames.h"
|
||||
#include <sys/stat.h>
|
||||
|
||||
/* A list of symbols to explicitly strip out, or to keep. A linked
|
||||
|
@ -2253,7 +2254,15 @@ main (argc, argv)
|
|||
if (is_strip < 0)
|
||||
{
|
||||
int i = strlen (program_name);
|
||||
is_strip = (i >= 5 && strcmp (program_name + i - 5, "strip") == 0);
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
/* Drop the .exe suffix, if any. */
|
||||
if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
|
||||
{
|
||||
i -= 4;
|
||||
program_name[i] = '\0';
|
||||
}
|
||||
#endif
|
||||
is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
|
||||
}
|
||||
|
||||
if (is_strip)
|
||||
|
|
|
@ -59,6 +59,23 @@
|
|||
#include "bucomm.h"
|
||||
#include "libiberty.h"
|
||||
|
||||
/* Some platforms need to put stdin into binary mode, to read
|
||||
binary files. */
|
||||
#ifdef HAVE_SETMODE
|
||||
#ifndef O_BINARY
|
||||
#ifdef _O_BINARY
|
||||
#define O_BINARY _O_BINARY
|
||||
#define setmode _setmode
|
||||
#else
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
#endif
|
||||
#if O_BINARY
|
||||
#include <io.h>
|
||||
#define SET_BINARY(f) do { if (!isatty(f)) setmode(f,O_BINARY); } while (0)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef isascii
|
||||
#define isgraphic(c) (isascii (c) && isprint (c))
|
||||
#else
|
||||
|
@ -218,6 +235,9 @@ main (argc, argv)
|
|||
if (optind >= argc)
|
||||
{
|
||||
datasection_only = false;
|
||||
#ifdef SET_BINARY
|
||||
SET_BINARY (fileno (stdin));
|
||||
#endif
|
||||
print_strings ("{standard input}", stdin, 0, 0, 0, (char *) NULL);
|
||||
files_given = true;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,39 @@
|
|||
2000-05-26 Alan Modra <alan@linuxcare.com.au>
|
||||
|
||||
* gprof.h: Remove most nls defines. They are pulled in by
|
||||
bfd/sysdep.h. #include "ansidecl.h" not <ansidecl.h>
|
||||
|
||||
2000-05-26 Eli Zaretskii <eliz@is.elta.co.il>
|
||||
|
||||
* gprof.texi: Fix numerous typos. Mention some DOS/Windows related
|
||||
issues.
|
||||
|
||||
* configure.in: Check for setmode function.
|
||||
* configure: Regenerate.
|
||||
|
||||
* gmon_io.h (SET_BINARY) [HAVE_SETMODE]: Define.
|
||||
|
||||
* gmon_io.c (gmon_out_read) [SET_BINARY]: Switch stdin into binary
|
||||
mode.
|
||||
|
||||
* source.c: Include filenames.h and sys/stat.h.
|
||||
(source_file_lookup_path, source_file_lookup_name): Use
|
||||
FILENAME_CMP to compare file names.
|
||||
(annotate_source) [__MSDOS__]: If "filename-ann" would overwrite
|
||||
"filename", replace the extension with ".ann".
|
||||
[HAVE_DOS_BASED_FILE_SYSTEM]: Support file names with
|
||||
backslashes and drive letters.
|
||||
Use IS_ABSOLUTE_PATH.
|
||||
|
||||
* search_list.h (PATH_SEP_CHAR): Define.
|
||||
|
||||
* search_list.c (search_list_append): Use PATH_SEP_CHAR.
|
||||
|
||||
* hertz.c (HERTZ) [__MSDOS__]: Don't define unless they have
|
||||
neither HAVE_SETITIMER nor HAVE_SYSCONF.
|
||||
[HAVE_SETITIMER]: If they define both HAVE_SETITIMER and
|
||||
HAVE_SYSCONF, try setitimer and fall back on sysconf.
|
||||
|
||||
Fri Apr 7 15:56:57 2000 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* configure.in (WARN_CFLAGS): Set to -W -Wall by default. Add
|
||||
|
|
694
gprof/configure
vendored
694
gprof/configure
vendored
File diff suppressed because it is too large
Load diff
|
@ -18,6 +18,7 @@ AC_PROG_CC
|
|||
AC_PROG_INSTALL
|
||||
|
||||
AC_ISC_POSIX
|
||||
AC_CHECK_FUNCS(setmode)
|
||||
|
||||
ALL_LINGUAS=
|
||||
CY_GNU_GETTEXT
|
||||
|
|
|
@ -73,6 +73,9 @@
|
|||
/* Define if you have the setlocale function. */
|
||||
#undef HAVE_SETLOCALE
|
||||
|
||||
/* Define if you have the setmode function. */
|
||||
#undef HAVE_SETMODE
|
||||
|
||||
/* Define if you have the stpcpy function. */
|
||||
#undef HAVE_STPCPY
|
||||
|
||||
|
|
|
@ -72,6 +72,9 @@ DEFUN (gmon_out_read, (filename), const char *filename)
|
|||
if (strcmp (filename, "-") == 0)
|
||||
{
|
||||
ifp = stdin;
|
||||
#ifdef SET_BINARY
|
||||
SET_BINARY (fileno (stdin));
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -4,6 +4,24 @@
|
|||
#include "bfd.h"
|
||||
#include "gmon.h"
|
||||
|
||||
/* Some platforms need to put stdin into binary mode, to read
|
||||
binary files. */
|
||||
#include "sysdep.h"
|
||||
#ifdef HAVE_SETMODE
|
||||
#ifndef O_BINARY
|
||||
#ifdef _O_BINARY
|
||||
#define O_BINARY _O_BINARY
|
||||
#define setmode _setmode
|
||||
#else
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
#endif
|
||||
#if O_BINARY
|
||||
#include <io.h>
|
||||
#define SET_BINARY(f) do { if (!isatty(f)) setmode(f,O_BINARY); } while (0)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define INPUT_HISTOGRAM (1<<0)
|
||||
#define INPUT_CALL_GRAPH (1<<1)
|
||||
#define INPUT_BB_COUNTS (1<<2)
|
||||
|
|
|
@ -16,7 +16,7 @@ END-INFO-DIR-ENTRY
|
|||
@ifinfo
|
||||
This file documents the gprof profiler of the GNU system.
|
||||
|
||||
Copyright (C) 1988, 1992, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1988, 92, 97, 98, 99, 2000 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
|
@ -53,11 +53,8 @@ can use it to determine which parts of a program are taking most of the
|
|||
execution time. We assume that you know how to write, compile, and
|
||||
execute programs. @sc{gnu} @code{gprof} was written by Jay Fenlason.
|
||||
|
||||
This manual was edited January 1993 by Jeffrey Osier
|
||||
and updated September 1997 by Brent Baccala.
|
||||
|
||||
@vskip 0pt plus 1filll
|
||||
Copyright @copyright{} 1988, 1992, 1997, 1998 Free Software Foundation, Inc.
|
||||
Copyright @copyright{} 1988, 92, 97, 98, 99, 2000 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
|
@ -89,8 +86,6 @@ can use it to determine which parts of a program are taking most of the
|
|||
execution time. We assume that you know how to write, compile, and
|
||||
execute programs. @sc{gnu} @code{gprof} was written by Jay Fenlason.
|
||||
|
||||
This manual was updated August 1997 by Brent Baccala.
|
||||
|
||||
@menu
|
||||
* Introduction:: What profiling means, and why it is useful.
|
||||
|
||||
|
@ -303,7 +298,7 @@ The order of these options does not matter.
|
|||
* Output Options:: Controlling @code{gprof}'s output style
|
||||
* Analysis Options:: Controlling how @code{gprof} analyses its data
|
||||
* Miscellaneous Options::
|
||||
* Depricated Options:: Options you no longer need to use, but which
|
||||
* Deprecated Options:: Options you no longer need to use, but which
|
||||
have been retained for compatibility
|
||||
* Symspecs:: Specifying functions to include or exclude
|
||||
@end menu
|
||||
|
@ -344,7 +339,7 @@ The @samp{-C} option causes @code{gprof} to
|
|||
print a tally of functions and the number of times each was called.
|
||||
If @var{symspec} is specified, print tally only for matching symbols.
|
||||
|
||||
If the profile data file contains basic-block count records, specifing
|
||||
If the profile data file contains basic-block count records, specifying
|
||||
the @samp{-l} option, along with @samp{-C}, will cause basic-block
|
||||
execution counts to be tallied and displayed.
|
||||
|
||||
|
@ -358,7 +353,7 @@ call graph, and basic-block count records is displayed.
|
|||
@itemx --directory-path=@var{dirs}
|
||||
The @samp{-I} option specifies a list of search directories in
|
||||
which to find source files. Environment variable @var{GPROF_PATH}
|
||||
can also be used to convery this information.
|
||||
can also be used to convey this information.
|
||||
Used mostly for annotated source output.
|
||||
|
||||
@item -J[@var{symspec}]
|
||||
|
@ -407,10 +402,15 @@ but excludes matching symbols.
|
|||
@item -y
|
||||
@itemx --separate-files
|
||||
This option affects annotated source output only.
|
||||
Normally, gprof prints annotated source files
|
||||
Normally, @code{gprof} prints annotated source files
|
||||
to standard-output. If this option is specified,
|
||||
annotated source for a file named @file{path/filename}
|
||||
is generated in the file @file{filename-ann}.
|
||||
annotated source for a file named @file{path/@var{filename}}
|
||||
is generated in the file @file{@var{filename}-ann}. If the underlying
|
||||
filesystem would truncate @file{@var{filename}-ann} so that it
|
||||
overwrites the original @file{@var{filename}}, @code{gprof} generates
|
||||
annotated source in the file @file{@var{filename}.ann} instead (if the
|
||||
original file name has an extension, that extension is @emph{replaced}
|
||||
with @file{.ann}).
|
||||
|
||||
@item -Z[@var{symspec}]
|
||||
@itemx --no-exec-counts[=@var{symspec}]
|
||||
|
@ -456,7 +456,8 @@ c-decl.o:00000000 T print_lang_type
|
|||
@end group
|
||||
@end smallexample
|
||||
|
||||
GNU @code{nm} @samp{--extern-only} @samp{--defined-only} @samp{-v} @samp{--print-file-name} can be used to create @var{map_file}.
|
||||
To create a @var{map_file} with @sc{gnu} @code{nm}, type a command like
|
||||
@kbd{nm --extern-only --defined-only -v --print-file-name program-name}.
|
||||
|
||||
@item -T
|
||||
@itemx --traditional
|
||||
|
@ -565,7 +566,7 @@ that had no time spent in them. This is useful in conjunction with the
|
|||
|
||||
@end table
|
||||
|
||||
@node Miscellaneous Options,Depricated Options,Analysis Options,Invoking
|
||||
@node Miscellaneous Options,Deprecated Options,Analysis Options,Invoking
|
||||
@section Miscellaneous Options
|
||||
|
||||
@table @code
|
||||
|
@ -601,8 +602,8 @@ number, and then exit.
|
|||
|
||||
@end table
|
||||
|
||||
@node Depricated Options,Symspecs,Miscellaneous Options,Invoking
|
||||
@section Depricated Options
|
||||
@node Deprecated Options,Symspecs,Miscellaneous Options,Invoking
|
||||
@section Deprecated Options
|
||||
|
||||
@table @code
|
||||
|
||||
|
@ -653,7 +654,7 @@ gprof -e boring -f foo -f bar myprogram > gprof.output
|
|||
lists in the call graph all functions that were reached from either
|
||||
@code{foo} or @code{bar} and were not reachable from @code{boring}.
|
||||
|
||||
@node Symspecs,,Depricated Options,Invoking
|
||||
@node Symspecs,,Deprecated Options,Invoking
|
||||
@section Symspecs
|
||||
|
||||
Many of the output options allow functions to be included or excluded
|
||||
|
@ -672,7 +673,7 @@ Here are some sample symspecs:
|
|||
@table @samp
|
||||
@item main.c
|
||||
Selects everything in file @file{main.c}---the
|
||||
dot in the string tells gprof to interpret
|
||||
dot in the string tells @code{gprof} to interpret
|
||||
the string as a filename, rather than as
|
||||
a function name. To select a file whose
|
||||
name does not contain a dot, a trailing colon
|
||||
|
@ -691,11 +692,13 @@ Sometimes, function names contain dots. In such cases, it is necessary
|
|||
to add a leading colon to the name. For example, @samp{:.mul} selects
|
||||
function @samp{.mul}.
|
||||
|
||||
In some object file formats, symbols have a leading underscore. gprof
|
||||
will normally not print these underscores. However, you must use the
|
||||
underscore when you name a symbol in a symspec. You can use the
|
||||
@code{nm} program to see whether symbols have underscores for the object
|
||||
file format you are using.
|
||||
In some object file formats, symbols have a leading underscore.
|
||||
@code{gprof} will normally not print these underscores. When you name a
|
||||
symbol in a symspec, you should type it exactly as @code{gprof} prints
|
||||
it in its output. For example, if the compiler produces a symbol
|
||||
@samp{_main} from your @code{main} function, @code{gprof} still prints
|
||||
it as @samp{main} in its output, so you should use @samp{main} in
|
||||
symspecs.
|
||||
|
||||
@item main.c:main
|
||||
Selects function @samp{main} in file @file{main.c}.
|
||||
|
@ -769,7 +772,7 @@ Each sample counts as 0.01 seconds.
|
|||
The functions are sorted by first by decreasing run-time spent in them,
|
||||
then by decreasing number of calls, then alphabetically by name. The
|
||||
functions @samp{mcount} and @samp{profil} are part of the profiling
|
||||
aparatus and appear in every flat profile; their time gives a measure of
|
||||
apparatus and appear in every flat profile; their time gives a measure of
|
||||
the amount of overhead due to profiling.
|
||||
|
||||
Just before the column headers, a statement appears indicating
|
||||
|
@ -781,10 +784,10 @@ suggesting a 100 Hz sampling rate.
|
|||
The program's total execution time was 0.06
|
||||
seconds, as indicated by the @samp{cumulative seconds} field. Since
|
||||
each sample counted for 0.01 seconds, this means only six samples
|
||||
were taken during the run. Two of the samples occured while the
|
||||
were taken during the run. Two of the samples occurred while the
|
||||
program was in the @samp{open} function, as indicated by the
|
||||
@samp{self seconds} field. Each of the other four samples
|
||||
occured one each in @samp{offtime}, @samp{memccpy}, @samp{write},
|
||||
occurred one each in @samp{offtime}, @samp{memccpy}, @samp{write},
|
||||
and @samp{mcount}.
|
||||
Since only six samples were taken, none of these values can
|
||||
be regarded as particularly reliable.
|
||||
|
@ -1019,7 +1022,7 @@ of the amount of time spent within calls to @code{report} from @code{main}.
|
|||
|
||||
@item called
|
||||
Two numbers: the number of times @code{report} was called from @code{main},
|
||||
followed by the total number of nonrecursive calls to @code{report} from
|
||||
followed by the total number of non-recursive calls to @code{report} from
|
||||
all its callers.
|
||||
|
||||
@item name and index number
|
||||
|
@ -1078,7 +1081,7 @@ of the total time spent in calls to @code{report} from @code{main}.
|
|||
|
||||
@item called
|
||||
Two numbers, the number of calls to @code{report} from @code{main}
|
||||
followed by the total number of nonrecursive calls to @code{report}.
|
||||
followed by the total number of non-recursive calls to @code{report}.
|
||||
This ratio is used to determine how much of @code{report}'s @code{self}
|
||||
and @code{children} time gets credited to @code{main}.
|
||||
@xref{Assumptions}.
|
||||
|
@ -1211,7 +1214,7 @@ The @code{calls} field in the primary line for the cycle has two numbers:
|
|||
first, the number of times functions in the cycle were called by functions
|
||||
outside the cycle; second, the number of times they were called by
|
||||
functions in the cycle (including times when a function in the cycle calls
|
||||
itself). This is a generalization of the usual split into nonrecursive and
|
||||
itself). This is a generalization of the usual split into non-recursive and
|
||||
recursive calls.
|
||||
|
||||
The @code{calls} field of a subroutine-line for a cycle member in the
|
||||
|
@ -1275,7 +1278,7 @@ index % time self children called name
|
|||
Now let's look at some of @code{gprof}'s output from the same program run,
|
||||
this time with line-by-line profiling enabled. Note that @code{ct_init}'s
|
||||
four histogram hits are broken down into four lines of source code - one hit
|
||||
occured on each of lines 349, 351, 382 and 385. In the call graph,
|
||||
occurred on each of lines 349, 351, 382 and 385. In the call graph,
|
||||
note how
|
||||
@code{ct_init}'s 13327 calls to @code{init_block} are broken down
|
||||
into one call from line 396, 3071 calls from line 384, 3730 calls
|
||||
|
@ -1328,7 +1331,7 @@ number of times it was called. You may also need to specify the
|
|||
Compiling with @samp{gcc @dots{} -g -pg -a} augments your program
|
||||
with basic-block counting code, in addition to function counting code.
|
||||
This enables @code{gprof} to determine how many times each line
|
||||
of code was exeucted.
|
||||
of code was executed.
|
||||
For example, consider the following function, taken from gzip,
|
||||
with line numbers added:
|
||||
|
||||
|
@ -1364,7 +1367,7 @@ the fifth basic-block. The compiler may also generate additional
|
|||
basic-blocks to handle various special cases.
|
||||
|
||||
A program augmented for basic-block counting can be analyzed with
|
||||
@code{gprof -l -A}. I also suggest use of the @samp{-x} option,
|
||||
@samp{gprof -l -A}. I also suggest use of the @samp{-x} option,
|
||||
which ensures that each line of code is labeled at least once.
|
||||
Here is @code{updcrc}'s
|
||||
annotated source listing for a sample @code{gzip} run:
|
||||
|
@ -1526,7 +1529,7 @@ but not necessarily those that consumed the most time.
|
|||
|
||||
@item How do I find which lines in my program called a particular function?
|
||||
|
||||
Use @code{gprof -l} and lookup the function in the call graph.
|
||||
Use @samp{gprof -l} and lookup the function in the call graph.
|
||||
The callers will be broken down by function and line number.
|
||||
|
||||
@item How do I analyze a program that runs for less than a second?
|
||||
|
@ -1582,7 +1585,7 @@ in the form @samp{from/to}, instead of @samp{from to}.
|
|||
@item
|
||||
In the annotated source listing,
|
||||
if there are multiple basic blocks on the same line,
|
||||
@sc{gnu} @code{gprof} prints all of their counts, seperated by commas.
|
||||
@sc{gnu} @code{gprof} prints all of their counts, separated by commas.
|
||||
|
||||
@ignore - it does this now
|
||||
@item
|
||||
|
@ -1601,7 +1604,7 @@ tables without skipping the blurbs.
|
|||
@chapter Details of Profiling
|
||||
|
||||
@menu
|
||||
* Implementation:: How a program collets profiling information
|
||||
* Implementation:: How a program collects profiling information
|
||||
* File Format:: Format of @samp{gmon.out} files
|
||||
* Internals:: @code{gprof}'s internal operation
|
||||
* Debugging:: Using @code{gprof}'s @samp{-d} option
|
||||
|
@ -1624,14 +1627,14 @@ is responsible for recording in an in-memory call graph table
|
|||
both its parent routine (the child) and its parent's parent. This is
|
||||
typically done by examining the stack frame to find both
|
||||
the address of the child, and the return address in the original parent.
|
||||
Since this is a very machine-dependant operation, @code{mcount}
|
||||
Since this is a very machine-dependent operation, @code{mcount}
|
||||
itself is typically a short assembly-language stub routine
|
||||
that extracts the required
|
||||
information, and then calls @code{__mcount_internal}
|
||||
(a normal C function) with two arguments - @code{frompc} and @code{selfpc}.
|
||||
@code{__mcount_internal} is responsible for maintaining
|
||||
the in-memory call graph, which records @code{frompc}, @code{selfpc},
|
||||
and the number of times each of these call arcs was transversed.
|
||||
and the number of times each of these call arcs was traversed.
|
||||
|
||||
GCC Version 2 provides a magical function (@code{__builtin_return_address}),
|
||||
which allows a generic @code{mcount} function to extract the
|
||||
|
@ -1724,7 +1727,7 @@ load due to other users won't directly affect the output you get.
|
|||
|
||||
The old BSD-derived file format used for profile data does not contain a
|
||||
magic cookie that allows to check whether a data file really is a
|
||||
gprof file. Furthermore, it does not provide a version number, thus
|
||||
@code{gprof} file. Furthermore, it does not provide a version number, thus
|
||||
rendering changes to the file format almost impossible. @sc{gnu} @code{gprof}
|
||||
uses a new file format that provides these features. For backward
|
||||
compatibility, @sc{gnu} @code{gprof} continues to support the old BSD-derived
|
||||
|
@ -1827,7 +1830,7 @@ Next, the BFD library is called to open the object file,
|
|||
verify that it is an object file,
|
||||
and read its symbol table (@code{core.c:core_init}),
|
||||
using @code{bfd_canonicalize_symtab} after mallocing
|
||||
an appropiate sized array of asymbols. At this point,
|
||||
an appropriately sized array of symbols. At this point,
|
||||
function mappings are read (if the @samp{--file-ordering} option
|
||||
has been specified), and the core text space is read into
|
||||
memory (if the @samp{-c} option was given).
|
||||
|
@ -1845,7 +1848,7 @@ In either case, two passes are made through the symbol
|
|||
table - one to count the size of the symbol table required,
|
||||
and the other to actually read the symbols. In between the
|
||||
two passes, a single array of type @code{Sym} is created of
|
||||
the appropiate length.
|
||||
the appropriate length.
|
||||
Finally, @code{symtab.c:symtab_finalize}
|
||||
is called to sort the symbol table and remove duplicate entries
|
||||
(entries with the same memory address).
|
||||
|
@ -1931,7 +1934,7 @@ cause each of two adjacent lines to be credited with half
|
|||
a hit, for example.
|
||||
|
||||
If call graph data is present, @code{cg_arcs.c:cg_assemble} is called.
|
||||
First, if @samp{-c} was specified, a machine-dependant
|
||||
First, if @samp{-c} was specified, a machine-dependent
|
||||
routine (@code{find_call}) scans through each symbol's machine code,
|
||||
looking for subroutine call instructions, and adding them
|
||||
to the call graph with a zero call count.
|
||||
|
@ -1945,14 +1948,14 @@ Cycles are also detected at this point, all members
|
|||
of which are assigned the same topological number.
|
||||
Two passes are now made through this sorted array of symbol pointers.
|
||||
The first pass, from end to beginning (parents to children),
|
||||
computes the fraction of child time to propogate to each parent
|
||||
computes the fraction of child time to propagate to each parent
|
||||
and a print flag.
|
||||
The print flag reflects symspec handling of INCL_GRAPH/EXCL_GRAPH,
|
||||
with a parent's include or exclude (print or no print) property
|
||||
being propagated to its children, unless they themselves explicitly appear
|
||||
in INCL_GRAPH or EXCL_GRAPH.
|
||||
A second pass, from beginning to end (children to parents) actually
|
||||
propogates the timings along the call graph, subject
|
||||
propagates the timings along the call graph, subject
|
||||
to a check against INCL_TIME/EXCL_TIME.
|
||||
With the print flag, fractions, and timings now stored in the symbol
|
||||
structures, the topological sort array is now discarded, and a
|
||||
|
|
|
@ -19,10 +19,6 @@
|
|||
#include "hertz.h"
|
||||
|
||||
|
||||
#ifdef __MSDOS__
|
||||
#define HERTZ 18
|
||||
#endif
|
||||
|
||||
int
|
||||
hertz ()
|
||||
{
|
||||
|
@ -38,17 +34,19 @@ hertz ()
|
|||
tim.it_value.tv_usec = 0;
|
||||
setitimer (ITIMER_REAL, &tim, 0);
|
||||
setitimer (ITIMER_REAL, 0, &tim);
|
||||
if (tim.it_interval.tv_usec < 2)
|
||||
if (tim.it_interval.tv_usec >= 2)
|
||||
{
|
||||
return HZ_WRONG;
|
||||
return 1000000 / tim.it_interval.tv_usec;
|
||||
}
|
||||
return 1000000 / tim.it_interval.tv_usec;
|
||||
#else /* ! defined (HAVE_SETITIMER) */
|
||||
#endif /* ! defined (HAVE_SETITIMER) */
|
||||
#if defined (HAVE_SYSCONF) && defined (_SC_CLK_TCK)
|
||||
return sysconf (_SC_CLK_TCK);
|
||||
#else /* ! defined (HAVE_SYSCONF) || ! defined (_SC_CLK_TCK) */
|
||||
#ifdef __MSDOS__
|
||||
return 18;
|
||||
#else /* ! defined (__MSDOS__) */
|
||||
return HZ_WRONG;
|
||||
#endif /* ! defined (__MSDOS__) */
|
||||
#endif /* ! defined (HAVE_SYSCONF) || ! defined (_SC_CLK_TCK) */
|
||||
#endif /* ! defined (HAVE_SETITIMER) */
|
||||
#endif /* ! defined (HERTZ) */
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ DEFUN (search_list_append, (list, paths),
|
|||
do
|
||||
{
|
||||
beg = colon + 1;
|
||||
colon = strchr (beg, ':');
|
||||
colon = strchr (beg, PATH_SEP_CHAR);
|
||||
if (colon)
|
||||
{
|
||||
len = colon - beg;
|
||||
|
|
|
@ -1,6 +1,14 @@
|
|||
#ifndef search_list_h
|
||||
#define search_list_h
|
||||
|
||||
/* Non-Posix systems use semi-colon as directory separator in lists,
|
||||
since colon is part of drive letter spec. */
|
||||
#if defined (__MSDOS__) || defined (_WIN32)
|
||||
#define PATH_SEP_CHAR ';'
|
||||
#else
|
||||
#define PATH_SEP_CHAR ':'
|
||||
#endif
|
||||
|
||||
typedef struct search_list_elem
|
||||
{
|
||||
struct search_list_elem *next;
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
/*
|
||||
* Keeps track of source files.
|
||||
*/
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "gprof.h"
|
||||
#include "libiberty.h"
|
||||
#include "filenames.h"
|
||||
#include "search_list.h"
|
||||
#include "source.h"
|
||||
|
||||
|
@ -25,7 +28,7 @@ DEFUN (source_file_lookup_path, (path), const char *path)
|
|||
|
||||
for (sf = first_src_file; sf; sf = sf->next)
|
||||
{
|
||||
if (strcmp (path, sf->name) == 0)
|
||||
if (FILENAME_CMP (path, sf->name) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
@ -66,7 +69,7 @@ DEFUN (source_file_lookup_name, (filename), const char *filename)
|
|||
{
|
||||
fname = sf->name;
|
||||
}
|
||||
if (strcmp (filename, fname) == 0)
|
||||
if (FILENAME_CMP (filename, fname) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
@ -95,7 +98,7 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
|
|||
* open succeeds or reaching end of list:
|
||||
*/
|
||||
strcpy (fname, sf->name);
|
||||
if (sf->name[0] == '/')
|
||||
if (IS_ABSOLUTE_PATH (sf->name))
|
||||
{
|
||||
sle = 0; /* don't use search list for absolute paths */
|
||||
}
|
||||
|
@ -112,6 +115,15 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
|
|||
if (!sle && !name_only)
|
||||
{
|
||||
name_only = strrchr (sf->name, '/');
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
{
|
||||
char *bslash = strrchr (sf->name, '\\');
|
||||
if (bslash > name_only)
|
||||
name_only = bslash;
|
||||
if (name_only == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
|
||||
name_only = (char *)sf->name + 1;
|
||||
}
|
||||
#endif
|
||||
if (name_only)
|
||||
{
|
||||
/* try search-list again, but this time with name only: */
|
||||
|
@ -122,6 +134,11 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
|
|||
if (sle)
|
||||
{
|
||||
strcpy (fname, sle->path);
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
/* d:foo is not the same thing as d:/foo! */
|
||||
if (fname[strlen (fname) - 1] == ':')
|
||||
strcat (fname, ".");
|
||||
#endif
|
||||
strcat (fname, "/");
|
||||
if (name_only)
|
||||
{
|
||||
|
@ -156,6 +173,15 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
|
|||
|
||||
/* create annotation files in the current working directory: */
|
||||
filename = strrchr (sf->name, '/');
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
{
|
||||
char *bslash = strrchr (sf->name, '\\');
|
||||
if (bslash > filename)
|
||||
filename = bslash;
|
||||
if (filename == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
|
||||
filename = sf->name + 1;
|
||||
}
|
||||
#endif
|
||||
if (filename)
|
||||
{
|
||||
++filename;
|
||||
|
@ -167,6 +193,24 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
|
|||
|
||||
strcpy (fname, filename);
|
||||
strcat (fname, EXT_ANNO);
|
||||
#ifdef __MSDOS__
|
||||
{
|
||||
/* foo.cpp-ann can overwrite foo.cpp due to silent truncation of
|
||||
file names on 8+3 filesystems. Their `stat' better be good... */
|
||||
struct stat buf1, buf2;
|
||||
|
||||
if (stat (filename, &buf1) == 0
|
||||
&& stat (fname, &buf2) == 0
|
||||
&& buf1.st_ino == buf2.st_ino)
|
||||
{
|
||||
char *dot = strrchr (fname, '.');
|
||||
|
||||
if (dot)
|
||||
*dot = '\0';
|
||||
strcat (fname, ".ann");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
ofp = fopen (fname, "w");
|
||||
if (!ofp)
|
||||
{
|
||||
|
|
|
@ -201,7 +201,10 @@ DEFUN (match, (pattern, sym), Sym * pattern AND Sym * sym)
|
|||
{
|
||||
return (pattern->file ? pattern->file == sym->file : TRUE)
|
||||
&& (pattern->line_num ? pattern->line_num == sym->line_num : TRUE)
|
||||
&& (pattern->name ? strcmp (pattern->name, sym->name) == 0 : TRUE);
|
||||
&& (pattern->name
|
||||
? strcmp (pattern->name,
|
||||
sym->name+(discard_underscores && sym->name[0] == '_')) == 0
|
||||
: TRUE);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2000-05-26 Eli Zaretskii <eliz@is.elta.co.il>
|
||||
|
||||
* filenames.h: New file.
|
||||
(HAVE_DOS_BASED_FILE_SYSTEM, IS_DIR_SEPARATOR)
|
||||
(IS_ABSOLUTE_PATH, FILENAME_CMP): New macros.
|
||||
|
||||
2000-05-17 S. Bharadwaj Yadavalli <sby@scrugs.lkg.dec.com>
|
||||
Rick Gorton <gorton@scrugs.lkg.dec.com>
|
||||
|
||||
|
|
51
include/filenames.h
Normal file
51
include/filenames.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/* Macros for taking apart, interpreting and processing file names.
|
||||
|
||||
These are here because some non-Posix (a.k.a. DOSish) systems have
|
||||
drive letter brain-damage at the beginning of an absolute file name,
|
||||
use forward- and back-slash in path names interchangeably, and
|
||||
some of them have case-insensitive file names.
|
||||
|
||||
Copyright 2000 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef FILENAMES_H
|
||||
#define FILENAMES_H
|
||||
|
||||
#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__)
|
||||
|
||||
#ifndef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
#define HAVE_DOS_BASED_FILE_SYSTEM 1
|
||||
#endif
|
||||
|
||||
#define IS_DIR_SEPARATOR(c) ((c) == '/' || (c) == '\\')
|
||||
/* Note that IS_ABSOLUTE_PATH accepts d:foo as well, although it is
|
||||
only semi-absolute. This is because the users of IS_ABSOLUTE_PATH
|
||||
want to know whether to prepend the current working directory to
|
||||
a file name, which should not be done with a name like d:foo. */
|
||||
#define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0]) || (((f)[0]) && ((f)[1] == ':')))
|
||||
#define FILENAME_CMP(s1, s2) strcasecmp(s1, s2)
|
||||
|
||||
#else /* not DOSish */
|
||||
|
||||
#define IS_DIR_SEPARATOR(c) ((c) == '/')
|
||||
#define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0]))
|
||||
#define FILENAME_CMP(s1, s2) strcmp(s1, s2)
|
||||
|
||||
#endif /* not DOSish */
|
||||
|
||||
#endif /* FILENAMES_H */
|
|
@ -1,3 +1,8 @@
|
|||
2000-05-26 Eli Zaretskii <eliz@is.elta.co.il>
|
||||
|
||||
* ldmain.c: Include filenames.h.
|
||||
(set_scripts_dir): Support backslashes in program name.
|
||||
|
||||
2000-05-22 Igor Shevlyakov <igor@windriver.com>
|
||||
|
||||
* ldmain.c (main): When deciding if ".text" section should be
|
||||
|
|
11
ld/ldmain.c
11
ld/ldmain.c
|
@ -1,5 +1,5 @@
|
|||
/* Main program of GNU linker.
|
||||
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 1999
|
||||
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||
Free Software Foundation, Inc.
|
||||
Written by Steve Chamberlain steve@cygnus.com
|
||||
|
||||
|
@ -27,6 +27,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#include "libiberty.h"
|
||||
#include "progress.h"
|
||||
#include "bfdlink.h"
|
||||
#include "filenames.h"
|
||||
|
||||
#include "ld.h"
|
||||
#include "ldmain.h"
|
||||
|
@ -569,6 +570,14 @@ set_scripts_dir ()
|
|||
|
||||
/* Look for "ldscripts" in the dir where our binary is. */
|
||||
end = strrchr (program_name, '/');
|
||||
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||
{
|
||||
/* We could have \foo\bar, or /foo\bar. */
|
||||
char *bslash = strrchr (program_name, '\\');
|
||||
if (bslash > end)
|
||||
end = bslash;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (end == NULL)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue