1117395Skan/* Target definitions for x86 running Darwin.
2169689Skan   Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
3117395Skan   Contributed by Apple Computer Inc.
4117395Skan
5132718SkanThis file is part of GCC.
6117395Skan
7132718SkanGCC is free software; you can redistribute it and/or modify
8117395Skanit under the terms of the GNU General Public License as published by
9117395Skanthe Free Software Foundation; either version 2, or (at your option)
10117395Skanany later version.
11117395Skan
12132718SkanGCC is distributed in the hope that it will be useful,
13117395Skanbut WITHOUT ANY WARRANTY; without even the implied warranty of
14117395SkanMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15117395SkanGNU General Public License for more details.
16117395Skan
17117395SkanYou should have received a copy of the GNU General Public License
18132718Skanalong with GCC; see the file COPYING.  If not, write to
19169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
20169689SkanBoston, MA 02110-1301, USA.  */
21117395Skan
22117395Skan/* Enable Mach-O bits in generic x86 code.  */
23117395Skan#undef TARGET_MACHO
24117395Skan#define TARGET_MACHO 1
25117395Skan
26169689Skan#define TARGET_VERSION fprintf (stderr, " (i686 Darwin)");
27117395Skan
28169689Skan#undef  TARGET_64BIT
29169689Skan#define TARGET_64BIT (target_flags & MASK_64BIT)
30169689Skan
31169689Skan#ifdef IN_LIBGCC2
32169689Skan#undef TARGET_64BIT
33169689Skan#ifdef __x86_64__
34169689Skan#define TARGET_64BIT 1
35169689Skan#else
36169689Skan#define TARGET_64BIT 0
37169689Skan#endif
38169689Skan#endif
39169689Skan
40169689Skan/* Size of the Obj-C jump buffer.  */
41169689Skan#define OBJC_JBLEN ((TARGET_64BIT) ? ((9 * 2) + 3 + 16) : (18))
42169689Skan
43169689Skan#undef TARGET_FPMATH_DEFAULT
44169689Skan#define TARGET_FPMATH_DEFAULT (TARGET_SSE ? FPMATH_SSE : FPMATH_387)
45169689Skan
46117395Skan#define TARGET_OS_CPP_BUILTINS()                \
47117395Skan  do                                            \
48117395Skan    {                                           \
49117395Skan      builtin_define ("__LITTLE_ENDIAN__");     \
50169689Skan      darwin_cpp_builtins (pfile);		\
51117395Skan    }                                           \
52117395Skan  while (0)
53117395Skan
54169689Skan#undef PTRDIFF_TYPE
55169689Skan#define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int")
56169689Skan
57169689Skan#undef WCHAR_TYPE
58169689Skan#define WCHAR_TYPE "int"
59169689Skan
60169689Skan#undef WCHAR_TYPE_SIZE
61169689Skan#define WCHAR_TYPE_SIZE 32
62169689Skan
63169689Skan#undef MAX_BITS_PER_WORD
64169689Skan#define MAX_BITS_PER_WORD 64
65169689Skan
66169689Skan#undef FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN
67169689Skan#define FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN (0)
68169689Skan
69117395Skan/* We want -fPIC by default, unless we're using -static to compile for
70117395Skan   the kernel or some such.  */
71117395Skan
72117395Skan#undef CC1_SPEC
73169689Skan#define CC1_SPEC "%{!mkernel:%{!static:%{!mdynamic-no-pic:-fPIC}}} \
74169689Skan  %{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols }}"
75117395Skan
76169689Skan#undef ASM_SPEC
77169689Skan#define ASM_SPEC "-arch %(darwin_arch) -force_cpusubtype_ALL"
78146895Skan
79169689Skan#define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}"
80169689Skan#define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC
81132718Skan
82132718Skan#undef SUBTARGET_EXTRA_SPECS
83169689Skan#define SUBTARGET_EXTRA_SPECS                                   \
84169689Skan  { "darwin_arch", DARWIN_ARCH_SPEC },                          \
85169689Skan  { "darwin_crt2", "" },                                        \
86169689Skan  { "darwin_subarch", DARWIN_SUBARCH_SPEC },
87132718Skan
88169689Skan/* Use the following macro for any Darwin/x86-specific command-line option
89169689Skan   translation.  */
90169689Skan#define SUBTARGET_OPTION_TRANSLATE_TABLE \
91169689Skan  { "", "" }
92169689Skan
93117395Skan/* The Darwin assembler mostly follows AT&T syntax.  */
94117395Skan#undef ASSEMBLER_DIALECT
95117395Skan#define ASSEMBLER_DIALECT ASM_ATT
96117395Skan
97117395Skan/* Define macro used to output shift-double opcodes when the shift
98117395Skan   count is in %cl.  Some assemblers require %cl as an argument;
99117395Skan   some don't.  This macro controls what to do: by default, don't
100117395Skan   print %cl.  */
101117395Skan
102117395Skan#define SHIFT_DOUBLE_OMITS_COUNT 0
103117395Skan
104169689Skanextern void darwin_x86_file_end (void);
105169689Skan#undef TARGET_ASM_FILE_END
106169689Skan#define TARGET_ASM_FILE_END darwin_x86_file_end
107169689Skan
108117395Skan/* Define the syntax of pseudo-ops, labels and comments.  */
109117395Skan
110117395Skan/* String containing the assembler's comment-starter.  */
111117395Skan
112117395Skan#define ASM_COMMENT_START "#"
113117395Skan
114117395Skan/* By default, target has a 80387, uses IEEE compatible arithmetic,
115117395Skan   and returns float values in the 387.  */
116117395Skan
117169689Skan#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_128BIT_LONG_DOUBLE)
118117395Skan
119132718Skan/* For now, disable dynamic-no-pic.  We'll need to go through i386.c
120132718Skan   with a fine-tooth comb looking for refs to flag_pic!  */
121132718Skan#define MASK_MACHO_DYNAMIC_NO_PIC 0
122132718Skan#define TARGET_DYNAMIC_NO_PIC	  (target_flags & MASK_MACHO_DYNAMIC_NO_PIC)
123132718Skan
124169689Skan#undef GOT_SYMBOL_NAME
125169689Skan#define GOT_SYMBOL_NAME (machopic_function_base_name ())
126169689Skan
127117395Skan/* Define the syntax of pseudo-ops, labels and comments.  */
128117395Skan
129117395Skan#define LPREFIX "L"
130117395Skan
131169689Skan/* These are used by -fbranch-probabilities */
132169689Skan#define HOT_TEXT_SECTION_NAME "__TEXT,__text,regular,pure_instructions"
133169689Skan#define UNLIKELY_EXECUTED_TEXT_SECTION_NAME \
134169689Skan                              "__TEXT,__unlikely,regular,pure_instructions"
135169689Skan
136117395Skan/* Assembler pseudos to introduce constants of various size.  */
137117395Skan
138117395Skan#define ASM_BYTE_OP "\t.byte\t"
139117395Skan#define ASM_SHORT "\t.word\t"
140117395Skan#define ASM_LONG "\t.long\t"
141169689Skan#define ASM_QUAD "\t.quad\t"
142117395Skan
143169689Skan#define SUBTARGET_ENCODE_SECTION_INFO  darwin_encode_section_info
144169689Skan
145117395Skan#undef ASM_OUTPUT_ALIGN
146117395Skan#define ASM_OUTPUT_ALIGN(FILE,LOG)	\
147117395Skan do { if ((LOG) != 0)			\
148117395Skan        {				\
149169689Skan          if (in_section == text_section) \
150117395Skan            fprintf (FILE, "\t%s %d,0x90\n", ALIGN_ASM_OP, (LOG)); \
151117395Skan          else				\
152117395Skan            fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG)); \
153117395Skan        }				\
154117395Skan    } while (0)
155117395Skan
156117395Skan/* This says how to output an assembler line
157117395Skan   to define a global common symbol.  */
158117395Skan
159117395Skan#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \
160117395Skan( fputs (".comm ", (FILE)),			\
161117395Skan  assemble_name ((FILE), (NAME)),		\
162132718Skan  fprintf ((FILE), ",%lu\n", (unsigned long)(ROUNDED)))
163117395Skan
164117395Skan/* This says how to output an assembler line
165117395Skan   to define a local common symbol.  */
166117395Skan
167117395Skan#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \
168117395Skan( fputs (".lcomm ", (FILE)),			\
169117395Skan  assemble_name ((FILE), (NAME)),		\
170132718Skan  fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED"\n", (ROUNDED)))
171117395Skan
172117395Skan/* Darwin profiling -- call mcount.  */
173117395Skan#undef FUNCTION_PROFILER
174117395Skan#define FUNCTION_PROFILER(FILE, LABELNO)				\
175117395Skan    do {								\
176169689Skan      if (MACHOPIC_INDIRECT && !TARGET_64BIT)				\
177117395Skan	{								\
178169689Skan	  const char *name = machopic_mcount_stub_name ();		\
179117395Skan	  fprintf (FILE, "\tcall %s\n", name+1);  /*  skip '&'  */	\
180169689Skan	  machopic_validate_stub_or_non_lazy_ptr (name);		\
181117395Skan	}								\
182117395Skan      else fprintf (FILE, "\tcall mcount\n");				\
183117395Skan    } while (0)
184169689Skan
185169689Skan#define C_COMMON_OVERRIDE_OPTIONS					\
186169689Skan  do {									\
187169689Skan    SUBTARGET_C_COMMON_OVERRIDE_OPTIONS;				\
188169689Skan  } while (0)
189169689Skan
190169689Skan/* Darwin on x86_64 uses dwarf-2 by default.  */
191169689Skan#undef PREFERRED_DEBUGGING_TYPE
192169689Skan#define PREFERRED_DEBUGGING_TYPE (TARGET_64BIT ? DWARF2_DEBUG : DBX_DEBUG)
193169689Skan
194169689Skan/* Darwin uses the standard DWARF register numbers but the default
195169689Skan   register numbers for STABS.  Fortunately for 64-bit code the
196169689Skan   default and the standard are the same.  */
197169689Skan#undef DBX_REGISTER_NUMBER
198169689Skan#define DBX_REGISTER_NUMBER(n) 					\
199169689Skan  (TARGET_64BIT ? dbx64_register_map[n]				\
200169689Skan   : write_symbols == DWARF2_DEBUG ? svr4_dbx_register_map[n]	\
201169689Skan   : dbx_register_map[n])
202169689Skan
203169689Skan/* Unfortunately, the 32-bit EH information also doesn't use the standard
204169689Skan   DWARF register numbers.  */
205169689Skan#define DWARF2_FRAME_REG_OUT(n, for_eh)					\
206169689Skan  (! (for_eh) || write_symbols != DWARF2_DEBUG || TARGET_64BIT ? (n)	\
207169689Skan   : (n) == 5 ? 4							\
208169689Skan   : (n) == 4 ? 5							\
209169689Skan   : (n) >= 11 && (n) <= 18 ? (n) + 1					\
210169689Skan   : (n))
211169689Skan
212169689Skan#undef REGISTER_TARGET_PRAGMAS
213169689Skan#define REGISTER_TARGET_PRAGMAS() DARWIN_REGISTER_TARGET_PRAGMAS()
214169689Skan
215169689Skan#undef TARGET_SET_DEFAULT_TYPE_ATTRIBUTES
216169689Skan#define TARGET_SET_DEFAULT_TYPE_ATTRIBUTES darwin_set_default_type_attributes
217169689Skan
218169689Skan/* For 64-bit, we need to add 4 because @GOTPCREL is relative to the
219169689Skan   end of the instruction, but without the 4 we'd only have the right
220169689Skan   address for the start of the instruction.  */
221169689Skan#undef ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX
222169689Skan#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE)	\
223169689Skan  if (TARGET_64BIT)				                                \
224169689Skan    {                                                                           \
225169689Skan      if ((SIZE) == 4 && ((ENCODING) & 0x70) == DW_EH_PE_pcrel)			\
226169689Skan        {                                                                       \
227169689Skan	   fputs (ASM_LONG, FILE);                                              \
228169689Skan	   assemble_name (FILE, XSTR (ADDR, 0));				\
229169689Skan	   fputs ("+4@GOTPCREL", FILE);                                         \
230169689Skan	   goto DONE;                                                           \
231169689Skan        }									\
232169689Skan    }										\
233169689Skan  else                                                                          \
234169689Skan    {										\
235169689Skan      if (ENCODING == ASM_PREFERRED_EH_DATA_FORMAT (2, 1))                      \
236169689Skan        {                                                                       \
237169689Skan          darwin_non_lazy_pcrel (FILE, ADDR);                                   \
238169689Skan          goto DONE;								\
239169689Skan        }                                                                       \
240169689Skan    }
241169689Skan
242169689Skan/* This needs to move since i386 uses the first flag and other flags are
243169689Skan   used in Mach-O.  */
244169689Skan#undef MACHO_SYMBOL_FLAG_VARIABLE
245169689Skan#define MACHO_SYMBOL_FLAG_VARIABLE ((SYMBOL_FLAG_MACH_DEP) << 3)
246