aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2009-09-13 19:18:11 +0000
committerRichard Sandiford <rdsandiford@googlemail.com>2009-09-13 19:18:11 +0000
commit1180b5a4deb36962eb5ad244f32d93e4ad519370 (patch)
tree60ffcaeeb998f209bb52cc696fff9bb1e89b71cf
parent3c0bfb2a239710f52543cc9e1a434814e82bd120 (diff)
downloadgdb-1180b5a4deb36962eb5ad244f32d93e4ad519370.zip
gdb-1180b5a4deb36962eb5ad244f32d93e4ad519370.tar.gz
gdb-1180b5a4deb36962eb5ad244f32d93e4ad519370.tar.bz2
gas/
* config/tc-mips.c (MIPS_JALR_HINT_P): Take an expr argument. Require the target to be a bare symbol on targets with in-place addends. (macro_build_jalr): Update accordingly. (mips_fix_adjustable): Don't reduce R_MIPS_JALRs on targets with in-place addends. gas/testsuite/ * gas/mips/jalr2.s, gas/mips/jalr2.d: New test. * gas/mips/jal-svr4pic.d: Don't expect R_MIPS_JALRs to be reduced. * gas/mips/jal-xgot.d: Likewise. * gas/mips/mips-abi32-pic2.d: Likewise. * gas/mips/mips.exp: Run it.
-rw-r--r--gas/ChangeLog9
-rw-r--r--gas/config/tc-mips.c18
-rw-r--r--gas/testsuite/ChangeLog8
-rw-r--r--gas/testsuite/gas/mips/jal-svr4pic.d2
-rw-r--r--gas/testsuite/gas/mips/jal-xgot.d2
-rw-r--r--gas/testsuite/gas/mips/jalr2.d41
-rw-r--r--gas/testsuite/gas/mips/jalr2.s15
-rw-r--r--gas/testsuite/gas/mips/mips-abi32-pic2.d6
-rw-r--r--gas/testsuite/gas/mips/mips.exp1
9 files changed, 92 insertions, 10 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index fe66a37..46969c0 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,12 @@
+2009-09-13 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * config/tc-mips.c (MIPS_JALR_HINT_P): Take an expr argument.
+ Require the target to be a bare symbol on targets with
+ in-place addends.
+ (macro_build_jalr): Update accordingly.
+ (mips_fix_adjustable): Don't reduce R_MIPS_JALRs on targets
+ with in-place addends.
+
2009-09-11 Nick Clifton <nickc@redhat.com>
* po/gas.pot: Updated by the Translation project.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index e1d6388..1c96480 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -292,10 +292,14 @@ static int file_ase_mips16;
/* True if we want to create R_MIPS_JALR for jalr $25. */
#ifdef TE_IRIX
-#define MIPS_JALR_HINT_P HAVE_NEWABI
+#define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
#else
-/* As a GNU extension, we use R_MIPS_JALR for o32 too. */
-#define MIPS_JALR_HINT_P 1
+/* As a GNU extension, we use R_MIPS_JALR for o32 too. However,
+ because there's no place for any addend, the only acceptable
+ expression is a bare symbol. */
+#define MIPS_JALR_HINT_P(EXPR) \
+ (!HAVE_IN_PLACE_ADDENDS \
+ || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
#endif
/* True if -mips3d was passed or implied by arguments passed on the
@@ -3930,13 +3934,13 @@ macro_build_jalr (expressionS *ep)
{
char *f = NULL;
- if (MIPS_JALR_HINT_P)
+ if (MIPS_JALR_HINT_P (ep))
{
frag_grow (8);
f = frag_more (0);
}
macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
- if (MIPS_JALR_HINT_P)
+ if (MIPS_JALR_HINT_P (ep))
fix_new_exp (frag_now, f - frag_now->fr_literal,
4, ep, FALSE, BFD_RELOC_MIPS_JALR);
}
@@ -14097,6 +14101,10 @@ mips_fix_adjustable (fixS *fixp)
&& (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
return 0;
+ /* There is no place to store an in-place offset for JALR relocations. */
+ if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
+ return 0;
+
#ifdef OBJ_ELF
/* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
to a floating-point stub. The same is true for non-R_MIPS16_26
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 3d737c2..6f23334 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,5 +1,13 @@
2009-09-13 Richard Sandiford <rdsandiford@googlemail.com>
+ * gas/mips/jalr2.s, gas/mips/jalr2.d: New test.
+ * gas/mips/jal-svr4pic.d: Don't expect R_MIPS_JALRs to be reduced.
+ * gas/mips/jal-xgot.d: Likewise.
+ * gas/mips/mips-abi32-pic2.d: Likewise.
+ * gas/mips/mips.exp: Run it.
+
+2009-09-13 Richard Sandiford <rdsandiford@googlemail.com>
+
* gas/mips/mips16-dwarf2-n32.d: Expect odd addresses.
2009-09-11 Hans-Peter Nilsson <hp@bitrange.com>
diff --git a/gas/testsuite/gas/mips/jal-svr4pic.d b/gas/testsuite/gas/mips/jal-svr4pic.d
index ef51f4b..3fc206d 100644
--- a/gas/testsuite/gas/mips/jal-svr4pic.d
+++ b/gas/testsuite/gas/mips/jal-svr4pic.d
@@ -26,7 +26,7 @@ Disassembly of section .text:
0+0034 <[^>]*> addiu t9,t9,0
[ ]*34: R_MIPS_LO16 .text
0+0038 <[^>]*> jalr t9
-[ ]*38: R_MIPS_JALR .text
+[ ]*38: R_MIPS_JALR text_label
0+003c <[^>]*> nop
0+0040 <[^>]*> lw gp,0\(sp\)
0+0044 <[^>]*> nop
diff --git a/gas/testsuite/gas/mips/jal-xgot.d b/gas/testsuite/gas/mips/jal-xgot.d
index 89a9b42..2ece157 100644
--- a/gas/testsuite/gas/mips/jal-xgot.d
+++ b/gas/testsuite/gas/mips/jal-xgot.d
@@ -27,7 +27,7 @@ Disassembly of section .text:
0+0034 <[^>]*> addiu t9,t9,0
[ ]*34: R_MIPS_LO16 .text
0+0038 <[^>]*> jalr t9
-[ ]*38: R_MIPS_JALR .text
+[ ]*38: R_MIPS_JALR text_label
0+003c <[^>]*> nop
0+0040 <[^>]*> lw gp,0\(sp\)
0+0044 <[^>]*> lui t9,0x0
diff --git a/gas/testsuite/gas/mips/jalr2.d b/gas/testsuite/gas/mips/jalr2.d
new file mode 100644
index 0000000..6509a18
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalr2.d
@@ -0,0 +1,41 @@
+#as: -mips2 -32 -KPIC
+#objdump: -dr
+
+.*
+
+
+Disassembly of section \.text:
+
+.* <test>:
+.*: afbc0010 sw gp,16\(sp\)
+.*: 8f990000 lw t9,0\(gp\)
+.*: R_MIPS_GOT16 \.text
+.*: 2739004c addiu t9,t9,76
+.*: R_MIPS_LO16 \.text
+.*: 0320f809 jalr t9
+.*: R_MIPS_JALR local
+.*: 00000000 nop
+.*: 8fbc0010 lw gp,16\(sp\)
+.*: 8f990000 lw t9,0\(gp\)
+.*: R_MIPS_GOT16 \.text
+.*: 27390058 addiu t9,t9,88
+.*: R_MIPS_LO16 \.text
+# No R_MIPS_JALR here, because the target address had an addend.
+.*: 0320f809 jalr t9
+.*: 00000000 nop
+.*: 8fbc0010 lw gp,16\(sp\)
+.*: 8f990000 lw t9,0\(gp\)
+.*: R_MIPS_CALL16 global
+.*: 0320f809 jalr t9
+.*: R_MIPS_JALR global
+.*: 00000000 nop
+.*: 8fbc0010 lw gp,16\(sp\)
+.*: 8f99000c lw t9,12\(gp\)
+.*: R_MIPS_CALL16 global
+# No R_MIPS_JALR here either, for the same reason.
+.*: 0320f809 jalr t9
+.*: 00000000 nop
+.*: 8fbc0010 lw gp,16\(sp\)
+
+.* <local>:
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/jalr2.s b/gas/testsuite/gas/mips/jalr2.s
new file mode 100644
index 0000000..6b100d7
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalr2.s
@@ -0,0 +1,15 @@
+ .ent test
+test:
+ .frame $sp,32,$31
+ .cprestore 16
+ jal local
+ jal local+12
+ jal global
+ jal global+12
+ .end test
+
+local:
+ nop
+ nop
+ nop
+ nop
diff --git a/gas/testsuite/gas/mips/mips-abi32-pic2.d b/gas/testsuite/gas/mips/mips-abi32-pic2.d
index 5336780..aca0dbd 100644
--- a/gas/testsuite/gas/mips/mips-abi32-pic2.d
+++ b/gas/testsuite/gas/mips/mips-abi32-pic2.d
@@ -16,7 +16,7 @@ Disassembly of section \.text:
0+014 <[^>]*> 273900cc addiu t9,t9,204
14: R_MIPS_LO16 \.text
0+018 <[^>]*> 0320f809 jalr t9
- 18: R_MIPS_JALR \.text
+ 18: R_MIPS_JALR end
0+01c <[^>]*> 00000000 nop
0+020 <[^>]*> 8fbc0008 lw gp,8\(sp\)
0+024 <[^>]*> 00000000 nop
@@ -36,7 +36,7 @@ Disassembly of section \.text:
0+050 <[^>]*> 273900cc addiu t9,t9,204
50: R_MIPS_LO16 \.text
0+054 <[^>]*> 0320f809 jalr t9
- 54: R_MIPS_JALR \.text
+ 54: R_MIPS_JALR end
0+058 <[^>]*> 00000000 nop
0+05c <[^>]*> 3c010001 lui at,0x1
0+060 <[^>]*> 003d0821 addu at,at,sp
@@ -60,7 +60,7 @@ Disassembly of section \.text:
0+09c <[^>]*> 273900cc addiu t9,t9,204
9c: R_MIPS_LO16 \.text
0+0a0 <[^>]*> 0320f809 jalr t9
- a0: R_MIPS_JALR \.text
+ a0: R_MIPS_JALR end
0+0a4 <[^>]*> 00000000 nop
0+0a8 <[^>]*> 3c010001 lui at,0x1
0+0ac <[^>]*> 003d0821 addu at,at,sp
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index ebe17c5..6f82f46 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -706,6 +706,7 @@ if { [istarget mips*-*-vxworks*] } {
run_list_test "tls-ill" "-32"
run_dump_test "tls-o32"
+ run_dump_test "jalr2"
}
if $has_newabi {