]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/ia64/sysv4.h
final.c (HAVE_READONLY_DATA_SECTION): New.
[thirdparty/gcc.git] / gcc / config / ia64 / sysv4.h
CommitLineData
c65ebc55
JW
1/* Override definitions in elfos.h/svr4.h to be correct for IA64. */
2
3/* We want DWARF2 as specified by the IA64 ABI. */
4#undef PREFERRED_DEBUGGING_TYPE
5#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
6
89e6abff
RH
7/* Stabs does not work properly for 64-bit targets. */
8#undef DBX_DEBUGGING_INFO
9
c65ebc55
JW
10/* Various pseudo-ops for which the Intel assembler uses non-standard
11 definitions. */
12
c65ebc55 13#undef STRING_ASM_OP
de323aa1 14#define STRING_ASM_OP "\tstringz\t"
c65ebc55
JW
15
16#undef SKIP_ASM_OP
de323aa1 17#define SKIP_ASM_OP "\t.skip\t"
c65ebc55
JW
18
19#undef COMMON_ASM_OP
de323aa1 20#define COMMON_ASM_OP "\t.common\t"
c65ebc55
JW
21
22#undef ASCII_DATA_ASM_OP
de323aa1 23#define ASCII_DATA_ASM_OP "\tstring\t"
c65ebc55 24
93215a1b
AS
25/* ia64-specific options for gas
26 ??? ia64 gas doesn't accept standard svr4 assembler options? */
27#undef ASM_SPEC
28#define ASM_SPEC "-x %{mconstant-gp} %{mauto-pic} %(asm_extra)"
29
c65ebc55
JW
30/* ??? Unfortunately, .lcomm doesn't work, because it puts things in either
31 .bss or .sbss, and we can't control the decision of which is used. When
32 I use .lcomm, I get a cryptic "Section group has no member" error from
33 the Intel simulator. So we must explicitly put variables in .bss
34 instead. This matters only if we care about the Intel assembler. */
35
36/* This is asm_output_aligned_bss from varasm.c without the ASM_GLOBALIZE_LABEL
37 call at the beginning. */
38
39/* This is for final.c, because it is used by ASM_DECLARE_OBJECT_NAME. */
40extern int size_directive_output;
41
42#undef ASM_OUTPUT_ALIGNED_LOCAL
43#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \
44do { \
0577bad8
RH
45 if ((DECL) \
46 && XSTR (XEXP (DECL_RTL (DECL), 0), 0)[0] == SDATA_NAME_FLAG_CHAR) \
c65ebc55
JW
47 sbss_section (); \
48 else \
49 bss_section (); \
50 ASM_OUTPUT_ALIGN (FILE, floor_log2 ((ALIGN) / BITS_PER_UNIT)); \
51 ASM_DECLARE_OBJECT_NAME (FILE, NAME, DECL); \
52 ASM_OUTPUT_SKIP (FILE, SIZE ? SIZE : 1); \
53} while (0)
54
c65ebc55
JW
55/* The # tells the Intel assembler that this is not a register name.
56 However, we can't emit the # in a label definition, so we set a variable
13daf3c1
NC
57 in ASM_OUTPUT_LABEL to control whether we want the postfix here or not.
58 We append the # to the label name, but since NAME can be an expression
59 we have to scan it for a non-label character and insert the # there. */
c65ebc55
JW
60
61#undef ASM_OUTPUT_LABELREF
c45632b7
RH
62#define ASM_OUTPUT_LABELREF(STREAM, NAME) \
63do { \
64 const char *name_ = NAME; \
65 if (*name_ == SDATA_NAME_FLAG_CHAR) \
66 name_++; \
67 if (*name_ == '*') \
68 name_++; \
69 else \
70 fputs (user_label_prefix, STREAM); \
71 fputs (name_, STREAM); \
45d29407
RH
72 if (!ia64_asm_output_label) \
73 fputc ('#', STREAM); \
c45632b7 74} while (0)
c65ebc55
JW
75
76/* Intel assembler requires both flags and type if declaring a non-predefined
77 section. */
78#undef INIT_SECTION_ASM_OP
de323aa1 79#define INIT_SECTION_ASM_OP "\t.section\t.init,\"ax\",\"progbits\""
c65ebc55 80#undef FINI_SECTION_ASM_OP
de323aa1 81#define FINI_SECTION_ASM_OP "\t.section\t.fini,\"ax\",\"progbits\""
c65ebc55
JW
82
83/* svr4.h undefines this, so we need to define it here. */
97e242b0
RH
84#define DBX_REGISTER_NUMBER(REGNO) \
85 ia64_dbx_register_number(REGNO)
c65ebc55
JW
86
87/* Things that svr4.h defines to the wrong type, because it assumes 32 bit
88 ints and 32 bit longs. */
89
90#undef SIZE_TYPE
91#define SIZE_TYPE "long unsigned int"
92
93#undef PTRDIFF_TYPE
94#define PTRDIFF_TYPE "long int"
95
96#undef WCHAR_TYPE
97#define WCHAR_TYPE "int"
98
99#undef WCHAR_TYPE_SIZE
100#define WCHAR_TYPE_SIZE 32
101
c65ebc55
JW
102/* We redefine this to use the ia64 .proc pseudo-op. */
103
104#undef ASM_DECLARE_FUNCTION_NAME
105#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
106do { \
107 fputs ("\t.proc ", FILE); \
108 assemble_name (FILE, NAME); \
109 fputc ('\n', FILE); \
110 ASM_OUTPUT_LABEL (FILE, NAME); \
111} while (0)
112
113/* We redefine this to use the ia64 .endp pseudo-op. */
114
115#undef ASM_DECLARE_FUNCTION_SIZE
116#define ASM_DECLARE_FUNCTION_SIZE(FILE, NAME, DECL) \
117do { \
118 fputs ("\t.endp ", FILE); \
119 assemble_name (FILE, NAME); \
120 fputc ('\n', FILE); \
121} while (0)
122
123/* A C expression which outputs to the stdio stream STREAM some appropriate
124 text to go at the start of an assembler file. */
125
126/* ??? Looks like almost every port, except for a few original ones, get this
127 wrong. Must emit #NO_APP as first line of file to turn of special assembler
128 preprocessing of files. */
129
130/* ??? Even worse, it doesn't work, because gas does not accept the tab chars
131 that dwarf2out.c emits when #NO_APP. */
132
133/* ??? Unrelated, but dwarf2out.c emits unnecessary newlines after strings,
134 may as well fix at the same time. */
135
c65ebc55
JW
136#undef ASM_FILE_START
137#define ASM_FILE_START(STREAM) \
138do { \
c65ebc55 139 output_file_directive (STREAM, main_input_filename); \
ca3920ad 140 emit_safe_across_calls (STREAM); \
c65ebc55 141} while (0)
c65ebc55 142
ac9cd70f
RH
143/* Similarly for constant pool data. */
144
3b572406 145extern unsigned int ia64_section_threshold;
ac9cd70f 146#undef SELECT_RTX_SECTION
201556f0 147#define SELECT_RTX_SECTION(MODE, RTX, ALIGN) \
ac9cd70f
RH
148{ \
149 if (GET_MODE_SIZE (MODE) > 0 \
150 && GET_MODE_SIZE (MODE) <= ia64_section_threshold) \
151 sdata_section (); \
152 else if (flag_pic && symbolic_operand ((RTX), (MODE))) \
153 data_section (); \
154 else \
201556f0 155 mergeable_constant_section ((MODE), (ALIGN), 0); \
ac9cd70f
RH
156}
157
c65ebc55 158#undef EXTRA_SECTIONS
d48bc59a 159#define EXTRA_SECTIONS in_sdata, in_sbss
c65ebc55
JW
160
161#undef EXTRA_SECTION_FUNCTIONS
162#define EXTRA_SECTION_FUNCTIONS \
c65ebc55
JW
163 SDATA_SECTION_FUNCTION \
164 SBSS_SECTION_FUNCTION
165
de323aa1 166#define SDATA_SECTION_ASM_OP "\t.sdata"
c65ebc55
JW
167
168#define SDATA_SECTION_FUNCTION \
169void \
170sdata_section () \
171{ \
172 if (in_section != in_sdata) \
173 { \
174 fprintf (asm_out_file, "%s\n", SDATA_SECTION_ASM_OP); \
175 in_section = in_sdata; \
176 } \
177}
178
de323aa1 179#define SBSS_SECTION_ASM_OP "\t.sbss"
c65ebc55
JW
180
181#define SBSS_SECTION_FUNCTION \
182void \
183sbss_section () \
184{ \
185 if (in_section != in_sbss) \
186 { \
187 fprintf (asm_out_file, "%s\n", SBSS_SECTION_ASM_OP); \
188 in_section = in_sbss; \
189 } \
190}