aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1997-03-15 02:14:44 +0000
committerIan Lance Taylor <ian@airs.com>1997-03-15 02:14:44 +0000
commit46a92fde532aec31ad31edda66fc7d79a459f75d (patch)
tree898db753d5c39a5c6c5fcc656e41d50d4121a495
parentf56d634e29f5c0a12dd4d49e769940bf325c9b3b (diff)
downloadgdb-46a92fde532aec31ad31edda66fc7d79a459f75d.zip
gdb-46a92fde532aec31ad31edda66fc7d79a459f75d.tar.gz
gdb-46a92fde532aec31ad31edda66fc7d79a459f75d.tar.bz2
* config/tc-mips.c (md_estimate_size_before_relax): Handle the
case of a symbol equated to another symbol when using SVR4_PIC.
-rw-r--r--gas/ChangeLog3
-rw-r--r--gas/config/tc-mips.c28
2 files changed, 27 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 6059604..bd15f3c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,8 @@
Fri Mar 14 15:33:38 1997 Ian Lance Taylor <ian@cygnus.com>
+ * config/tc-mips.c (md_estimate_size_before_relax): Handle the
+ case of a symbol equated to another symbol when using SVR4_PIC.
+
* Makefile.in (TARG_CPU_DEP_sparc): Add opcode/sparc.h.
Thu Mar 13 11:20:51 1997 Ian Lance Taylor <ian@cygnus.com>
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 5290f3b..b76b903 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -8068,12 +8068,12 @@ struct option md_longopts[] = {
{"mips16", no_argument, NULL, OPTION_MIPS16},
#define OPTION_NO_MIPS16 (OPTION_MD_BASE + 23)
{"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
- /* start-sanitize-5900 */
+ /* start-sanitize-r5900 */
#define OPTION_M5900 (OPTION_MD_BASE + 24)
{"m5900", no_argument, NULL, OPTION_M5900},
#define OPTION_NO_M5900 (OPTION_MD_BASE + 25)
{"no-m5900", no_argument, NULL, OPTION_NO_M5900},
- /* end-sanitize-5900 */
+ /* end-sanitize-r5900 */
#define OPTION_CALL_SHARED (OPTION_MD_BASE + 7)
#define OPTION_NON_SHARED (OPTION_MD_BASE + 8)
@@ -9922,7 +9922,26 @@ md_estimate_size_before_relax (fragp, segtype)
}
else if (mips_pic == SVR4_PIC)
{
- asection *symsec = fragp->fr_symbol->bsym->section;
+ symbolS *sym;
+ asection *symsec;
+
+ sym = fragp->fr_symbol;
+
+ /* Handle the case of a symbol equated to another symbol. */
+ while (sym->sy_value.X_op == O_symbol
+ && (! S_IS_DEFINED (sym) || S_IS_COMMON (sym)))
+ {
+ symbolS *n;
+
+ /* It's possible to get a loop here in a badly written
+ program. */
+ n = sym->sy_value.X_add_symbol;
+ if (n == sym)
+ break;
+ sym = n;
+ }
+
+ symsec = S_GET_SEGMENT (sym);
/* This must duplicate the test in adjust_reloc_syms. */
change = (symsec != &bfd_und_section
@@ -9969,7 +9988,8 @@ mips_fix_adjustable (fixp)
return 1;
#ifdef S_GET_OTHER
if (OUTPUT_FLAVOR == bfd_target_elf_flavour
- && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16)
+ && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
+ && fixp->fx_subsy == NULL)
return 0;
#endif
return 1;