From 1180b5a4deb36962eb5ad244f32d93e4ad519370 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sun, 13 Sep 2009 19:18:11 +0000 Subject: [PATCH] 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. --- gas/ChangeLog | 9 ++++++ gas/config/tc-mips.c | 18 ++++++++--- gas/testsuite/ChangeLog | 8 +++++ gas/testsuite/gas/mips/jal-svr4pic.d | 2 +- gas/testsuite/gas/mips/jal-xgot.d | 2 +- gas/testsuite/gas/mips/jalr2.d | 41 ++++++++++++++++++++++++ gas/testsuite/gas/mips/jalr2.s | 15 +++++++++ gas/testsuite/gas/mips/mips-abi32-pic2.d | 6 ++-- gas/testsuite/gas/mips/mips.exp | 1 + 9 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 gas/testsuite/gas/mips/jalr2.d create mode 100644 gas/testsuite/gas/mips/jalr2.s diff --git a/gas/ChangeLog b/gas/ChangeLog index fe66a379fb5..46969c0cb34 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2009-09-13 Richard Sandiford + + * 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 * po/gas.pot: Updated by the Translation project. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index e1d63881e5d..1c964802248 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 3d737c2c767..6f233340717 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2009-09-13 Richard Sandiford + + * 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 * gas/mips/mips16-dwarf2-n32.d: Expect odd addresses. diff --git a/gas/testsuite/gas/mips/jal-svr4pic.d b/gas/testsuite/gas/mips/jal-svr4pic.d index ef51f4bcc71..3fc206de283 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 89a9b42b507..2ece1578bee 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 00000000000..6509a181c28 --- /dev/null +++ b/gas/testsuite/gas/mips/jalr2.d @@ -0,0 +1,41 @@ +#as: -mips2 -32 -KPIC +#objdump: -dr + +.* + + +Disassembly of section \.text: + +.* : +.*: 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\) + +.* : + \.\.\. diff --git a/gas/testsuite/gas/mips/jalr2.s b/gas/testsuite/gas/mips/jalr2.s new file mode 100644 index 00000000000..6b100d78237 --- /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 53367808910..aca0dbda176 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 ebe17c57bc7..6f82f46f499 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 { -- 2.30.2