1/* tc-aarch64.h -- Header file for tc-aarch64.c. 2 Copyright (C) 2009-2020 Free Software Foundation, Inc. 3 Contributed by ARM Ltd. 4 5 This file is part of GAS. 6 7 GAS is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the license, or 10 (at your option) any later version. 11 12 GAS is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; see the file COPYING3. If not, 19 see <http://www.gnu.org/licenses/>. */ 20 21#ifndef TC_AARCH64 22#define TC_AARCH64 1 23 24#include "opcode/aarch64.h" 25 26#ifndef TARGET_BYTES_BIG_ENDIAN 27#define TARGET_BYTES_BIG_ENDIAN 0 28#endif 29 30#define WORKING_DOT_WORD 31 32#define TARGET_ARCH bfd_arch_aarch64 33 34#define DIFF_EXPR_OK 35 36/* Permit // comments. */ 37#define DOUBLESLASH_LINE_COMMENTS 38 39#ifdef LITTLE_ENDIAN 40#undef LITTLE_ENDIAN 41#endif 42 43#ifdef BIG_ENDIAN 44#undef BIG_ENDIAN 45#endif 46 47#define LITTLE_ENDIAN 1234 48#define BIG_ENDIAN 4321 49 50#define SWAP_32(n) \ 51 ((((n) & 0xff) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) \ 52 | (((n) >> 24) & 0xff)) 53 54struct fix; 55 56struct aarch64_fix 57{ 58 struct aarch64_inst *inst; 59 enum aarch64_opnd opnd; 60}; 61 62#if defined OBJ_ELF 63# define AARCH64_BI_ENDIAN 64# define TARGET_FORMAT elf64_aarch64_target_format () 65#endif 66 67#define TC_FORCE_RELOCATION(FIX) aarch64_force_relocation (FIX) 68 69/* Currently there is no machine specific frags generated. */ 70#define md_convert_frag(b,s,f) as_fatal ("aarch64 convert_frag called\n") 71 72#define md_cleanup() aarch64_cleanup () 73 74#define md_start_line_hook() aarch64_start_line_hook () 75 76#define tc_frob_label(S) aarch64_frob_label (S) 77 78/* We also need to mark assembler created symbols: */ 79#define tc_frob_fake_label(S) aarch64_frob_label (S) 80 81#define tc_frob_section(S) aarch64_frob_section (S) 82 83/* The key used to sign a function's return address. */ 84enum pointer_auth_key { 85 AARCH64_PAUTH_KEY_A, 86 AARCH64_PAUTH_KEY_B 87}; 88 89/* The extra fields required by AArch64 in fde_entry and cie_entry. Currently 90 only used to store the key used to sign the frame's return address. */ 91#define tc_fde_entry_extras enum pointer_auth_key pauth_key; 92#define tc_cie_entry_extras enum pointer_auth_key pauth_key; 93 94/* The extra initialisation steps needed by AArch64 in alloc_fde_entry. 95 Currently only used to initialise the key used to sign the return 96 address. */ 97#define tc_fde_entry_init_extra(fde) fde->pauth_key = AARCH64_PAUTH_KEY_A; 98 99/* Extra checks required by AArch64 when outputting the current cie_entry. 100 Currently only used to output a 'B' if the return address is signed with the 101 B key. */ 102#define tc_output_cie_extra(cie) \ 103 do \ 104 { \ 105 if (cie->pauth_key == AARCH64_PAUTH_KEY_B) \ 106 out_one ('B'); \ 107 } \ 108 while (0) 109 110/* Extra equivalence checks required by AArch64 when selecting the correct cie 111 for some fde. Currently only used to check for quivalence between keys used 112 to sign ther return address. */ 113#define tc_cie_fde_equivalent_extra(cie, fde) (cie->pauth_key == fde->pauth_key) 114 115/* The extra initialisation steps needed by AArch64 in select_cie_for_fde. 116 Currently only used to initialise the key used to sign the return 117 address. */ 118#define tc_cie_entry_init_extra(cie, fde) cie->pauth_key = fde->pauth_key; 119 120#define TC_FIX_TYPE struct aarch64_fix 121#define TC_INIT_FIX_DATA(FIX) { (FIX)->tc_fix_data.inst = NULL; \ 122 (FIX)->tc_fix_data.opnd = AARCH64_OPND_NIL; } 123 124#define TC_SYMFIELD_TYPE unsigned int 125#define AARCH64_GET_FLAG(s) (*symbol_get_tc (s)) 126 127void aarch64_copy_symbol_attributes (symbolS *, symbolS *); 128#ifndef TC_COPY_SYMBOL_ATTRIBUTES 129#define TC_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \ 130 (aarch64_copy_symbol_attributes (DEST, SRC)) 131#endif 132 133#ifdef OBJ_ELF 134void aarch64_elf_copy_symbol_attributes (symbolS *, symbolS *); 135#define OBJ_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \ 136 aarch64_elf_copy_symbol_attributes (DEST, SRC) 137#endif 138 139#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \ 140 (NEXT_CHAR == ':' || (NEXT_CHAR == '/' && aarch64_data_in_code ())) 141#define tc_canonicalize_symbol_name(str) aarch64_canonicalize_symbol_name (str); 142#define obj_adjust_symtab() aarch64_adjust_symtab () 143 144#define LISTING_HEADER "AARCH64 GAS " 145 146#define LOCAL_LABEL(name) (name[0] == '.' && name[1] == 'L') 147#define LOCAL_LABELS_FB 1 148 149/* This expression evaluates to true if the relocation is for a local 150 object for which we still want to do the relocation at runtime. 151 False if we are willing to perform this relocation while building 152 the .o file. GOTOFF does not need to be checked here because it is 153 not pcrel. I am not sure if some of the others are ever used with 154 pcrel, but it is easier to be safe than sorry. */ 155 156#define TC_FORCE_RELOCATION_LOCAL(FIX) \ 157 (GENERIC_FORCE_RELOCATION_LOCAL (FIX) \ 158 || (FIX)->fx_r_type == BFD_RELOC_64 \ 159 || (FIX)->fx_r_type == BFD_RELOC_32) 160 161#define TC_CONS_FIX_NEW(f,w,s,e,r) cons_fix_new_aarch64 ((f), (w), (s), (e)) 162 163/* Max space for a rs_align_code fragment is 3 unaligned bytes 164 (fr_fix) plus 4 bytes to contain the repeating NOP (fr_var). */ 165#define MAX_MEM_FOR_RS_ALIGN_CODE 7 166 167/* For frags in code sections we need to record whether they contain 168 code or data. */ 169struct aarch64_frag_type 170{ 171 int recorded; 172#ifdef OBJ_ELF 173 /* If there is a mapping symbol at offset 0 in this frag, 174 it will be saved in FIRST_MAP. If there are any mapping 175 symbols in this frag, the last one will be saved in 176 LAST_MAP. */ 177 symbolS *first_map, *last_map; 178#endif 179}; 180 181#define TC_FRAG_TYPE struct aarch64_frag_type 182#define TC_FRAG_INIT(fragp, max_bytes) aarch64_init_frag (fragp, max_bytes) 183#define HANDLE_ALIGN(fragp) aarch64_handle_align (fragp) 184 185#define md_do_align(N, FILL, LEN, MAX, LABEL) \ 186 if (FILL == NULL && (N) != 0 && ! need_pass_2 && subseg_text_p (now_seg)) \ 187 { \ 188 frag_align_code (N, MAX); \ 189 goto LABEL; \ 190 } 191 192#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0 193 194#define DWARF2_LINE_MIN_INSN_LENGTH 4 195 196/* The lr register is r30. */ 197#define DWARF2_DEFAULT_RETURN_COLUMN 30 198 199/* Registers are generally saved at negative offsets to the CFA. */ 200#define DWARF2_CIE_DATA_ALIGNMENT (-8) 201 202extern int aarch64_dwarf2_addr_size (void); 203#define DWARF2_ADDR_SIZE(bfd) aarch64_dwarf2_addr_size () 204 205#ifdef OBJ_ELF 206# define obj_frob_symbol(sym, punt) aarch64elf_frob_symbol ((sym), & (punt)) 207 208# define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_" 209# define TC_SEGMENT_INFO_TYPE struct aarch64_segment_info_type 210 211/* This is not really an alignment operation, but it's something we 212 need to do at the same time: whenever we are figuring out the 213 alignment for data, we should check whether a $d symbol is 214 necessary. */ 215# define md_cons_align(nbytes) mapping_state (MAP_DATA) 216 217enum mstate 218{ 219 MAP_UNDEFINED = 0, /* Must be zero, for seginfo in new sections. */ 220 MAP_DATA, 221 MAP_INSN, 222}; 223 224void mapping_state (enum mstate); 225 226struct aarch64_segment_info_type 227{ 228 enum mstate mapstate; 229 unsigned int marked_pr_dependency; 230 aarch64_instr_sequence insn_sequence; 231}; 232 233/* We want .cfi_* pseudo-ops for generating unwind info. */ 234#define TARGET_USE_CFIPOP 1 235 236/* CFI hooks. */ 237#define tc_regname_to_dw2regnum tc_aarch64_regname_to_dw2regnum 238#define tc_cfi_frame_initial_instructions tc_aarch64_frame_initial_instructions 239 240extern void aarch64_after_parse_args (void); 241#define md_after_parse_args() aarch64_after_parse_args () 242 243#else /* Not OBJ_ELF. */ 244#define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_" 245#endif 246 247#if defined OBJ_ELF || defined OBJ_COFF 248 249# define EXTERN_FORCE_RELOC 1 250# define tc_fix_adjustable(FIX) 1 251/* Values passed to md_apply_fix don't include the symbol value. */ 252# define MD_APPLY_SYM_VALUE(FIX) 0 253 254#endif 255 256#define MD_PCREL_FROM_SECTION(F,S) md_pcrel_from_section(F,S) 257 258extern void aarch64_frag_align_code (int, int); 259extern const char * elf64_aarch64_target_format (void); 260extern int aarch64_force_relocation (struct fix *); 261extern void aarch64_cleanup (void); 262extern void aarch64_start_line_hook (void); 263extern void aarch64_frob_label (symbolS *); 264extern void aarch64_frob_section (asection *sec); 265extern int aarch64_data_in_code (void); 266extern char * aarch64_canonicalize_symbol_name (char *); 267extern void aarch64_adjust_symtab (void); 268extern void aarch64elf_frob_symbol (symbolS *, int *); 269extern void cons_fix_new_aarch64 (fragS *, int, int, expressionS *); 270extern void aarch64_init_frag (struct frag *, int); 271extern void aarch64_handle_align (struct frag *); 272extern int tc_aarch64_regname_to_dw2regnum (char *regname); 273extern void tc_aarch64_frame_initial_instructions (void); 274 275#ifdef TE_PE 276 277#define O_secrel O_md1 278 279#define TC_DWARF2_EMIT_OFFSET tc_pe_dwarf2_emit_offset 280void tc_pe_dwarf2_emit_offset (symbolS *, unsigned int); 281 282#endif /* TE_PE */ 283 284#endif /* TC_AARCH64 */ 285