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  <jcmvbkbc@gmail.com>

	* 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.
This commit is contained in:
Max Filippov
2019-04-08 13:47:18 -07:00
parent 035801cebe
commit 548791769d
5 changed files with 34 additions and 25 deletions

View File

@ -1,3 +1,18 @@
2019-04-11 Max Filippov <jcmvbkbc@gmail.com>
* 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 <sudi.das@arm.com> 2019-04-11 Sudakshina Das <sudi.das@arm.com>
* config/tc-aarch64.c (process_omitted_operand): Add case for * config/tc-aarch64.c (process_omitted_operand): Add case for

View File

@ -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 void xtensa_maybe_create_literal_pool_frag (bfd_boolean, bfd_boolean);
static bfd_boolean auto_litpools = FALSE; static bfd_boolean auto_litpools = FALSE;
static int auto_litpool_limit = 0; static int auto_litpool_limit = 0;
static bfd_boolean xtensa_is_init_fini (segT seg);
/* Alignment Functions. */ /* Alignment Functions. */
@ -4797,7 +4798,6 @@ xtensa_mark_literal_pool_location (void)
{ {
/* Any labels pointing to the current location need /* Any labels pointing to the current location need
to be adjusted to after the literal pool. */ to be adjusted to after the literal pool. */
emit_state s;
fragS *pool_location; fragS *pool_location;
if (use_literal_section) if (use_literal_section)
@ -4818,19 +4818,7 @@ xtensa_mark_literal_pool_location (void)
RELAX_LITERAL_POOL_END, NULL, 0, NULL); RELAX_LITERAL_POOL_END, NULL, 0, NULL);
xtensa_set_frag_assembly_state (frag_now); 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); 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. */ /* Set up the assembly state. */
if (!frag_now->tc_frag_data.is_assembly_state_set) if (!frag_now->tc_frag_data.is_assembly_state_set)
xtensa_set_frag_assembly_state (frag_now); 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. */ /* Set up the assembly state. */
if (!frag_now->tc_frag_data.is_assembly_state_set) if (!frag_now->tc_frag_data.is_assembly_state_set)
xtensa_set_frag_assembly_state (frag_now); 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 ();
} }

View File

@ -5,8 +5,8 @@
.*: +file format .*xtensa.* .*: +file format .*xtensa.*
#... #...
Contents of section .text: Contents of section .text:
0000 ........ 20170331 .* 0000 20170331 .*
#... #...
00000000 <f>: 00000004 <f>:
.*0:.*j.8 .* .*4:.*l32r.*a2, 0.*
#... #...

View File

@ -5,11 +5,9 @@
.*: +file format .*xtensa.* .*: +file format .*xtensa.*
#... #...
Contents of section .text: Contents of section .text:
0000 ........ ........ 20170331 .* 0000 20170331 .*
#... #...
00000000 <f>: 00000004 <f>:
0:.*addi.*a1.* 4:.*addi.*a1.*
3:.*j.*c.* 7:.*l32r.*a2, 0.*
#...
c:.*l32r.*a2, 8.*
#... #...

View File

@ -4,9 +4,9 @@
.*: +file format .*xtensa.* .*: +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 .*
#... #...