|
|
|
@ -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 *); |
|
|
|
|