forked from Imagelibrary/binutils-gdb
Apply Bruno de Bus's patch to record the ARM mapping symbol state on a per-
section basis and to switch to the MAP_DATA state when emitting literal pools.
This commit is contained in:
@@ -1,3 +1,22 @@
|
||||
2004-04-22 Bruno De Bus <bdebus@elis.ugent.be>
|
||||
|
||||
* config/tc-arm.h (enum mstate): Move here, add MAP_UNDEFINED
|
||||
state.
|
||||
(TC_SEGMENT_INFO_TYPE): Define to enum mstate.
|
||||
* config/tc-arm.c (enum mstate): Delete from here.
|
||||
(mapping_state): Remove the static mapstate variable and instead
|
||||
store the state in the segment. This allows a per-section mapping
|
||||
state. Handle and ignore MAP_UNDEFINED states.
|
||||
(arm_elf_change_section): Get the current mapping state from the
|
||||
new section.
|
||||
(s_ltorg): Set the mapping state to MAP_DATA.
|
||||
(arm_cleanup): Use arm_elf_change_section to get the mapping state
|
||||
for each pool as it is emitted.
|
||||
|
||||
2004-04-22 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* config/tc-arm.h: Formatting tidy ups.
|
||||
|
||||
2004-04-20 Chris Demetriou <cgd@broadcom.com>
|
||||
|
||||
* NEWS: Note that MIPS -membedded-pic option is deprecated.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* tc-arm.c -- Assemble for the ARM
|
||||
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
||||
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
|
||||
Modified by David Taylor (dtaylor@armltd.co.uk)
|
||||
@@ -2829,13 +2829,6 @@ validate_offset_imm (val, hwse)
|
||||
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
enum mstate
|
||||
{
|
||||
MAP_DATA,
|
||||
MAP_ARM,
|
||||
MAP_THUMB
|
||||
};
|
||||
|
||||
/* This code is to handle mapping symbols as defined in the ARM ELF spec.
|
||||
(This text is taken from version B-02 of the spec):
|
||||
|
||||
@@ -2910,10 +2903,11 @@ enum mstate
|
||||
the EABI (which is still under development), so they are not
|
||||
implemented here. */
|
||||
|
||||
static enum mstate mapstate = MAP_UNDEFINED;
|
||||
|
||||
static void
|
||||
mapping_state (enum mstate state)
|
||||
{
|
||||
static enum mstate mapstate = MAP_DATA;
|
||||
symbolS * symbolP;
|
||||
const char * symname;
|
||||
int type;
|
||||
@@ -2939,10 +2933,14 @@ mapping_state (enum mstate state)
|
||||
symname = "$t";
|
||||
type = BSF_FUNCTION;
|
||||
break;
|
||||
case MAP_UNDEFINED:
|
||||
return;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
seg_info (now_seg)->tc_segment_info_data = state;
|
||||
|
||||
symbolP = symbol_new (symname, now_seg, (valueT) frag_now_fix (), frag_now);
|
||||
symbol_table_insert (symbolP);
|
||||
symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
|
||||
@@ -2983,16 +2981,7 @@ arm_elf_change_section (void)
|
||||
if ((flags & SEC_ALLOC) == 0)
|
||||
return;
|
||||
|
||||
if (flags & SEC_CODE)
|
||||
{
|
||||
if (thumb_mode)
|
||||
mapping_state (MAP_THUMB);
|
||||
else
|
||||
mapping_state (MAP_ARM);
|
||||
}
|
||||
else
|
||||
/* This section does not contain code. Therefore it must contain data. */
|
||||
mapping_state (MAP_DATA);
|
||||
mapstate = seg_info (now_seg)->tc_segment_info_data;
|
||||
}
|
||||
#else
|
||||
#define mapping_state(a)
|
||||
@@ -3115,6 +3104,8 @@ s_ltorg (ignored)
|
||||
|| pool->next_free_entry == 0)
|
||||
return;
|
||||
|
||||
mapping_state (MAP_DATA);
|
||||
|
||||
/* Align pool as you have word accesses.
|
||||
Only make a frag if we have to. */
|
||||
if (!need_pass_2)
|
||||
@@ -13878,6 +13869,9 @@ arm_cleanup ()
|
||||
{
|
||||
/* Put it at the end of the relevent section. */
|
||||
subseg_set (pool->section, pool->sub_section);
|
||||
#ifdef OBJ_ELF
|
||||
arm_elf_change_section ();
|
||||
#endif
|
||||
s_ltorg (0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* This file is tc-arm.h
|
||||
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
|
||||
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
|
||||
Modified by David Taylor (dtaylor@armltd.co.uk)
|
||||
@@ -47,67 +47,47 @@
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#define BIG_ENDIAN 4321
|
||||
|
||||
#if defined OBJ_AOUT
|
||||
#if defined TE_RISCIX
|
||||
# define TARGET_FORMAT "a.out-riscix"
|
||||
#elif defined TE_LINUX
|
||||
# define ARM_BI_ENDIAN
|
||||
# define TARGET_FORMAT "a.out-arm-linux"
|
||||
#elif defined TE_NetBSD
|
||||
# define TARGET_FORMAT "a.out-arm-netbsd"
|
||||
#else
|
||||
# define ARM_BI_ENDIAN
|
||||
# define TARGET_FORMAT \
|
||||
(target_big_endian ? "a.out-arm-big" : "a.out-arm-little")
|
||||
#endif
|
||||
#endif /* OBJ_AOUT */
|
||||
|
||||
#ifdef OBJ_AIF
|
||||
#define TARGET_FORMAT "aif"
|
||||
#endif
|
||||
|
||||
struct fix;
|
||||
|
||||
#if defined OBJ_COFF || defined OBJ_ELF
|
||||
#if defined OBJ_AOUT
|
||||
# if defined TE_RISCIX
|
||||
# define TARGET_FORMAT "a.out-riscix"
|
||||
# elif defined TE_LINUX
|
||||
# define ARM_BI_ENDIAN
|
||||
# define TARGET_FORMAT "a.out-arm-linux"
|
||||
# elif defined TE_NetBSD
|
||||
# define TARGET_FORMAT "a.out-arm-netbsd"
|
||||
# else
|
||||
# define ARM_BI_ENDIAN
|
||||
# define TARGET_FORMAT (target_big_endian ? "a.out-arm-big" : "a.out-arm-little")
|
||||
# endif
|
||||
#elif defined OBJ_AIF
|
||||
# define TARGET_FORMAT "aif"
|
||||
#elif defined OBJ_COFF
|
||||
# define ARM_BI_ENDIAN
|
||||
|
||||
# define TC_VALIDATE_FIX(FIX, SEGTYPE, LABEL) arm_validate_fix (FIX)
|
||||
extern void arm_validate_fix PARAMS ((struct fix *));
|
||||
#endif
|
||||
|
||||
#ifdef OBJ_COFF
|
||||
# if defined TE_PE
|
||||
# ifdef TE_EPOC
|
||||
# define TARGET_FORMAT (target_big_endian ? "epoc-pe-arm-big" : "epoc-pe-arm-little")
|
||||
# else
|
||||
# define TARGET_FORMAT (target_big_endian ? "pe-arm-big" : "pe-arm-little")
|
||||
# endif
|
||||
# if defined TE_EPOC
|
||||
# define TARGET_FORMAT (target_big_endian ? "epoc-pe-arm-big" : "epoc-pe-arm-little")
|
||||
# else
|
||||
# define TARGET_FORMAT (target_big_endian ? "pe-arm-big" : "pe-arm-little")
|
||||
# endif
|
||||
# else
|
||||
# define TARGET_FORMAT (target_big_endian ? "coff-arm-big" : "coff-arm-little")
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
# define TARGET_FORMAT elf32_arm_target_format()
|
||||
extern const char * elf32_arm_target_format PARAMS ((void));
|
||||
|
||||
# define md_elf_section_change_hook() arm_elf_change_section
|
||||
extern void arm_elf_change_section (void);
|
||||
#elif defined OBJ_ELF
|
||||
# define ARM_BI_ENDIAN
|
||||
# define TARGET_FORMAT elf32_arm_target_format ()
|
||||
#endif
|
||||
|
||||
#define TC_FORCE_RELOCATION(FIX) arm_force_relocation (FIX)
|
||||
extern int arm_force_relocation PARAMS ((struct fix *));
|
||||
|
||||
#define md_convert_frag(b, s, f) {as_fatal (_("arm convert_frag\n"));}
|
||||
#define md_convert_frag(b, s, f) { as_fatal (_("arm convert_frag\n")); }
|
||||
|
||||
#define md_cleanup() arm_cleanup ()
|
||||
extern void arm_cleanup PARAMS ((void));
|
||||
|
||||
#define md_start_line_hook() arm_start_line_hook ()
|
||||
extern void arm_start_line_hook PARAMS ((void));
|
||||
|
||||
#define tc_frob_label(S) arm_frob_label (S)
|
||||
extern void arm_frob_label PARAMS ((symbolS *));
|
||||
|
||||
/* We also need to mark assembler created symbols: */
|
||||
#define tc_frob_fake_label(S) arm_frob_label (S)
|
||||
@@ -119,19 +99,9 @@ extern int arm_force_relocation PARAMS ((struct fix *));
|
||||
#define TC_FIX_TYPE PTR
|
||||
#define TC_INIT_FIX_DATA(FIX) ((FIX)->tc_fix_data = NULL)
|
||||
|
||||
#if defined OBJ_ELF || defined OBJ_COFF
|
||||
#define EXTERN_FORCE_RELOC 1
|
||||
|
||||
#define tc_fix_adjustable(FIX) arm_fix_adjustable (FIX)
|
||||
bfd_boolean arm_fix_adjustable PARAMS ((struct fix *));
|
||||
|
||||
/* Values passed to md_apply_fix3 don't include the symbol value. */
|
||||
#define MD_APPLY_SYM_VALUE(FIX) 0
|
||||
#endif
|
||||
|
||||
/* We need to keep some local information on symbols. */
|
||||
|
||||
#define TC_SYMFIELD_TYPE unsigned int
|
||||
#define TC_SYMFIELD_TYPE unsigned int
|
||||
#define ARM_GET_FLAG(s) (*symbol_get_tc (s))
|
||||
#define ARM_SET_FLAG(s,v) (*symbol_get_tc (s) |= (v))
|
||||
#define ARM_RESET_FLAG(s,v) (*symbol_get_tc (s) &= ~(v))
|
||||
@@ -148,23 +118,10 @@ bfd_boolean arm_fix_adjustable PARAMS ((struct fix *));
|
||||
#define ARM_SET_INTERWORK(s,t) ((t) ? ARM_SET_FLAG (s, ARM_FLAG_INTERWORK) : ARM_RESET_FLAG (s, ARM_FLAG_INTERWORK))
|
||||
#define THUMB_SET_FUNC(s,t) ((t) ? ARM_SET_FLAG (s, THUMB_FLAG_FUNC) : ARM_RESET_FLAG (s, THUMB_FLAG_FUNC))
|
||||
|
||||
#define TC_START_LABEL(C,STR) \
|
||||
(c == ':' || (c == '/' && arm_data_in_code ()))
|
||||
int arm_data_in_code PARAMS ((void));
|
||||
|
||||
#define tc_canonicalize_symbol_name(str) \
|
||||
arm_canonicalize_symbol_name (str);
|
||||
char * arm_canonicalize_symbol_name PARAMS ((char *));
|
||||
|
||||
#define obj_adjust_symtab() arm_adjust_symtab ()
|
||||
extern void arm_adjust_symtab PARAMS ((void));
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
#define obj_frob_symbol(sym, punt) armelf_frob_symbol ((sym), & (punt))
|
||||
void armelf_frob_symbol PARAMS ((symbolS *, int *));
|
||||
#endif
|
||||
|
||||
#define tc_aout_pre_write_hook(x) {;} /* not used */
|
||||
#define TC_START_LABEL(C,STR) (c == ':' || (c == '/' && arm_data_in_code ()))
|
||||
#define tc_canonicalize_symbol_name(str) arm_canonicalize_symbol_name (str);
|
||||
#define obj_adjust_symtab() arm_adjust_symtab ()
|
||||
#define tc_aout_pre_write_hook(x) {;} /* not used */
|
||||
|
||||
#define LISTING_HEADER "ARM GAS "
|
||||
|
||||
@@ -172,9 +129,6 @@ void armelf_frob_symbol PARAMS ((symbolS *, int *));
|
||||
|
||||
#define LOCAL_LABEL(name) (name[0] == '.' && (name[1] == 'L'))
|
||||
#define LOCAL_LABELS_FB 1
|
||||
#ifdef OBJ_ELF
|
||||
#define LOCAL_LABEL_PREFIX '.'
|
||||
#endif
|
||||
|
||||
/* This expression evaluates to true if the relocation is for a local
|
||||
object for which we still want to do the relocation at runtime.
|
||||
@@ -192,29 +146,15 @@ void armelf_frob_symbol PARAMS ((symbolS *, int *));
|
||||
|| TC_FORCE_RELOCATION (FIX))
|
||||
|
||||
#define TC_CONS_FIX_NEW cons_fix_new_arm
|
||||
extern void cons_fix_new_arm PARAMS ((fragS *, int, int, expressionS *));
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
#define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
|
||||
#else
|
||||
#define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_"
|
||||
#endif
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
#define DWARF2_LINE_MIN_INSN_LENGTH 2
|
||||
#endif
|
||||
|
||||
#define MAX_MEM_FOR_RS_ALIGN_CODE 31
|
||||
|
||||
/* For frags in code sections we need to record whether they contain
|
||||
ARM code or THUMB code. This is that if they have to be aligned,
|
||||
they can contain the correct type of no-op instruction. */
|
||||
#define TC_FRAG_TYPE int
|
||||
#define TC_FRAG_TYPE int
|
||||
#define TC_FRAG_INIT(fragp) arm_init_frag (fragp)
|
||||
extern void arm_init_frag PARAMS ((struct frag *));
|
||||
|
||||
#define HANDLE_ALIGN(fragp) arm_handle_align (fragp)
|
||||
extern void arm_handle_align PARAMS ((struct frag *));
|
||||
#define HANDLE_ALIGN(fragp) arm_handle_align (fragp)
|
||||
|
||||
#define md_do_align(N, FILL, LEN, MAX, LABEL) \
|
||||
if (FILL == NULL && (N) != 0 && ! need_pass_2 && subseg_text_p (now_seg)) \
|
||||
@@ -222,4 +162,50 @@ extern void arm_handle_align PARAMS ((struct frag *));
|
||||
arm_frag_align_code (N, MAX); \
|
||||
goto LABEL; \
|
||||
}
|
||||
extern void arm_frag_align_code PARAMS ((int, int));
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
# define DWARF2_LINE_MIN_INSN_LENGTH 2
|
||||
# define obj_frob_symbol(sym, punt) armelf_frob_symbol ((sym), & (punt))
|
||||
# define md_elf_section_change_hook() arm_elf_change_section ()
|
||||
# define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
|
||||
# define LOCAL_LABEL_PREFIX '.'
|
||||
# define TC_SEGMENT_INFO_TYPE enum mstate
|
||||
|
||||
enum mstate
|
||||
{
|
||||
MAP_UNDEFINED = 0, /* Must be zero, for seginfo in new sections. */
|
||||
MAP_DATA,
|
||||
MAP_ARM,
|
||||
MAP_THUMB
|
||||
};
|
||||
|
||||
#else /* Not OBJ_ELF. */
|
||||
#define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_"
|
||||
#endif
|
||||
|
||||
#if defined OBJ_ELF || defined OBJ_COFF
|
||||
|
||||
# define EXTERN_FORCE_RELOC 1
|
||||
# define tc_fix_adjustable(FIX) arm_fix_adjustable (FIX)
|
||||
/* Values passed to md_apply_fix3 don't include the symbol value. */
|
||||
# define MD_APPLY_SYM_VALUE(FIX) 0
|
||||
# define TC_VALIDATE_FIX(FIX, SEGTYPE, LABEL) arm_validate_fix (FIX)
|
||||
|
||||
#endif
|
||||
|
||||
extern void arm_frag_align_code (int, int);
|
||||
extern void arm_validate_fix (struct fix *);
|
||||
extern const char * elf32_arm_target_format (void);
|
||||
extern void arm_elf_change_section (void);
|
||||
extern int arm_force_relocation (struct fix *);
|
||||
extern void arm_cleanup (void);
|
||||
extern void arm_start_line_hook (void);
|
||||
extern void arm_frob_label (symbolS *);
|
||||
extern int arm_data_in_code (void);
|
||||
extern char * arm_canonicalize_symbol_name (char *);
|
||||
extern void arm_adjust_symtab (void);
|
||||
extern void armelf_frob_symbol (symbolS *, int *);
|
||||
extern void cons_fix_new_arm (fragS *, int, int, expressionS *);
|
||||
extern void arm_init_frag (struct frag *);
|
||||
extern void arm_handle_align (struct frag *);
|
||||
extern bfd_boolean arm_fix_adjustable (struct fix *);
|
||||
|
||||
Reference in New Issue
Block a user