1/* Machine description for AArch64 architecture. 2 Copyright (C) 2009-2020 Free Software Foundation, Inc. 3 Contributed by ARM Ltd. 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it 8 under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3, or (at your option) 10 any later version. 11 12 GCC is distributed in the hope that it will be useful, but 13 WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21#ifndef GCC_AARCH64_ELF_H 22#define GCC_AARCH64_ELF_H 23 24 25#define ASM_OUTPUT_LABELREF(FILE, NAME) \ 26 aarch64_asm_output_labelref (FILE, NAME) 27 28#define TEXT_SECTION_ASM_OP "\t.text" 29#define DATA_SECTION_ASM_OP "\t.data" 30#define BSS_SECTION_ASM_OP "\t.bss" 31 32#define CTORS_SECTION_ASM_OP "\t.section\t.init_array,\"aw\",%init_array" 33#define DTORS_SECTION_ASM_OP "\t.section\t.fini_array,\"aw\",%fini_array" 34 35#undef INIT_SECTION_ASM_OP 36#undef FINI_SECTION_ASM_OP 37#define INIT_ARRAY_SECTION_ASM_OP CTORS_SECTION_ASM_OP 38#define FINI_ARRAY_SECTION_ASM_OP DTORS_SECTION_ASM_OP 39 40/* Since we use .init_array/.fini_array we don't need the markers at 41 the start and end of the ctors/dtors arrays. */ 42#define CTOR_LIST_BEGIN asm (CTORS_SECTION_ASM_OP) 43#define CTOR_LIST_END /* empty */ 44#define DTOR_LIST_BEGIN asm (DTORS_SECTION_ASM_OP) 45#define DTOR_LIST_END /* empty */ 46 47#undef TARGET_ASM_CONSTRUCTOR 48#define TARGET_ASM_CONSTRUCTOR aarch64_elf_asm_constructor 49 50#undef TARGET_ASM_DESTRUCTOR 51#define TARGET_ASM_DESTRUCTOR aarch64_elf_asm_destructor 52 53#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN 54/* Support for -falign-* switches. Use .p2align to ensure that code 55 sections are padded with NOP instructions, rather than zeros. */ 56#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP) \ 57 do \ 58 { \ 59 if ((LOG) != 0) \ 60 { \ 61 if ((MAX_SKIP) == 0) \ 62 fprintf ((FILE), "\t.p2align %d\n", (int) (LOG)); \ 63 else \ 64 fprintf ((FILE), "\t.p2align %d,,%d\n", \ 65 (int) (LOG), (int) (MAX_SKIP)); \ 66 } \ 67 } while (0) 68 69#endif /* HAVE_GAS_MAX_SKIP_P2ALIGN */ 70 71#define JUMP_TABLES_IN_TEXT_SECTION 0 72 73#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \ 74 do { \ 75 switch (GET_MODE (BODY)) \ 76 { \ 77 case E_QImode: \ 78 asm_fprintf (STREAM, "\t.byte\t(%LL%d - %LLrtx%d) / 4\n", \ 79 VALUE, REL); \ 80 break; \ 81 case E_HImode: \ 82 asm_fprintf (STREAM, "\t.2byte\t(%LL%d - %LLrtx%d) / 4\n", \ 83 VALUE, REL); \ 84 break; \ 85 case E_SImode: \ 86 case E_DImode: /* See comment in aarch64_output_casesi. */ \ 87 asm_fprintf (STREAM, "\t.word\t(%LL%d - %LLrtx%d) / 4\n", \ 88 VALUE, REL); \ 89 break; \ 90 default: \ 91 gcc_unreachable (); \ 92 } \ 93 } while (0) 94 95#define ASM_OUTPUT_ALIGN(STREAM, POWER) \ 96 fprintf(STREAM, "\t.align\t%d\n", (int)POWER) 97 98#define ASM_COMMENT_START "//" 99 100#define LOCAL_LABEL_PREFIX "." 101#define USER_LABEL_PREFIX "" 102 103#define GLOBAL_ASM_OP "\t.global\t" 104 105#ifdef TARGET_BIG_ENDIAN_DEFAULT 106#define ENDIAN_SPEC "-mbig-endian" 107#else 108#define ENDIAN_SPEC "-mlittle-endian" 109#endif 110 111#if TARGET_DATA_MODEL == 1 112#define ABI_SPEC "-mabi=lp64" 113#define MULTILIB_DEFAULTS { "mabi=lp64" } 114#elif TARGET_DATA_MODEL == 2 115#define ABI_SPEC "-mabi=ilp32" 116#define MULTILIB_DEFAULTS { "mabi=ilp32" } 117#else 118#error "Unknown or undefined TARGET_DATA_MODEL!" 119#endif 120 121/* Force the default endianness and ABI flags onto the command line 122 in order to make the other specs easier to write. */ 123#undef DRIVER_SELF_SPECS 124#define DRIVER_SELF_SPECS \ 125 " %{!mbig-endian:%{!mlittle-endian:" ENDIAN_SPEC "}}" \ 126 " %{!mabi=*:" ABI_SPEC "}" \ 127 MCPU_MTUNE_NATIVE_SPECS 128 129#ifdef HAVE_AS_MABI_OPTION 130#define ASM_MABI_SPEC "%{mabi=*:-mabi=%*}" 131#else 132#define ASM_MABI_SPEC "%{mabi=lp64:}" 133#endif 134 135#ifndef ASM_SPEC 136#define ASM_SPEC "\ 137%{mbig-endian:-EB} \ 138%{mlittle-endian:-EL} \ 139%{march=*:-march=%*} \ 140%(asm_cpu_spec)" \ 141ASM_MABI_SPEC 142#endif 143 144#undef TYPE_OPERAND_FMT 145#define TYPE_OPERAND_FMT "%%%s" 146 147/* Stabs debug not required. */ 148#undef DBX_DEBUGGING_INFO 149 150#endif /* GCC_AARCH64_ELF_H */ 151