X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-arm.h;h=5e32eac637226e6a3fc8eddb8722cd16d814f8d9;hb=bd920864f3dc2cad376989a642ab774aef6b2fce;hp=f88fa2976114a7b338eefe75e7d17455cfe769bd;hpb=2e6976a881711242cc151971b83e36844edbc310;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-arm.h b/gas/config/tc-arm.h index f88fa29761..5e32eac637 100644 --- a/gas/config/tc-arm.h +++ b/gas/config/tc-arm.h @@ -1,5 +1,5 @@ /* This file is tc-arm.h - Copyright (C) 1994-2014 Free Software Foundation, Inc. + Copyright (C) 1994-2020 Free Software Foundation, Inc. Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) Modified by David Taylor (dtaylor@armltd.co.uk) @@ -46,26 +46,10 @@ struct fix; -#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 +#if defined OBJ_COFF # define ARM_BI_ENDIAN # if defined TE_PE -# if defined TE_EPOC -# define TARGET_FORMAT (target_big_endian ? "epoc-pe-arm-big" : "epoc-pe-arm-little") -# elif defined TE_WINCE +# if defined TE_WINCE # define TARGET_FORMAT (target_big_endian ? "pe-arm-wince-big" : "pe-arm-wince-little") # else # define TARGET_FORMAT (target_big_endian ? "pe-arm-big" : "pe-arm-little") @@ -104,8 +88,9 @@ extern int arm_optimize_expr (expressionS *, operatorT, expressionS *); #define md_start_line_hook() arm_start_line_hook () -#define TC_START_LABEL_WITHOUT_COLON(c, l) tc_start_label_without_colon (c, l) -extern bfd_boolean tc_start_label_without_colon (char, const char *); +#define TC_START_LABEL_WITHOUT_COLON(NUL_CHAR, NEXT_CHAR) \ + tc_start_label_without_colon () +extern bfd_boolean tc_start_label_without_colon (void); #define tc_frob_label(S) arm_frob_label (S) @@ -116,6 +101,9 @@ extern bfd_boolean tc_start_label_without_colon (char, const char *); #define md_end arm_md_end extern void arm_md_end (void); bfd_boolean arm_is_eabi (void); + +#define md_post_relax_hook arm_md_post_relax () +extern void arm_md_post_relax (void); #endif /* NOTE: The fake label creation in stabs.c:s_stab_generic() has @@ -176,7 +164,8 @@ void arm_copy_symbol_attributes (symbolS *, symbolS *); (arm_copy_symbol_attributes (DEST, SRC)) #endif -#define TC_START_LABEL(C,S,STR) (C == ':' || (C == '/' && arm_data_in_code ())) +#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \ + (NEXT_CHAR == ':' || (NEXT_CHAR == '/' && arm_data_in_code ())) #define tc_canonicalize_symbol_name(str) arm_canonicalize_symbol_name (str); #define obj_adjust_symtab() arm_adjust_symtab () @@ -195,17 +184,17 @@ void arm_copy_symbol_attributes (symbolS *, symbolS *); pcrel, but it is easier to be safe than sorry. */ #define TC_FORCE_RELOCATION_LOCAL(FIX) \ - (!(FIX)->fx_pcrel \ + (GENERIC_FORCE_RELOCATION_LOCAL (FIX) \ || (FIX)->fx_r_type == BFD_RELOC_ARM_GOT32 \ || (FIX)->fx_r_type == BFD_RELOC_32 \ - || ((FIX)->fx_addsy != NULL && S_IS_WEAK ((FIX)->fx_addsy)) \ - || TC_FORCE_RELOCATION (FIX)) + || ((FIX)->fx_addsy != NULL \ + && S_IS_WEAK ((FIX)->fx_addsy))) /* Force output of R_ARM_REL32 relocations against thumb function symbols. This is needed to ensure the low bit is handled correctly. */ #define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEG) \ - (THUMB_IS_FUNC ((FIX)->fx_addsy) \ - || !SEG_NORMAL (SEG)) + (GENERIC_FORCE_RELOCATION_SUB_SAME (FIX, SEG) \ + || THUMB_IS_FUNC ((FIX)->fx_addsy)) #define TC_FORCE_RELOCATION_ABS(FIX) \ (((FIX)->fx_pcrel \ @@ -233,10 +222,22 @@ struct arm_frag_type #endif }; +static inline int +arm_min (int am_p1, int am_p2) +{ + return am_p1 < am_p2 ? am_p1 : am_p2; +} + #define TC_FRAG_TYPE struct arm_frag_type -/* NOTE: max_chars is a local variable from frag_var / frag_variant. */ -#define TC_FRAG_INIT(fragp) arm_init_frag (fragp, max_chars) +#define TC_FRAG_INIT(fragp, max_bytes) arm_init_frag (fragp, max_bytes) +#define TC_ALIGN_ZERO_IS_DEFAULT 1 #define HANDLE_ALIGN(fragp) arm_handle_align (fragp) +/* PR gas/19276: COFF/PE segment alignment is already handled in coff_frob_section(). */ +#ifndef TE_PE +#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \ + ((!(FRCHAIN)->frch_next && subseg_text_p (SEG)) \ + ? arm_min (2, get_recorded_alignment (SEG)) : 0) +#endif #define md_do_align(N, FILL, LEN, MAX, LABEL) \ if (FILL == NULL && (N) != 0 && ! need_pass_2 && subseg_text_p (now_seg)) \ @@ -253,21 +254,25 @@ struct arm_frag_type /* Registers are generally saved at negative offsets to the CFA. */ #define DWARF2_CIE_DATA_ALIGNMENT (-4) -/* State variables for IT block handling. */ -enum it_state +/* State variables for predication block handling. */ +enum pred_state { - OUTSIDE_IT_BLOCK, MANUAL_IT_BLOCK, AUTOMATIC_IT_BLOCK + OUTSIDE_PRED_BLOCK, MANUAL_PRED_BLOCK, AUTOMATIC_PRED_BLOCK +}; +enum pred_type { + SCALAR_PRED, VECTOR_PRED }; -struct current_it +struct current_pred { int mask; - enum it_state state; + enum pred_state state; int cc; int block_length; char *insn; int state_handled; int warn_deprecated; int insn_cond; + enum pred_type type; }; #ifdef OBJ_ELF @@ -302,7 +307,7 @@ struct arm_segment_info_type emitted only once per section, to save unnecessary bloat. */ unsigned int marked_pr_dependency; - struct current_it current_it; + struct current_pred current_pred; }; /* We want .cfi_* pseudo-ops for generating unwind info. */ @@ -324,7 +329,7 @@ struct arm_segment_info_type #ifdef OBJ_ELF /* Values passed to md_apply_fix don't include the symbol value. */ -# define MD_APPLY_SYM_VALUE(FIX) arm_apply_sym_value (FIX) +# define MD_APPLY_SYM_VALUE(FIX) arm_apply_sym_value (FIX, this_segment) #endif #ifdef OBJ_COFF @@ -335,7 +340,6 @@ struct arm_segment_info_type #define MD_PCREL_FROM_SECTION(F,S) md_pcrel_from_section(F,S) -extern long md_pcrel_from_section (struct fix *, segT); extern void arm_frag_align_code (int, int); extern void arm_validate_fix (struct fix *); extern const char * elf32_arm_target_format (void); @@ -348,7 +352,8 @@ 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 cons_fix_new_arm (fragS *, int, int, expressionS *, + bfd_reloc_code_real_type); extern void arm_init_frag (struct frag *, int); extern void arm_handle_align (struct frag *); extern bfd_boolean arm_fix_adjustable (struct fix *); @@ -368,7 +373,7 @@ void tc_pe_dwarf2_emit_offset (symbolS *, unsigned int); #ifdef OBJ_ELF #define CONVERT_SYMBOLIC_ATTRIBUTE(name) arm_convert_symbolic_attribute (name) extern int arm_convert_symbolic_attribute (const char *); -extern int arm_apply_sym_value (struct fix *); +extern int arm_apply_sym_value (struct fix *, segT); #endif #define tc_comment_chars arm_comment_chars @@ -376,3 +381,10 @@ extern char arm_comment_chars[]; #define tc_line_separator_chars arm_line_separator_chars extern char arm_line_separator_chars[]; + +#define TC_EQUAL_IN_INSN(c, s) arm_tc_equal_in_insn ((c), (s)) +extern bfd_boolean arm_tc_equal_in_insn (int, char *); + +#define TC_LARGEST_EXPONENT_IS_NORMAL(PRECISION) \ + arm_is_largest_exponent_ok ((PRECISION)) +int arm_is_largest_exponent_ok (int precision);