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