diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2016-02-16 02:23:28 +0300 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2016-02-17 23:08:15 +0300 |
commit | 4111950f363221c4641dc2f33bea61cc94f34906 (patch) | |
tree | 6da128f81f8682f41715183037ef564051781b68 /gas/testsuite | |
parent | 8f79b794ce055b3b4041788182080f4ce3f9048e (diff) | |
download | gdb-4111950f363221c4641dc2f33bea61cc94f34906.zip gdb-4111950f363221c4641dc2f33bea61cc94f34906.tar.gz gdb-4111950f363221c4641dc2f33bea61cc94f34906.tar.bz2 |
xtensa: fix .init/.fini literals moving
Despite the documentation and the comment in xtensa_move_literals, in
the presence of --text-section-literals and --auto-litpools literals are
moved from the separate literal sections into .init and .fini, because
the check in the xtensa_move_literals is incorrect.
This moving was broken with introduction of auto litpools: some literals
now may be lost. This happens because literal frags emitted from .init
and .fini are not closed when new .literal_position marks new literal
pool. Then frag_align(2, 0, 0) changes type of the last literal frag to
rs_align. rs_align frags are skipped in the xtensa_move_literals. As a
result fixups against such literals are not moved out of .init.literal/
.fini.literal sections producing the following assembler error:
test.S: Warning: fixes not all moved from .init.literal
test.S: Internal error!
Fix check for .init.literal/.fini.literal in the xtensa_move_literals
and don't let it move literals from there in the presence of
--text-section-literals or --auto-litpools.
2016-02-17 Max Filippov <jcmvbkbc@gmail.com>
gas/
* config/tc-xtensa.c (xtensa_move_literals): Fix check for
.init.literal/.fini.literal section name.
* testsuite/gas/xtensa/all.exp: Add init-fini-literals to the
list of xtensa tests.
* testsuite/gas/xtensa/init-fini-literals.d: New file:
init-fini-literals test result patterns.
* testsuite/gas/xtensa/init-fini-literals.s: New file:
init-fini-literals test.
Diffstat (limited to 'gas/testsuite')
-rw-r--r-- | gas/testsuite/gas/xtensa/all.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/xtensa/init-fini-literals.d | 24 | ||||
-rw-r--r-- | gas/testsuite/gas/xtensa/init-fini-literals.s | 19 |
3 files changed, 44 insertions, 0 deletions
diff --git a/gas/testsuite/gas/xtensa/all.exp b/gas/testsuite/gas/xtensa/all.exp index 7ff7bd7..6b67320 100644 --- a/gas/testsuite/gas/xtensa/all.exp +++ b/gas/testsuite/gas/xtensa/all.exp @@ -102,6 +102,7 @@ if [istarget xtensa*-*-*] then { run_dump_test "first_frag_align" run_dump_test "auto-litpools" run_dump_test "loc" + run_dump_test "init-fini-literals" } if [info exists errorInfo] then { diff --git a/gas/testsuite/gas/xtensa/init-fini-literals.d b/gas/testsuite/gas/xtensa/init-fini-literals.d new file mode 100644 index 0000000..19ed121 --- /dev/null +++ b/gas/testsuite/gas/xtensa/init-fini-literals.d @@ -0,0 +1,24 @@ +#as: --text-section-literals +#objdump: -r +#name: check that literals for .init and .fini always go to separate sections + +.*: +file format .*xtensa.* +#... +RELOCATION RECORDS FOR \[\.init\.literal\]: +#... +00000000 R_XTENSA_PLT init +#... +RELOCATION RECORDS FOR \[\.fini\.literal\]: +#... +00000000 R_XTENSA_PLT fini +#... +RELOCATION RECORDS FOR \[\.init\]: +#... +.* R_XTENSA_SLOT0_OP \.init\.literal +.* R_XTENSA_SLOT0_OP \.init\.literal\+0x00000004 +#... +RELOCATION RECORDS FOR \[\.fini\]: +#... +.* R_XTENSA_SLOT0_OP \.fini\.literal +.* R_XTENSA_SLOT0_OP \.fini\.literal\+0x00000004 +#... diff --git a/gas/testsuite/gas/xtensa/init-fini-literals.s b/gas/testsuite/gas/xtensa/init-fini-literals.s new file mode 100644 index 0000000..7c9ec17 --- /dev/null +++ b/gas/testsuite/gas/xtensa/init-fini-literals.s @@ -0,0 +1,19 @@ + .section .init,"ax",@progbits + .literal_position + .literal .LC0, init@PLT + .literal_position + .literal .LC1, 1 + .align 4 + + l32r a2, .LC0 + l32r a2, .LC1 + + .section .fini,"ax",@progbits + .literal_position + .literal .LC2, fini@PLT + .literal_position + .literal .LC3, 1 + .align 4 + + l32r a2, .LC2 + l32r a2, .LC3 |