190075Sobrien/* Definitions of target machine GNU compiler.  IA-64 version.
2169689Skan   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
3169689Skan   Free Software Foundation, Inc.
490075Sobrien   Contributed by Steve Ellcey <sje@cup.hp.com> and
590075Sobrien                  Reva Cuthbertson <reva@cup.hp.com>
690075Sobrien
7132718SkanThis file is part of GCC.
890075Sobrien
9132718SkanGCC is free software; you can redistribute it and/or modify
1090075Sobrienit under the terms of the GNU General Public License as published by
1190075Sobrienthe Free Software Foundation; either version 2, or (at your option)
1290075Sobrienany later version.
1390075Sobrien
14132718SkanGCC is distributed in the hope that it will be useful,
1590075Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1690075SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1790075SobrienGNU General Public License for more details.
1890075Sobrien
1990075SobrienYou should have received a copy of the GNU General Public License
20132718Skanalong with GCC; see the file COPYING.  If not, write to
21169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
22169689SkanBoston, MA 02110-1301, USA.  */
2390075Sobrien
2490075Sobrien/* This macro is a C statement to print on `stderr' a string describing the
2590075Sobrien   particular machine description choice.  */
2690075Sobrien
2790075Sobrien#define TARGET_VERSION fprintf (stderr, " (IA-64) HP-UX");
2890075Sobrien
29132718Skan/* Enable HPUX ABI quirks.  */
30132718Skan#undef  TARGET_HPUX
31132718Skan#define TARGET_HPUX 1
32132718Skan
33169689Skan#undef WCHAR_TYPE
34169689Skan#define WCHAR_TYPE "unsigned int"
35169689Skan
36169689Skan#undef WCHAR_TYPE_SIZE
37169689Skan#define WCHAR_TYPE_SIZE 32
38169689Skan
39117395Skan/* Target OS builtins.  */
40117395Skan#define TARGET_OS_CPP_BUILTINS()			\
41117395Skando {							\
42117395Skan	builtin_assert("system=hpux");			\
43117395Skan	builtin_assert("system=posix");			\
44117395Skan	builtin_assert("system=unix");			\
45117395Skan	builtin_define_std("hpux");			\
46117395Skan	builtin_define_std("unix");			\
47117395Skan	builtin_define("__IA64__");			\
48117395Skan	builtin_define("_LONGLONG");			\
49132718Skan	builtin_define("_INCLUDE_LONGLONG");		\
50117395Skan	builtin_define("_UINT128_T");			\
51132718Skan	if (c_dialect_cxx () || !flag_iso)		\
52117395Skan	  {						\
53117395Skan	    builtin_define("_HPUX_SOURCE");		\
54117395Skan	    builtin_define("__STDC_EXT__");		\
55132718Skan	    builtin_define("__STDCPP__");		\
56169689Skan	    builtin_define("_INCLUDE__STDC_A1_SOURCE");	\
57117395Skan	  }						\
58132718Skan	if (TARGET_ILP32)				\
59132718Skan	  builtin_define("_ILP32");			\
60117395Skan} while (0)
6190075Sobrien
62122180Skan#undef CPP_SPEC
63122180Skan#define CPP_SPEC \
64122180Skan  "%{mt|pthread:-D_REENTRANT -D_THREAD_SAFE -D_POSIX_C_SOURCE=199506L}"
65122180Skan/* aCC defines also -DRWSTD_MULTI_THREAD, -DRW_MULTI_THREAD.  These
66122180Skan   affect only aCC's C++ library (Rogue Wave-derived) which we do not
67122180Skan   use, and they violate the user's name space.  */
68122180Skan
6996263Sobrien#undef  ASM_EXTRA_SPEC
7096263Sobrien#define ASM_EXTRA_SPEC "%{milp32:-milp32} %{mlp64:-mlp64}"
7190075Sobrien
7290075Sobrien#undef ENDFILE_SPEC
7390075Sobrien
7490075Sobrien#undef STARTFILE_SPEC
75169689Skan#define STARTFILE_SPEC "%{!shared:%{static:crt0%O%s} \
76169689Skan			  %{mlp64:/usr/lib/hpux64/unix98%O%s} \
77169689Skan			  %{!mlp64:/usr/lib/hpux32/unix98%O%s}}"
7890075Sobrien
7990075Sobrien#undef LINK_SPEC
80117395Skan#define LINK_SPEC \
81169689Skan  "-z +Accept TypeMismatch \
82117395Skan   %{shared:-b} \
83117395Skan   %{!shared: \
84117395Skan     -u main \
85117395Skan     %{static:-noshared}}"
8690075Sobrien
8790075Sobrien#undef  LIB_SPEC
88117395Skan#define LIB_SPEC \
89117395Skan  "%{!shared: \
90122180Skan     %{mt|pthread:-lpthread} \
91117395Skan     %{p:%{!mlp64:-L/usr/lib/hpux32/libp} \
92117395Skan	 %{mlp64:-L/usr/lib/hpux64/libp} -lprof} \
93117395Skan     %{pg:%{!mlp64:-L/usr/lib/hpux32/libp} \
94117395Skan	  %{mlp64:-L/usr/lib/hpux64/libp} -lgprof} \
95117395Skan     %{!symbolic:-lc}}"
9690075Sobrien
97132718Skan#define MULTILIB_DEFAULTS { "milp32" }
98132718Skan
9990075Sobrien/* A C expression whose value is zero if pointers that need to be extended
10090075Sobrien   from being `POINTER_SIZE' bits wide to `Pmode' are sign-extended and
10190075Sobrien   greater then zero if they are zero-extended and less then zero if the
10290075Sobrien   ptr_extend instruction should be used.  */
10390075Sobrien
10490075Sobrien#define POINTERS_EXTEND_UNSIGNED -1
10590075Sobrien
10690075Sobrien#define JMP_BUF_SIZE  (8 * 76)
10790075Sobrien
10890075Sobrien#undef TARGET_DEFAULT
109169689Skan#define TARGET_DEFAULT \
110169689Skan  (MASK_DWARF2_ASM | MASK_BIG_ENDIAN | MASK_ILP32)
11190075Sobrien
112169689Skan/* ??? Might not be needed anymore.  */
113169689Skan#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) ((MODE) == TFmode)
11490075Sobrien
115117395Skan/* ASM_OUTPUT_EXTERNAL_LIBCALL defaults to just a globalize_label call,
116117395Skan   but that doesn't put out the @function type information which causes
117117395Skan   shared library problems.  */
11890075Sobrien
119117395Skan#undef ASM_OUTPUT_EXTERNAL_LIBCALL
120117395Skan#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)			\
121117395Skando {								\
122117395Skan  (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0));	\
123117395Skan  ASM_OUTPUT_TYPE_DIRECTIVE (FILE, XSTR (FUN, 0), "function");	\
124117395Skan} while (0)
12590075Sobrien
12690075Sobrien#undef FUNCTION_ARG_PADDING
12790075Sobrien#define FUNCTION_ARG_PADDING(MODE, TYPE) \
12890075Sobrien	ia64_hpux_function_arg_padding ((MODE), (TYPE))
12990075Sobrien
13090075Sobrien#undef PAD_VARARGS_DOWN
13190075Sobrien#define PAD_VARARGS_DOWN (!AGGREGATE_TYPE_P (type))
132117395Skan
133132718Skan#define REGISTER_TARGET_PRAGMAS() \
134132718Skan  c_register_pragma (0, "builtin", ia64_hpux_handle_builtin_pragma)
135117395Skan
136117395Skan/* Tell ia64.c that we are using the HP linker and we should delay output of
137117395Skan   function extern declarations so that we don't output them for functions
138117395Skan   which are never used (and may not be defined).  */
139117395Skan
140117395Skan#undef TARGET_HPUX_LD
141117395Skan#define TARGET_HPUX_LD	1
142117395Skan
143122180Skan/* The HPUX dynamic linker objects to weak symbols with no
144122180Skan   definitions, so do not use them in gthr-posix.h.  */
145122180Skan#define GTHREAD_USE_WEAK 0
146122180Skan
147117395Skan#undef CTORS_SECTION_ASM_OP
148117395Skan#define CTORS_SECTION_ASM_OP  "\t.section\t.init_array,\t\"aw\",\"init_array\""
149117395Skan
150117395Skan#undef DTORS_SECTION_ASM_OP
151117395Skan#define DTORS_SECTION_ASM_OP  "\t.section\t.fini_array,\t\"aw\",\"fini_array\""
152117395Skan
153122180Skan/* The init_array/fini_array technique does not permit the use of
154122180Skan   initialization priorities.  */
155122180Skan#define SUPPORTS_INIT_PRIORITY 0
156122180Skan
157117395Skan#undef READONLY_DATA_SECTION_ASM_OP
158117395Skan#define READONLY_DATA_SECTION_ASM_OP "\t.section\t.rodata,\t\"a\",\t\"progbits\""
159117395Skan
160117395Skan#undef DATA_SECTION_ASM_OP
161117395Skan#define DATA_SECTION_ASM_OP "\t.section\t.data,\t\"aw\",\t\"progbits\""
162117395Skan
163117395Skan#undef SDATA_SECTION_ASM_OP
164117395Skan#define SDATA_SECTION_ASM_OP "\t.section\t.sdata,\t\"asw\",\t\"progbits\""
165117395Skan
166117395Skan#undef BSS_SECTION_ASM_OP
167117395Skan#define BSS_SECTION_ASM_OP "\t.section\t.bss,\t\"aw\",\t\"nobits\""
168117395Skan
169117395Skan#undef SBSS_SECTION_ASM_OP
170117395Skan#define SBSS_SECTION_ASM_OP "\t.section\t.sbss,\t\"asw\",\t\"nobits\""
171117395Skan
172117395Skan#undef TEXT_SECTION_ASM_OP
173117395Skan#define TEXT_SECTION_ASM_OP "\t.section\t.text,\t\"ax\",\t\"progbits\""
174117395Skan
175117395Skan/* It is illegal to have relocations in shared segments on HPUX.
176117395Skan   Pretend flag_pic is always set.  */
177169689Skan#undef  TARGET_ASM_RELOC_RW_MASK
178169689Skan#define TARGET_ASM_RELOC_RW_MASK  ia64_hpux_reloc_rw_mask
179132718Skan
180132718Skan/* ia64 HPUX has the float and long double forms of math functions.  */
181132718Skan#undef TARGET_C99_FUNCTIONS
182132718Skan#define TARGET_C99_FUNCTIONS  1
183132718Skan
184169689Skan#undef TARGET_INIT_LIBFUNCS
185132718Skan#define TARGET_INIT_LIBFUNCS ia64_hpux_init_libfuncs
186132718Skan
187132718Skan#define FLOAT_LIB_COMPARE_RETURNS_BOOL(MODE, COMPARISON) ((MODE) == TFmode)
188169689Skan
189169689Skan/* Put all *xf routines in libgcc, regardless of long double size.  */
190169689Skan#undef LIBGCC2_HAS_XF_MODE
191169689Skan#define LIBGCC2_HAS_XF_MODE 1
192169689Skan#define XF_SIZE 64
193169689Skan
194169689Skan/* Put all *tf routines in libgcc, regardless of long double size.  */
195169689Skan#undef LIBGCC2_HAS_TF_MODE
196169689Skan#define LIBGCC2_HAS_TF_MODE 1
197169689Skan#define TF_SIZE 113
198169689Skan
199169689Skan/* HP-UX headers are C++-compatible.  */
200169689Skan#define NO_IMPLICIT_EXTERN_C
201169689Skan
202169689Skan/* HP-UX uses PROFILE_HOOK instead of FUNCTION_PROFILER but we need a
203169689Skan   FUNCTION_PROFILER defined because its use is not ifdefed.  When using
204169689Skan   PROFILE_HOOK, the profile call comes after the prologue.  */
205169689Skan
206169689Skan#undef FUNCTION_PROFILER
207169689Skan#define FUNCTION_PROFILER(FILE, LABELNO) do { } while (0)
208169689Skan
209169689Skan#undef PROFILE_HOOK
210169689Skan#define PROFILE_HOOK(LABEL) ia64_profile_hook (LABEL)
211169689Skan
212169689Skan#undef  PROFILE_BEFORE_PROLOGUE
213169689Skan
214169689Skan#undef NO_PROFILE_COUNTERS
215169689Skan#define NO_PROFILE_COUNTERS 0
216169689Skan
217169689Skan#undef HANDLE_PRAGMA_PACK_PUSH_POP
218169689Skan#define HANDLE_PRAGMA_PACK_PUSH_POP
219