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>
|
2000-05-26 Alan Modra <alan@linuxcare.com.au>
|
||||||
|
|
||||||
* opncls.c (bfd_close_all_done): Mask file perms with 0777 not 0x777.
|
* 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.
|
/* 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.
|
Free Software Foundation, Inc.
|
||||||
Written by Cygnus Support.
|
Written by Cygnus Support.
|
||||||
|
|
||||||
|
@ -2833,7 +2833,7 @@ NAME(aout,find_nearest_line)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (main_file_name == NULL
|
if (main_file_name == NULL
|
||||||
|| main_file_name[0] == '/'
|
|| IS_ABSOLUTE_PATH (main_file_name)
|
||||||
|| directory_name == NULL)
|
|| directory_name == NULL)
|
||||||
filelen = 0;
|
filelen = 0;
|
||||||
else
|
else
|
||||||
|
@ -2857,7 +2857,7 @@ NAME(aout,find_nearest_line)
|
||||||
|
|
||||||
if (main_file_name != NULL)
|
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;
|
*filename_ptr = main_file_name;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* BFD back-end for archive files (libraries).
|
/* 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.
|
Free Software Foundation, Inc.
|
||||||
Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault.
|
Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault.
|
||||||
|
|
||||||
|
@ -1183,6 +1183,17 @@ normalize (abfd, file)
|
||||||
{
|
{
|
||||||
const char *filename = strrchr (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)
|
if (filename != (char *) NULL)
|
||||||
filename++;
|
filename++;
|
||||||
else
|
else
|
||||||
|
@ -1566,6 +1577,17 @@ bfd_bsd_truncate_arname (abfd, pathname, arhdr)
|
||||||
CONST char *filename = strrchr (pathname, '/');
|
CONST char *filename = strrchr (pathname, '/');
|
||||||
int maxlen = ar_maxnamelen (abfd);
|
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)
|
if (filename == NULL)
|
||||||
filename = pathname;
|
filename = pathname;
|
||||||
else
|
else
|
||||||
|
@ -1606,6 +1628,17 @@ bfd_gnu_truncate_arname (abfd, pathname, arhdr)
|
||||||
CONST char *filename = strrchr (pathname, '/');
|
CONST char *filename = strrchr (pathname, '/');
|
||||||
int maxlen = ar_maxnamelen (abfd);
|
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)
|
if (filename == NULL)
|
||||||
filename = pathname;
|
filename = pathname;
|
||||||
else
|
else
|
||||||
|
|
10
bfd/cache.c
10
bfd/cache.c
|
@ -1,5 +1,6 @@
|
||||||
/* BFD library -- caching of file descriptors.
|
/* 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).
|
Hacked by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
|
||||||
|
|
||||||
This file is part of BFD, the Binary File Descriptor library.
|
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
|
So we unlink the output file if and only if it has
|
||||||
non-zero size. */
|
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;
|
struct stat s;
|
||||||
|
|
||||||
if (stat (abfd->filename, &s) == 0 && s.st_size != 0)
|
if (stat (abfd->filename, &s) == 0 && s.st_size != 0)
|
||||||
unlink (abfd->filename);
|
unlink (abfd->filename);
|
||||||
|
#endif
|
||||||
abfd->iostream = (PTR) fopen (abfd->filename, FOPEN_WB);
|
abfd->iostream = (PTR) fopen (abfd->filename, FOPEN_WB);
|
||||||
abfd->opened_once = true;
|
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
|
/* 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.
|
Written by Cygnus Support.
|
||||||
|
|
||||||
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
||||||
|
@ -102,6 +102,8 @@ extern char *strrchr ();
|
||||||
#define SEEK_CUR 1
|
#define SEEK_CUR 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "filenames.h"
|
||||||
|
|
||||||
#ifdef NEED_DECLARATION_STRSTR
|
#ifdef NEED_DECLARATION_STRSTR
|
||||||
extern char *strstr ();
|
extern char *strstr ();
|
||||||
#endif
|
#endif
|
||||||
|
@ -131,14 +133,13 @@ extern char *getenv ();
|
||||||
#define N_(String) (String)
|
#define N_(String) (String)
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
/* Stubs that do something close enough. */
|
# define gettext(Msgid) (Msgid)
|
||||||
#define textdomain(String) (String)
|
# define dgettext(Domainname, Msgid) (Msgid)
|
||||||
#define gettext(String) (String)
|
# define dcgettext(Domainname, Msgid, Category) (Msgid)
|
||||||
#define dgettext(Domain,Message) (Message)
|
# define textdomain(Domainname) while (0) /* nothing */
|
||||||
#define dcgettext(Domain,Message,Type) (Message)
|
# define bindtextdomain(Domainname, Dirname) while (0) /* nothing */
|
||||||
#define bindtextdomain(Domain,Directory) (Domain)
|
# define _(String) (String)
|
||||||
#define _(String) (String)
|
# define N_(String) (String)
|
||||||
#define N_(String) (String)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* ! defined (BFD_SYSDEP_H) */
|
#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>
|
2000-05-24 Alan Modra <alan@linuxcare.com.au>
|
||||||
|
|
||||||
* objdump.c (display_target_list): Close the bfd.
|
* 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 "aout/ar.h"
|
||||||
#include "libbfd.h"
|
#include "libbfd.h"
|
||||||
#include "arsup.h"
|
#include "arsup.h"
|
||||||
|
#include "filenames.h"
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#ifdef __GO32___
|
#ifdef __GO32___
|
||||||
|
@ -215,7 +216,7 @@ map_over_members (arch, function, files, count)
|
||||||
bfd_stat_arch_elt (head, &buf);
|
bfd_stat_arch_elt (head, &buf);
|
||||||
}
|
}
|
||||||
if ((head->filename != NULL) &&
|
if ((head->filename != NULL) &&
|
||||||
(!strcmp (normalize (*files, arch), head->filename)))
|
(!FILENAME_CMP (normalize (*files, arch), head->filename)))
|
||||||
{
|
{
|
||||||
++match_count;
|
++match_count;
|
||||||
if (counted_name_mode
|
if (counted_name_mode
|
||||||
|
@ -302,6 +303,16 @@ normalize (file, abfd)
|
||||||
return file;
|
return file;
|
||||||
|
|
||||||
filename = strrchr (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)
|
if (filename != (char *) NULL)
|
||||||
filename++;
|
filename++;
|
||||||
else
|
else
|
||||||
|
@ -377,12 +388,22 @@ main (argc, argv)
|
||||||
char *temp;
|
char *temp;
|
||||||
|
|
||||||
temp = strrchr (program_name, '/');
|
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)
|
if (temp == NULL)
|
||||||
temp = program_name;
|
temp = program_name;
|
||||||
else
|
else
|
||||||
++temp;
|
++temp;
|
||||||
if (strlen (temp) >= 6
|
if (strlen (temp) >= 6
|
||||||
&& strcmp (temp + strlen (temp) - 6, "ranlib") == 0)
|
&& FILENAME_CMP (temp + strlen (temp) - 6, "ranlib") == 0)
|
||||||
is_ranlib = 1;
|
is_ranlib = 1;
|
||||||
else
|
else
|
||||||
is_ranlib = 0;
|
is_ranlib = 0;
|
||||||
|
@ -697,12 +718,15 @@ open_inarch (archive_filename, file)
|
||||||
|
|
||||||
if (stat (archive_filename, &sbuf) != 0)
|
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
|
/* KLUDGE ALERT! Temporary fix until I figger why
|
||||||
* stat() is wrong ... think it's buried in GO32's IDT
|
stat() is wrong ... think it's buried in GO32's IDT - Jax */
|
||||||
* - Jax
|
|
||||||
*/
|
|
||||||
if (errno != ENOENT)
|
if (errno != ENOENT)
|
||||||
bfd_fatal (archive_filename);
|
bfd_fatal (archive_filename);
|
||||||
#endif
|
#endif
|
||||||
|
@ -932,12 +956,18 @@ do_quick_append (archive_filename, files_to_append)
|
||||||
if (stat (archive_filename, &sbuf) != 0)
|
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
|
/* KLUDGE ALERT! Temporary fix until I figger why
|
||||||
* stat() is wrong ... think it's buried in GO32's IDT
|
stat() is wrong ... think it's buried in GO32's IDT - Jax */
|
||||||
* - Jax
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (errno != ENOENT)
|
if (errno != ENOENT)
|
||||||
bfd_fatal (archive_filename);
|
bfd_fatal (archive_filename);
|
||||||
|
@ -1107,7 +1137,7 @@ get_pos_bfd (contents, default_pos, default_posname)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (; *after_bfd; after_bfd = &(*after_bfd)->next)
|
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)
|
if (realpos == pos_after)
|
||||||
after_bfd = &(*after_bfd)->next;
|
after_bfd = &(*after_bfd)->next;
|
||||||
|
@ -1147,7 +1177,7 @@ delete_members (arch, files_to_delete)
|
||||||
current_ptr_ptr = &(arch->next);
|
current_ptr_ptr = &(arch->next);
|
||||||
while (*current_ptr_ptr)
|
while (*current_ptr_ptr)
|
||||||
{
|
{
|
||||||
if (strcmp (normalize (*files_to_delete, arch),
|
if (FILENAME_CMP (normalize (*files_to_delete, arch),
|
||||||
(*current_ptr_ptr)->filename) == 0)
|
(*current_ptr_ptr)->filename) == 0)
|
||||||
{
|
{
|
||||||
++match_count;
|
++match_count;
|
||||||
|
@ -1204,8 +1234,8 @@ move_members (arch, files_to_move)
|
||||||
while (*current_ptr_ptr)
|
while (*current_ptr_ptr)
|
||||||
{
|
{
|
||||||
bfd *current_ptr = *current_ptr_ptr;
|
bfd *current_ptr = *current_ptr_ptr;
|
||||||
if (strcmp (normalize (*files_to_move, arch),
|
if (FILENAME_CMP (normalize (*files_to_move, arch),
|
||||||
current_ptr->filename) == 0)
|
current_ptr->filename) == 0)
|
||||||
{
|
{
|
||||||
/* Move this file to the end of the list - first cut from
|
/* Move this file to the end of the list - first cut from
|
||||||
where it is. */
|
where it is. */
|
||||||
|
@ -1260,8 +1290,8 @@ replace_members (arch, files_to_move, quick)
|
||||||
|
|
||||||
/* For compatibility with existing ar programs, we
|
/* For compatibility with existing ar programs, we
|
||||||
permit the same file to be added multiple times. */
|
permit the same file to be added multiple times. */
|
||||||
if (strcmp (normalize (*files_to_move, arch),
|
if (FILENAME_CMP (normalize (*files_to_move, arch),
|
||||||
normalize (current->filename, arch)) == 0
|
normalize (current->filename, arch)) == 0
|
||||||
&& current->arelt_data != NULL)
|
&& current->arelt_data != NULL)
|
||||||
{
|
{
|
||||||
if (newer_only)
|
if (newer_only)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* arsup.c - Archive support for MRI compatibility
|
/* 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.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Binutils.
|
This file is part of GNU Binutils.
|
||||||
|
@ -31,6 +31,7 @@ style librarian command syntax + 1 word LIST
|
||||||
#include "arsup.h"
|
#include "arsup.h"
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "bucomm.h"
|
#include "bucomm.h"
|
||||||
|
#include "filenames.h"
|
||||||
|
|
||||||
static void map_over_list
|
static void map_over_list
|
||||||
PARAMS ((bfd *, void (*function) (bfd *, bfd *), struct 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)
|
for (head = arch->next; head; head = head->next)
|
||||||
{
|
{
|
||||||
if (head->filename != NULL
|
if (head->filename != NULL
|
||||||
&& strcmp (ptr->name, head->filename) == 0)
|
&& FILENAME_CMP (ptr->name, head->filename) == 0)
|
||||||
{
|
{
|
||||||
found = true;
|
found = true;
|
||||||
function (head, prev);
|
function (head, prev);
|
||||||
|
@ -160,7 +161,9 @@ DEFUN(ar_open,(name, t),
|
||||||
{
|
{
|
||||||
char *tname = (char *) xmalloc (strlen (name) + 10);
|
char *tname = (char *) xmalloc (strlen (name) + 10);
|
||||||
real_name = name;
|
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);
|
obfd = bfd_openw(tname, NULL);
|
||||||
|
|
||||||
if (!obfd) {
|
if (!obfd) {
|
||||||
|
@ -289,7 +292,7 @@ DEFUN(ar_delete, (list),
|
||||||
bfd **prev = &(obfd->archive_head);
|
bfd **prev = &(obfd->archive_head);
|
||||||
int found = 0;
|
int found = 0;
|
||||||
while (member) {
|
while (member) {
|
||||||
if (strcmp(member->filename, list->name) == 0) {
|
if (FILENAME_CMP(member->filename, list->name) == 0) {
|
||||||
*prev = member->next;
|
*prev = member->next;
|
||||||
found = 1;
|
found = 1;
|
||||||
}
|
}
|
||||||
|
@ -346,7 +349,7 @@ DEFUN(ar_replace, (list),
|
||||||
int found = 0;
|
int found = 0;
|
||||||
while (member)
|
while (member)
|
||||||
{
|
{
|
||||||
if (strcmp(member->filename, list->name) == 0)
|
if (FILENAME_CMP(member->filename, list->name) == 0)
|
||||||
{
|
{
|
||||||
/* Found the one to replace */
|
/* Found the one to replace */
|
||||||
bfd *abfd = bfd_openr(list->name, 0);
|
bfd *abfd = bfd_openr(list->name, 0);
|
||||||
|
@ -437,7 +440,7 @@ DEFUN(ar_extract,(list),
|
||||||
int found = 0;
|
int found = 0;
|
||||||
while (member && !found)
|
while (member && !found)
|
||||||
{
|
{
|
||||||
if (strcmp(member->filename, list->name) == 0)
|
if (FILENAME_CMP(member->filename, list->name) == 0)
|
||||||
{
|
{
|
||||||
extract_file(member);
|
extract_file(member);
|
||||||
found = 1;
|
found = 1;
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "bucomm.h"
|
#include "bucomm.h"
|
||||||
|
#include "filenames.h"
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <time.h> /* ctime, maybe time_t */
|
#include <time.h> /* ctime, maybe time_t */
|
||||||
|
@ -214,9 +215,15 @@ make_tempname (filename)
|
||||||
char *tmpname;
|
char *tmpname;
|
||||||
char *slash = strrchr (filename, '/');
|
char *slash = strrchr (filename, '/');
|
||||||
|
|
||||||
#if defined (__DJGPP__) || defined (__GO32__) || defined (_WIN32)
|
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||||
if (slash == NULL)
|
{
|
||||||
slash = strrchr (filename, '\\');
|
/* 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
|
#endif
|
||||||
|
|
||||||
if (slash != (char *) NULL)
|
if (slash != (char *) NULL)
|
||||||
|
@ -225,8 +232,15 @@ make_tempname (filename)
|
||||||
|
|
||||||
c = *slash;
|
c = *slash;
|
||||||
*slash = 0;
|
*slash = 0;
|
||||||
tmpname = xmalloc (strlen (filename) + sizeof (template) + 1);
|
tmpname = xmalloc (strlen (filename) + sizeof (template) + 2);
|
||||||
strcpy (tmpname, filename);
|
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, "/");
|
||||||
strcat (tmpname, template);
|
strcat (tmpname, template);
|
||||||
mktemp (tmpname);
|
mktemp (tmpname);
|
||||||
|
|
|
@ -82,6 +82,9 @@
|
||||||
/* Define if you have the setlocale function. */
|
/* Define if you have the setlocale function. */
|
||||||
#undef HAVE_SETLOCALE
|
#undef HAVE_SETLOCALE
|
||||||
|
|
||||||
|
/* Define if you have the setmode function. */
|
||||||
|
#undef HAVE_SETMODE
|
||||||
|
|
||||||
/* Define if you have the stpcpy function. */
|
/* Define if you have the stpcpy function. */
|
||||||
#undef HAVE_STPCPY
|
#undef HAVE_STPCPY
|
||||||
|
|
||||||
|
|
2
binutils/configure
vendored
2
binutils/configure
vendored
|
@ -4325,7 +4325,7 @@ EOF
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for ac_func in sbrk utimes
|
for ac_func in sbrk utimes setmode
|
||||||
do
|
do
|
||||||
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
||||||
echo "configure:4332: checking for $ac_func" >&5
|
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_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h)
|
||||||
AC_HEADER_SYS_WAIT
|
AC_HEADER_SYS_WAIT
|
||||||
AC_FUNC_ALLOCA
|
AC_FUNC_ALLOCA
|
||||||
AC_CHECK_FUNCS(sbrk utimes)
|
AC_CHECK_FUNCS(sbrk utimes setmode)
|
||||||
|
|
||||||
# Some systems have frexp only in -lm, not in -lc.
|
# Some systems have frexp only in -lm, not in -lc.
|
||||||
AC_SEARCH_LIBS(frexp, m)
|
AC_SEARCH_LIBS(frexp, m)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* ieee.c -- Read and write IEEE-695 debugging information.
|
/* 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>.
|
Written by Ian Lance Taylor <ian@cygnus.com>.
|
||||||
|
|
||||||
This file is part of GNU Binutils.
|
This file is part of GNU Binutils.
|
||||||
|
@ -30,6 +30,7 @@
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "budbg.h"
|
#include "budbg.h"
|
||||||
|
#include "filenames.h"
|
||||||
|
|
||||||
/* This structure holds an entry on the block stack. */
|
/* 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;
|
struct ieee_handle *info = (struct ieee_handle *) p;
|
||||||
const char *modname;
|
const char *modname;
|
||||||
|
const char *backslash;
|
||||||
char *c, *s;
|
char *c, *s;
|
||||||
unsigned int nindx;
|
unsigned int nindx;
|
||||||
|
|
||||||
|
@ -4937,16 +4939,20 @@ ieee_start_compilation_unit (p, filename)
|
||||||
|
|
||||||
info->filename = filename;
|
info->filename = filename;
|
||||||
modname = strrchr (filename, '/');
|
modname = strrchr (filename, '/');
|
||||||
|
/* We could have a mixed forward/back slash case. */
|
||||||
|
backslash = strrchr (modname, '\\');
|
||||||
|
if (backslash > modname)
|
||||||
|
modname = backslash;
|
||||||
|
|
||||||
if (modname != NULL)
|
if (modname != NULL)
|
||||||
++modname;
|
++modname;
|
||||||
|
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||||
|
else if (filename[0] && filename[1] == ':')
|
||||||
|
modname = filename + 2;
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
modname = filename;
|
||||||
modname = strrchr (filename, '\\');
|
|
||||||
if (modname != NULL)
|
|
||||||
++modname;
|
|
||||||
else
|
|
||||||
modname = filename;
|
|
||||||
}
|
|
||||||
c = xstrdup (modname);
|
c = xstrdup (modname);
|
||||||
s = strrchr (c, '.');
|
s = strrchr (c, '.');
|
||||||
if (s != NULL)
|
if (s != NULL)
|
||||||
|
@ -5194,22 +5200,25 @@ ieee_add_bb11 (info, sec, low, high)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const char *filename, *modname;
|
const char *filename, *modname, *backslash;
|
||||||
char *c, *s;
|
char *c, *s;
|
||||||
|
|
||||||
/* Start the enclosing BB10 block. */
|
/* Start the enclosing BB10 block. */
|
||||||
filename = bfd_get_filename (info->abfd);
|
filename = bfd_get_filename (info->abfd);
|
||||||
modname = strrchr (filename, '/');
|
modname = strrchr (filename, '/');
|
||||||
|
backslash = strrchr (modname, '\\');
|
||||||
|
if (backslash > modname)
|
||||||
|
modname = backslash;
|
||||||
|
|
||||||
if (modname != NULL)
|
if (modname != NULL)
|
||||||
++modname;
|
++modname;
|
||||||
|
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
|
||||||
|
else if (filename[0] && filename[1] == ':')
|
||||||
|
modname = filename + 2;
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
modname = filename;
|
||||||
modname = strrchr (filename, '\\');
|
|
||||||
if (modname != NULL)
|
|
||||||
++modname;
|
|
||||||
else
|
|
||||||
modname = filename;
|
|
||||||
}
|
|
||||||
c = xstrdup (modname);
|
c = xstrdup (modname);
|
||||||
s = strrchr (c, '.');
|
s = strrchr (c, '.');
|
||||||
if (s != NULL)
|
if (s != NULL)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* objcopy.c -- copy object file from input to output, optionally massaging it.
|
/* 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.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GNU Binutils.
|
This file is part of GNU Binutils.
|
||||||
|
@ -25,6 +25,7 @@
|
||||||
#include "getopt.h"
|
#include "getopt.h"
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "budbg.h"
|
#include "budbg.h"
|
||||||
|
#include "filenames.h"
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
/* A list of symbols to explicitly strip out, or to keep. A linked
|
/* A list of symbols to explicitly strip out, or to keep. A linked
|
||||||
|
@ -2253,7 +2254,15 @@ main (argc, argv)
|
||||||
if (is_strip < 0)
|
if (is_strip < 0)
|
||||||
{
|
{
|
||||||
int i = strlen (program_name);
|
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)
|
if (is_strip)
|
||||||
|
|
|
@ -59,6 +59,23 @@
|
||||||
#include "bucomm.h"
|
#include "bucomm.h"
|
||||||
#include "libiberty.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
|
#ifdef isascii
|
||||||
#define isgraphic(c) (isascii (c) && isprint (c))
|
#define isgraphic(c) (isascii (c) && isprint (c))
|
||||||
#else
|
#else
|
||||||
|
@ -218,6 +235,9 @@ main (argc, argv)
|
||||||
if (optind >= argc)
|
if (optind >= argc)
|
||||||
{
|
{
|
||||||
datasection_only = false;
|
datasection_only = false;
|
||||||
|
#ifdef SET_BINARY
|
||||||
|
SET_BINARY (fileno (stdin));
|
||||||
|
#endif
|
||||||
print_strings ("{standard input}", stdin, 0, 0, 0, (char *) NULL);
|
print_strings ("{standard input}", stdin, 0, 0, 0, (char *) NULL);
|
||||||
files_given = true;
|
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>
|
Fri Apr 7 15:56:57 2000 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* configure.in (WARN_CFLAGS): Set to -W -Wall by default. Add
|
* 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_PROG_INSTALL
|
||||||
|
|
||||||
AC_ISC_POSIX
|
AC_ISC_POSIX
|
||||||
|
AC_CHECK_FUNCS(setmode)
|
||||||
|
|
||||||
ALL_LINGUAS=
|
ALL_LINGUAS=
|
||||||
CY_GNU_GETTEXT
|
CY_GNU_GETTEXT
|
||||||
|
|
|
@ -73,6 +73,9 @@
|
||||||
/* Define if you have the setlocale function. */
|
/* Define if you have the setlocale function. */
|
||||||
#undef HAVE_SETLOCALE
|
#undef HAVE_SETLOCALE
|
||||||
|
|
||||||
|
/* Define if you have the setmode function. */
|
||||||
|
#undef HAVE_SETMODE
|
||||||
|
|
||||||
/* Define if you have the stpcpy function. */
|
/* Define if you have the stpcpy function. */
|
||||||
#undef HAVE_STPCPY
|
#undef HAVE_STPCPY
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,9 @@ DEFUN (gmon_out_read, (filename), const char *filename)
|
||||||
if (strcmp (filename, "-") == 0)
|
if (strcmp (filename, "-") == 0)
|
||||||
{
|
{
|
||||||
ifp = stdin;
|
ifp = stdin;
|
||||||
|
#ifdef SET_BINARY
|
||||||
|
SET_BINARY (fileno (stdin));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,6 +4,24 @@
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
#include "gmon.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_HISTOGRAM (1<<0)
|
||||||
#define INPUT_CALL_GRAPH (1<<1)
|
#define INPUT_CALL_GRAPH (1<<1)
|
||||||
#define INPUT_BB_COUNTS (1<<2)
|
#define INPUT_BB_COUNTS (1<<2)
|
||||||
|
|
|
@ -16,7 +16,7 @@ END-INFO-DIR-ENTRY
|
||||||
@ifinfo
|
@ifinfo
|
||||||
This file documents the gprof profiler of the GNU system.
|
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
|
Permission is granted to make and distribute verbatim copies of
|
||||||
this manual provided the copyright notice and this permission notice
|
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
|
execution time. We assume that you know how to write, compile, and
|
||||||
execute programs. @sc{gnu} @code{gprof} was written by Jay Fenlason.
|
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
|
@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
|
Permission is granted to make and distribute verbatim copies of
|
||||||
this manual provided the copyright notice and this permission notice
|
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
|
execution time. We assume that you know how to write, compile, and
|
||||||
execute programs. @sc{gnu} @code{gprof} was written by Jay Fenlason.
|
execute programs. @sc{gnu} @code{gprof} was written by Jay Fenlason.
|
||||||
|
|
||||||
This manual was updated August 1997 by Brent Baccala.
|
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Introduction:: What profiling means, and why it is useful.
|
* 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
|
* Output Options:: Controlling @code{gprof}'s output style
|
||||||
* Analysis Options:: Controlling how @code{gprof} analyses its data
|
* Analysis Options:: Controlling how @code{gprof} analyses its data
|
||||||
* Miscellaneous Options::
|
* 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
|
have been retained for compatibility
|
||||||
* Symspecs:: Specifying functions to include or exclude
|
* Symspecs:: Specifying functions to include or exclude
|
||||||
@end menu
|
@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.
|
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 @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
|
the @samp{-l} option, along with @samp{-C}, will cause basic-block
|
||||||
execution counts to be tallied and displayed.
|
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}
|
@itemx --directory-path=@var{dirs}
|
||||||
The @samp{-I} option specifies a list of search directories in
|
The @samp{-I} option specifies a list of search directories in
|
||||||
which to find source files. Environment variable @var{GPROF_PATH}
|
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.
|
Used mostly for annotated source output.
|
||||||
|
|
||||||
@item -J[@var{symspec}]
|
@item -J[@var{symspec}]
|
||||||
|
@ -407,10 +402,15 @@ but excludes matching symbols.
|
||||||
@item -y
|
@item -y
|
||||||
@itemx --separate-files
|
@itemx --separate-files
|
||||||
This option affects annotated source output only.
|
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,
|
to standard-output. If this option is specified,
|
||||||
annotated source for a file named @file{path/filename}
|
annotated source for a file named @file{path/@var{filename}}
|
||||||
is generated in the file @file{filename-ann}.
|
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}]
|
@item -Z[@var{symspec}]
|
||||||
@itemx --no-exec-counts[=@var{symspec}]
|
@itemx --no-exec-counts[=@var{symspec}]
|
||||||
|
@ -456,7 +456,8 @@ c-decl.o:00000000 T print_lang_type
|
||||||
@end group
|
@end group
|
||||||
@end smallexample
|
@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
|
@item -T
|
||||||
@itemx --traditional
|
@itemx --traditional
|
||||||
|
@ -565,7 +566,7 @@ that had no time spent in them. This is useful in conjunction with the
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node Miscellaneous Options,Depricated Options,Analysis Options,Invoking
|
@node Miscellaneous Options,Deprecated Options,Analysis Options,Invoking
|
||||||
@section Miscellaneous Options
|
@section Miscellaneous Options
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
|
@ -601,8 +602,8 @@ number, and then exit.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node Depricated Options,Symspecs,Miscellaneous Options,Invoking
|
@node Deprecated Options,Symspecs,Miscellaneous Options,Invoking
|
||||||
@section Depricated Options
|
@section Deprecated Options
|
||||||
|
|
||||||
@table @code
|
@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
|
lists in the call graph all functions that were reached from either
|
||||||
@code{foo} or @code{bar} and were not reachable from @code{boring}.
|
@code{foo} or @code{bar} and were not reachable from @code{boring}.
|
||||||
|
|
||||||
@node Symspecs,,Depricated Options,Invoking
|
@node Symspecs,,Deprecated Options,Invoking
|
||||||
@section Symspecs
|
@section Symspecs
|
||||||
|
|
||||||
Many of the output options allow functions to be included or excluded
|
Many of the output options allow functions to be included or excluded
|
||||||
|
@ -672,7 +673,7 @@ Here are some sample symspecs:
|
||||||
@table @samp
|
@table @samp
|
||||||
@item main.c
|
@item main.c
|
||||||
Selects everything in file @file{main.c}---the
|
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
|
the string as a filename, rather than as
|
||||||
a function name. To select a file whose
|
a function name. To select a file whose
|
||||||
name does not contain a dot, a trailing colon
|
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
|
to add a leading colon to the name. For example, @samp{:.mul} selects
|
||||||
function @samp{.mul}.
|
function @samp{.mul}.
|
||||||
|
|
||||||
In some object file formats, symbols have a leading underscore. gprof
|
In some object file formats, symbols have a leading underscore.
|
||||||
will normally not print these underscores. However, you must use the
|
@code{gprof} will normally not print these underscores. When you name a
|
||||||
underscore when you name a symbol in a symspec. You can use the
|
symbol in a symspec, you should type it exactly as @code{gprof} prints
|
||||||
@code{nm} program to see whether symbols have underscores for the object
|
it in its output. For example, if the compiler produces a symbol
|
||||||
file format you are using.
|
@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
|
@item main.c:main
|
||||||
Selects function @samp{main} in file @file{main.c}.
|
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,
|
The functions are sorted by first by decreasing run-time spent in them,
|
||||||
then by decreasing number of calls, then alphabetically by name. The
|
then by decreasing number of calls, then alphabetically by name. The
|
||||||
functions @samp{mcount} and @samp{profil} are part of the profiling
|
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.
|
the amount of overhead due to profiling.
|
||||||
|
|
||||||
Just before the column headers, a statement appears indicating
|
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
|
The program's total execution time was 0.06
|
||||||
seconds, as indicated by the @samp{cumulative seconds} field. Since
|
seconds, as indicated by the @samp{cumulative seconds} field. Since
|
||||||
each sample counted for 0.01 seconds, this means only six samples
|
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
|
program was in the @samp{open} function, as indicated by the
|
||||||
@samp{self seconds} field. Each of the other four samples
|
@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}.
|
and @samp{mcount}.
|
||||||
Since only six samples were taken, none of these values can
|
Since only six samples were taken, none of these values can
|
||||||
be regarded as particularly reliable.
|
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
|
@item called
|
||||||
Two numbers: the number of times @code{report} was called from @code{main},
|
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.
|
all its callers.
|
||||||
|
|
||||||
@item name and index number
|
@item name and index number
|
||||||
|
@ -1078,7 +1081,7 @@ of the total time spent in calls to @code{report} from @code{main}.
|
||||||
|
|
||||||
@item called
|
@item called
|
||||||
Two numbers, the number of calls to @code{report} from @code{main}
|
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}
|
This ratio is used to determine how much of @code{report}'s @code{self}
|
||||||
and @code{children} time gets credited to @code{main}.
|
and @code{children} time gets credited to @code{main}.
|
||||||
@xref{Assumptions}.
|
@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
|
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
|
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
|
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.
|
recursive calls.
|
||||||
|
|
||||||
The @code{calls} field of a subroutine-line for a cycle member in the
|
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,
|
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
|
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
|
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
|
note how
|
||||||
@code{ct_init}'s 13327 calls to @code{init_block} are broken down
|
@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
|
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
|
Compiling with @samp{gcc @dots{} -g -pg -a} augments your program
|
||||||
with basic-block counting code, in addition to function counting code.
|
with basic-block counting code, in addition to function counting code.
|
||||||
This enables @code{gprof} to determine how many times each line
|
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,
|
For example, consider the following function, taken from gzip,
|
||||||
with line numbers added:
|
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.
|
basic-blocks to handle various special cases.
|
||||||
|
|
||||||
A program augmented for basic-block counting can be analyzed with
|
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.
|
which ensures that each line of code is labeled at least once.
|
||||||
Here is @code{updcrc}'s
|
Here is @code{updcrc}'s
|
||||||
annotated source listing for a sample @code{gzip} run:
|
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?
|
@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.
|
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?
|
@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
|
@item
|
||||||
In the annotated source listing,
|
In the annotated source listing,
|
||||||
if there are multiple basic blocks on the same line,
|
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
|
@ignore - it does this now
|
||||||
@item
|
@item
|
||||||
|
@ -1601,7 +1604,7 @@ tables without skipping the blurbs.
|
||||||
@chapter Details of Profiling
|
@chapter Details of Profiling
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Implementation:: How a program collets profiling information
|
* Implementation:: How a program collects profiling information
|
||||||
* File Format:: Format of @samp{gmon.out} files
|
* File Format:: Format of @samp{gmon.out} files
|
||||||
* Internals:: @code{gprof}'s internal operation
|
* Internals:: @code{gprof}'s internal operation
|
||||||
* Debugging:: Using @code{gprof}'s @samp{-d} option
|
* 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
|
both its parent routine (the child) and its parent's parent. This is
|
||||||
typically done by examining the stack frame to find both
|
typically done by examining the stack frame to find both
|
||||||
the address of the child, and the return address in the original parent.
|
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
|
itself is typically a short assembly-language stub routine
|
||||||
that extracts the required
|
that extracts the required
|
||||||
information, and then calls @code{__mcount_internal}
|
information, and then calls @code{__mcount_internal}
|
||||||
(a normal C function) with two arguments - @code{frompc} and @code{selfpc}.
|
(a normal C function) with two arguments - @code{frompc} and @code{selfpc}.
|
||||||
@code{__mcount_internal} is responsible for maintaining
|
@code{__mcount_internal} is responsible for maintaining
|
||||||
the in-memory call graph, which records @code{frompc}, @code{selfpc},
|
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}),
|
GCC Version 2 provides a magical function (@code{__builtin_return_address}),
|
||||||
which allows a generic @code{mcount} function to extract the
|
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
|
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
|
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}
|
rendering changes to the file format almost impossible. @sc{gnu} @code{gprof}
|
||||||
uses a new file format that provides these features. For backward
|
uses a new file format that provides these features. For backward
|
||||||
compatibility, @sc{gnu} @code{gprof} continues to support the old BSD-derived
|
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,
|
verify that it is an object file,
|
||||||
and read its symbol table (@code{core.c:core_init}),
|
and read its symbol table (@code{core.c:core_init}),
|
||||||
using @code{bfd_canonicalize_symtab} after mallocing
|
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
|
function mappings are read (if the @samp{--file-ordering} option
|
||||||
has been specified), and the core text space is read into
|
has been specified), and the core text space is read into
|
||||||
memory (if the @samp{-c} option was given).
|
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,
|
table - one to count the size of the symbol table required,
|
||||||
and the other to actually read the symbols. In between the
|
and the other to actually read the symbols. In between the
|
||||||
two passes, a single array of type @code{Sym} is created of
|
two passes, a single array of type @code{Sym} is created of
|
||||||
the appropiate length.
|
the appropriate length.
|
||||||
Finally, @code{symtab.c:symtab_finalize}
|
Finally, @code{symtab.c:symtab_finalize}
|
||||||
is called to sort the symbol table and remove duplicate entries
|
is called to sort the symbol table and remove duplicate entries
|
||||||
(entries with the same memory address).
|
(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.
|
a hit, for example.
|
||||||
|
|
||||||
If call graph data is present, @code{cg_arcs.c:cg_assemble} is called.
|
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,
|
routine (@code{find_call}) scans through each symbol's machine code,
|
||||||
looking for subroutine call instructions, and adding them
|
looking for subroutine call instructions, and adding them
|
||||||
to the call graph with a zero call count.
|
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.
|
of which are assigned the same topological number.
|
||||||
Two passes are now made through this sorted array of symbol pointers.
|
Two passes are now made through this sorted array of symbol pointers.
|
||||||
The first pass, from end to beginning (parents to children),
|
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.
|
and a print flag.
|
||||||
The print flag reflects symspec handling of INCL_GRAPH/EXCL_GRAPH,
|
The print flag reflects symspec handling of INCL_GRAPH/EXCL_GRAPH,
|
||||||
with a parent's include or exclude (print or no print) property
|
with a parent's include or exclude (print or no print) property
|
||||||
being propagated to its children, unless they themselves explicitly appear
|
being propagated to its children, unless they themselves explicitly appear
|
||||||
in INCL_GRAPH or EXCL_GRAPH.
|
in INCL_GRAPH or EXCL_GRAPH.
|
||||||
A second pass, from beginning to end (children to parents) actually
|
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.
|
to a check against INCL_TIME/EXCL_TIME.
|
||||||
With the print flag, fractions, and timings now stored in the symbol
|
With the print flag, fractions, and timings now stored in the symbol
|
||||||
structures, the topological sort array is now discarded, and a
|
structures, the topological sort array is now discarded, and a
|
||||||
|
|
|
@ -19,10 +19,6 @@
|
||||||
#include "hertz.h"
|
#include "hertz.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef __MSDOS__
|
|
||||||
#define HERTZ 18
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
int
|
||||||
hertz ()
|
hertz ()
|
||||||
{
|
{
|
||||||
|
@ -38,17 +34,19 @@ hertz ()
|
||||||
tim.it_value.tv_usec = 0;
|
tim.it_value.tv_usec = 0;
|
||||||
setitimer (ITIMER_REAL, &tim, 0);
|
setitimer (ITIMER_REAL, &tim, 0);
|
||||||
setitimer (ITIMER_REAL, 0, &tim);
|
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;
|
#endif /* ! defined (HAVE_SETITIMER) */
|
||||||
#else /* ! defined (HAVE_SETITIMER) */
|
|
||||||
#if defined (HAVE_SYSCONF) && defined (_SC_CLK_TCK)
|
#if defined (HAVE_SYSCONF) && defined (_SC_CLK_TCK)
|
||||||
return sysconf (_SC_CLK_TCK);
|
return sysconf (_SC_CLK_TCK);
|
||||||
#else /* ! defined (HAVE_SYSCONF) || ! defined (_SC_CLK_TCK) */
|
#else /* ! defined (HAVE_SYSCONF) || ! defined (_SC_CLK_TCK) */
|
||||||
|
#ifdef __MSDOS__
|
||||||
|
return 18;
|
||||||
|
#else /* ! defined (__MSDOS__) */
|
||||||
return HZ_WRONG;
|
return HZ_WRONG;
|
||||||
|
#endif /* ! defined (__MSDOS__) */
|
||||||
#endif /* ! defined (HAVE_SYSCONF) || ! defined (_SC_CLK_TCK) */
|
#endif /* ! defined (HAVE_SYSCONF) || ! defined (_SC_CLK_TCK) */
|
||||||
#endif /* ! defined (HAVE_SETITIMER) */
|
|
||||||
#endif /* ! defined (HERTZ) */
|
#endif /* ! defined (HERTZ) */
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ DEFUN (search_list_append, (list, paths),
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
beg = colon + 1;
|
beg = colon + 1;
|
||||||
colon = strchr (beg, ':');
|
colon = strchr (beg, PATH_SEP_CHAR);
|
||||||
if (colon)
|
if (colon)
|
||||||
{
|
{
|
||||||
len = colon - beg;
|
len = colon - beg;
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
#ifndef search_list_h
|
#ifndef search_list_h
|
||||||
#define 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
|
typedef struct search_list_elem
|
||||||
{
|
{
|
||||||
struct search_list_elem *next;
|
struct search_list_elem *next;
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
/*
|
/*
|
||||||
* Keeps track of source files.
|
* Keeps track of source files.
|
||||||
*/
|
*/
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "gprof.h"
|
#include "gprof.h"
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
|
#include "filenames.h"
|
||||||
#include "search_list.h"
|
#include "search_list.h"
|
||||||
#include "source.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)
|
for (sf = first_src_file; sf; sf = sf->next)
|
||||||
{
|
{
|
||||||
if (strcmp (path, sf->name) == 0)
|
if (FILENAME_CMP (path, sf->name) == 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -66,7 +69,7 @@ DEFUN (source_file_lookup_name, (filename), const char *filename)
|
||||||
{
|
{
|
||||||
fname = sf->name;
|
fname = sf->name;
|
||||||
}
|
}
|
||||||
if (strcmp (filename, fname) == 0)
|
if (FILENAME_CMP (filename, fname) == 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -95,7 +98,7 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
|
||||||
* open succeeds or reaching end of list:
|
* open succeeds or reaching end of list:
|
||||||
*/
|
*/
|
||||||
strcpy (fname, sf->name);
|
strcpy (fname, sf->name);
|
||||||
if (sf->name[0] == '/')
|
if (IS_ABSOLUTE_PATH (sf->name))
|
||||||
{
|
{
|
||||||
sle = 0; /* don't use search list for absolute paths */
|
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)
|
if (!sle && !name_only)
|
||||||
{
|
{
|
||||||
name_only = strrchr (sf->name, '/');
|
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)
|
if (name_only)
|
||||||
{
|
{
|
||||||
/* try search-list again, but this time with 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)
|
if (sle)
|
||||||
{
|
{
|
||||||
strcpy (fname, sle->path);
|
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, "/");
|
strcat (fname, "/");
|
||||||
if (name_only)
|
if (name_only)
|
||||||
{
|
{
|
||||||
|
@ -156,6 +173,15 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
|
||||||
|
|
||||||
/* create annotation files in the current working directory: */
|
/* create annotation files in the current working directory: */
|
||||||
filename = strrchr (sf->name, '/');
|
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)
|
if (filename)
|
||||||
{
|
{
|
||||||
++filename;
|
++filename;
|
||||||
|
@ -167,6 +193,24 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
|
||||||
|
|
||||||
strcpy (fname, filename);
|
strcpy (fname, filename);
|
||||||
strcat (fname, EXT_ANNO);
|
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");
|
ofp = fopen (fname, "w");
|
||||||
if (!ofp)
|
if (!ofp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -201,7 +201,10 @@ DEFUN (match, (pattern, sym), Sym * pattern AND Sym * sym)
|
||||||
{
|
{
|
||||||
return (pattern->file ? pattern->file == sym->file : TRUE)
|
return (pattern->file ? pattern->file == sym->file : TRUE)
|
||||||
&& (pattern->line_num ? pattern->line_num == sym->line_num : 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>
|
2000-05-17 S. Bharadwaj Yadavalli <sby@scrugs.lkg.dec.com>
|
||||||
Rick Gorton <gorton@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>
|
2000-05-22 Igor Shevlyakov <igor@windriver.com>
|
||||||
|
|
||||||
* ldmain.c (main): When deciding if ".text" section should be
|
* 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.
|
/* 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.
|
Free Software Foundation, Inc.
|
||||||
Written by Steve Chamberlain steve@cygnus.com
|
Written by Steve Chamberlain steve@cygnus.com
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "progress.h"
|
#include "progress.h"
|
||||||
#include "bfdlink.h"
|
#include "bfdlink.h"
|
||||||
|
#include "filenames.h"
|
||||||
|
|
||||||
#include "ld.h"
|
#include "ld.h"
|
||||||
#include "ldmain.h"
|
#include "ldmain.h"
|
||||||
|
@ -569,6 +570,14 @@ set_scripts_dir ()
|
||||||
|
|
||||||
/* Look for "ldscripts" in the dir where our binary is. */
|
/* Look for "ldscripts" in the dir where our binary is. */
|
||||||
end = strrchr (program_name, '/');
|
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)
|
if (end == NULL)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue