1 /* Operating system specific defines to be used when targeting GCC for any 2 Solaris 2 system. 3 Copyright (C) 2002-2018 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 ("__EXTENSIONS__"); \ 117 } \ 118 TARGET_SUB_OS_CPP_BUILTINS(); \ 119 } while (0) 120 121 #define SUBTARGET_OVERRIDE_OPTIONS \ 122 do { \ 123 solaris_override_options (); \ 124 } while (0) 125 126 #if DEFAULT_ARCH32_P 127 #define MULTILIB_DEFAULTS { "m32" } 128 #else 129 #define MULTILIB_DEFAULTS { "m64" } 130 #endif 131 132 #if DEFAULT_ARCH32_P 133 #define DEF_ARCH32_SPEC(__str) "%{!m64:" __str "}" 134 #define DEF_ARCH64_SPEC(__str) "%{m64:" __str "}" 135 #else 136 #define DEF_ARCH32_SPEC(__str) "%{m32:" __str "}" 137 #define DEF_ARCH64_SPEC(__str) "%{!m32:" __str "}" 138 #endif 139 140 /* It's safe to pass -s always, even if -g is not used. Those options are 141 handled by both Sun as and GNU as. */ 142 #define ASM_SPEC_BASE \ 143 "%{v:-V} %{Qy:} %{!Qn:-Qy} %{Ym,*} -s %(asm_cpu)" 144 145 #define ASM_PIC_SPEC " %{" FPIE_OR_FPIC_SPEC ":-K PIC}" 146 147 #undef ASM_CPU_DEFAULT_SPEC 148 #define ASM_CPU_DEFAULT_SPEC \ 149 (DEFAULT_ARCH32_P ? "\ 150 %{m64:" ASM_CPU64_DEFAULT_SPEC "} \ 151 %{!m64:" ASM_CPU32_DEFAULT_SPEC "} \ 152 " : "\ 153 %{m32:" ASM_CPU32_DEFAULT_SPEC "} \ 154 %{!m32:" ASM_CPU64_DEFAULT_SPEC "} \ 155 ") 156 157 #undef LIB_SPEC 158 #define LIB_SPEC \ 159 "%{!symbolic:\ 160 %{pthreads|pthread:-lpthread} \ 161 %{p|pg:-ldl} -lc}" 162 163 #ifndef CROSS_DIRECTORY_STRUCTURE 164 #undef MD_EXEC_PREFIX 165 #define MD_EXEC_PREFIX "/usr/ccs/bin/" 166 #endif 167 168 /* Enable constructor priorities if the configured linker supports it. */ 169 #undef SUPPORTS_INIT_PRIORITY 170 #define SUPPORTS_INIT_PRIORITY HAVE_INITFINI_ARRAY_SUPPORT 171 172 /* Solaris libc and libm implement multiple behaviours for various 173 interfaces that have changed over the years in different versions of the 174 C standard. The behaviour is controlled by linking corresponding 175 values-*.o objects. Each of these objects contain alternate definitions 176 of one or more variables that the libraries use to select which 177 conflicting behaviour they should exhibit. There are two sets of these 178 objects, values-X*.o and values-xpg*.o. 179 180 The values-X[ac].o objects set the variable _lib_version. The Studio C 181 compilers use values-Xc.o with either -Xc or (since Studio 12.6) 182 -pedantic to select strictly conformant ISO C behaviour, otherwise 183 values-Xa.o. Since -pedantic is a diagnostic option only in GCC, we 184 need to specifiy the -std=c* options and -std=iso9899:199409. We 185 traditionally include -ansi, which affects C and C++, and also -std=c++* 186 for consistency. 187 188 The values-xpg[46].o objects define either or both __xpg[46] variables, 189 selecting XPG4 mode (__xpg4) and conforming C99/SUSv3 behavior (__xpg6). 190 191 Since GCC 5, gcc defaults to -std=gnu11 or higher, so we link 192 values-xpg6.o to get C99 semantics. Besides, most of the runtime 193 libraries always require C99 semantics. 194 195 Since only one instance of _lib_version and __xpg[46] takes effekt (the 196 first in ld.so.1's search path), we only link the values-*.o files into 197 executable programs. */ 198 #undef STARTFILE_ARCH_SPEC 199 #define STARTFILE_ARCH_SPEC \ 200 "%{!shared:%{!symbolic: \ 201 %{ansi|std=c*|std=iso9899\\:199409:values-Xc.o%s; :values-Xa.o%s} \ 202 %{std=c90|std=gnu90:values-xpg4.o%s; :values-xpg6.o%s}}}" 203 204 #if defined(HAVE_LD_PIE) && defined(HAVE_SOLARIS_CRTS) 205 #define STARTFILE_CRTBEGIN_SPEC "%{static:crtbegin.o%s; \ 206 shared|" PIE_SPEC ":crtbeginS.o%s; \ 207 :crtbegin.o%s}" 208 #else 209 #define STARTFILE_CRTBEGIN_SPEC "crtbegin.o%s" 210 #endif 211 212 #if ENABLE_VTABLE_VERIFY 213 #if SUPPORTS_INIT_PRIORITY 214 #define STARTFILE_VTV_SPEC \ 215 "%{fvtable-verify=none:%s; \ 216 fvtable-verify=preinit:vtv_start_preinit.o%s; \ 217 fvtable-verify=std:vtv_start.o%s}" 218 #define ENDFILE_VTV_SPEC \ 219 "%{fvtable-verify=none:%s; \ 220 fvtable-verify=preinit:vtv_end_preinit.o%s; \ 221 fvtable-verify=std:vtv_end.o%s}" 222 #else /* !SUPPORTS_INIT_PRIORITY */ 223 #define STARTFILE_VTV_SPEC \ 224 "%{fvtable-verify=*: \ 225 %e-fvtable-verify=%* is not supported in this configuration}" 226 #define ENDFILE_VTV_SPEC "" 227 #endif /* !SUPPORTS_INIT_PRIORITY */ 228 #else /* !ENABLE_VTABLE_VERIFY */ 229 #define STARTFILE_VTV_SPEC "" 230 #define ENDFILE_VTV_SPEC "" 231 #endif /* !ENABLE_VTABLE_VERIFY */ 232 233 /* We don't use the standard svr4 STARTFILE_SPEC because it's wrong for us. */ 234 #undef STARTFILE_SPEC 235 #ifdef HAVE_SOLARIS_CRTS 236 /* Since Solaris 11.4, the OS delivers crt1.o, crti.o, and crtn.o, with a hook 237 for compiler-dependent stuff like profile handling. */ 238 #define STARTFILE_SPEC "%{!shared:%{!symbolic: \ 239 crt1.o%s \ 240 %{p:%e-p is not supported; \ 241 pg:crtpg.o%s gmon.o%s; \ 242 :crtp.o%s}}} \ 243 crti.o%s %(startfile_arch) %(startfile_crtbegin) \ 244 %(startfile_vtv)" 245 #else 246 #define STARTFILE_SPEC "%{!shared:%{!symbolic: \ 247 %{p:mcrt1.o%s; \ 248 pg:gcrt1.o%s gmon.o%s; \ 249 :crt1.o%s}}} \ 250 crti.o%s %(startfile_arch) %(startfile_crtbegin) \ 251 %(startfile_vtv)" 252 #endif 253 254 #if defined(HAVE_LD_PIE) && defined(HAVE_SOLARIS_CRTS) 255 #define ENDFILE_CRTEND_SPEC "%{static:crtend.o%s; \ 256 shared|" PIE_SPEC ":crtendS.o%s; \ 257 :crtend.o%s}" 258 #else 259 #define ENDFILE_CRTEND_SPEC "crtend.o%s" 260 #endif 261 262 #undef ENDFILE_SPEC 263 #define ENDFILE_SPEC \ 264 "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \ 265 %(endfile_arch) %(endfile_vtv) %(endfile_crtend) crtn.o%s" 266 267 #undef LINK_ARCH32_SPEC_BASE 268 #define LINK_ARCH32_SPEC_BASE \ 269 "%{G:-G} \ 270 %{YP,*} \ 271 %{R*} \ 272 %{!YP,*:%{p|pg:-Y P,%R/usr/lib/libp%R/lib:%R/usr/lib} \ 273 %{!p:%{!pg:-Y P,%R/lib:%R/usr/lib}}}" 274 275 #undef LINK_ARCH32_SPEC 276 #define LINK_ARCH32_SPEC LINK_ARCH32_SPEC_BASE 277 278 /* This should be the same as LINK_ARCH32_SPEC_BASE, except with 279 ARCH64_SUBDIR appended to the paths. */ 280 #undef LINK_ARCH64_SPEC_BASE 281 #define LINK_ARCH64_SPEC_BASE \ 282 "%{G:-G} \ 283 %{YP,*} \ 284 %{R*} \ 285 %{!YP,*:%{p|pg:-Y P,%R/usr/lib/libp/" ARCH64_SUBDIR ":%R/lib/" ARCH64_SUBDIR ":%R/usr/lib/" ARCH64_SUBDIR "} \ 286 %{!p:%{!pg:-Y P,%R/lib/" ARCH64_SUBDIR ":%R/usr/lib/" ARCH64_SUBDIR "}}}" 287 288 #undef LINK_ARCH64_SPEC 289 #ifndef USE_GLD 290 /* FIXME: Used to be SPARC-only. Not SPARC-specfic but for the model name! */ 291 #define LINK_ARCH64_SPEC \ 292 "%{mcmodel=medlow:-M /usr/lib/ld/" ARCH64_SUBDIR "/map.below4G} " \ 293 LINK_ARCH64_SPEC_BASE 294 #else 295 #define LINK_ARCH64_SPEC LINK_ARCH64_SPEC_BASE 296 #endif 297 298 #ifdef USE_GLD 299 #if DEFAULT_ARCH32_P 300 #define ARCH_DEFAULT_EMULATION ARCH32_EMULATION 301 #else 302 #define ARCH_DEFAULT_EMULATION ARCH64_EMULATION 303 #endif 304 #define TARGET_LD_EMULATION "%{m32:-m " ARCH32_EMULATION "}" \ 305 "%{m64:-m " ARCH64_EMULATION "}" \ 306 "%{!m32:%{!m64:-m " ARCH_DEFAULT_EMULATION "}} " 307 #else 308 #define TARGET_LD_EMULATION "" 309 #endif 310 311 #undef LINK_ARCH_SPEC 312 #if DISABLE_MULTILIB 313 #if DEFAULT_ARCH32_P 314 #define LINK_ARCH_SPEC TARGET_LD_EMULATION " \ 315 %{m32:%(link_arch32)} \ 316 %{m64:%edoes not support multilib} \ 317 %{!m32:%{!m64:%(link_arch_default)}} \ 318 " 319 #else 320 #define LINK_ARCH_SPEC TARGET_LD_EMULATION " \ 321 %{m32:%edoes not support multilib} \ 322 %{m64:%(link_arch64)} \ 323 %{!m32:%{!m64:%(link_arch_default)}} \ 324 " 325 #endif 326 #else 327 #define LINK_ARCH_SPEC TARGET_LD_EMULATION " \ 328 %{m32:%(link_arch32)} \ 329 %{m64:%(link_arch64)} \ 330 %{!m32:%{!m64:%(link_arch_default)}}" 331 #endif 332 333 #define LINK_ARCH_DEFAULT_SPEC \ 334 (DEFAULT_ARCH32_P ? LINK_ARCH32_SPEC : LINK_ARCH64_SPEC) 335 336 #undef SUBTARGET_EXTRA_SPECS 337 #define SUBTARGET_EXTRA_SPECS \ 338 { "startfile_arch", STARTFILE_ARCH_SPEC }, \ 339 { "startfile_crtbegin", STARTFILE_CRTBEGIN_SPEC }, \ 340 { "startfile_vtv", STARTFILE_VTV_SPEC }, \ 341 { "link_arch32", LINK_ARCH32_SPEC }, \ 342 { "link_arch64", LINK_ARCH64_SPEC }, \ 343 { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ 344 { "link_arch", LINK_ARCH_SPEC }, \ 345 { "endfile_arch", ENDFILE_ARCH_SPEC }, \ 346 { "endfile_crtend", ENDFILE_CRTEND_SPEC }, \ 347 { "endfile_vtv", ENDFILE_VTV_SPEC }, \ 348 SUBTARGET_CPU_EXTRA_SPECS 349 350 /* C++11 programs need -lrt for nanosleep. */ 351 #define TIME_LIBRARY "rt" 352 353 #ifndef USE_GLD 354 /* With Sun ld, -rdynamic is a no-op. */ 355 #define RDYNAMIC_SPEC "" 356 #else 357 /* GNU ld needs --export-dynamic to implement -rdynamic. */ 358 #define RDYNAMIC_SPEC "--export-dynamic" 359 #endif 360 361 #ifndef USE_GLD 362 /* Prefer native form with Solaris ld. */ 363 #define SYSROOT_SPEC "-z sysroot=%R" 364 #endif 365 366 #ifndef USE_GLD 367 /* With Sun ld, use mapfile to enforce direct binding to libgcc_s unwinder. */ 368 #define LINK_LIBGCC_MAPFILE_SPEC \ 369 "%{shared|shared-libgcc:-M %slibgcc-unwind.map}" 370 #else 371 /* GNU ld doesn't support direct binding. */ 372 #define LINK_LIBGCC_MAPFILE_SPEC "" 373 #endif 374 375 /* Clear hardware capabilities, either explicitly or with OpenMP: 376 #pragma openmp declare simd creates clones for SSE2, AVX, and AVX2. */ 377 #ifdef HAVE_LD_CLEARCAP 378 #define LINK_CLEARCAP_SPEC " %{mclear-hwcap|fopenmp*:-M %sclearcap.map}" 379 #else 380 #define LINK_CLEARCAP_SPEC "" 381 #endif 382 383 #undef LINK_SPEC 384 #define LINK_SPEC \ 385 "%{h*} %{v:-V} \ 386 %{!shared:%{!static:%{rdynamic: " RDYNAMIC_SPEC "}}} \ 387 %{static:-dn -Bstatic} \ 388 %{shared:-G -dy %{!mimpure-text:-z text}} " \ 389 LINK_LIBGCC_MAPFILE_SPEC LINK_CLEARCAP_SPEC " \ 390 %{symbolic:-Bsymbolic -G -dy -z text} \ 391 %(link_arch) \ 392 %{Qy:} %{!Qn:-Qy}" 393 394 /* Use --as-needed/-z ignore -lgcc_s for eh support. */ 395 #ifdef HAVE_LD_AS_NEEDED 396 #define USE_LD_AS_NEEDED 1 397 #endif 398 399 #ifdef USE_GLD 400 /* Solaris 11 build 135+ implements dl_iterate_phdr. GNU ld needs 401 --eh-frame-hdr to create the required .eh_frame_hdr sections. */ 402 #if defined(HAVE_LD_EH_FRAME_HDR) && defined(TARGET_DL_ITERATE_PHDR) 403 #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " 404 #endif /* HAVE_LD_EH_FRAME && TARGET_DL_ITERATE_PHDR */ 405 #endif 406 407 #if defined(HAVE_LD_PIE) && defined(HAVE_SOLARIS_CRTS) 408 #ifdef USE_GLD 409 /* Assert -z text by default to match Solaris ld. */ 410 #define LD_PIE_SPEC "-pie %{!mimpure-text:-z text}" 411 #else 412 /* Solaris ld needs -z type=pie instead of -pie. */ 413 #define LD_PIE_SPEC "-z type=pie %{mimpure-text:-z textoff}" 414 #endif 415 #else 416 /* Error out if some part of PIE support is missing. */ 417 #define LINK_PIE_SPEC \ 418 "%{no-pie:} %{pie:%e-pie is not supported in this configuration} " 419 #endif 420 421 /* collect2.c can only parse GNU nm -n output. Solaris nm needs -png to 422 produce the same format. */ 423 #define NM_FLAGS "-png" 424 425 /* The system headers under Solaris 2 are C++-aware since 2.0. */ 426 #define NO_IMPLICIT_EXTERN_C 427 428 #define STDC_0_IN_SYSTEM_HEADERS 1 429 430 /* Support Solaris-specific format checking for cmn_err. */ 431 #define TARGET_N_FORMAT_TYPES 1 432 #define TARGET_FORMAT_TYPES solaris_format_types 433 434 /* #pragma init and #pragma fini are implemented on top of init and 435 fini attributes. */ 436 #define SOLARIS_ATTRIBUTE_TABLE \ 437 { "init", 0, 0, true, false, false, false, NULL, NULL }, \ 438 { "fini", 0, 0, true, false, false, false, NULL, NULL } 439 440 /* Solaris-specific #pragmas are implemented on top of attributes. Hook in 441 the bits from config/sol2.c. */ 442 #define SUBTARGET_INSERT_ATTRIBUTES solaris_insert_attributes 443 #define SUBTARGET_ATTRIBUTE_TABLE SOLARIS_ATTRIBUTE_TABLE 444 445 /* Allow macro expansion in #pragma pack. */ 446 #define HANDLE_PRAGMA_PACK_WITH_EXPANSION 447 448 #define TARGET_CXX_DECL_MANGLING_CONTEXT solaris_cxx_decl_mangling_context 449 450 /* Solaris/x86 as and gas support unquoted section names. */ 451 #ifndef SECTION_NAME_FORMAT 452 #define SECTION_NAME_FORMAT "%s" 453 #endif 454 455 /* This is how to declare the size of a function. For Solaris, we output 456 any .init or .fini entries here. */ 457 #undef ASM_DECLARE_FUNCTION_SIZE 458 #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ 459 do \ 460 { \ 461 if (!flag_inhibit_size_directive) \ 462 ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME); \ 463 solaris_output_init_fini (FILE, DECL); \ 464 } \ 465 while (0) 466 467 #ifndef USE_GAS 468 #undef TARGET_ASM_ASSEMBLE_VISIBILITY 469 #define TARGET_ASM_ASSEMBLE_VISIBILITY solaris_assemble_visibility 470 471 #define AS_NEEDS_DASH_FOR_PIPED_INPUT 472 473 /* The Solaris assembler cannot grok .stabd directives. */ 474 #undef NO_DBX_BNSYM_ENSYM 475 #define NO_DBX_BNSYM_ENSYM 1 476 #endif 477 478 /* Solaris has an implementation of __enable_execute_stack. */ 479 #define HAVE_ENABLE_EXECUTE_STACK 480 481 /* Static stack checking is supported by means of probes. */ 482 #define STACK_CHECK_STATIC_BUILTIN 1 483 484 #define TARGET_POSIX_IO 485 486 /* Solaris 10 has the float and long double forms of math functions. 487 We redefine this hook so the version from elfos.h header won't be used. */ 488 #undef TARGET_LIBC_HAS_FUNCTION 489 #define TARGET_LIBC_HAS_FUNCTION default_libc_has_function 490 491 extern GTY(()) tree solaris_pending_aligns; 492 extern GTY(()) tree solaris_pending_inits; 493 extern GTY(()) tree solaris_pending_finis; 494