From: Nick Clifton Date: Tue, 9 May 2006 15:13:22 +0000 (+0000) Subject: Revised test (that is not O(n2)) for checking for orphaned cloned symbols X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6e0080dd37a13129b04c34c7aa18ec2bee85b731;p=binutils-gdb.git Revised test (that is not O(n2)) for checking for orphaned cloned symbols --- diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index fe24ab277ae..5ccbfc1f134 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -17016,21 +17016,16 @@ arm_fix_adjustable (fixS * fixP) /* This is a hack for the gas/all/redef2.s test. This test causes symbols to be cloned, and without this test relocs would still be generated - against the original pre-cloned symbol. Such symbols would not appear + against the original, pre-cloned symbol. Such symbols would not appear in the symbol table however, and so a valid reloc could not be generated. So check to see if the fixup is against a symbol which has been removed from the symbol chain, and if it is, then allow it to be adjusted into a reloc against a section symbol. */ - if (fixP->fx_addsy != NULL) - { - symbolS * sym; - - for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym)) - if (sym == fixP->fx_addsy) - break; - if (sym == NULL) - return 1; - } + if (fixP->fx_addsy != NULL + && ! S_IS_LOCAL (fixP->fx_addsy) + && symbol_next (fixP->fx_addsy) == NULL + && symbol_next (fixP->fx_addsy) == symbol_previous (fixP->fx_addsy)) + return 1; return 0; }