X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-aarch64.h;h=658b6935cd37bdb4ead68b3e1c822217b593b067;hb=9a01ec4c0368048fb5ea1ba1b3af9afbd651b529;hp=94a3dc9c3390214a0b7899b6053efa226f1ae30f;hpb=00c06fdc57ab89d14789b5207763410a79c39a11;p=binutils-gdb.git diff --git a/gas/config/tc-aarch64.h b/gas/config/tc-aarch64.h index 94a3dc9c339..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-2014 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,15 +154,15 @@ 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)) -/* Max code alignment is 32 bytes */ -#define MAX_MEM_FOR_RS_ALIGN_CODE 31 +/* Max space for a rs_align_code fragment is 3 unaligned bytes + (fr_fix) plus 4 bytes to contain the repeating NOP (fr_var). */ +#define MAX_MEM_FOR_RS_ALIGN_CODE 7 /* For frags in code sections we need to record whether they contain code or data. */ @@ -134,24 +179,25 @@ 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) \ if (FILL == NULL && (N) != 0 && ! need_pass_2 && subseg_text_p (now_seg)) \ { \ - aarch64_frag_align_code (N, MAX); \ + frag_align_code (N, MAX); \ goto LABEL; \ } -#define DWARF2_LINE_MIN_INSN_LENGTH 2 +#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0 + +#define DWARF2_LINE_MIN_INSN_LENGTH 4 /* The lr register is r30. */ #define DWARF2_DEFAULT_RETURN_COLUMN 30 /* Registers are generally saved at negative offsets to the CFA. */ -#define DWARF2_CIE_DATA_ALIGNMENT (-4) +#define DWARF2_CIE_DATA_ALIGNMENT (-8) extern int aarch64_dwarf2_addr_size (void); #define DWARF2_ADDR_SIZE(bfd) aarch64_dwarf2_addr_size () @@ -181,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. */ @@ -190,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 @@ -205,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);