X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-aarch64.h;h=658b6935cd37bdb4ead68b3e1c822217b593b067;hb=9a01ec4c0368048fb5ea1ba1b3af9afbd651b529;hp=19b9eae2aa288d169d4a70435d4c4e0bd4b2ee7f;hpb=b90efa5b79ac1524ec260f8eb89d1be37e0219a7;p=binutils-gdb.git diff --git a/gas/config/tc-aarch64.h b/gas/config/tc-aarch64.h index 19b9eae2aa2..658b6935cd3 100644 --- a/gas/config/tc-aarch64.h +++ b/gas/config/tc-aarch64.h @@ -1,5 +1,5 @@ /* tc-aarch64.h -- Header file for tc-aarch64.c. - Copyright (C) 2009-2015 Free Software Foundation, Inc. + Copyright (C) 2009-2021 Free Software Foundation, Inc. Contributed by ARM Ltd. This file is part of GAS. @@ -78,6 +78,45 @@ struct aarch64_fix /* We also need to mark assembler created symbols: */ #define tc_frob_fake_label(S) aarch64_frob_label (S) +#define tc_frob_section(S) aarch64_frob_section (S) + +/* The key used to sign a function's return address. */ +enum pointer_auth_key { + AARCH64_PAUTH_KEY_A, + AARCH64_PAUTH_KEY_B +}; + +/* The extra fields required by AArch64 in fde_entry and cie_entry. Currently + only used to store the key used to sign the frame's return address. */ +#define tc_fde_entry_extras enum pointer_auth_key pauth_key; +#define tc_cie_entry_extras enum pointer_auth_key pauth_key; + +/* The extra initialisation steps needed by AArch64 in alloc_fde_entry. + Currently only used to initialise the key used to sign the return + address. */ +#define tc_fde_entry_init_extra(fde) fde->pauth_key = AARCH64_PAUTH_KEY_A; + +/* Extra checks required by AArch64 when outputting the current cie_entry. + Currently only used to output a 'B' if the return address is signed with the + B key. */ +#define tc_output_cie_extra(cie) \ + do \ + { \ + if (cie->pauth_key == AARCH64_PAUTH_KEY_B) \ + out_one ('B'); \ + } \ + while (0) + +/* Extra equivalence checks required by AArch64 when selecting the correct cie + for some fde. Currently only used to check for quivalence between keys used + to sign ther return address. */ +#define tc_cie_fde_equivalent_extra(cie, fde) (cie->pauth_key == fde->pauth_key) + +/* The extra initialisation steps needed by AArch64 in select_cie_for_fde. + Currently only used to initialise the key used to sign the return + address. */ +#define tc_cie_entry_init_extra(cie, fde) cie->pauth_key = fde->pauth_key; + #define TC_FIX_TYPE struct aarch64_fix #define TC_INIT_FIX_DATA(FIX) { (FIX)->tc_fix_data.inst = NULL; \ (FIX)->tc_fix_data.opnd = AARCH64_OPND_NIL; } @@ -91,8 +130,14 @@ void aarch64_copy_symbol_attributes (symbolS *, symbolS *); (aarch64_copy_symbol_attributes (DEST, SRC)) #endif -#define TC_START_LABEL(C,S,STR) ((C) == ':' \ - || ((C) == '/' && aarch64_data_in_code ())) +#ifdef OBJ_ELF +void aarch64_elf_copy_symbol_attributes (symbolS *, symbolS *); +#define OBJ_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \ + aarch64_elf_copy_symbol_attributes (DEST, SRC) +#endif + +#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \ + (NEXT_CHAR == ':' || (NEXT_CHAR == '/' && aarch64_data_in_code ())) #define tc_canonicalize_symbol_name(str) aarch64_canonicalize_symbol_name (str); #define obj_adjust_symtab() aarch64_adjust_symtab () @@ -109,10 +154,9 @@ void aarch64_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_64 \ - || (FIX)->fx_r_type == BFD_RELOC_32 \ - || TC_FORCE_RELOCATION (FIX)) + || (FIX)->fx_r_type == BFD_RELOC_32) #define TC_CONS_FIX_NEW(f,w,s,e,r) cons_fix_new_aarch64 ((f), (w), (s), (e)) @@ -135,8 +179,7 @@ struct aarch64_frag_type }; #define TC_FRAG_TYPE struct aarch64_frag_type -/* NOTE: max_chars is a local variable from frag_var / frag_variant. */ -#define TC_FRAG_INIT(fragp) aarch64_init_frag (fragp, max_chars) +#define TC_FRAG_INIT(fragp, max_bytes) aarch64_init_frag (fragp, max_bytes) #define HANDLE_ALIGN(fragp) aarch64_handle_align (fragp) #define md_do_align(N, FILL, LEN, MAX, LABEL) \ @@ -146,6 +189,8 @@ struct aarch64_frag_type goto LABEL; \ } +#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0 + #define DWARF2_LINE_MIN_INSN_LENGTH 4 /* The lr register is r30. */ @@ -182,6 +227,7 @@ struct aarch64_segment_info_type { enum mstate mapstate; unsigned int marked_pr_dependency; + aarch64_instr_sequence insn_sequence; }; /* We want .cfi_* pseudo-ops for generating unwind info. */ @@ -191,6 +237,9 @@ struct aarch64_segment_info_type #define tc_regname_to_dw2regnum tc_aarch64_regname_to_dw2regnum #define tc_cfi_frame_initial_instructions tc_aarch64_frame_initial_instructions +extern void aarch64_after_parse_args (void); +#define md_after_parse_args() aarch64_after_parse_args () + #else /* Not OBJ_ELF. */ #define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_" #endif @@ -206,13 +255,13 @@ struct aarch64_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 aarch64_frag_align_code (int, int); extern const char * elf64_aarch64_target_format (void); extern int aarch64_force_relocation (struct fix *); extern void aarch64_cleanup (void); extern void aarch64_start_line_hook (void); extern void aarch64_frob_label (symbolS *); +extern void aarch64_frob_section (asection *sec); extern int aarch64_data_in_code (void); extern char * aarch64_canonicalize_symbol_name (char *); extern void aarch64_adjust_symtab (void);