From 548791769dc737f05cb12e5ee4190b7e853beac9 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Mon, 8 Apr 2019 13:47:18 -0700 Subject: [PATCH] xtensa: gas: put .literal_position at section start Provide literal position at the beginning of each section for literal space reserved by relaxations when text-section-literals or auto-litpools options are used. Remove code that adds fill frag to the literal section for every .literal_position directive to avoid creation of empty literal sections. Fix auto-litpools tests that got literal pool address changes. gas/ 2019-04-11 Max Filippov * config/tc-xtensa.c (xtensa_is_init_fini): Add declaration. (xtensa_mark_literal_pool_location): Don't add fill frag to literal section that records literal pool location. (md_begin): Call xtensa_mark_literal_pool_location when text section literals or auto litpools are used. (xtensa_elf_section_change_hook): Call xtensa_mark_literal_pool_location when text section literals or auto litpools are used, there's no literal pool location defined for the current section and it's not .init or .fini. * testsuite/gas/xtensa/auto-litpools-first1.d: Fix up addresses. * testsuite/gas/xtensa/auto-litpools-first2.d: Likewise. * testsuite/gas/xtensa/auto-litpools.d: Likewise. --- gas/ChangeLog | 15 +++++++++++++++ gas/config/tc-xtensa.c | 22 +++++++++------------- gas/testsuite/gas/xtensa/auto-litpools-first1.d | 6 +++--- gas/testsuite/gas/xtensa/auto-litpools-first2.d | 10 ++++------ gas/testsuite/gas/xtensa/auto-litpools.d | 6 +++--- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 253f1cf..f0d2a97 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2019-04-11 Max Filippov + + * config/tc-xtensa.c (xtensa_is_init_fini): Add declaration. + (xtensa_mark_literal_pool_location): Don't add fill frag to literal + section that records literal pool location. + (md_begin): Call xtensa_mark_literal_pool_location when text + section literals or auto litpools are used. + (xtensa_elf_section_change_hook): Call + xtensa_mark_literal_pool_location when text section literals or + auto litpools are used, there's no literal pool location defined + for the current section and it's not .init or .fini. + * testsuite/gas/xtensa/auto-litpools-first1.d: Fix up addresses. + * testsuite/gas/xtensa/auto-litpools-first2.d: Likewise. + * testsuite/gas/xtensa/auto-litpools.d: Likewise. + 2019-04-11 Sudakshina Das * config/tc-aarch64.c (process_omitted_operand): Add case for diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index 0cc0636..6a80e76 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -497,6 +497,7 @@ static fixS *xg_append_jump (fragS *fragP, symbolS *sym, offsetT offset); static void xtensa_maybe_create_literal_pool_frag (bfd_boolean, bfd_boolean); static bfd_boolean auto_litpools = FALSE; static int auto_litpool_limit = 0; +static bfd_boolean xtensa_is_init_fini (segT seg); /* Alignment Functions. */ @@ -4797,7 +4798,6 @@ xtensa_mark_literal_pool_location (void) { /* Any labels pointing to the current location need to be adjusted to after the literal pool. */ - emit_state s; fragS *pool_location; if (use_literal_section) @@ -4818,19 +4818,7 @@ xtensa_mark_literal_pool_location (void) RELAX_LITERAL_POOL_END, NULL, 0, NULL); xtensa_set_frag_assembly_state (frag_now); - /* Now put a frag into the literal pool that points to this location. */ set_literal_pool_location (now_seg, pool_location); - xtensa_switch_to_non_abs_literal_fragment (&s); - frag_align (2, 0, 0); - record_alignment (now_seg, 2); - - /* Close whatever frag is there. */ - frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL); - xtensa_set_frag_assembly_state (frag_now); - frag_now->tc_frag_data.literal_frag = pool_location; - frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL); - xtensa_restore_emit_state (&s); - xtensa_set_frag_assembly_state (frag_now); } @@ -5334,6 +5322,9 @@ md_begin (void) /* Set up the assembly state. */ if (!frag_now->tc_frag_data.is_assembly_state_set) xtensa_set_frag_assembly_state (frag_now); + + if (!use_literal_section) + xtensa_mark_literal_pool_location (); } @@ -5933,6 +5924,11 @@ xtensa_elf_section_change_hook (void) /* Set up the assembly state. */ if (!frag_now->tc_frag_data.is_assembly_state_set) xtensa_set_frag_assembly_state (frag_now); + + if (!use_literal_section + && seg_info (now_seg)->tc_segment_info_data.literal_pool_loc == NULL + && !xtensa_is_init_fini (now_seg)) + xtensa_mark_literal_pool_location (); } diff --git a/gas/testsuite/gas/xtensa/auto-litpools-first1.d b/gas/testsuite/gas/xtensa/auto-litpools-first1.d index 322cdc5..9dfb0b0 100644 --- a/gas/testsuite/gas/xtensa/auto-litpools-first1.d +++ b/gas/testsuite/gas/xtensa/auto-litpools-first1.d @@ -5,8 +5,8 @@ .*: +file format .*xtensa.* #... Contents of section .text: - 0000 ........ 20170331 .* + 0000 20170331 .* #... -00000000 : -.*0:.*j.8 .* +00000004 : +.*4:.*l32r.*a2, 0.* #... diff --git a/gas/testsuite/gas/xtensa/auto-litpools-first2.d b/gas/testsuite/gas/xtensa/auto-litpools-first2.d index a6b798e..44dbddd 100644 --- a/gas/testsuite/gas/xtensa/auto-litpools-first2.d +++ b/gas/testsuite/gas/xtensa/auto-litpools-first2.d @@ -5,11 +5,9 @@ .*: +file format .*xtensa.* #... Contents of section .text: - 0000 ........ ........ 20170331 .* + 0000 20170331 .* #... -00000000 : - 0:.*addi.*a1.* - 3:.*j.*c.* -#... - c:.*l32r.*a2, 8.* +00000004 : + 4:.*addi.*a1.* + 7:.*l32r.*a2, 0.* #... diff --git a/gas/testsuite/gas/xtensa/auto-litpools.d b/gas/testsuite/gas/xtensa/auto-litpools.d index 8eadd1f..8b6d13e 100644 --- a/gas/testsuite/gas/xtensa/auto-litpools.d +++ b/gas/testsuite/gas/xtensa/auto-litpools.d @@ -4,9 +4,9 @@ .*: +file format .*xtensa.* #... -.*8:.*l32r.a2, 4 .* +.*4:.*l32r.a2, 0 .* #... -.*3f029:.*j.3f030 .* +.*3f025:.*j.3f02c .* #... -.*40752:.*l32r.a2, 3f02c .* +.*4074e:.*l32r.a2, 3f028 .* #... -- 2.7.4