MIPS16/GAS: Fix absolute references with PC-relative synthetic instructions

Complement commit 88a7ef1689 ("MIPS16/GAS: Restore unsupported
relocation diagnostics") and also propagate constant expressions, either
already reduced from absolute symbol references or created from literals
in the first place, used as a PC-relative operand with the MIPS16 LA,
LW, DLA and LD synthetic instructions to relaxation, matching the way
forward absolute symbol references have been handled as from the commit
referred and letting relaxation produce any necessary relocations, if
possible, for the absolute value requested to be reproduced at the run
time.

Call `symbol_append' for any expression symbol created for the purpose
of MIPS16 relaxation as with constant expressions now propagated from
earlier on such symbols may make it through and have R_MIPS16_PC16_S1
relocations emitted against, and therefore need to appear in the symbol
table produced.

	gas/
	* config/tc-mips.c (append_insn): Call `symbol_append' for any
	expression symbol created for MIPS16 relaxation.
	(match_mips16_insn): Don't encode a constant value as an
	immediate with a PC-relative operand.

	* testsuite/gas/mips/mips16-pcrel-absolute-1.d: New test.
	* testsuite/gas/mips/mips16-branch-absolute-1.d: New test.
	* testsuite/gas/mips/mips16-branch-absolute-2.d: New test.
	* testsuite/gas/mips/mips16-branch-absolute-addend-1.d: New
	test.
	* testsuite/gas/mips/mips16-branch-absolute-n32-1.d: New test.
	* testsuite/gas/mips/mips16-branch-absolute-n32-2.d: New test.
	* testsuite/gas/mips/mips16-branch-absolute-addend-n32-1.d: New
	test.
	* testsuite/gas/mips/mips16-branch-absolute-n64-1.d: New test.
	* testsuite/gas/mips/mips16-branch-absolute-n64-2.d: New test.
	* testsuite/gas/mips/mips16-branch-absolute-addend-n64-1.d: New
	test.
	* testsuite/gas/mips/mips16-pcrel-absolute-1.l: New stderr
	output.
	* testsuite/gas/mips/mips16-pcrel-absolute-1.s: New test source.
	* testsuite/gas/mips/mips16-branch-absolute-1.s: New test
	source.
	* testsuite/gas/mips/mips16-branch-absolute-2.s: New test
	source.
	* testsuite/gas/mips/mips16-branch-absolute-addend-1.s: New test
	source.
	* testsuite/gas/mips/mips.exp: Run the new tests.

	ld/
	* testsuite/ld-mips-elf/mips16-branch-absolute-1.d: New test.
	* testsuite/ld-mips-elf/mips16-branch-absolute-2.d: New test.
	* testsuite/ld-mips-elf/mips16-branch-absolute-addend-1.d: New
	test.
	* testsuite/ld-mips-elf/mips16-branch-absolute-n32-1.d: New
	test.
	* testsuite/ld-mips-elf/mips16-branch-absolute-n32-2.d: New
	test.
	* testsuite/ld-mips-elf/mips16-branch-absolute-addend-n32-1.d:
	New test.
	* testsuite/ld-mips-elf/mips16-branch-absolute-n64-1.d: New
	test.
	* testsuite/ld-mips-elf/mips16-branch-absolute-n64-2.d: New
	test.
	* testsuite/ld-mips-elf/mips16-branch-absolute-addend-n64-1.d:
	New test.
	* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
This commit is contained in:
Maciej W. Rozycki 2017-05-03 00:05:15 +01:00
parent 3d8505928a
commit 82d808edbc
29 changed files with 283 additions and 1 deletions

View File

@ -1,3 +1,34 @@
2017-05-02 Maciej W. Rozycki <macro@imgtec.com>
* config/tc-mips.c (append_insn): Call `symbol_append' for any
expression symbol created for MIPS16 relaxation.
(match_mips16_insn): Don't encode a constant value as an
immediate with a PC-relative operand.
* testsuite/gas/mips/mips16-pcrel-absolute-1.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-1.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-2.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-addend-1.d: New
test.
* testsuite/gas/mips/mips16-branch-absolute-n32-1.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-n32-2.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-addend-n32-1.d: New
test.
* testsuite/gas/mips/mips16-branch-absolute-n64-1.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-n64-2.d: New test.
* testsuite/gas/mips/mips16-branch-absolute-addend-n64-1.d: New
test.
* testsuite/gas/mips/mips16-pcrel-absolute-1.l: New stderr
output.
* testsuite/gas/mips/mips16-pcrel-absolute-1.s: New test source.
* testsuite/gas/mips/mips16-branch-absolute-1.s: New test
source.
* testsuite/gas/mips/mips16-branch-absolute-2.s: New test
source.
* testsuite/gas/mips/mips16-branch-absolute-addend-1.s: New test
source.
* testsuite/gas/mips/mips.exp: Run the new tests.
2017-04-27 Maciej W. Rozycki <macro@imgtec.com>
* config/tc-mips.c (mips16_pcrel_val): New function, factored

View File

@ -7419,6 +7419,7 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
else
{
symbol = make_expr_symbol (address_expr);
symbol_append (symbol, symbol_lastP, &symbol_rootP, &symbol_lastP);
offset = 0;
}
add_relaxed_insn (ip, 4, 0,
@ -8087,6 +8088,7 @@ match_mips16_insn (struct mips_cl_insn *insn, const struct mips_opcode *opcode,
const char *args;
const struct mips_operand *operand;
const struct mips_operand *ext_operand;
bfd_boolean pcrel = FALSE;
int required_insn_length;
struct mips_arg_info arg;
int relax_char;
@ -8148,6 +8150,7 @@ match_mips16_insn (struct mips_cl_insn *insn, const struct mips_opcode *opcode,
}
else if (relax_char
&& offset_expr.X_op == O_constant
&& !pcrel
&& calculate_reloc (*offset_reloc,
offset_expr.X_add_number,
&value))
@ -8216,7 +8219,9 @@ match_mips16_insn (struct mips_cl_insn *insn, const struct mips_opcode *opcode,
if (!operand)
abort ();
if (operand->type != OP_PCREL)
if (operand->type == OP_PCREL)
pcrel = TRUE;
else
{
ext_operand = decode_mips16_operand (c, TRUE);
if (operand != ext_operand)

View File

@ -1544,6 +1544,7 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test "mips16-pcrel-addend-2"
run_dump_test "mips16-pcrel-addend-3"
run_dump_test "mips16-pcrel-absolute"
run_dump_test "mips16-pcrel-absolute-1"
run_dump_test "mips16-branch-reloc-0"
run_dump_test "mips16-branch-reloc-1"
run_dump_test "mips16-branch-reloc-2"
@ -1555,12 +1556,21 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test "mips16-branch-addend-4"
run_dump_test "mips16-branch-addend-5"
run_dump_test "mips16-branch-absolute"
run_dump_test "mips16-branch-absolute-1"
run_dump_test "mips16-branch-absolute-2"
run_dump_test "mips16-branch-absolute-addend"
run_dump_test "mips16-branch-absolute-addend-1"
if $has_newabi {
run_dump_test "mips16-branch-absolute-n32"
run_dump_test "mips16-branch-absolute-n32-1"
run_dump_test "mips16-branch-absolute-n32-2"
run_dump_test "mips16-branch-absolute-addend-n32"
run_dump_test "mips16-branch-absolute-addend-n32-1"
run_dump_test "mips16-branch-absolute-n64"
run_dump_test "mips16-branch-absolute-n64-1"
run_dump_test "mips16-branch-absolute-n64-2"
run_dump_test "mips16-branch-absolute-addend-n64"
run_dump_test "mips16-branch-absolute-addend-n64-1"
}
run_dump_test "mips16-absolute-reloc-0"
run_dump_test "mips16-absolute-reloc-1"

View File

@ -0,0 +1,20 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 branch to absolute expression 1
#as: -32
.*: +file format .*mips.*
Disassembly of section \.text:
\.\.\.
[0-9a-f]+ <[^>]*> f7ff 101e b 00001000 <foo>
[ ]*[0-9a-f]+: R_MIPS16_PC16_S1 L0\001
[0-9a-f]+ <[^>]*> f7ff 601e bteqz 00001004 <foo\+0x4>
[ ]*[0-9a-f]+: R_MIPS16_PC16_S1 L0\001
[0-9a-f]+ <[^>]*> f7ff 611e btnez 00001008 <foo\+0x8>
[ ]*[0-9a-f]+: R_MIPS16_PC16_S1 L0\001
[0-9a-f]+ <[^>]*> f7ff 221e beqz v0,0000100c <foo\+0xc>
[ ]*[0-9a-f]+: R_MIPS16_PC16_S1 L0\001
[0-9a-f]+ <[^>]*> f7ff 2a1e bnez v0,00001010 <foo\+0x10>
[ ]*[0-9a-f]+: R_MIPS16_PC16_S1 L0\001
[0-9a-f]+ <[^>]*> 6500 nop
\.\.\.

View File

@ -0,0 +1,22 @@
.text
.space 0x1000
.set bar, 0x1235
.globl foo
.ent foo
.set mips16
foo:
b bar
bteqz bar
btnez bar
beqz $2, bar
bnez $2, bar
nop
.set nomips16
.end foo
# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
.align 4, 0
.space 16

View File

@ -0,0 +1,4 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 branch to absolute expression 2
#as: -32
#dump: mips16-branch-absolute-1.d

View File

@ -0,0 +1,20 @@
.text
.space 0x1000
.globl foo
.ent foo
.set mips16
foo:
b 0x1235
bteqz 0x1235
btnez 0x1235
beqz $2, 0x1235
bnez $2, 0x1235
nop
.set nomips16
.end foo
# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
.align 4, 0
.space 16

View File

@ -0,0 +1,4 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 branch to absolute expression with addend 1
#as: -32
#dump: mips16-branch-absolute-1.d

View File

@ -0,0 +1,22 @@
.text
.space 0x1000
.set bar, 0x12345679
.globl foo
.ent foo
.set mips16
foo:
b bar + 0x1234
bteqz bar + 0x1234
btnez bar + 0x1234
beqz $2, bar + 0x1234
bnez $2, bar + 0x1234
nop
.set nomips16
.end foo
# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
.align 4, 0
.space 16

View File

@ -0,0 +1,5 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 branch to absolute expression with addend 1 (n32)
#as: -n32 -march=from-abi
#source: mips16-branch-absolute-addend-1.s
#dump: mips16-branch-absolute-addend-n32.d

View File

@ -0,0 +1,5 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 branch to absolute expression with addend 1 (n64)
#as: -64 -march=from-abi
#source: mips16-branch-absolute-addend-1.s
#dump: mips16-branch-absolute-addend-n64.d

View File

@ -0,0 +1,5 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 branch to absolute expression 1 (n32)
#as: -n32 -march=from-abi
#source: mips16-branch-absolute-1.s
#dump: mips16-branch-absolute-n32.d

View File

@ -0,0 +1,5 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 branch to absolute expression 2 (n32)
#as: -n32 -march=from-abi
#source: mips16-branch-absolute-2.s
#dump: mips16-branch-absolute-n32.d

View File

@ -0,0 +1,5 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 branch to absolute expression 1 (n64)
#as: -64 -march=from-abi
#source: mips16-branch-absolute-1.s
#dump: mips16-branch-absolute-n64.d

View File

@ -0,0 +1,5 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 branch to absolute expression 2 (n64)
#as: -64 -march=from-abi
#source: mips16-branch-absolute-2.s
#dump: mips16-branch-absolute-n64.d

View File

@ -0,0 +1,3 @@
#name: MIPS16 PC-relative reference to absolute expression 1
#as: -32
#error-output: mips16-pcrel-absolute-1.l

View File

@ -0,0 +1,3 @@
.*: Assembler messages:
.*:10: Error: unsupported relocation
.*:11: Error: unsupported relocation

View File

@ -0,0 +1,18 @@
.text
.space 0x1000
.set bar, 0x1234
.ent foo
.set mips16
foo:
la $2, bar
lw $2, bar
nop
.set nomips16
.end foo
# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
.align 4, 0
.space 16

View File

@ -1,3 +1,23 @@
2017-05-02 Maciej W. Rozycki <macro@imgtec.com>
* testsuite/ld-mips-elf/mips16-branch-absolute-1.d: New test.
* testsuite/ld-mips-elf/mips16-branch-absolute-2.d: New test.
* testsuite/ld-mips-elf/mips16-branch-absolute-addend-1.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-n32-1.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-n32-2.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-addend-n32-1.d:
New test.
* testsuite/ld-mips-elf/mips16-branch-absolute-n64-1.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-n64-2.d: New
test.
* testsuite/ld-mips-elf/mips16-branch-absolute-addend-n64-1.d:
New test.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
2017-05-02 H.J. Lu <hongjiu.lu@intel.com>
* testsuite/ld-i386/tls.exp: Add -Wl,--no-as-needed to

View File

@ -159,17 +159,33 @@ run_dump_test "mips16-branch-3" [list [list ld $abi_ldflags(o32)]]
run_dump_test "mips16-branch-addend-2" [list [list ld $abi_ldflags(o32)]]
run_dump_test "mips16-branch-addend-3" [list [list ld $abi_ldflags(o32)]]
run_dump_test "mips16-branch-absolute" [list [list ld $abi_ldflags(o32)]]
run_dump_test "mips16-branch-absolute-1" [list [list ld $abi_ldflags(o32)]]
run_dump_test "mips16-branch-absolute-2" [list [list ld $abi_ldflags(o32)]]
run_dump_test "mips16-branch-absolute-addend" \
[list [list ld $abi_ldflags(o32)]]
run_dump_test "mips16-branch-absolute-addend-1" \
[list [list ld $abi_ldflags(o32)]]
if $has_newabi {
run_dump_test "mips16-branch-absolute-n32" \
[list [list ld $abi_ldflags(n32)]]
run_dump_test "mips16-branch-absolute-n32-1" \
[list [list ld $abi_ldflags(n32)]]
run_dump_test "mips16-branch-absolute-n32-2" \
[list [list ld $abi_ldflags(n32)]]
run_dump_test "mips16-branch-absolute-addend-n32" \
[list [list ld $abi_ldflags(n32)]]
run_dump_test "mips16-branch-absolute-addend-n32-1" \
[list [list ld $abi_ldflags(n32)]]
run_dump_test "mips16-branch-absolute-n64" \
[list [list ld $abi_ldflags(n64)]]
run_dump_test "mips16-branch-absolute-n64-1" \
[list [list ld $abi_ldflags(n64)]]
run_dump_test "mips16-branch-absolute-n64-2" \
[list [list ld $abi_ldflags(n64)]]
run_dump_test "mips16-branch-absolute-addend-n64" \
[list [list ld $abi_ldflags(n64)]]
run_dump_test "mips16-branch-absolute-addend-n64-1" \
[list [list ld $abi_ldflags(n64)]]
}
run_dump_test "micromips-branch-absolute" [list [list ld $abi_ldflags(o32)]]

View File

@ -0,0 +1,6 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 link branch to absolute expression 1
#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-1.s
#as: -EB -32
#ld: -EB -Ttext 0 -e foo
#dump: mips16-branch-absolute.d

View File

@ -0,0 +1,6 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 link branch to absolute expression 2
#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-2.s
#as: -EB -32
#ld: -EB -Ttext 0 -e foo
#dump: mips16-branch-absolute.d

View File

@ -0,0 +1,6 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 link branch to absolute expression with addend 1
#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.s
#as: -EB -32
#ld: -EB -Ttext 0x12340000 -e foo
#dump: mips16-branch-absolute-addend.d

View File

@ -0,0 +1,6 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 link branch to absolute expression with addend 1 (n32)
#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.s
#as: -EB -n32 -march=from-abi
#ld: -EB -Ttext 0x12340000 -e foo
#dump: mips16-branch-absolute-addend.d

View File

@ -0,0 +1,6 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 link branch to absolute expression with addend 1 (n64)
#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-addend-1.s
#as: -EB -64 -march=from-abi
#ld: -EB -Ttext 0x12340000 -e foo
#dump: mips16-branch-absolute-addend.d

View File

@ -0,0 +1,6 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 link branch to absolute expression 1 (n32)
#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-1.s
#as: -EB -n32 -march=from-abi
#ld: -EB -Ttext 0 -e foo
#dump: mips16-branch-absolute.d

View File

@ -0,0 +1,6 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 link branch to absolute expression 2 (n32)
#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-2.s
#as: -EB -n32 -march=from-abi
#ld: -EB -Ttext 0 -e foo
#dump: mips16-branch-absolute.d

View File

@ -0,0 +1,6 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 link branch to absolute expression 1 (n64)
#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-1.s
#as: -EB -64 -march=from-abi
#ld: -EB -Ttext 0 -e foo
#dump: mips16-branch-absolute.d

View File

@ -0,0 +1,6 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: MIPS16 link branch to absolute expression 2 (n64)
#source: ../../../gas/testsuite/gas/mips/mips16-branch-absolute-2.s
#as: -EB -64 -march=from-abi
#ld: -EB -Ttext 0 -e foo
#dump: mips16-branch-absolute.d