1 /* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF. 2 Copyright (C) 1996-2020 Free Software Foundation, Inc. 3 Contributed by Richard Henderson (rth@tamu.edu). 4 5 This file is part of GCC. 6 7 GCC 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, or (at your option) 10 any later version. 11 12 GCC 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 GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 #undef OBJECT_FORMAT_COFF 22 #undef EXTENDED_COFF 23 #define OBJECT_FORMAT_ELF 24 25 #undef DBX_DEBUGGING_INFO 26 27 #define DWARF2_DEBUGGING_INFO 1 28 29 #undef PREFERRED_DEBUGGING_TYPE 30 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG 31 32 #undef ASM_FINAL_SPEC 33 34 /* alpha/ doesn't use elfos.h for some reason. */ 35 #define TARGET_OBJFMT_CPP_BUILTINS() \ 36 do \ 37 { \ 38 builtin_define ("__ELF__"); \ 39 } \ 40 while (0) 41 42 #undef CC1_SPEC 43 #define CC1_SPEC "%{G*}" 44 45 #undef ASM_SPEC 46 #define ASM_SPEC "%{G*} %{relax:-relax} %{!gstabs*:-no-mdebug}%{gstabs*:-mdebug} %{mcpu=*:-m%*}" 47 48 /* Do not output a .file directive at the beginning of the input file. */ 49 50 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE 51 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false 52 53 /* This is how to output an assembler line 54 that says to advance the location counter 55 to a multiple of 2**LOG bytes. */ 56 57 #define ASM_OUTPUT_ALIGN(FILE,LOG) \ 58 if ((LOG) != 0) \ 59 fprintf (FILE, "\t.align %d\n", LOG); 60 61 /* This says how to output assembler code to declare an 62 uninitialized internal linkage data object. Under SVR4, 63 the linker seems to want the alignment of data objects 64 to depend on their types. We do exactly that here. */ 65 66 #undef ASM_OUTPUT_ALIGNED_LOCAL 67 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 68 do { \ 69 if ((SIZE) <= (unsigned HOST_WIDE_INT) g_switch_value) \ 70 switch_to_section (sbss_section); \ 71 else \ 72 switch_to_section (bss_section); \ 73 ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ 74 if (!flag_inhibit_size_directive) \ 75 ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \ 76 ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \ 77 ASM_OUTPUT_LABEL(FILE, NAME); \ 78 ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1); \ 79 } while (0) 80 81 /* This says how to output assembler code to declare an 82 uninitialized external linkage data object. */ 83 84 #undef ASM_OUTPUT_ALIGNED_BSS 85 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ 86 do { \ 87 ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \ 88 } while (0) 89 90 #undef BSS_SECTION_ASM_OP 91 #define BSS_SECTION_ASM_OP "\t.section\t.bss" 92 #undef SBSS_SECTION_ASM_OP 93 #define SBSS_SECTION_ASM_OP "\t.section\t.sbss,\"aw\"" 94 #undef SDATA_SECTION_ASM_OP 95 #define SDATA_SECTION_ASM_OP "\t.section\t.sdata,\"aw\"" 96 97 /* This is how we tell the assembler that two symbols have the same value. */ 98 99 #undef ASM_OUTPUT_DEF 100 #define ASM_OUTPUT_DEF(FILE, ALIAS, NAME) \ 101 do { \ 102 assemble_name(FILE, ALIAS); \ 103 fputs(" = ", FILE); \ 104 assemble_name(FILE, NAME); \ 105 fputc('\n', FILE); \ 106 } while (0) 107 108 #undef ASM_OUTPUT_DEF_FROM_DECLS 109 #define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL, TARGET) \ 110 do { \ 111 const char *alias = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \ 112 const char *name = IDENTIFIER_POINTER (TARGET); \ 113 if (TREE_CODE (DECL) == FUNCTION_DECL) \ 114 { \ 115 fputc ('$', FILE); \ 116 assemble_name (FILE, alias); \ 117 fputs ("..ng = $", FILE); \ 118 assemble_name (FILE, name); \ 119 fputs ("..ng\n", FILE); \ 120 } \ 121 ASM_OUTPUT_DEF (FILE, alias, name); \ 122 } while (0) 123 124 /* This variable should be set to 'true' if the target ABI requires 125 unwinding tables even when exceptions are not used. */ 126 #define TARGET_UNWIND_TABLES_DEFAULT true 127 128 /* Select a format to encode pointers in exception handling data. CODE 129 is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is 130 true if the symbol may be affected by dynamic relocations. 131 132 Since application size is already constrained to <2GB by the form of 133 the ldgp relocation, we can use a 32-bit pc-relative relocation to 134 static data. Dynamic data is accessed indirectly to allow for read 135 only EH sections. */ 136 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \ 137 (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4) 138 139 /* If defined, a C statement to be executed just prior to the output of 140 assembler code for INSN. */ 141 #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \ 142 (alpha_this_literal_sequence_number = 0, \ 143 alpha_this_gpdisp_sequence_number = 0) 144 extern int alpha_this_literal_sequence_number; 145 extern int alpha_this_gpdisp_sequence_number; 146 147 /* Since the bits of the _init and _fini function is spread across 148 many object files, each potentially with its own GP, we must assume 149 we need to load our GP. Further, the .init/.fini section can 150 easily be more than 4MB away from the function to call so we can't 151 use bsr. */ 152 #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ 153 asm (SECTION_OP "\n" \ 154 " br $29,1f\n" \ 155 "1: ldgp $29,0($29)\n" \ 156 " unop\n" \ 157 " jsr $26," USER_LABEL_PREFIX #FUNC "\n" \ 158 " .align 3\n" \ 159 " .previous"); 160 161 /* If we have the capability create headers for efficient EH lookup. 162 As of Jan 2002, only glibc 2.2.4 can actually make use of this, but 163 I imagine that other systems will catch up. In the meantime, it 164 doesn't harm to make sure that the data exists to be used later. */ 165 #if defined(HAVE_LD_EH_FRAME_HDR) && !defined(LINK_EH_SPEC) 166 #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " 167 #endif 168