diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 11 | ||||
-rw-r--r-- | gas/config/tc-xtensa.c | 12 | ||||
-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 |
5 files changed, 65 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 2e89801..3688728 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2016-02-17 Max Filippov <jcmvbkbc@gmail.com> + + * 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. + 2016-02-17 Nick Clifton <nickc@redhat.com> * config/tc-msp430.c (msp430_mcu_data): Sync with data from TI's diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index 36a06cc..5773634 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -11061,6 +11061,10 @@ xtensa_move_literals (void) fixS *fix, *next_fix, **fix_splice; sym_list *lit; struct litpool_seg *lps; + const char *init_name = INIT_SECTION_NAME; + const char *fini_name = FINI_SECTION_NAME; + int init_name_len = strlen(init_name); + int fini_name_len = strlen(fini_name); mark_literal_frags (literal_head->next); @@ -11171,9 +11175,13 @@ xtensa_move_literals (void) for (segment = literal_head->next; segment; segment = segment->next) { + const char *seg_name = segment_name (segment->seg); + /* Keep the literals for .init and .fini in separate sections. */ - if (!strcmp (segment_name (segment->seg), INIT_SECTION_NAME) - || !strcmp (segment_name (segment->seg), FINI_SECTION_NAME)) + if ((!memcmp (seg_name, init_name, init_name_len) && + !strcmp (seg_name + init_name_len, ".literal")) || + (!memcmp (seg_name, fini_name, fini_name_len) && + !strcmp (seg_name + fini_name_len, ".literal"))) continue; frchain_from = seg_info (segment->seg)->frchainP; 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 |