diff options
author | Ian Lance Taylor <ian@airs.com> | 1999-09-12 02:55:58 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1999-09-12 02:55:58 +0000 |
commit | 1c4d6b4ec4ccf17ee26da348bf786204ed913ef8 (patch) | |
tree | 89925d039a85f80dfce748111f9984c48e5df692 /gas | |
parent | b79a977e5e8a3400fa03dbf559e6b65a9068fea4 (diff) | |
download | binutils-redhat-1c4d6b4ec4ccf17ee26da348bf786204ed913ef8.tar.gz |
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')
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/obj-coff.c | 19 |
2 files changed, 20 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index a2515b3a2b..a0b15a644c 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -5,6 +5,11 @@ 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. + * config/obj-coff.c (obj_coff_endef) [BFD_ASSEMBLER]: Handle .ef C_FCN symbol differently if TE_PE. (obj_coff_line) [BFD_ASSEMBLER]: Always use the line number which diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c index 6be91336b1..4207ea0fa2 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 { |