X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ld%2Fldcref.c;h=12cb2942e6ec49531505ef4dd70143f9758242a7;hb=ec49711a16785636a5b9eac3a92bd00382fcb1a9;hp=2f6a46caead990ba5849c9db71f9f08f7222b330;hpb=806fc311517a1001110c6d08ac34b0a78caf1e06;p=external%2Fbinutils.git diff --git a/ld/ldcref.c b/ld/ldcref.c index 2f6a46c..12cb294 100644 --- a/ld/ldcref.c +++ b/ld/ldcref.c @@ -1,6 +1,5 @@ /* ldcref.c -- output a cross reference table - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 1996-2019 Free Software Foundation, Inc. Written by Ian Lance Taylor This file is part of the GNU Binutils. @@ -41,7 +40,8 @@ /* We keep an instance of this structure for each reference to a symbol from a given object. */ -struct cref_ref { +struct cref_ref +{ /* The next reference. */ struct cref_ref *next; /* The object. */ @@ -56,7 +56,8 @@ struct cref_ref { /* We keep a hash table of symbols. Each entry looks like this. */ -struct cref_hash_entry { +struct cref_hash_entry +{ struct bfd_hash_entry root; /* The demangled name. */ const char *demangled; @@ -66,7 +67,8 @@ struct cref_hash_entry { /* This is what the hash table looks like. */ -struct cref_hash_table { +struct cref_hash_table +{ struct bfd_hash_table root; }; @@ -161,7 +163,7 @@ add_cref (const char *name, struct cref_hash_entry *h; struct cref_ref *r; - if (! cref_initialized) + if (!cref_initialized) { if (!bfd_hash_table_init (&cref_table.root, cref_hash_newfunc, sizeof (struct cref_hash_entry))) @@ -344,12 +346,15 @@ cref_fill_array (struct cref_hash_entry *h, void *data) static int cref_sort_array (const void *a1, const void *a2) { - const struct cref_hash_entry * const *p1 = - (const struct cref_hash_entry * const *) a1; - const struct cref_hash_entry * const *p2 = - (const struct cref_hash_entry * const *) a2; + const struct cref_hash_entry *const *p1 + = (const struct cref_hash_entry *const *) a1; + const struct cref_hash_entry *const *p2 + = (const struct cref_hash_entry *const *) a2; - return strcmp ((*p1)->demangled, (*p2)->demangled); + if (demangling) + return strcmp ((*p1)->demangled, (*p2)->demangled); + else + return strcmp ((*p1)->root.string, (*p2)->root.string); } /* Write out the cref table. */ @@ -374,7 +379,7 @@ output_cref (FILE *fp) } fprintf (fp, _("File\n")); - if (! cref_initialized) + if (!cref_initialized) { fprintf (fp, _("No symbols\n")); return; @@ -405,7 +410,7 @@ output_one_cref (FILE *fp, struct cref_hash_entry *h) hl = bfd_link_hash_lookup (link_info.hash, h->root.string, FALSE, FALSE, TRUE); if (hl == NULL) - einfo ("%P: symbol `%T' missing from main hash table\n", + einfo (_("%P: symbol `%pT' missing from main hash table\n"), h->root.string); else { @@ -427,8 +432,16 @@ output_one_cref (FILE *fp, struct cref_hash_entry *h) } } - fprintf (fp, "%s ", h->demangled); - len = strlen (h->demangled) + 1; + if (demangling) + { + fprintf (fp, "%s ", h->demangled); + len = strlen (h->demangled) + 1; + } + else + { + fprintf (fp, "%s ", h->root.string); + len = strlen (h->root.string) + 1; + } for (r = h->refs; r != NULL; r = r->next) { @@ -439,21 +452,35 @@ output_one_cref (FILE *fp, struct cref_hash_entry *h) putc (' ', fp); ++len; } - lfinfo (fp, "%B\n", r->abfd); + lfinfo (fp, "%pB\n", r->abfd); + len = 0; + } + } + + for (r = h->refs; r != NULL; r = r->next) + { + if (r->common) + { + while (len < FILECOL) + { + putc (' ', fp); + ++len; + } + lfinfo (fp, "%pB\n", r->abfd); len = 0; } } for (r = h->refs; r != NULL; r = r->next) { - if (! r->def) + if (!r->def && !r->common) { while (len < FILECOL) { putc (' ', fp); ++len; } - lfinfo (fp, "%B\n", r->abfd); + lfinfo (fp, "%pB\n", r->abfd); len = 0; } } @@ -466,7 +493,7 @@ output_one_cref (FILE *fp, struct cref_hash_entry *h) void check_nocrossrefs (void) { - if (! cref_initialized) + if (!cref_initialized) return; cref_hash_traverse (&cref_table, check_nocrossref, NULL); @@ -487,7 +514,7 @@ check_local_sym_xref (lang_input_statement_type *statement) return; if (!bfd_generic_link_read_symbols (abfd)) - einfo (_("%B%F: could not read symbols: %E\n"), abfd); + einfo (_("%F%P: %pB: could not read symbols: %E\n"), abfd); for (syms = bfd_get_outsymbols (abfd); *syms; ++syms) { @@ -507,8 +534,14 @@ check_local_sym_xref (lang_input_statement_type *statement) symname = sym->name; for (ncrs = nocrossref_list; ncrs != NULL; ncrs = ncrs->next) for (ncr = ncrs->list; ncr != NULL; ncr = ncr->next) - if (strcmp (ncr->name, outsecname) == 0) - check_refs (symname, FALSE, sym->section, abfd, ncrs); + { + if (strcmp (ncr->name, outsecname) == 0) + check_refs (symname, FALSE, sym->section, abfd, ncrs); + /* The NOCROSSREFS_TO command only checks symbols defined in + the first section in the list. */ + if (ncrs->onlyfirst) + break; + } } } } @@ -529,7 +562,7 @@ check_nocrossref (struct cref_hash_entry *h, void *ignore ATTRIBUTE_UNUSED) FALSE, TRUE); if (hl == NULL) { - einfo (_("%P: symbol `%T' missing from main hash table\n"), + einfo (_("%P: symbol `%pT' missing from main hash table\n"), h->root.string); return TRUE; } @@ -545,10 +578,16 @@ check_nocrossref (struct cref_hash_entry *h, void *ignore ATTRIBUTE_UNUSED) for (ncrs = nocrossref_list; ncrs != NULL; ncrs = ncrs->next) for (ncr = ncrs->list; ncr != NULL; ncr = ncr->next) - if (strcmp (ncr->name, defsecname) == 0) - for (ref = h->refs; ref != NULL; ref = ref->next) - check_refs (hl->root.string, TRUE, hl->u.def.section, - ref->abfd, ncrs); + { + if (strcmp (ncr->name, defsecname) == 0) + for (ref = h->refs; ref != NULL; ref = ref->next) + check_refs (hl->root.string, TRUE, hl->u.def.section, + ref->abfd, ncrs); + /* The NOCROSSREFS_TO command only checks symbols defined in the first + section in the list. */ + if (ncrs->onlyfirst) + break; + } return TRUE; } @@ -556,7 +595,8 @@ check_nocrossref (struct cref_hash_entry *h, void *ignore ATTRIBUTE_UNUSED) /* The struct is used to pass information from check_refs to check_reloc_refs through bfd_map_over_sections. */ -struct check_refs_info { +struct check_refs_info +{ const char *sym_name; asection *defsec; struct lang_nocrossrefs *ncrs; @@ -585,7 +625,7 @@ check_refs (const char *name, BFD might contain a prohibited cross reference. */ if (!bfd_generic_link_read_symbols (abfd)) - einfo (_("%B%F: could not read symbols: %E\n"), abfd); + einfo (_("%F%P: %pB: could not read symbols: %E\n"), abfd); info.sym_name = name; info.global = global; @@ -647,14 +687,14 @@ check_reloc_refs (bfd *abfd, asection *sec, void *iarg) relsize = bfd_get_reloc_upper_bound (abfd, sec); if (relsize < 0) - einfo (_("%B%F: could not read relocs: %E\n"), abfd); + einfo (_("%F%P: %pB: could not read relocs: %E\n"), abfd); if (relsize == 0) return; relpp = (arelent **) xmalloc (relsize); relcount = bfd_canonicalize_reloc (abfd, sec, relpp, info->asymbols); if (relcount < 0) - einfo (_("%B%F: could not read relocs: %E\n"), abfd); + einfo (_("%F%P: %pB: could not read relocs: %E\n"), abfd); p = relpp; pend = p + relcount; @@ -681,7 +721,7 @@ check_reloc_refs (bfd *abfd, asection *sec, void *iarg) in OUTSECNAME. This reloc is from a section which is mapped into a section from which references to OUTSECNAME are prohibited. We must report an error. */ - einfo (_("%X%C: prohibited cross reference from %s to `%T' in %s\n"), + einfo (_("%X%P: %C: prohibited cross reference from %s to `%pT' in %s\n"), abfd, sec, q->address, outsecname, bfd_asymbol_name (*q->sym_ptr_ptr), outdefsecname); }