aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog9
-rw-r--r--bfd/coff64-rs6000.c2
-rw-r--r--bfd/coffgen.c41
-rw-r--r--gas/ChangeLog15
-rw-r--r--gas/config/tc-tic4x.c1
5 files changed, 67 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 9f40340..f775536 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2008-09-30 Wesley W. Terpstra <wesley@terpstra.ca>
+ Nick Clifton <nickc@redhat.com>
+
+ * 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 <amodra@bigpond.net.au>
* Makefile.am: Run "make dep-am".
diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c
index 7a0ec1f..ee797ed 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 17d46a2..469cdfa 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 053a6ce..1054ef3 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,18 @@
+2008-09-30 Wesley W. Terpstra <wesley@terpstra.ca>
+ Nick Clifton <nickc@redhat.com>
+
+ * config/tc-tic4x.c (tic4x_globl): Call S_SET_EXTERNAL as well as
+ S_SET_STORAGE_CLASS.
+
+2008-09-30 Wesley W. Terpstra <wesley@terpstra.ca>
+ Nick Clifton <nickc@redhat.com>
+
+ * 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 <amodra@bigpond.net.au>
* Makefile.am: Run "make dep-am".
diff --git a/gas/config/tc-tic4x.c b/gas/config/tc-tic4x.c
index c373e20..bc92de2 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++;