Home | History | Annotate | Download | only in config
      1 /* tc-aarch64.h -- Header file for tc-aarch64.c.
      2    Copyright (C) 2009-2016 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 
     54 struct fix;
     55 
     56 struct 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_FIX_TYPE struct aarch64_fix
     82 #define TC_INIT_FIX_DATA(FIX) { (FIX)->tc_fix_data.inst = NULL;	\
     83     (FIX)->tc_fix_data.opnd = AARCH64_OPND_NIL; }
     84 
     85 #define TC_SYMFIELD_TYPE 	unsigned int
     86 #define AARCH64_GET_FLAG(s)   	(*symbol_get_tc (s))
     87 
     88 void aarch64_copy_symbol_attributes (symbolS *, symbolS *);
     89 #ifndef TC_COPY_SYMBOL_ATTRIBUTES
     90 #define TC_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \
     91   (aarch64_copy_symbol_attributes (DEST, SRC))
     92 #endif
     93 
     94 #define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR)			\
     95   (NEXT_CHAR == ':' || (NEXT_CHAR == '/' && aarch64_data_in_code ()))
     96 #define tc_canonicalize_symbol_name(str) aarch64_canonicalize_symbol_name (str);
     97 #define obj_adjust_symtab() 		 aarch64_adjust_symtab ()
     98 
     99 #define LISTING_HEADER "AARCH64 GAS "
    100 
    101 #define LOCAL_LABEL(name)  (name[0] == '.' && name[1] == 'L')
    102 #define LOCAL_LABELS_FB    1
    103 
    104 /* This expression evaluates to true if the relocation is for a local
    105    object for which we still want to do the relocation at runtime.
    106    False if we are willing to perform this relocation while building
    107    the .o file.  GOTOFF does not need to be checked here because it is
    108    not pcrel.  I am not sure if some of the others are ever used with
    109    pcrel, but it is easier to be safe than sorry.  */
    110 
    111 #define TC_FORCE_RELOCATION_LOCAL(FIX)			\
    112   (!(FIX)->fx_pcrel					\
    113    || (FIX)->fx_r_type == BFD_RELOC_64			\
    114    || (FIX)->fx_r_type == BFD_RELOC_32			\
    115    || TC_FORCE_RELOCATION (FIX))
    116 
    117 #define TC_CONS_FIX_NEW(f,w,s,e,r) cons_fix_new_aarch64 ((f), (w), (s), (e))
    118 
    119 /* Max space for a rs_align_code fragment is 3 unaligned bytes
    120    (fr_fix) plus 4 bytes to contain the repeating NOP (fr_var).  */
    121 #define MAX_MEM_FOR_RS_ALIGN_CODE 7
    122 
    123 /* For frags in code sections we need to record whether they contain
    124    code or data.  */
    125 struct aarch64_frag_type
    126 {
    127   int recorded;
    128 #ifdef OBJ_ELF
    129   /* If there is a mapping symbol at offset 0 in this frag,
    130      it will be saved in FIRST_MAP.  If there are any mapping
    131      symbols in this frag, the last one will be saved in
    132      LAST_MAP.  */
    133   symbolS *first_map, *last_map;
    134 #endif
    135 };
    136 
    137 #define TC_FRAG_TYPE		struct aarch64_frag_type
    138 /* NOTE: max_chars is a local variable from frag_var / frag_variant.  */
    139 #define TC_FRAG_INIT(fragp)	aarch64_init_frag (fragp, max_chars)
    140 #define HANDLE_ALIGN(fragp)	aarch64_handle_align (fragp)
    141 
    142 #define md_do_align(N, FILL, LEN, MAX, LABEL)					\
    143   if (FILL == NULL && (N) != 0 && ! need_pass_2 && subseg_text_p (now_seg))	\
    144     {										\
    145       frag_align_code (N, MAX);							\
    146       goto LABEL;								\
    147     }
    148 
    149 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
    150 
    151 #define DWARF2_LINE_MIN_INSN_LENGTH 	4
    152 
    153 /* The lr register is r30.  */
    154 #define DWARF2_DEFAULT_RETURN_COLUMN  30
    155 
    156 /* Registers are generally saved at negative offsets to the CFA.  */
    157 #define DWARF2_CIE_DATA_ALIGNMENT     (-8)
    158 
    159 extern int aarch64_dwarf2_addr_size (void);
    160 #define DWARF2_ADDR_SIZE(bfd) aarch64_dwarf2_addr_size ()
    161 
    162 #ifdef OBJ_ELF
    163 # define obj_frob_symbol(sym, punt)	aarch64elf_frob_symbol ((sym), & (punt))
    164 
    165 # define GLOBAL_OFFSET_TABLE_NAME	"_GLOBAL_OFFSET_TABLE_"
    166 # define TC_SEGMENT_INFO_TYPE 		struct aarch64_segment_info_type
    167 
    168 /* This is not really an alignment operation, but it's something we
    169    need to do at the same time: whenever we are figuring out the
    170    alignment for data, we should check whether a $d symbol is
    171    necessary.  */
    172 # define md_cons_align(nbytes)		mapping_state (MAP_DATA)
    173 
    174 enum mstate
    175 {
    176   MAP_UNDEFINED = 0, /* Must be zero, for seginfo in new sections.  */
    177   MAP_DATA,
    178   MAP_INSN,
    179 };
    180 
    181 void mapping_state (enum mstate);
    182 
    183 struct aarch64_segment_info_type
    184 {
    185   enum mstate mapstate;
    186   unsigned int marked_pr_dependency;
    187 };
    188 
    189 /* We want .cfi_* pseudo-ops for generating unwind info.  */
    190 #define TARGET_USE_CFIPOP              1
    191 
    192 /* CFI hooks.  */
    193 #define tc_regname_to_dw2regnum            tc_aarch64_regname_to_dw2regnum
    194 #define tc_cfi_frame_initial_instructions  tc_aarch64_frame_initial_instructions
    195 
    196 #else /* Not OBJ_ELF.  */
    197 #define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_"
    198 #endif
    199 
    200 #if defined OBJ_ELF || defined OBJ_COFF
    201 
    202 # define EXTERN_FORCE_RELOC 			1
    203 # define tc_fix_adjustable(FIX) 		1
    204 /* Values passed to md_apply_fix don't include the symbol value.  */
    205 # define MD_APPLY_SYM_VALUE(FIX) 		0
    206 
    207 #endif
    208 
    209 #define MD_PCREL_FROM_SECTION(F,S) md_pcrel_from_section(F,S)
    210 
    211 extern long md_pcrel_from_section (struct fix *, segT);
    212 extern void aarch64_frag_align_code (int, int);
    213 extern const char * elf64_aarch64_target_format (void);
    214 extern int aarch64_force_relocation (struct fix *);
    215 extern void aarch64_cleanup (void);
    216 extern void aarch64_start_line_hook (void);
    217 extern void aarch64_frob_label (symbolS *);
    218 extern int aarch64_data_in_code (void);
    219 extern char * aarch64_canonicalize_symbol_name (char *);
    220 extern void aarch64_adjust_symtab (void);
    221 extern void aarch64elf_frob_symbol (symbolS *, int *);
    222 extern void cons_fix_new_aarch64 (fragS *, int, int, expressionS *);
    223 extern void aarch64_init_frag (struct frag *, int);
    224 extern void aarch64_handle_align (struct frag *);
    225 extern int tc_aarch64_regname_to_dw2regnum (char *regname);
    226 extern void tc_aarch64_frame_initial_instructions (void);
    227 
    228 #ifdef TE_PE
    229 
    230 #define O_secrel O_md1
    231 
    232 #define TC_DWARF2_EMIT_OFFSET  tc_pe_dwarf2_emit_offset
    233 void tc_pe_dwarf2_emit_offset (symbolS *, unsigned int);
    234 
    235 #endif /* TE_PE */
    236 
    237 #endif /* TC_AARCH64 */
    238