123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- From 471702ac4a57878a06e8167f063274cf413e548d Mon Sep 17 00:00:00 2001
- From: Max Filippov <jcmvbkbc@gmail.com>
- 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 <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.
- Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
- gas/config/tc-xtensa.c | 22 +++++++++-------------
- 1 file changed, 9 insertions(+), 13 deletions(-)
- diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c
- index 0cc06361cf6f..6a80e76fed8c 100644
- @@ -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 ();
- }
-
-
- --
- 2.11.0
|