xtensa: fix .init/.fini literals moving
authorMax Filippov <jcmvbkbc@gmail.com>
Mon, 15 Feb 2016 23:23:28 +0000 (02:23 +0300)
committerMax Filippov <jcmvbkbc@gmail.com>
Wed, 17 Feb 2016 20:08:15 +0000 (23:08 +0300)
commit4111950f363221c4641dc2f33bea61cc94f34906
tree6da128f81f8682f41715183037ef564051781b68
parent8f79b794ce055b3b4041788182080f4ce3f9048e
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.
gas/ChangeLog
gas/config/tc-xtensa.c
gas/testsuite/gas/xtensa/all.exp
gas/testsuite/gas/xtensa/init-fini-literals.d [new file with mode: 0644]
gas/testsuite/gas/xtensa/init-fini-literals.s [new file with mode: 0644]