123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /* Machine description for AArch64 architecture.
- Copyright (C) 2009-2015 Free Software Foundation, Inc.
- Contributed by ARM Ltd.
- This file is part of GCC.
- GCC is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
- GCC is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
- <http://www.gnu.org/licenses/>. */
- #ifndef GCC_AARCH64_ELF_H
- #define GCC_AARCH64_ELF_H
- #define ASM_OUTPUT_LABELREF(FILE, NAME) \
- aarch64_asm_output_labelref (FILE, NAME)
- #define ASM_OUTPUT_DEF(FILE, NAME1, NAME2) \
- do \
- { \
- assemble_name (FILE, NAME1); \
- fputs (" = ", FILE); \
- assemble_name (FILE, NAME2); \
- fputc ('\n', FILE); \
- } while (0)
- #define TEXT_SECTION_ASM_OP "\t.text"
- #define DATA_SECTION_ASM_OP "\t.data"
- #define BSS_SECTION_ASM_OP "\t.bss"
- #define CTORS_SECTION_ASM_OP "\t.section\t.init_array,\"aw\",%init_array"
- #define DTORS_SECTION_ASM_OP "\t.section\t.fini_array,\"aw\",%fini_array"
- #undef INIT_SECTION_ASM_OP
- #undef FINI_SECTION_ASM_OP
- #define INIT_ARRAY_SECTION_ASM_OP CTORS_SECTION_ASM_OP
- #define FINI_ARRAY_SECTION_ASM_OP DTORS_SECTION_ASM_OP
- /* Since we use .init_array/.fini_array we don't need the markers at
- the start and end of the ctors/dtors arrays. */
- #define CTOR_LIST_BEGIN asm (CTORS_SECTION_ASM_OP)
- #define CTOR_LIST_END /* empty */
- #define DTOR_LIST_BEGIN asm (DTORS_SECTION_ASM_OP)
- #define DTOR_LIST_END /* empty */
- #undef TARGET_ASM_CONSTRUCTOR
- #define TARGET_ASM_CONSTRUCTOR aarch64_elf_asm_constructor
- #undef TARGET_ASM_DESTRUCTOR
- #define TARGET_ASM_DESTRUCTOR aarch64_elf_asm_destructor
- #ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
- /* Support for -falign-* switches. Use .p2align to ensure that code
- sections are padded with NOP instructions, rather than zeros. */
- #define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP) \
- do \
- { \
- if ((LOG) != 0) \
- { \
- if ((MAX_SKIP) == 0) \
- fprintf ((FILE), "\t.p2align %d\n", (int) (LOG)); \
- else \
- fprintf ((FILE), "\t.p2align %d,,%d\n", \
- (int) (LOG), (int) (MAX_SKIP)); \
- } \
- } while (0)
- #endif /* HAVE_GAS_MAX_SKIP_P2ALIGN */
- #define JUMP_TABLES_IN_TEXT_SECTION 0
- #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \
- do { \
- switch (GET_MODE (BODY)) \
- { \
- case QImode: \
- asm_fprintf (STREAM, "\t.byte\t(%LL%d - %LLrtx%d) / 4\n", \
- VALUE, REL); \
- break; \
- case HImode: \
- asm_fprintf (STREAM, "\t.2byte\t(%LL%d - %LLrtx%d) / 4\n", \
- VALUE, REL); \
- break; \
- case SImode: \
- case DImode: /* See comment in aarch64_output_casesi. */ \
- asm_fprintf (STREAM, "\t.word\t(%LL%d - %LLrtx%d) / 4\n", \
- VALUE, REL); \
- break; \
- default: \
- gcc_unreachable (); \
- } \
- } while (0)
- #define ASM_OUTPUT_ALIGN(STREAM, POWER) \
- fprintf(STREAM, "\t.align\t%d\n", (int)POWER)
- #define ASM_COMMENT_START "//"
- #define LOCAL_LABEL_PREFIX "."
- #define USER_LABEL_PREFIX ""
- #define GLOBAL_ASM_OP "\t.global\t"
- #ifdef TARGET_BIG_ENDIAN_DEFAULT
- #define ENDIAN_SPEC "-mbig-endian"
- #else
- #define ENDIAN_SPEC "-mlittle-endian"
- #endif
- #if TARGET_DATA_MODEL == 1
- #define ABI_SPEC "-mabi=lp64"
- #define MULTILIB_DEFAULTS { "mabi=lp64" }
- #elif TARGET_DATA_MODEL == 2
- #define ABI_SPEC "-mabi=ilp32"
- #define MULTILIB_DEFAULTS { "mabi=ilp32" }
- #else
- #error "Unknown or undefined TARGET_DATA_MODEL!"
- #endif
- /* Force the default endianness and ABI flags onto the command line
- in order to make the other specs easier to write. */
- #undef DRIVER_SELF_SPECS
- #define DRIVER_SELF_SPECS \
- " %{!mbig-endian:%{!mlittle-endian:" ENDIAN_SPEC "}}" \
- " %{!mabi=*:" ABI_SPEC "}"
- #ifdef HAVE_AS_MABI_OPTION
- #define ASM_MABI_SPEC "%{mabi=*:-mabi=%*}"
- #else
- #define ASM_MABI_SPEC "%{mabi=lp64:}"
- #endif
- #ifndef ASM_SPEC
- #define ASM_SPEC "\
- %{mbig-endian:-EB} \
- %{mlittle-endian:-EL} \
- %{march=*:-march=%*} \
- %(asm_cpu_spec)" \
- ASM_MABI_SPEC
- #endif
- #undef TYPE_OPERAND_FMT
- #define TYPE_OPERAND_FMT "%%%s"
- #undef TARGET_ASM_NAMED_SECTION
- #define TARGET_ASM_NAMED_SECTION aarch64_elf_asm_named_section
- /* Stabs debug not required. */
- #undef DBX_DEBUGGING_INFO
- #endif /* GCC_AARCH64_ELF_H */
|