PR tree-optimization/84480 - bogus -Wstringop-truncation despite assignment with...
[official-gcc.git] / gcc / config / alpha / elf.h
blobdb7666161562c1a304c1a676422bf974fbb8959b
1 /* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF.
2 Copyright (C) 1996-2018 Free Software Foundation, Inc.
3 Contributed by Richard Henderson (rth@tamu.edu).
5 This file is part of GCC.
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.
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.
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/>. */
21 #undef CC1_SPEC
22 #define CC1_SPEC "%{G*}"
24 #undef ASM_SPEC
25 #define ASM_SPEC "%{G*} %{relax:-relax} %{!gstabs*:-no-mdebug}%{gstabs*:-mdebug} %{mcpu=*:-m%*}"
27 /* Do not output a .file directive at the beginning of the input file. */
29 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
30 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
32 /* This is how to output an assembler line
33 that says to advance the location counter
34 to a multiple of 2**LOG bytes. */
36 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
37 if ((LOG) != 0) \
38 fprintf (FILE, "\t.align %d\n", LOG);
40 /* This says how to output assembler code to declare an
41 uninitialized internal linkage data object. Under SVR4,
42 the linker seems to want the alignment of data objects
43 to depend on their types. We do exactly that here. */
45 #undef ASM_OUTPUT_ALIGNED_LOCAL
46 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
47 do { \
48 if ((SIZE) <= (unsigned HOST_WIDE_INT) g_switch_value) \
49 switch_to_section (sbss_section); \
50 else \
51 switch_to_section (bss_section); \
52 ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \
53 if (!flag_inhibit_size_directive) \
54 ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \
55 ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \
56 ASM_OUTPUT_LABEL(FILE, NAME); \
57 ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1); \
58 } while (0)
60 /* This says how to output assembler code to declare an
61 uninitialized external linkage data object. */
63 #undef ASM_OUTPUT_ALIGNED_BSS
64 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
65 do { \
66 ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \
67 } while (0)
69 #undef BSS_SECTION_ASM_OP
70 #define BSS_SECTION_ASM_OP "\t.section\t.bss"
71 #undef SBSS_SECTION_ASM_OP
72 #define SBSS_SECTION_ASM_OP "\t.section\t.sbss,\"aw\""
73 #undef SDATA_SECTION_ASM_OP
74 #define SDATA_SECTION_ASM_OP "\t.section\t.sdata,\"aw\""
76 /* This is how we tell the assembler that two symbols have the same value. */
78 #undef ASM_OUTPUT_DEF
79 #define ASM_OUTPUT_DEF(FILE, ALIAS, NAME) \
80 do { \
81 assemble_name(FILE, ALIAS); \
82 fputs(" = ", FILE); \
83 assemble_name(FILE, NAME); \
84 fputc('\n', FILE); \
85 } while (0)
87 #undef ASM_OUTPUT_DEF_FROM_DECLS
88 #define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL, TARGET) \
89 do { \
90 const char *alias = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
91 const char *name = IDENTIFIER_POINTER (TARGET); \
92 if (TREE_CODE (DECL) == FUNCTION_DECL) \
93 { \
94 fputc ('$', FILE); \
95 assemble_name (FILE, alias); \
96 fputs ("..ng = $", FILE); \
97 assemble_name (FILE, name); \
98 fputs ("..ng\n", FILE); \
99 } \
100 ASM_OUTPUT_DEF (FILE, alias, name); \
101 } while (0)
103 /* Provide a STARTFILE_SPEC appropriate for ELF. Here we add the
104 (even more) magical crtbegin.o file which provides part of the
105 support for getting C++ file-scope static object constructed
106 before entering `main'. */
108 #undef STARTFILE_SPEC
109 #ifdef HAVE_LD_PIE
110 #define STARTFILE_SPEC \
111 "%{!shared: %{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}}\
112 crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
113 #else
114 #define STARTFILE_SPEC \
115 "%{!shared: %{pg|p:gcrt1.o%s;:crt1.o%s}}\
116 crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
117 #endif
119 /* Provide a ENDFILE_SPEC appropriate for ELF. Here we tack on the
120 magical crtend.o file which provides part of the support for
121 getting C++ file-scope static object constructed before entering
122 `main', followed by a normal ELF "finalizer" file, `crtn.o'. */
124 #undef ENDFILE_SPEC
125 #define ENDFILE_SPEC \
126 "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
127 %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
129 /* This variable should be set to 'true' if the target ABI requires
130 unwinding tables even when exceptions are not used. */
131 #define TARGET_UNWIND_TABLES_DEFAULT true
133 /* Select a format to encode pointers in exception handling data. CODE
134 is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is
135 true if the symbol may be affected by dynamic relocations.
137 Since application size is already constrained to <2GB by the form of
138 the ldgp relocation, we can use a 32-bit pc-relative relocation to
139 static data. Dynamic data is accessed indirectly to allow for read
140 only EH sections. */
141 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
142 (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4)
144 /* If defined, a C statement to be executed just prior to the output of
145 assembler code for INSN. */
146 #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
147 (alpha_this_literal_sequence_number = 0, \
148 alpha_this_gpdisp_sequence_number = 0)
149 extern int alpha_this_literal_sequence_number;
150 extern int alpha_this_gpdisp_sequence_number;
152 /* Since the bits of the _init and _fini function is spread across
153 many object files, each potentially with its own GP, we must assume
154 we need to load our GP. Further, the .init/.fini section can
155 easily be more than 4MB away from the function to call so we can't
156 use bsr. */
157 #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
158 asm (SECTION_OP "\n" \
159 " br $29,1f\n" \
160 "1: ldgp $29,0($29)\n" \
161 " unop\n" \
162 " jsr $26," USER_LABEL_PREFIX #FUNC "\n" \
163 " .align 3\n" \
164 " .previous");
166 /* If we have the capability create headers for efficient EH lookup.
167 As of Jan 2002, only glibc 2.2.4 can actually make use of this, but
168 I imagine that other systems will catch up. In the meantime, it
169 doesn't harm to make sure that the data exists to be used later. */
170 #if defined(HAVE_LD_EH_FRAME_HDR)
171 #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
172 #endif