aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2009-08-07 19:30:31 +0000
committerDaniel Jacobowitz <drow@false.org>2009-08-07 19:30:31 +0000
commit940b5ce0998a436a5e414250ab8fa9a25138c839 (patch)
tree0baeacd6ca529e30c35dfab2aabfd6c9da2ffa31 /gas/config
parentddd3c53c3d15eefc6edb664887eba9502eda5c44 (diff)
downloadgdb-940b5ce0998a436a5e414250ab8fa9a25138c839.zip
gdb-940b5ce0998a436a5e414250ab8fa9a25138c839.tar.gz
gdb-940b5ce0998a436a5e414250ab8fa9a25138c839.tar.bz2
gas/
* config/tc-arm.c (marked_pr_dependency, mapstate): Delete global variables. (mapping_state): Use the section's mapstate. (mapping_state_2): Likewise. Skip special sections. (s_arm_unwind_fnend): Use the section's marked_pr_dependency. (arm_elf_change_section): Do not set deleted globals. * config/tc-arm.h (struct arm_segment_info_type): Document marked_pr_dependency. gas/testsuite/ * gas/arm/mapping2.s: Test code after .ident.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/tc-arm.c30
-rw-r--r--gas/config/tc-arm.h5
2 files changed, 16 insertions, 19 deletions
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index c77e44e..20b7f2a 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -77,11 +77,6 @@ static struct
unsigned sp_restored:1;
} unwind;
-/* Bit N indicates that an R_ARM_NONE relocation has been output for
- __aeabi_unwind_cpp_prN already if set. This enables dependencies to be
- emitted only once per section, to save unnecessary bloat. */
-static unsigned int marked_pr_dependency = 0;
-
#endif /* OBJ_ELF */
/* Results from operand parsing worker functions. */
@@ -2432,8 +2427,6 @@ s_unreq (int a ATTRIBUTE_UNUSED)
Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped. */
-static enum mstate mapstate = MAP_UNDEFINED;
-
/* Create a new mapping symbol for the transition to STATE. */
static void
@@ -2532,6 +2525,8 @@ static void mapping_state_2 (enum mstate state, int max_chars);
void
mapping_state (enum mstate state)
{
+ enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
+
#define TRANSITION(from, to) (mapstate == (from) && state == (to))
if (mapstate == state)
@@ -2565,12 +2560,16 @@ mapping_state (enum mstate state)
static void
mapping_state_2 (enum mstate state, int max_chars)
{
+ enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
+
+ if (!SEG_NORMAL (now_seg))
+ return;
+
if (mapstate == state)
/* The mapping symbol has already been emitted.
There is nothing else to do. */
return;
- mapstate = state;
seg_info (now_seg)->tc_segment_info_data.mapstate = state;
make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
}
@@ -3421,6 +3420,7 @@ s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
long where;
char *ptr;
valueT val;
+ unsigned int marked_pr_dependency;
demand_empty_rest_of_line ();
@@ -3450,6 +3450,8 @@ s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
/* Indicate dependency on EHABI-defined personality routines to the
linker, if it hasn't been done already. */
+ marked_pr_dependency
+ = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
if (unwind.personality_index >= 0 && unwind.personality_index < 3
&& !(marked_pr_dependency & (1 << unwind.personality_index)))
{
@@ -3461,9 +3463,8 @@ s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
};
symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
- marked_pr_dependency |= 1 << unwind.personality_index;
seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
- = marked_pr_dependency;
+ |= 1 << unwind.personality_index;
}
if (val)
@@ -18557,19 +18558,10 @@ arm_init_frag (fragS * fragP, int max_chars)
void
arm_elf_change_section (void)
{
- segment_info_type *seginfo;
-
/* Link an unlinked unwind index table section to the .text section. */
if (elf_section_type (now_seg) == SHT_ARM_EXIDX
&& elf_linked_to_section (now_seg) == NULL)
elf_linked_to_section (now_seg) = text_section;
-
- if (!SEG_NORMAL (now_seg))
- return;
-
- seginfo = seg_info (now_seg);
- marked_pr_dependency = seginfo->tc_segment_info_data.marked_pr_dependency;
- mapstate = seginfo->tc_segment_info_data.mapstate;
}
int
diff --git a/gas/config/tc-arm.h b/gas/config/tc-arm.h
index d386770..2a85afd 100644
--- a/gas/config/tc-arm.h
+++ b/gas/config/tc-arm.h
@@ -272,7 +272,12 @@ void mapping_state (enum mstate);
struct arm_segment_info_type
{
enum mstate mapstate;
+
+ /* Bit N indicates that an R_ARM_NONE relocation has been output for
+ __aeabi_unwind_cpp_prN already if set. This enables dependencies to be
+ emitted only once per section, to save unnecessary bloat. */
unsigned int marked_pr_dependency;
+
struct current_it current_it;
};