From: Nick Clifton Date: Tue, 30 Sep 2008 10:50:03 +0000 (+0000) Subject: * coffgen.c (coff_write_symbols): Check to see if a symbol's flags X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=e144674af8458b72b0f03fc68989b00101773543;p=deliverable%2Fbinutils-gdb.git * coffgen.c (coff_write_symbols): Check to see if a symbol's flags do not match it class and if necessary update the class. (null_error_handler): New function. Suppresses the generation of bfd error messages. * coff64-rs6000.c (bfd_xcoff_backend_data): Update comment. * config/tc-tic4x.c (tic4x_globl): Call S_SET_EXTERNAL as well as S_SET_STORAGE_CLASS. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9f40340abe..f775536155 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2008-09-30 Wesley W. Terpstra + Nick Clifton + + * coffgen.c (coff_write_symbols): Check to see if a symbol's flags + do not match it class and if necessary update the class. + (null_error_handler): New function. Suppresses the generation of + bfd error messages. + * coff64-rs6000.c (bfd_xcoff_backend_data): Update comment. + 2008-09-30 Alan Modra * Makefile.am: Run "make dep-am". diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 7a0ec1f2ca..ee797ed4a2 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -2580,7 +2580,7 @@ static const struct xcoff_backend_data_rec bfd_xcoff_backend_data = coff_print_aux, dummy_reloc16_extra_cases, dummy_reloc16_estimate, - NULL, /* bfd_coff_sym_is_global */ + NULL, /* bfd_coff_symbol_classification */ coff_compute_section_file_positions, NULL, /* _bfd_coff_start_final_link */ xcoff64_ppc_relocate_section, diff --git a/bfd/coffgen.c b/bfd/coffgen.c index 17d46a2d5b..469cdfa495 100644 --- a/bfd/coffgen.c +++ b/bfd/coffgen.c @@ -1082,6 +1082,11 @@ coff_write_native_symbol (bfd *abfd, debug_string_size_p); } +static void +null_error_handler (const char * fmt ATTRIBUTE_UNUSED, ...) +{ +} + /* Write out the COFF symbols. */ bfd_boolean @@ -1138,6 +1143,42 @@ coff_write_symbols (bfd *abfd) } else { + if (coff_backend_info (abfd)->_bfd_coff_classify_symbol != NULL) + { + bfd_error_handler_type current_error_handler; + enum coff_symbol_classification class; + unsigned char *n_sclass; + + /* Suppress error reporting by bfd_coff_classify_symbol. + Error messages can be generated when we are processing a local + symbol which has no associated section and we do not have to + worry about this, all we need to know is that it is local. */ + current_error_handler = bfd_set_error_handler (null_error_handler); + class = bfd_coff_classify_symbol (abfd, &c_symbol->native->u.syment); + (void) bfd_set_error_handler (current_error_handler); + + n_sclass = &c_symbol->native->u.syment.n_sclass; + + /* If the symbol class has been changed (eg objcopy/ld script/etc) + we cannot retain the existing sclass from the original symbol. + Weak symbols only have one valid sclass, so just set it always. + If it is not local class and should be, set it C_STAT. + If it is global and not classified as global, or if it is + weak (which is also classified as global), set it C_EXT. */ + + if (symbol->flags & BSF_WEAK) + *n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT; + else if (symbol->flags & BSF_LOCAL && class != COFF_SYMBOL_LOCAL) + *n_sclass = C_STAT; + else if (symbol->flags & BSF_GLOBAL + && (class != COFF_SYMBOL_GLOBAL +#ifdef COFF_WITH_PE + || *n_sclass == C_NT_WEAK +#endif + || *n_sclass == C_WEAKEXT)) + c_symbol->native->u.syment.n_sclass = C_EXT; + } + if (!coff_write_native_symbol (abfd, c_symbol, &written, &string_size, &debug_string_section, &debug_string_size)) diff --git a/gas/ChangeLog b/gas/ChangeLog index 053a6ced6b..1054ef3e8d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2008-09-30 Wesley W. Terpstra + Nick Clifton + + * config/tc-tic4x.c (tic4x_globl): Call S_SET_EXTERNAL as well as + S_SET_STORAGE_CLASS. + +2008-09-30 Wesley W. Terpstra + Nick Clifton + + * coffgen.c (coff_write_symbols): Check to see if a symbol's flags + do not match it class and if necessary update the class. + (null_error_handler): New function. Suppresses the generation of + bfd error messages. + * coff64-rs6000.c (bfd_xcoff_backend_data): Update comment. + 2008-09-30 Alan Modra * Makefile.am: Run "make dep-am". diff --git a/gas/config/tc-tic4x.c b/gas/config/tc-tic4x.c index c373e20565..bc92de2da5 100644 --- a/gas/config/tc-tic4x.c +++ b/gas/config/tc-tic4x.c @@ -821,6 +821,7 @@ tic4x_globl (int ignore ATTRIBUTE_UNUSED) *input_line_pointer = c; SKIP_WHITESPACE (); S_SET_STORAGE_CLASS (symbolP, C_EXT); + S_SET_EXTERNAL (symbolP); if (c == ',') { input_line_pointer++;