sco5.h revision 117395
1/* Definitions for Intel 386 running SCO Unix System V 3.2 Version 5. 2 Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2002 3 Free Software Foundation, Inc. 4 Contributed by Kean Johnston (hug@netcom.com) 5 6This file is part of GNU CC. 7 8GNU CC is free software; you can redistribute it and/or modify 9it under the terms of the GNU General Public License as published by 10the Free Software Foundation; either version 2, or (at your option) 11any later version. 12 13GNU CC is distributed in the hope that it will be useful, 14but WITHOUT ANY WARRANTY; without even the implied warranty of 15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16GNU General Public License for more details. 17 18You should have received a copy of the GNU General Public License 19along with GNU CC; see the file COPYING. If not, write to 20the Free Software Foundation, 59 Temple Place - Suite 330, 21Boston, MA 02111-1307, USA. */ 22 23#define TARGET_VERSION fprintf (stderr, " (i386, SCO OpenServer 5 Syntax)"); 24 25#undef LPREFIX 26#define LPREFIX ".L" 27 28#undef ALIGN_ASM_OP 29#define ALIGN_ASM_OP "\t.align\t" 30 31#undef ASCII_DATA_ASM_OP 32#define ASCII_DATA_ASM_OP "\t.ascii\t" 33 34#undef IDENT_ASM_OP 35#define IDENT_ASM_OP "\t.ident\t" 36 37#undef COMMON_ASM_OP 38#define COMMON_ASM_OP "\t.comm\t" 39 40#undef SET_ASM_OP 41#define SET_ASM_OP "\t.set\t" 42 43#undef LOCAL_ASM_OP 44#define LOCAL_ASM_OP "\t.local\t" 45 46#undef ASM_SHORT 47#define ASM_SHORT "\t.value\t" 48 49#undef ASM_LONG 50#define ASM_LONG "\t.long\t" 51 52#undef ASM_QUAD 53 54#undef TYPE_ASM_OP 55#define TYPE_ASM_OP "\t.type\t" 56 57#undef SIZE_ASM_OP 58#define SIZE_ASM_OP "\t.size\t" 59 60#undef STRING_ASM_OP 61#define STRING_ASM_OP "\t.string\t" 62 63#undef SKIP_ASM_OP 64#define SKIP_ASM_OP "\t.zero\t" 65 66#undef GLOBAL_ASM_OP 67#define GLOBAL_ASM_OP "\t.globl\t" 68 69#undef EH_FRAME_SECTION_ASM_OP 70#define EH_FRAME_SECTION_NAME_COFF ".ehfram" 71#define EH_FRAME_SECTION_NAME_ELF ".eh_frame" 72#define EH_FRAME_SECTION_NAME \ 73 ((TARGET_ELF) ? EH_FRAME_SECTION_NAME_ELF : EH_FRAME_SECTION_NAME_COFF) 74 75/* Avoid problems (long sectino names, forward assembler refs) with DWARF 76 exception unwinding when we're generating COFF */ 77#define DWARF2_UNWIND_INFO \ 78 ((TARGET_ELF) ? 1 : 0 ) 79 80#undef READONLY_DATA_SECTION_ASM_OP 81#define READONLY_DATA_SECTION_ASM_OP_COFF "\t.section\t.rodata, \"x\"" 82#define READONLY_DATA_SECTION_ASM_OP_ELF "\t.section\t.rodata" 83#define READONLY_DATA_SECTION_ASM_OP \ 84 ((TARGET_ELF) \ 85 ? READONLY_DATA_SECTION_ASM_OP_ELF \ 86 : READONLY_DATA_SECTION_ASM_OP_COFF) 87 88#undef INIT_SECTION_ASM_OP 89#define INIT_SECTION_ASM_OP_ELF "\t.section\t.init" 90/* Rename these for COFF because crt1.o will try to run them. */ 91#define INIT_SECTION_ASM_OP_COFF "\t.section\t.ctor ,\"x\"" 92#define INIT_SECTION_ASM_OP \ 93 ((TARGET_ELF) ? INIT_SECTION_ASM_OP_ELF : INIT_SECTION_ASM_OP_COFF) 94 95#undef CTORS_SECTION_ASM_OP 96#define CTORS_SECTION_ASM_OP_ELF "\t.section\t.ctors,\"aw\"" 97#define CTORS_SECTION_ASM_OP_COFF INIT_SECTION_ASM_OP_COFF 98#define CTORS_SECTION_ASM_OP \ 99 ((TARGET_ELF) ? CTORS_SECTION_ASM_OP_ELF : CTORS_SECTION_ASM_OP_COFF) 100 101#undef DTORS_SECTION_ASM_OP 102#define DTORS_SECTION_ASM_OP_ELF "\t.section\t.dtors, \"aw\"" 103#define DTORS_SECTION_ASM_OP_COFF FINI_SECTION_ASM_OP_COFF 104#define DTORS_SECTION_ASM_OP \ 105 ((TARGET_ELF) ? DTORS_SECTION_ASM_OP_ELF : DTORS_SECTION_ASM_OP_COFF) 106 107#undef FINI_SECTION_ASM_OP 108#define FINI_SECTION_ASM_OP_ELF "\t.section\t.fini" 109#define FINI_SECTION_ASM_OP_COFF "\t.section\t.dtor, \"x\"" 110#define FINI_SECTION_ASM_OP \ 111 ((TARGET_ELF) ? FINI_SECTION_ASM_OP_ELF : FINI_SECTION_ASM_OP_COFF) 112 113#undef BSS_SECTION_ASM_OP 114#define BSS_SECTION_ASM_OP "\t.data" 115 116#undef TEXT_SECTION_ASM_OP 117#define TEXT_SECTION_ASM_OP "\t.text" 118 119#undef DATA_SECTION_ASM_OP 120#define DATA_SECTION_ASM_OP "\t.data" 121 122#undef TYPE_OPERAND_FMT 123#define TYPE_OPERAND_FMT "@%s" 124 125#undef APPLY_RESULT_SIZE 126#define APPLY_RESULT_SIZE \ 127(TARGET_ELF) ? size : 116 128 129#ifndef ASM_DECLARE_RESULT 130#define ASM_DECLARE_RESULT(FILE, RESULT) 131#endif 132 133#define SCO_DEFAULT_ASM_COFF(FILE,NAME) \ 134do { \ 135 ASM_OUTPUT_LABEL (FILE, NAME); \ 136 } while (0) 137 138#undef ASM_DECLARE_FUNCTION_NAME 139#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ 140 do { \ 141 if (TARGET_ELF) { \ 142 ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \ 143 ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \ 144 ASM_OUTPUT_LABEL (FILE, NAME); \ 145 } else \ 146 SCO_DEFAULT_ASM_COFF(FILE, NAME); \ 147} while (0) 148 149#undef ASM_DECLARE_FUNCTION_SIZE 150#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ 151 do { \ 152 if (TARGET_ELF && !flag_inhibit_size_directive) \ 153 ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME); \ 154 } while (0) 155 156#undef ASM_DECLARE_OBJECT_NAME 157#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ 158 do { \ 159 if (TARGET_ELF) { \ 160 HOST_WIDE_INT size; \ 161 \ 162 ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ 163 \ 164 size_directive_output = 0; \ 165 if (!flag_inhibit_size_directive \ 166 && (DECL) && DECL_SIZE (DECL)) \ 167 { \ 168 size_directive_output = 1; \ 169 size = int_size_in_bytes (TREE_TYPE (DECL)); \ 170 ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size); \ 171 } \ 172 \ 173 ASM_OUTPUT_LABEL (FILE, NAME); \ 174 } else \ 175 SCO_DEFAULT_ASM_COFF(FILE, NAME); \ 176 } while (0) 177 178#undef ASM_FILE_START_1 179#define ASM_FILE_START_1(FILE) 180 181#undef ASM_FILE_START 182#define ASM_FILE_START(FILE) \ 183do { \ 184 output_file_directive((FILE),main_input_filename); \ 185 fprintf ((FILE), "\t.version\t\"01.01\"\n"); \ 186} while (0) 187 188#undef ASM_FINISH_DECLARE_OBJECT 189#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \ 190do { \ 191 if (TARGET_ELF) { \ 192 const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \ 193 HOST_WIDE_INT size; \ 194 if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \ 195 && ! AT_END && TOP_LEVEL \ 196 && DECL_INITIAL (DECL) == error_mark_node \ 197 && !size_directive_output) \ 198 { \ 199 size_directive_output = 1; \ 200 size = int_size_in_bytes (TREE_TYPE (DECL)); \ 201 ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size); \ 202 } \ 203 } \ 204} while (0) 205 206#undef ASM_GENERATE_INTERNAL_LABEL 207#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \ 208do { \ 209 if (TARGET_ELF) \ 210 sprintf (LABEL, "*.%s%ld", (PREFIX), (long)(NUM)); \ 211 else \ 212 sprintf (LABEL, ".%s%ld", (PREFIX), (long)(NUM)); \ 213} while (0) 214 215#undef ASM_OUTPUT_ALIGNED_COMMON 216#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ 217do { \ 218 fprintf ((FILE), "%s", COMMON_ASM_OP); \ 219 assemble_name ((FILE), (NAME)); \ 220 if (TARGET_ELF) \ 221 fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ 222 else \ 223 fprintf ((FILE), ",%u\n", (SIZE)); \ 224} while (0) 225 226#undef ASM_OUTPUT_ALIGNED_LOCAL 227#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 228do { \ 229 if (TARGET_ELF) { \ 230 fprintf ((FILE), "%s", LOCAL_ASM_OP); \ 231 assemble_name ((FILE), (NAME)); \ 232 fprintf ((FILE), "\n"); \ 233 ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ 234 } else { \ 235 int align = exact_log2 (ALIGN); \ 236 if (align > 2) align = 2; \ 237 if (TARGET_SVR3_SHLIB) \ 238 data_section (); \ 239 else \ 240 bss_section (); \ 241 ASM_OUTPUT_ALIGN ((FILE), align == -1 ? 2 : align); \ 242 fprintf ((FILE), "%s\t", "\t.lcomm"); \ 243 assemble_name ((FILE), (NAME)); \ 244 fprintf ((FILE), ",%u\n", (SIZE)); \ 245 } \ 246} while (0) 247 248/* A C statement (sans semicolon) to output to the stdio stream 249 FILE the assembler definition of uninitialized global DECL named 250 NAME whose size is SIZE bytes and alignment is ALIGN bytes. 251 Try to use asm_output_aligned_bss to implement this macro. */ 252 253#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ 254asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) 255 256#undef ESCAPES 257#define ESCAPES \ 258"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ 259\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ 260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\ 261\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\ 262\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ 263\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ 264\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ 265\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1" 266 267#undef STRING_LIMIT 268#define STRING_LIMIT ((unsigned) 256) 269 270#undef ASM_OUTPUT_LIMITED_STRING 271#define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \ 272 do \ 273 { \ 274 register const unsigned char *_limited_str = \ 275 (const unsigned char *) (STR); \ 276 register unsigned ch; \ 277 fprintf ((FILE), "%s\"", STRING_ASM_OP); \ 278 for (; (ch = *_limited_str); _limited_str++) \ 279 { \ 280 register int escape; \ 281 switch (escape = ESCAPES[ch]) \ 282 { \ 283 case 0: \ 284 putc (ch, (FILE)); \ 285 break; \ 286 case 1: \ 287 fprintf ((FILE), "\\%03o", ch); \ 288 break; \ 289 default: \ 290 putc ('\\', (FILE)); \ 291 putc (escape, (FILE)); \ 292 break; \ 293 } \ 294 } \ 295 fprintf ((FILE), "\"\n"); \ 296 } \ 297 while (0) 298 299 300#undef ASM_OUTPUT_ASCII 301#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \ 302do { \ 303 register const unsigned char *_ascii_bytes = \ 304 (const unsigned char *) (STR); \ 305 register const unsigned char *limit = _ascii_bytes + (LENGTH); \ 306 register unsigned bytes_in_chunk = 0; \ 307 for (; _ascii_bytes < limit; _ascii_bytes++) \ 308 { \ 309 register unsigned const char *p; \ 310 if (bytes_in_chunk >= 64) \ 311 { \ 312 fputc ('\n', (FILE)); \ 313 bytes_in_chunk = 0; \ 314 } \ 315 for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \ 316 continue; \ 317 if (p < limit && (p - _ascii_bytes) <= (long) STRING_LIMIT) \ 318 { \ 319 if (bytes_in_chunk > 0) \ 320 { \ 321 fputc ('\n', (FILE)); \ 322 bytes_in_chunk = 0; \ 323 } \ 324 ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \ 325 _ascii_bytes = p; \ 326 } \ 327 else \ 328 { \ 329 if (bytes_in_chunk == 0) \ 330 fputs ("\t.byte\t", (FILE)); \ 331 else \ 332 fputc (',', (FILE)); \ 333 fprintf ((FILE), "0x%02x", *_ascii_bytes); \ 334 bytes_in_chunk += 5; \ 335 } \ 336 } \ 337 if (bytes_in_chunk > 0) \ 338 fprintf ((FILE), "\n"); \ 339} while (0) 340 341#undef ASM_OUTPUT_CASE_LABEL 342#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \ 343do { \ 344 if (TARGET_ELF) \ 345 ASM_OUTPUT_ALIGN ((FILE), 2); \ 346 ASM_OUTPUT_INTERNAL_LABEL((FILE),(PREFIX),(NUM)); \ 347} while (0) 348 349#undef ASM_OUTPUT_IDENT 350#define ASM_OUTPUT_IDENT(FILE, NAME) \ 351 fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME); 352 353#undef ASM_OUTPUT_EXTERNAL_LIBCALL 354#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ 355 if (TARGET_ELF) (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0)) 356 357#undef ASM_OUTPUT_INTERNAL_LABEL 358#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ 359 fprintf (FILE, ".%s%d:\n", PREFIX, NUM) 360 361/* The prefix to add to user-visible assembler symbols. */ 362 363#undef USER_LABEL_PREFIX 364#define USER_LABEL_PREFIX "" 365 366/* 367 * We rename 'gcc_except_table' to the shorter name in preparation 368 * for the day when we're ready to do DWARF2 eh unwinding under COFF. 369 */ 370/* #define EXCEPTION_SECTION() named_section (NULL, ".gccexc", 1) */ 371 372/* Switch into a generic section. */ 373#define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section 374 375#undef ASM_OUTPUT_SKIP 376#define ASM_OUTPUT_SKIP(FILE,SIZE) \ 377do { \ 378 if (TARGET_ELF) \ 379 fprintf (FILE, "%s%u\n", SKIP_ASM_OP, (SIZE)); \ 380 else \ 381 fprintf ((FILE), "%s.,.+%u\n", SET_ASM_OP, (SIZE)); \ 382} while (0) 383 384 385#undef CTOR_LIST_BEGIN 386#define CTOR_LIST_BEGIN \ 387do { \ 388 asm (CTORS_SECTION_ASM_OP); \ 389 if (TARGET_ELF) \ 390 STATIC func_ptr __CTOR_LIST__[1] = { (func_ptr) (-1) }; \ 391 else \ 392 asm ("pushl $0"); \ 393} while (0) 394 395#undef CTOR_LIST_END 396#define CTOR_LIST_END \ 397do { \ 398 if (TARGET_ELF) { \ 399 asm (CTORS_SECTION_ASM_OP); \ 400 STATIC func_ptr __CTOR_LIST__[1] = { (func_ptr) (0) }; \ 401 } else { \ 402 CTOR_LIST_BEGIN; \ 403 } \ 404} while (0) 405 406#undef DBX_BLOCKS_FUNCTION_RELATIVE 407#define DBX_BLOCKS_FUNCTION_RELATIVE 1 408 409#undef DBX_FUNCTION_FIRST 410#define DBX_FUNCTION_FIRST 1 411 412#undef DBX_REGISTER_NUMBER 413#define DBX_REGISTER_NUMBER(n) \ 414 ((TARGET_ELF) ? svr4_dbx_register_map[n] : dbx_register_map[n]) 415 416#define DWARF2_DEBUGGING_INFO 1 417#define DWARF_DEBUGGING_INFO 1 418#define SDB_DEBUGGING_INFO 1 419#define DBX_DEBUGGING_INFO 1 420 421#undef PREFERRED_DEBUGGING_TYPE 422#define PREFERRED_DEBUGGING_TYPE \ 423 ((TARGET_ELF) ? DWARF2_DEBUG: SDB_DEBUG) 424 425#undef EXTRA_SECTIONS 426#define EXTRA_SECTIONS in_init, in_fini 427 428#undef EXTRA_SECTION_FUNCTIONS 429#define EXTRA_SECTION_FUNCTIONS \ 430 INIT_SECTION_FUNCTION \ 431 FINI_SECTION_FUNCTION 432 433#undef FINI_SECTION_FUNCTION 434#define FINI_SECTION_FUNCTION \ 435void \ 436fini_section () \ 437{ \ 438 if ((!TARGET_ELF) && in_section != in_fini) \ 439 { \ 440 fprintf (asm_out_file, "%s\n", FINI_SECTION_ASM_OP); \ 441 in_section = in_fini; \ 442 } \ 443} 444 445#undef INIT_SECTION_FUNCTION 446#define INIT_SECTION_FUNCTION \ 447void \ 448init_section () \ 449{ \ 450 if ((!TARGET_ELF) && in_section != in_init) \ 451 { \ 452 fprintf (asm_out_file, "%s\n", INIT_SECTION_ASM_OP); \ 453 in_section = in_init; \ 454 } \ 455} 456 457#undef SUBTARGET_FRAME_POINTER_REQUIRED 458#define SUBTARGET_FRAME_POINTER_REQUIRED \ 459 ((TARGET_ELF) ? 0 : \ 460 (current_function_calls_setjmp || current_function_calls_longjmp)) 461 462#undef LOCAL_LABEL_PREFIX 463#define LOCAL_LABEL_PREFIX \ 464 ((TARGET_ELF) ? "" : ".") 465 466#undef MD_EXEC_PREFIX 467#undef MD_STARTFILE_PREFIX 468#define MD_EXEC_PREFIX "/usr/ccs/bin/" 469#define MD_STARTFILE_PREFIX "/usr/ccs/lib/" 470 471#undef NON_SAVING_SETJMP 472#define NON_SAVING_SETJMP \ 473 ((TARGET_ELF) ? 0 : \ 474 (current_function_calls_setjmp && current_function_calls_longjmp)) 475 476#undef NO_IMPLICIT_EXTERN_C 477#define NO_IMPLICIT_EXTERN_C 1 478 479/* JKJ FIXME - examine the ramifications of RETURN_IN_MEMORY and 480 RETURN_POPS_ARGS */ 481 482#undef RETURN_POPS_ARGS 483#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \ 484 ((TARGET_ELF) ? \ 485 (ix86_return_pops_args (FUNDECL, FUNTYPE, SIZE)) : \ 486 (((FUNDECL) && (TREE_CODE (FUNDECL) == IDENTIFIER_NODE)) ? 0 \ 487 : (TARGET_RTD \ 488 && (TYPE_ARG_TYPES (FUNTYPE) == 0 \ 489 || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \ 490 == void_type_node))) ? (SIZE) \ 491 : 0)) 492 493/* ??? Ignore coff. */ 494#undef TARGET_ASM_SELECT_SECTION 495#define TARGET_ASM_SELECT_SECTION default_elf_select_section 496 497#undef SWITCH_TAKES_ARG 498#define SWITCH_TAKES_ARG(CHAR) \ 499 (DEFAULT_SWITCH_TAKES_ARG(CHAR) \ 500 || (CHAR) == 'h' \ 501 || (CHAR) == 'R' \ 502 || (CHAR) == 'Y' \ 503 || (CHAR) == 'z') 504 505#undef WORD_SWITCH_TAKES_ARG 506#define WORD_SWITCH_TAKES_ARG(STR) \ 507 (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ 508 && strcmp (STR, "Tdata") && strcmp (STR, "Ttext") \ 509 && strcmp (STR, "Tbss")) 510 511#undef TARGET_SUBTARGET_DEFAULT 512#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS) 513 514#define HANDLE_SYSV_PRAGMA 1 515 516/* Though OpenServer supports .weak in COFF, we don't use it. 517 * G++ will frequently emit a symol as .weak and then (in the same .s 518 * file) declare it global. The COFF assembler finds this unamusing. 519 */ 520#define SUPPORTS_WEAK (TARGET_ELF) 521#define ASM_WEAKEN_LABEL(FILE,NAME) \ 522 do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \ 523 fputc ('\n', FILE); } while (0) 524 525/* 526 * Define sizes and types 527 */ 528#undef SIZE_TYPE 529#undef PTRDIFF_TYPE 530#undef WCHAR_TYPE 531#undef WCHAR_TYPE_SIZE 532#undef LONG_DOUBLE_TYPE_SIZE 533#define LONG_DOUBLE_TYPE_SIZE 96 534#define SIZE_TYPE "unsigned int" 535#define PTRDIFF_TYPE "int" 536#define WCHAR_TYPE "long int" 537#define WCHAR_TYPE_SIZE BITS_PER_WORD 538 539/* 540 * New for multilib support. Set the default switches for multilib, 541 * which is -melf. 542 */ 543#define MULTILIB_DEFAULTS { "melf" } 544 545 546/* Please note that these specs may look messy but they are required in 547 order to emulate the SCO Development system as closely as possible. 548 With SCO Open Server 5.0, you now get the linker and assembler free, 549 so that is what these specs are targeted for. These utilities are 550 very argument sensitive: a space in the wrong place breaks everything. 551 So RMS, please forgive this mess. It works. 552 553 Parameters which can be passed to gcc, and their SCO equivalents: 554 GCC Parameter SCO Equivalent 555 -ansi -a ansi 556 -posix -a posix 557 -Xpg4 -a xpg4 558 -Xpg4plus -a xpg4plus 559 -Xods30 -a ods30 560 561 As with SCO, the default is XPG4 plus mode. SCO also allows you to 562 specify a C dialect with -Xt, -Xa, -Xc, -Xk and -Xm. These are passed 563 on to the assembler and linker in the same way that the SCO compiler 564 does. 565 566 SCO also allows you to compile, link and generate either ELF or COFF 567 binaries. With gcc, unlike the SCO compiler, the default is ELF. 568 Specify -mcoff to gcc to produce COFF binaries. -fpic will get the 569 assembler and linker to produce PIC code. 570*/ 571 572/* Set up assembler flags for PIC and ELF compilations */ 573#undef ASM_SPEC 574 575#if USE_GAS 576 /* Leave ASM_SPEC undefined so we pick up the master copy from gcc.c 577 * Undef MD_EXEC_PREFIX because we don't know where GAS is, but it's not 578 * likely in /usr/ccs/bin/ 579 */ 580#undef MD_EXEC_PREFIX 581#else 582 583#define ASM_SPEC \ 584 "-b %{!mcoff:elf}%{mcoff:coff \ 585 %{static:%e-static not valid with -mcoff} \ 586 %{shared:%e-shared not valid with -mcoff} \ 587 %{symbolic:%e-symbolic not valid with -mcoff}} \ 588 %{Ym,*} %{Yd,*} %{Wa,*:%*} \ 589 %{!mcoff:-E%{Xa:a}%{!Xa:%{Xc:c}%{!Xc:%{Xk:k}%{!Xk:%{Xt:t}%{!Xt:a}}}},%{ansi:ansi}%{!ansi:%{posix:posix}%{!posix:%{Xpg4:xpg4}%{!Xpg4:%{Xpg4plus:XPG4PLUS}%{!Xpg4plus:%{Xods30:ods30}%{!Xods30:XPG4PLUS}}}}},ELF %{Qn:} %{!Qy:-Qn}}" 590#endif 591 592/* Use crt1.o as a startup file and crtn.o as a closing file. */ 593 594#undef STARTFILE_SPEC 595#define STARTFILE_SPEC \ 596 "%{shared: %{!mcoff: crti.o%s}} \ 597 %{!shared:\ 598 %{!symbolic: \ 599 %{pg:gcrt.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}}} \ 600 %{ansi:values-Xc.o%s} \ 601 %{!ansi: \ 602 %{Xa:values-Xa.o%s} \ 603 %{!Xa:%{Xc:values-Xc.o%s} \ 604 %{!Xc:%{Xk:values-Xk.o%s} \ 605 %{!Xk:%{Xt:values-Xt.o%s} \ 606 %{!Xt:values-Xa.o%s}}}}} \ 607 %{mcoff:crtbeginS.o%s} %{!mcoff:crtbegin.o%s}" 608 609#undef ENDFILE_SPEC 610#define ENDFILE_SPEC \ 611 "%{!mcoff:crtend.o%s} \ 612 %{mcoff:crtendS.o%s} \ 613 %{pg:gcrtn.o%s}%{!pg:crtn.o%s}" 614 615#define TARGET_OS_CPP_BUILTINS() \ 616 do \ 617 { \ 618 builtin_define ("__unix"); \ 619 builtin_define ("_SCO_DS"); \ 620 builtin_define ("_M_I386"); \ 621 builtin_define ("_M_XENIX"); \ 622 builtin_define ("_M_UNIX"); \ 623 builtin_assert ("system=svr3"); \ 624 if (flag_iso) \ 625 cpp_define (pfile, "_STRICT_ANSI"); \ 626 if (flag_pic) \ 627 { \ 628 builtin_define ("__PIC__"); \ 629 builtin_define ("__pic__"); \ 630 } \ 631 } \ 632 while (0) 633 634#undef CPP_SPEC 635#define CPP_SPEC "\ 636 %{fpic:%{mcoff:%e-fpic is not valid with -mcoff}} \ 637 %{fPIC:%{mcoff:%e-fPIC is not valid with -mcoff}} \ 638 %{!Xods30:-D_STRICT_NAMES} \ 639 %{!ansi:%{!posix:%{!Xods30:-D_SCO_XPG_VERS=4}}} \ 640 %{ansi:-isystem include/ansi%s -isystem /usr/include/ansi} \ 641 %{!ansi: \ 642 %{posix:-isystem include/posix%s -isystem /usr/include/posix \ 643 -D_POSIX_C_SOURCE=2 -D_POSIX_SOURCE=1} \ 644 %{!posix:%{Xpg4:-isystem include/xpg4%s -isystem /usr/include/xpg4 \ 645 -D_XOPEN_SOURCE=1} \ 646 %{!Xpg4:-D_M_I86 -D_M_I86SM -D_M_INTERNAT -D_M_SDATA -D_M_STEXT \ 647 -D_M_BITFIELDS -D_M_SYS5 -D_M_SYSV -D_M_SYSIII \ 648 -D_M_WORDSWAP -Dunix -DM_I386 -DM_UNIX -DM_XENIX \ 649 %{Xods30:-isystem include/ods_30_compat%s \ 650 -isystem /usr/include/ods_30_compat \ 651 -D_SCO_ODS_30 -DM_I86 -DM_I86SM -DM_SDATA -DM_STEXT \ 652 -DM_BITFIELDS -DM_SYS5 -DM_SYSV -DM_INTERNAT -DM_SYSIII \ 653 -DM_WORDSWAP}}}} \ 654 %{scointl:-DM_INTERNAT -D_M_INTERNAT} \ 655 %{!mcoff:-D_SCO_ELF} \ 656 %{mcoff:-D_M_COFF -D_SCO_COFF} \ 657 %{Xa:-D_SCO_C_DIALECT=1} \ 658 %{!Xa:%{Xc:-D_SCO_C_DIALECT=3} \ 659 %{!Xc:%{Xk:-D_SCO_C_DIALECT=4} \ 660 %{!Xk:%{Xt:-D_SCO_C_DIALECT=2} \ 661 %{!Xt:-D_SCO_C_DIALECT=1}}}}" 662 663#undef LINK_SPEC 664#define LINK_SPEC \ 665 "-b %{!mcoff:elf}%{mcoff:coff \ 666 %{static:%e-static not valid with -mcoff} \ 667 %{shared:%e-shared not valid with -mcoff} \ 668 %{symbolic:%e-symbolic not valid with -mcoff} \ 669 %{fpic:%e-fpic not valid with -mcoff} \ 670 %{fPIC:%e-fPIC not valid with -mcoff}} \ 671 -R%{Xa:a}%{!Xa:%{Xc:c}%{!Xc:%{Xk:k}%{!Xk:%{Xt:t}%{!Xt:a}}}},%{ansi:ansi}%{!ansi:%{posix:posix}%{!posix:%{Xpg4:xpg4}%{!Xpg4:%{Xpg4plus:XPG4PLUS}%{!Xpg4plus:%{Xods30:ods30}%{!Xods30:XPG4PLUS}}}}},%{mcoff:COFF}%{!mcoff:ELF} \ 672 %{Wl,*%*} %{YP,*} %{YL,*} %{YU,*} \ 673 %{!YP,*:%{p:-YP,/usr/ccs/libp:/lib/libp:/usr/lib/libp:/usr/ccs/lib:/lib:/usr/lib} \ 674 %{!p:-YP,/usr/ccs/lib:/lib:/usr/lib}} \ 675 %{h*} %{static:-dn -Bstatic} %{shared:-G -dy %{!z*:-z text}} \ 676 %{symbolic:-Bsymbolic -G -dy %{!z*:-z text}} %{z*} %{R*} %{Y*} \ 677 %{G:-G} %{!mcoff:%{Qn:} %{!Qy:-Qn}}" 678 679/* The SCO COFF linker gets confused on the difference between "-ofoo" 680 and "-o foo". So we just always force a single space. */ 681 682#define SWITCHES_NEED_SPACES "o" 683 684/* Library spec. If we are not building a shared library, provide the 685 standard libraries, as per the SCO compiler. */ 686 687#undef LIB_SPEC 688#define LIB_SPEC \ 689 "%{shared:pic/libgcc.a%s}%{!shared:%{!symbolic:-lcrypt -lgen -lc}}" 690 691#undef LIBGCC_SPEC 692#define LIBGCC_SPEC \ 693 "%{!shared:-lgcc}" 694 695#define MASK_COFF 010000000000 /* Mask for elf generation */ 696#define TARGET_ELF (1) /* (!(target_flags & MASK_COFF)) */ 697 698#undef SUBTARGET_SWITCHES 699#define SUBTARGET_SWITCHES \ 700 { "elf", -MASK_COFF, N_("Generate ELF output") }, 701 702#define NO_DOLLAR_IN_LABEL 703 704/* Implicit library calls should use memcpy, not bcopy, etc. They are 705 faster on OpenServer libraries. */ 706 707#define TARGET_MEM_FUNCTIONS 708 709/* Biggest alignment supported by the object file format of this 710 machine. Use this macro to limit the alignment which can be 711 specified using the `__attribute__ ((aligned (N)))' construct. If 712 not defined, the default value is `BIGGEST_ALIGNMENT'. */ 713 714#define MAX_OFILE_ALIGNMENT (32768*8) 715 716/* Define the `__builtin_va_list' type for the ABI. On OpenServer, this 717 type is `char *'. */ 718#undef BUILD_VA_LIST_TYPE 719#define BUILD_VA_LIST_TYPE(VALIST) \ 720 (VALIST) = build_pointer_type (char_type_node) 721 722 723/* 724Here comes some major hackery to get the crt stuff to compile properly. 725Since we can (and do) compile for both COFF and ELF environments, we 726set things up accordingly, based on the pre-processor defines for ELF 727and COFF. This is insane, but then I guess having one compiler with a 728single back-end supporting two vastly different file format types is 729a little insane too. But it is not impossible and we get a useful 730compiler at the end of the day. Onward we go ... 731*/ 732 733#if defined(CRT_BEGIN) || defined(CRT_END) || defined(IN_LIBGCC2) 734# undef OBJECT_FORMAT_ELF 735# undef INIT_SECTION_ASM_OP 736# undef FINI_SECTION_ASM_OP 737# undef CTORS_SECTION_ASM_OP 738# undef DTORS_SECTION_ASM_OP 739# undef EH_FRAME_SECTION_NAME 740# undef CTOR_LIST_BEGIN 741# undef CTOR_LIST_END 742# undef DO_GLOBAL_CTORS_BODY 743 744# if defined (_SCO_ELF) 745# define OBJECT_FORMAT_ELF 746# define INIT_SECTION_ASM_OP INIT_SECTION_ASM_OP_ELF 747# define FINI_SECTION_ASM_OP FINI_SECTION_ASM_OP_ELF 748# define DTORS_SECTION_ASM_OP DTORS_SECTION_ASM_OP_ELF 749# define CTORS_SECTION_ASM_OP CTORS_SECTION_ASM_OP_ELF 750# define EH_FRAME_SECTION_NAME EH_FRAME_SECTION_NAME_ELF 751# else /* ! _SCO_ELF */ 752# define INIT_SECTION_ASM_OP INIT_SECTION_ASM_OP_COFF 753# define FINI_SECTION_ASM_OP FINI_SECTION_ASM_OP_COFF 754# define DTORS_SECTION_ASM_OP DTORS_SECTION_ASM_OP_COFF 755# define CTORS_SECTION_ASM_OP CTORS_SECTION_ASM_OP_COFF 756# define EH_FRAME_SECTION_NAME EH_FRAME_SECTION_NAME_COFF 757# define CTOR_LIST_BEGIN asm (INIT_SECTION_ASM_OP); asm ("pushl $0") 758# define CTOR_LIST_END CTOR_LIST_BEGIN 759# define DO_GLOBAL_CTORS_BODY \ 760do { \ 761 func_ptr *p, *beg = alloca(0); \ 762 for (p = beg; *p;) \ 763 (*p++) (); \ 764} while (0) 765# endif /* ! _SCO_ELF */ 766#endif /* CRT_BEGIN !! CRT_END */ 767 768/* Handle special EH pointer encodings. Absolute, pc-relative, and 769 indirect are handled automatically. */ 770#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \ 771 do { \ 772 if ((SIZE) == 4 && ((ENCODING) & 0x70) == DW_EH_PE_datarel) \ 773 { \ 774 fputs (ASM_LONG, FILE); \ 775 assemble_name (FILE, XSTR (ADDR, 0)); \ 776 fputs (((ENCODING) & DW_EH_PE_indirect ? "@GOT" : "@GOTOFF"), FILE); \ 777 goto DONE; \ 778 } \ 779 } while (0) 780 781/* Used by crtstuff.c to initialize the base of data-relative relocations. 782 These are GOT relative on x86, so return the pic register. */ 783#ifdef __PIC__ 784#define CRT_GET_RFIB_DATA(BASE) \ 785 { \ 786 register void *ebx_ __asm__("ebx"); \ 787 BASE = ebx_; \ 788 } 789#else 790#define CRT_GET_RFIB_DATA(BASE) \ 791 __asm__ ("call\t.LPR%=\n" \ 792 ".LPR%=:\n\t" \ 793 "popl\t%0\n\t" \ 794 /* Due to a GAS bug, this cannot use EAX. That encodes \ 795 smaller than the traditional EBX, which results in the \ 796 offset being off by one. */ \ 797 "addl\t$_GLOBAL_OFFSET_TABLE_+[.-.LPR%=],%0" \ 798 : "=d"(BASE)) 799#endif 800 801/* Select a format to encode pointers in exception handling data. CODE 802 is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is 803 true if the symbol may be affected by dynamic relocations. */ 804#undef ASM_PREFERRED_EH_DATA_FORMAT 805#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \ 806 (flag_pic ? (GLOBAL ? DW_EH_PE_indirect : 0) | DW_EH_PE_datarel \ 807 : DW_EH_PE_absptr) 808