aboutsummaryrefslogtreecommitdiff
path: root/gas/config/obj-coff.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1999-09-12 02:55:58 +0000
committerIan Lance Taylor <ian@airs.com>1999-09-12 02:55:58 +0000
commit9690c54dda4ad0095593b6b16c54db7a3036daa3 (patch)
tree6650f3555dbe6eaa50219d07447f8ca738973cbf /gas/config/obj-coff.c
parent23dab925ad8856522f11b1aaca29a1b0c5e41034 (diff)
downloadgdb-9690c54dda4ad0095593b6b16c54db7a3036daa3.zip
gdb-9690c54dda4ad0095593b6b16c54db7a3036daa3.tar.gz
gdb-9690c54dda4ad0095593b6b16c54db7a3036daa3.tar.bz2
1999-09-11 Donn Terry <donn@interix.com>
* config/obj-coff.c (obj_coff_endef): Don't merge labels, or symbols which do not have a constant value, or tags with non-tags. Remove the symbol from the list before adding it at the end.
Diffstat (limited to 'gas/config/obj-coff.c')
-rw-r--r--gas/config/obj-coff.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c
index 6be9133..4207ea0 100644
--- a/gas/config/obj-coff.c
+++ b/gas/config/obj-coff.c
@@ -727,7 +727,10 @@ obj_coff_endef (ignore)
/* Now that we have built a debug symbol, try to find if we should
merge with an existing symbol or not. If a symbol is C_EFCN or
- SEG_ABSOLUTE or untagged SEG_DEBUG it never merges. */
+ absolute_section or untagged SEG_DEBUG it never merges. We also
+ don't merge labels, which are in a different namespace, nor
+ symbols which have not yet been defined since they are typically
+ unique, nor do we merge tags with non-tags. */
/* Two cases for functions. Either debug followed by definition or
definition followed by debug. For definition first, we will
@@ -742,16 +745,24 @@ obj_coff_endef (ignore)
time. */
if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN
+ || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL
|| (!strcmp (bfd_get_section_name (stdoutput,
S_GET_SEGMENT (def_symbol_in_progress)),
"*DEBUG*")
&& !SF_GET_TAG (def_symbol_in_progress))
|| S_GET_SEGMENT (def_symbol_in_progress) == absolute_section
- || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress), DO_NOT_STRIP)) == NULL)
+ || ! symbol_constant_p (def_symbol_in_progress)
+ || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress),
+ DO_NOT_STRIP)) == NULL
+ || SF_GET_TAG (def_symbol_in_progress) != SF_GET_TAG (symbolP))
{
+ /* If it already is at the end of the symbol list, do nothing */
if (def_symbol_in_progress != symbol_lastP)
- symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
- &symbol_lastP);
+ {
+ symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
+ symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
+ &symbol_lastP);
+ }
}
else
{