* ldmisc.c (vfinfo): For `%I', if the file is in an archive, print

the archive filename too.
This commit is contained in:
David MacKenzie
1994-01-28 21:20:11 +00:00
parent ddd0223e94
commit 288897f490
2 changed files with 89 additions and 80 deletions

View File

@ -1,5 +1,8 @@
Fri Jan 28 09:12:56 1994 David J. Mackenzie (djm@thepub.cygnus.com)
* ldmisc.c (vfinfo): For `%I', if the file is in an archive, print
the archive filename too.
* ldlex.l: Add rule to catch invalid input characters instead of
printing them. Include "ldmain.h" for program_name decl.
(lex_warn_invalid): New function.

View File

@ -1,5 +1,5 @@
/* ldmisc.c
Copyright (C) 1991 Free Software Foundation, Inc.
Copyright (C) 1991, 1993 Free Software Foundation, Inc.
Written by Steve Chamberlain of Cygnus Support.
@ -29,12 +29,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "ldexp.h"
#include "ldlang.h"
#include "ldlex.h"
#include "ldsym.h"
#include "ldmain.h"
#include "ldfile.h"
/* VARARGS*/
static void finfo ();
static const char *demangle PARAMS ((const char *string,
int remove_underscore));
/*
%% literal %
@ -44,7 +45,7 @@ static void finfo ();
%E current bfd error or errno
%I filename from a lang_input_statement_type
%B filename from a bfd
%T symbol table entry
%T symbol name
%X no object output, fail return
%V hex bfd_vma
%v hex bfd_vma, no leading zeros
@ -54,12 +55,12 @@ static void finfo ();
%d integer, like printf
*/
static char *
static const char *
demangle (string, remove_underscore)
char *string;
const char *string;
int remove_underscore;
{
char *res;
const char *res;
if (remove_underscore && output_bfd)
{
if (bfd_get_symbol_leading_char (output_bfd) == string[0])
@ -132,28 +133,15 @@ vfinfo(fp, fmt, arg)
break;
case 'T':
/* symbol table entry */
/* Symbol name. */
{
asymbol *symbol = va_arg(arg, asymbol *);
if (symbol)
{
asection *section = symbol->section;
char *cplusname = demangle(symbol->name, 1);
CONST char *section_name = section->name;
if (section != &bfd_und_section)
{
fprintf(fp,"%s (%s)", cplusname, section_name);
}
const char *name = va_arg (arg, const char *);
if (name != (const char *) NULL)
fprintf (fp, "%s", demangle (name, 1));
else
{
fprintf(fp,"%s", cplusname);
}
}
else
{
fprintf (fp, "no symbol");
}
}
break;
case 'B':
@ -191,6 +179,8 @@ vfinfo(fp, fmt, arg)
lang_input_statement_type *i =
va_arg(arg,lang_input_statement_type *);
if (i->the_bfd->my_archive)
fprintf(fp, "(%s)", i->the_bfd->my_archive->filename);
fprintf(fp,"%s", i->local_sym_name);
}
break;
@ -221,34 +211,50 @@ vfinfo(fp, fmt, arg)
case 'C':
/* Clever filename:linenumber with function name if possible,
or section name as a last resort */
or section name as a last resort. The arguments are a BFD,
a section, and an offset. */
{
CONST char *filename;
CONST char *functionname;
char *cplus_name;
bfd *abfd;
asection *section;
bfd_vma offset;
lang_input_statement_type *entry;
asymbol **asymbols;
const char *filename;
const char *functionname;
unsigned int linenumber;
bfd *abfd = va_arg(arg, bfd *);
asection *section = va_arg(arg, asection *);
asymbol **symbols = va_arg(arg, asymbol **);
bfd_vma offset = va_arg(arg, bfd_vma);
if (bfd_find_nearest_line(abfd,
section,
symbols,
offset,
&filename,
&functionname,
&linenumber))
abfd = va_arg (arg, bfd *);
section = va_arg (arg, asection *);
offset = va_arg (arg, bfd_vma);
entry = (lang_input_statement_type *) abfd->usrdata;
if (entry != (lang_input_statement_type *) NULL
&& entry->asymbols != (asymbol **) NULL)
asymbols = entry->asymbols;
else
{
unsigned int symsize;
unsigned int symbol_count;
symsize = get_symtab_upper_bound (abfd);
asymbols = (asymbol **) ldmalloc (symsize);
symbol_count = bfd_canonicalize_symtab (abfd, asymbols);
if (entry != (lang_input_statement_type *) NULL)
{
entry->asymbols = asymbols;
entry->symbol_count = symbol_count;
}
}
if (bfd_find_nearest_line (abfd, section, asymbols, offset,
&filename, &functionname, &linenumber))
{
if (filename == (char *) NULL)
filename = abfd->filename;
if (functionname != (char *)NULL)
{
cplus_name = demangle(functionname, 1);
fprintf(fp,"%s:%u: %s", filename, linenumber, cplus_name);
}
if (functionname != (char *)NULL)
fprintf (fp, "%s:%u: %s", filename, linenumber,
demangle (functionname, 1));
else if (linenumber != 0)
fprintf (fp, "%s:%u", filename, linenumber);
else
@ -327,18 +333,18 @@ multiple_warn (message1, newsym, message2, oldsym)
char *message2;
asymbol *oldsym;
{
lang_input_statement_type *stat;
lang_input_statement_type *inp_stat;
asymbol **stat_symbols;
stat = (lang_input_statement_type *) bfd_asymbol_bfd (newsym)->usrdata;
stat_symbols = stat ? stat->asymbols : 0;
inp_stat = (lang_input_statement_type *) bfd_asymbol_bfd (newsym)->usrdata;
stat_symbols = inp_stat ? inp_stat->asymbols : 0;
einfo (message1,
bfd_asymbol_bfd (newsym), newsym->section, stat_symbols, newsym->value,
demangle (newsym->name, 1));
stat = (lang_input_statement_type *) bfd_asymbol_bfd (oldsym)->usrdata;
stat_symbols = stat ? stat->asymbols : 0;
inp_stat = (lang_input_statement_type *) bfd_asymbol_bfd (oldsym)->usrdata;
stat_symbols = inp_stat ? inp_stat->asymbols : 0;
einfo (message2,
bfd_asymbol_bfd (oldsym), oldsym->section, stat_symbols, oldsym->value);
@ -394,7 +400,7 @@ PTR
xmalloc (size)
int size;
{
return ldmalloc(size);
return ldmalloc ((size_t) size);
}
@ -414,9 +420,9 @@ ldrealloc (ptr, size)
PTR
xrealloc (ptr, size)
PTR ptr;
size_t size;
int size;
{
return ldrealloc(ptr, size);
return ldrealloc (ptr, (size_t) size);
}