1 /* Operating system specific defines to be used when targeting GCC for any
2    Solaris 2 system.
3    Copyright (C) 2002-2021 Free Software Foundation, Inc.
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 /* We are compiling for Solaris 2 now.  */
22 #define TARGET_SOLARIS 1
23 
24 /* wchar_t is called differently in <wchar.h> for 32 and 64-bit
25    compilations.  This is called for by SCD 2.4.1, p. 6-83, Figure 6-65
26    (32-bit) and p. 6P-10, Figure 6.38 (64-bit).  */
27 
28 #undef WCHAR_TYPE
29 #define WCHAR_TYPE (TARGET_64BIT ? "int" : "long int")
30 
31 #undef WCHAR_TYPE_SIZE
32 #define WCHAR_TYPE_SIZE 32
33 
34 /* Same for wint_t.  See SCD 2.4.1, p. 6-83, Figure 6-66 (32-bit).  There's
35    no corresponding 64-bit definition, but this is what Solaris 8
36    <iso/wchar_iso.h> uses.  */
37 
38 #undef WINT_TYPE
39 #define WINT_TYPE (TARGET_64BIT ? "int" : "long int")
40 
41 #undef WINT_TYPE_SIZE
42 #define WINT_TYPE_SIZE 32
43 
44 #define SIG_ATOMIC_TYPE "int"
45 
46 /* ??? This definition of int8_t follows the system header but does
47    not conform to C99.  Likewise int_fast8_t, int_least8_t.  */
48 #define INT8_TYPE "char"
49 #define INT16_TYPE "short int"
50 #define INT32_TYPE "int"
51 #define INT64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
52 #define UINT8_TYPE "unsigned char"
53 #define UINT16_TYPE "short unsigned int"
54 #define UINT32_TYPE "unsigned int"
55 #define UINT64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
56 
57 #define INT_LEAST8_TYPE "char"
58 #define INT_LEAST16_TYPE "short int"
59 #define INT_LEAST32_TYPE "int"
60 #define INT_LEAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
61 #define UINT_LEAST8_TYPE "unsigned char"
62 #define UINT_LEAST16_TYPE "short unsigned int"
63 #define UINT_LEAST32_TYPE "unsigned int"
64 #define UINT_LEAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
65 
66 #define INT_FAST8_TYPE "char"
67 #define INT_FAST16_TYPE "int"
68 #define INT_FAST32_TYPE "int"
69 #define INT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
70 #define UINT_FAST8_TYPE "unsigned char"
71 #define UINT_FAST16_TYPE "unsigned int"
72 #define UINT_FAST32_TYPE "unsigned int"
73 #define UINT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
74 
75 #define INTPTR_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int")
76 #define UINTPTR_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "unsigned int")
77 
78 #undef CPP_SUBTARGET_SPEC
79 #define CPP_SUBTARGET_SPEC "\
80 %{pthreads|pthread:-D_REENTRANT -D_PTHREADS}"
81 
82 /* Names to predefine in the preprocessor for this target machine.  */
83 #define TARGET_SUB_OS_CPP_BUILTINS()
84 #define TARGET_OS_CPP_BUILTINS()			\
85   do {							\
86     builtin_define_std ("unix");			\
87     builtin_define_std ("sun");				\
88     builtin_define ("__svr4__");			\
89     builtin_define ("__SVR4");				\
90     builtin_assert ("system=unix");			\
91     builtin_assert ("system=svr4");			\
92     /* For C++ we need to add some additional macro	\
93        definitions required by the C++ standard		\
94        library.  */					\
95     if (c_dialect_cxx ())				\
96       {							\
97 	switch (cxx_dialect)				\
98 	  {						\
99 	  case cxx98:					\
100 	  case cxx11:					\
101 	  case cxx14:					\
102 	    /* C++11 and C++14 are based on C99.	\
103 	       libstdc++ makes use of C99 features	\
104 	       even for C++98.  */			\
105 	    builtin_define ("__STDC_VERSION__=199901L");\
106 	    break;					\
107 							\
108 	  default:					\
109 	    /* C++17 is based on C11.  */		\
110 	    builtin_define ("__STDC_VERSION__=201112L");\
111 	    break;					\
112 	  }						\
113 	builtin_define ("_XOPEN_SOURCE=600");		\
114 	builtin_define ("_LARGEFILE_SOURCE=1");		\
115 	builtin_define ("_LARGEFILE64_SOURCE=1");	\
116 	builtin_define ("_FILE_OFFSET_BITS=64");	\
117 	builtin_define ("__EXTENSIONS__");		\
118       }							\
119     TARGET_SUB_OS_CPP_BUILTINS();			\
120   } while (0)
121 
122 #define SUBTARGET_OVERRIDE_OPTIONS			\
123   do {							\
124     solaris_override_options ();			\
125   } while (0)
126 
127 #if DEFAULT_ARCH32_P
128 #define MULTILIB_DEFAULTS { "m32" }
129 #else
130 #define MULTILIB_DEFAULTS { "m64" }
131 #endif
132 
133 #if DEFAULT_ARCH32_P
134 #define DEF_ARCH32_SPEC(__str) "%{!m64:" __str "}"
135 #define DEF_ARCH64_SPEC(__str) "%{m64:" __str "}"
136 #else
137 #define DEF_ARCH32_SPEC(__str) "%{m32:" __str "}"
138 #define DEF_ARCH64_SPEC(__str) "%{!m32:" __str "}"
139 #endif
140 
141 /* Solaris needs -fasynchronous-unwind-tables to generate unwind info.  */
142 #define ASAN_CC1_SPEC "%{%:sanitize(address):-fasynchronous-unwind-tables}"
143 
144 /* It's safe to pass -s always, even if -g is not used.  Those options are
145    handled by both Sun as and GNU as.  */
146 #define ASM_SPEC_BASE \
147 "%{v:-V} %{Qy:} %{!Qn:-Qy} %{Ym,*} -s %(asm_cpu)"
148 
149 #define ASM_PIC_SPEC " %{" FPIE_OR_FPIC_SPEC ":-K PIC}"
150 
151 #undef ASM_CPU_DEFAULT_SPEC
152 #define ASM_CPU_DEFAULT_SPEC \
153 (DEFAULT_ARCH32_P ? "\
154 %{m64:" ASM_CPU64_DEFAULT_SPEC "} \
155 %{!m64:" ASM_CPU32_DEFAULT_SPEC "} \
156 " : "\
157 %{m32:" ASM_CPU32_DEFAULT_SPEC "} \
158 %{!m32:" ASM_CPU64_DEFAULT_SPEC "} \
159 ")
160 
161 #undef LIB_SPEC
162 #define LIB_SPEC \
163   "%{!symbolic:\
164      %{pthreads|pthread:-lpthread} \
165      %{p|pg:-ldl} -lc}"
166 
167 #ifndef CROSS_DIRECTORY_STRUCTURE
168 #undef MD_EXEC_PREFIX
169 #define MD_EXEC_PREFIX "/usr/ccs/bin/"
170 #endif
171 
172 /* Enable constructor priorities if the configured linker supports it.  */
173 #undef SUPPORTS_INIT_PRIORITY
174 #define SUPPORTS_INIT_PRIORITY HAVE_INITFINI_ARRAY_SUPPORT
175 
176 /* Solaris libc and libm implement multiple behaviours for various
177    interfaces that have changed over the years in different versions of the
178    C standard.  The behaviour is controlled by linking corresponding
179    values-*.o objects.  Each of these objects contain alternate definitions
180    of one or more variables that the libraries use to select which
181    conflicting behaviour they should exhibit.  There are two sets of these
182    objects, values-X*.o and values-xpg*.o.
183 
184    The values-X[ac].o objects set the variable _lib_version.  The Studio C
185    compilers use values-Xc.o with either -Xc or (since Studio 12.6)
186    -pedantic to select strictly conformant ISO C behaviour, otherwise
187    values-Xa.o.  Since -pedantic is a diagnostic option only in GCC, we
188    need to specifiy the -std=c* options and -std=iso9899:199409.  We
189    traditionally include -ansi, which affects C and C++, and also -std=c++*
190    for consistency.
191 
192    The values-xpg[46].o objects define either or both __xpg[46] variables,
193    selecting XPG4 mode (__xpg4) and conforming C99/SUSv3 behavior (__xpg6).
194 
195    Since GCC 5, gcc defaults to -std=gnu11 or higher, so we link
196    values-xpg6.o to get C99 semantics.  Besides, most of the runtime
197    libraries always require C99 semantics.
198 
199    Since only one instance of _lib_version and __xpg[46] takes effekt (the
200    first in ld.so.1's search path), we only link the values-*.o files into
201    executable programs.  */
202 #undef STARTFILE_ARCH_SPEC
203 #define STARTFILE_ARCH_SPEC \
204   "%{!shared:%{!symbolic: \
205      %{ansi|std=c*|std=iso9899\\:199409:values-Xc.o%s; :values-Xa.o%s} \
206      %{std=c90|std=gnu90:values-xpg4.o%s; :values-xpg6.o%s}}}"
207 
208 #if defined(HAVE_LD_PIE) && defined(HAVE_SOLARIS_CRTS)
209 #define STARTFILE_CRTBEGIN_SPEC "%{static:crtbegin.o%s; \
210 				   shared|" PIE_SPEC ":crtbeginS.o%s; \
211 				   :crtbegin.o%s}"
212 #else
213 #define STARTFILE_CRTBEGIN_SPEC	"crtbegin.o%s"
214 #endif
215 
216 #if ENABLE_VTABLE_VERIFY
217 #if SUPPORTS_INIT_PRIORITY
218 #define STARTFILE_VTV_SPEC \
219   "%{fvtable-verify=none:%s; \
220      fvtable-verify=preinit:vtv_start_preinit.o%s; \
221      fvtable-verify=std:vtv_start.o%s}"
222 #define ENDFILE_VTV_SPEC \
223   "%{fvtable-verify=none:%s; \
224      fvtable-verify=preinit:vtv_end_preinit.o%s; \
225      fvtable-verify=std:vtv_end.o%s}"
226 #else /* !SUPPORTS_INIT_PRIORITY */
227 #define STARTFILE_VTV_SPEC \
228   "%{fvtable-verify=*: \
229      %e-fvtable-verify=%* is not supported in this configuration}"
230 #define ENDFILE_VTV_SPEC ""
231 #endif /* !SUPPORTS_INIT_PRIORITY */
232 #else /* !ENABLE_VTABLE_VERIFY */
233 #define STARTFILE_VTV_SPEC ""
234 #define ENDFILE_VTV_SPEC ""
235 #endif /* !ENABLE_VTABLE_VERIFY */
236 
237 /* Link -lasan early on the command line.  For -static-libasan, don't link
238    it for -shared link, the executable should be compiled with -static-libasan
239    in that case, and for executable link with --{,no-}whole-archive around
240    it to force everything into the executable.  */
241 
242 #ifndef USE_GNU_LD
243 #define LD_WHOLE_ARCHIVE_OPTION "-z allextract"
244 #define LD_NO_WHOLE_ARCHIVE_OPTION "-z defaultextract"
245 #else
246 #define LD_WHOLE_ARCHIVE_OPTION "--whole-archive"
247 #define LD_NO_WHOLE_ARCHIVE_OPTION "--no-whole-archive"
248 #endif
249 
250 /* Allow rejecting -fsanitize=address, e.g. for specific multilibs.  */
251 #ifndef ASAN_REJECT_SPEC
252 #define ASAN_REJECT_SPEC ""
253 #endif
254 
255 #define LIBASAN_EARLY_SPEC ASAN_REJECT_SPEC \
256   " %{!shared:libasan_preinit%O%s} \
257     %{static-libasan:%{!shared: -Bstatic "\
258     LD_WHOLE_ARCHIVE_OPTION " -lasan " LD_NO_WHOLE_ARCHIVE_OPTION \
259     "-Bdynamic}}%{!static-libasan:-lasan}"
260 
261 /* Error out on -fsanitize=thread|leak.  */
262 #define LIBTSAN_EARLY_SPEC "\
263   %e-fsanitize=thread is not supported in this configuration"
264 #define LIBLSAN_EARLY_SPEC "\
265   %e-fsanitize=leak is not supported in this configuration"
266 
267 /* We don't use the standard svr4 STARTFILE_SPEC because it's wrong for us.  */
268 #undef STARTFILE_SPEC
269 #ifdef HAVE_SOLARIS_CRTS
270 /* Since Solaris 11.4, the OS delivers crt1.o, crti.o, and crtn.o, with a hook
271    for compiler-dependent stuff like profile handling.  */
272 #define STARTFILE_SPEC "%{!shared:%{!symbolic: \
273 			  crt1.o%s \
274 			  %{p:%e-p is not supported; \
275 			    pg:crtpg.o%s gmon.o%s; \
276 			      :crtp.o%s}}} \
277 			crti.o%s %(startfile_arch) %(startfile_crtbegin) \
278 			%(startfile_vtv)"
279 #else
280 #define STARTFILE_SPEC "%{!shared:%{!symbolic: \
281 			  %{p:mcrt1.o%s; \
282                             pg:gcrt1.o%s gmon.o%s; \
283                               :crt1.o%s}}} \
284 			crti.o%s %(startfile_arch) %(startfile_crtbegin) \
285 			%(startfile_vtv)"
286 #endif
287 
288 #if defined(HAVE_LD_PIE) && defined(HAVE_SOLARIS_CRTS)
289 #define ENDFILE_CRTEND_SPEC "%{static:crtend.o%s; \
290 			       shared|" PIE_SPEC ":crtendS.o%s; \
291 			       :crtend.o%s}"
292 #else
293 #define ENDFILE_CRTEND_SPEC "crtend.o%s"
294 #endif
295 
296 #undef  ENDFILE_SPEC
297 #define ENDFILE_SPEC \
298   "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
299    %(endfile_arch) %(endfile_vtv) %(endfile_crtend) crtn.o%s"
300 
301 #undef LINK_ARCH32_SPEC_BASE
302 #define LINK_ARCH32_SPEC_BASE \
303   "%{G:-G} \
304    %{YP,*} \
305    %{R*} \
306    %{!YP,*:%{p|pg:-Y P,%R/usr/lib/libp%R/lib:%R/usr/lib} \
307 	   %{!p:%{!pg:-Y P,%R/lib:%R/usr/lib}}}"
308 
309 #undef LINK_ARCH32_SPEC
310 #define LINK_ARCH32_SPEC LINK_ARCH32_SPEC_BASE
311 
312 /* This should be the same as LINK_ARCH32_SPEC_BASE, except with
313    ARCH64_SUBDIR appended to the paths.  */
314 #undef LINK_ARCH64_SPEC_BASE
315 #define LINK_ARCH64_SPEC_BASE \
316   "%{G:-G} \
317    %{YP,*} \
318    %{R*} \
319    %{!YP,*:%{p|pg:-Y P,%R/usr/lib/libp/" ARCH64_SUBDIR ":%R/lib/" ARCH64_SUBDIR ":%R/usr/lib/" ARCH64_SUBDIR "}	\
320 	   %{!p:%{!pg:-Y P,%R/lib/" ARCH64_SUBDIR ":%R/usr/lib/" ARCH64_SUBDIR "}}}"
321 
322 #undef LINK_ARCH64_SPEC
323 #ifndef USE_GLD
324 /* FIXME: Used to be SPARC-only.  Not SPARC-specfic but for the model name!  */
325 #define LINK_ARCH64_SPEC \
326   "%{mcmodel=medlow:-M /usr/lib/ld/" ARCH64_SUBDIR "/map.below4G} " \
327   LINK_ARCH64_SPEC_BASE
328 #else
329 #define LINK_ARCH64_SPEC LINK_ARCH64_SPEC_BASE
330 #endif
331 
332 #ifdef USE_GLD
333 #if DEFAULT_ARCH32_P
334 #define ARCH_DEFAULT_EMULATION ARCH32_EMULATION
335 #else
336 #define ARCH_DEFAULT_EMULATION ARCH64_EMULATION
337 #endif
338 #define TARGET_LD_EMULATION "%{m32:-m " ARCH32_EMULATION "}" \
339 			    "%{m64:-m " ARCH64_EMULATION "}" \
340 			    "%{!m32:%{!m64:-m " ARCH_DEFAULT_EMULATION "}} "
341 #else
342 #define TARGET_LD_EMULATION ""
343 #endif
344 
345 #undef LINK_ARCH_SPEC
346 #if DISABLE_MULTILIB
347 #if DEFAULT_ARCH32_P
348 #define LINK_ARCH_SPEC TARGET_LD_EMULATION " \
349 %{m32:%(link_arch32)} \
350 %{m64:%edoes not support multilib} \
351 %{!m32:%{!m64:%(link_arch_default)}} \
352 "
353 #else
354 #define LINK_ARCH_SPEC TARGET_LD_EMULATION " \
355 %{m32:%edoes not support multilib} \
356 %{m64:%(link_arch64)} \
357 %{!m32:%{!m64:%(link_arch_default)}} \
358 "
359 #endif
360 #else
361 #define LINK_ARCH_SPEC TARGET_LD_EMULATION " \
362 %{m32:%(link_arch32)} \
363 %{m64:%(link_arch64)} \
364 %{!m32:%{!m64:%(link_arch_default)}}"
365 #endif
366 
367 #define LINK_ARCH_DEFAULT_SPEC \
368 (DEFAULT_ARCH32_P ? LINK_ARCH32_SPEC : LINK_ARCH64_SPEC)
369 
370 #undef SUBTARGET_EXTRA_SPECS
371 #define SUBTARGET_EXTRA_SPECS \
372   { "startfile_arch",	 	STARTFILE_ARCH_SPEC },		\
373   { "startfile_crtbegin",	STARTFILE_CRTBEGIN_SPEC },	\
374   { "startfile_vtv",		STARTFILE_VTV_SPEC },		\
375   { "link_arch32",       	LINK_ARCH32_SPEC },		\
376   { "link_arch64",       	LINK_ARCH64_SPEC },		\
377   { "link_arch_default", 	LINK_ARCH_DEFAULT_SPEC },	\
378   { "link_arch",	 	LINK_ARCH_SPEC },		\
379   { "endfile_arch",	 	ENDFILE_ARCH_SPEC },		\
380   { "endfile_crtend",		ENDFILE_CRTEND_SPEC },		\
381   { "endfile_vtv",		ENDFILE_VTV_SPEC },		\
382   SUBTARGET_CPU_EXTRA_SPECS
383 
384 #ifndef USE_GLD
385 /* With Sun ld, -rdynamic is a no-op.  */
386 #define RDYNAMIC_SPEC ""
387 #else
388 /* GNU ld needs --export-dynamic to implement -rdynamic.  */
389 #define RDYNAMIC_SPEC "--export-dynamic"
390 #endif
391 
392 #ifndef USE_GLD
393 /* Prefer native form with Solaris ld.  */
394 #define SYSROOT_SPEC "-z sysroot=%R"
395 #endif
396 
397 #if !defined(USE_GLD) && defined(ENABLE_SHARED_LIBGCC)
398 /* With Sun ld, use mapfile to enforce direct binding to libgcc_s unwinder.  */
399 #define LINK_LIBGCC_MAPFILE_SPEC \
400   "%{shared|shared-libgcc:-M %slibgcc-unwind.map}"
401 #else
402 /* GNU ld doesn't support direct binding.  */
403 #define LINK_LIBGCC_MAPFILE_SPEC ""
404 #endif
405 
406 /* Clear hardware capabilities, either explicitly or with OpenMP:
407    #pragma openmp declare simd creates clones for SSE2, AVX, and AVX2.  */
408 #ifdef HAVE_LD_CLEARCAP
409 #define LINK_CLEARCAP_SPEC " %{mclear-hwcap|fopenmp*:-M %sclearcap.map}"
410 #else
411 #define LINK_CLEARCAP_SPEC ""
412 #endif
413 
414 #undef  LINK_SPEC
415 #define LINK_SPEC \
416   "%{h*} %{v:-V} \
417    %{!shared:%{!static:%{rdynamic: " RDYNAMIC_SPEC "}}} \
418    %{static:-dn -Bstatic} \
419    %{shared:-G -dy %{!mimpure-text:-z text}} " \
420    LINK_LIBGCC_MAPFILE_SPEC LINK_CLEARCAP_SPEC " \
421    %{symbolic:-Bsymbolic -G -dy -z text} \
422    %(link_arch) \
423    %{Qy:} %{!Qn:-Qy}"
424 
425 /* Use --as-needed/-z ignore -lgcc_s for eh support.  */
426 #ifdef HAVE_LD_AS_NEEDED
427 #define USE_LD_AS_NEEDED 1
428 #endif
429 
430 #ifdef USE_GLD
431 /* Solaris 11 build 135+ implements dl_iterate_phdr.  GNU ld needs
432    --eh-frame-hdr to create the required .eh_frame_hdr sections.  */
433 #if defined(HAVE_LD_EH_FRAME_HDR) && defined(TARGET_DL_ITERATE_PHDR)
434 #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
435 #endif /* HAVE_LD_EH_FRAME && TARGET_DL_ITERATE_PHDR */
436 #endif
437 
438 #if defined(HAVE_LD_PIE) && defined(HAVE_SOLARIS_CRTS)
439 #ifdef USE_GLD
440 /* Assert -z text by default to match Solaris ld.  */
441 #define LD_PIE_SPEC "-pie %{!mimpure-text:-z text}"
442 #else
443 /* Solaris ld needs -z type=pie instead of -pie.  */
444 #define LD_PIE_SPEC "-z type=pie %{mimpure-text:-z textoff}"
445 #endif
446 #else
447 /* Error out if some part of PIE support is missing.  */
448 #define LINK_PIE_SPEC \
449   "%{no-pie:} %{pie:%e-pie is not supported in this configuration} "
450 #endif
451 
452 /* collect2.c can only parse GNU nm -n output.  Solaris nm needs -png to
453    produce the same format.  */
454 #define NM_FLAGS "-png"
455 
456 #define STDC_0_IN_SYSTEM_HEADERS 1
457 
458 /* Support Solaris-specific format checking for cmn_err.  */
459 #define TARGET_N_FORMAT_TYPES 1
460 #define TARGET_FORMAT_TYPES solaris_format_types
461 
462 /* #pragma init and #pragma fini are implemented on top of init and
463    fini attributes.  */
464 #define SOLARIS_ATTRIBUTE_TABLE						\
465   { "init",      0, 0, true,  false,  false, false, NULL, NULL },	\
466   { "fini",      0, 0, true,  false,  false, false, NULL, NULL }
467 
468 /* Solaris-specific #pragmas are implemented on top of attributes.  Hook in
469    the bits from config/sol2.c.  */
470 #define SUBTARGET_INSERT_ATTRIBUTES solaris_insert_attributes
471 #define SUBTARGET_ATTRIBUTE_TABLE SOLARIS_ATTRIBUTE_TABLE
472 
473 /* Allow macro expansion in #pragma pack.  */
474 #define HANDLE_PRAGMA_PACK_WITH_EXPANSION
475 
476 #define TARGET_CXX_DECL_MANGLING_CONTEXT solaris_cxx_decl_mangling_context
477 
478 /* Solaris/x86 as and gas support unquoted section names.  */
479 #ifndef SECTION_NAME_FORMAT
480 #define SECTION_NAME_FORMAT	"%s"
481 #endif
482 
483 /* This is how to declare the size of a function.  For Solaris, we output
484    any .init or .fini entries here.  */
485 #undef ASM_DECLARE_FUNCTION_SIZE
486 #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)		\
487   do								\
488     {								\
489       if (!flag_inhibit_size_directive)				\
490 	ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME);			\
491       solaris_output_init_fini (FILE, DECL);			\
492     }								\
493   while (0)
494 
495 #ifndef USE_GAS
496 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
497 #define TARGET_ASM_ASSEMBLE_VISIBILITY solaris_assemble_visibility
498 
499 #define AS_NEEDS_DASH_FOR_PIPED_INPUT
500 
501 /* The Solaris assembler cannot grok .stabd directives.  */
502 #undef NO_DBX_BNSYM_ENSYM
503 #define NO_DBX_BNSYM_ENSYM 1
504 #endif
505 
506 /* Solaris has an implementation of __enable_execute_stack.  */
507 #define HAVE_ENABLE_EXECUTE_STACK
508 
509 /* Static stack checking is supported by means of probes.  */
510 #define STACK_CHECK_STATIC_BUILTIN 1
511 
512 #define TARGET_POSIX_IO
513 
514 /* Solaris 10 has the float and long double forms of math functions.
515    We redefine this hook so the version from elfos.h header won't be used.  */
516 #undef TARGET_LIBC_HAS_FUNCTION
517 #define TARGET_LIBC_HAS_FUNCTION default_libc_has_function
518 
519 extern GTY(()) tree solaris_pending_aligns;
520 extern GTY(()) tree solaris_pending_inits;
521 extern GTY(()) tree solaris_pending_finis;
522