sysv4.h revision 90075
118334Speter/* Target definitions for GNU compiler for Intel 80386 running System V.4 290075Sobrien Copyright (C) 1991, 2001 Free Software Foundation, Inc. 318334Speter 418334Speter Written by Ron Guilmette (rfg@netcom.com). 518334Speter 618334SpeterThis file is part of GNU CC. 718334Speter 818334SpeterGNU CC is free software; you can redistribute it and/or modify 918334Speterit under the terms of the GNU General Public License as published by 1018334Speterthe Free Software Foundation; either version 2, or (at your option) 1118334Speterany later version. 1218334Speter 1318334SpeterGNU CC is distributed in the hope that it will be useful, 1418334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of 1518334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1618334SpeterGNU General Public License for more details. 1718334Speter 1818334SpeterYou should have received a copy of the GNU General Public License 1918334Speteralong with GNU CC; see the file COPYING. If not, write to 2018334Speterthe Free Software Foundation, 59 Temple Place - Suite 330, 2118334SpeterBoston, MA 02111-1307, USA. */ 2218334Speter 2318334Speter 2418334Speter#undef TARGET_VERSION 2518334Speter#define TARGET_VERSION fprintf (stderr, " (i386 System V Release 4)"); 2618334Speter 2718334Speter/* The svr4 ABI for the i386 says that records and unions are returned 2818334Speter in memory. */ 2918334Speter 3018334Speter#undef RETURN_IN_MEMORY 3118334Speter#define RETURN_IN_MEMORY(TYPE) \ 3290075Sobrien (TYPE_MODE (TYPE) == BLKmode \ 3390075Sobrien || (VECTOR_MODE_P (TYPE_MODE (TYPE)) && int_size_in_bytes (TYPE) == 8)) 3418334Speter 3518334Speter/* Define which macros to predefine. __svr4__ is our extension. */ 3618334Speter/* This used to define X86, but james@bigtex.cactus.org says that 3718334Speter is supposed to be defined optionally by user programs--not by default. */ 3818334Speter#define CPP_PREDEFINES \ 3990075Sobrien "-Dunix -D__svr4__ -Asystem=unix -Asystem=svr4" 4018334Speter 4118334Speter/* Output at beginning of assembler file. */ 4218334Speter/* The .file command should always begin the output. */ 4318334Speter 4418334Speter#undef ASM_FILE_START 4518334Speter#define ASM_FILE_START(FILE) \ 4618334Speter do { \ 4718334Speter output_file_directive (FILE, main_input_filename); \ 4818334Speter fprintf (FILE, "\t.version\t\"01.01\"\n"); \ 4918334Speter } while (0) 5018334Speter 5118334Speter#undef DBX_REGISTER_NUMBER 5290075Sobrien#define DBX_REGISTER_NUMBER(n) svr4_dbx_register_map[n] 5318334Speter 5418334Speter/* The routine used to output sequences of byte values. We use a special 5518334Speter version of this for most svr4 targets because doing so makes the 5618334Speter generated assembly code more compact (and thus faster to assemble) 5718334Speter as well as more readable. Note that if we find subparts of the 5818334Speter character sequence which end with NUL (and which are shorter than 5918334Speter STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */ 6018334Speter 6118334Speter#undef ASM_OUTPUT_ASCII 6218334Speter#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \ 6318334Speter do \ 6418334Speter { \ 6590075Sobrien register const unsigned char *_ascii_bytes = \ 6690075Sobrien (const unsigned char *) (STR); \ 6790075Sobrien register const unsigned char *limit = _ascii_bytes + (LENGTH); \ 6818334Speter register unsigned bytes_in_chunk = 0; \ 6918334Speter for (; _ascii_bytes < limit; _ascii_bytes++) \ 7018334Speter { \ 7190075Sobrien register const unsigned char *p; \ 7218334Speter if (bytes_in_chunk >= 64) \ 7318334Speter { \ 7418334Speter fputc ('\n', (FILE)); \ 7518334Speter bytes_in_chunk = 0; \ 7618334Speter } \ 7718334Speter for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \ 7818334Speter continue; \ 7990075Sobrien if (p < limit && (p - _ascii_bytes) <= (long) STRING_LIMIT) \ 8018334Speter { \ 8118334Speter if (bytes_in_chunk > 0) \ 8218334Speter { \ 8318334Speter fputc ('\n', (FILE)); \ 8418334Speter bytes_in_chunk = 0; \ 8518334Speter } \ 8618334Speter ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \ 8718334Speter _ascii_bytes = p; \ 8818334Speter } \ 8918334Speter else \ 9018334Speter { \ 9118334Speter if (bytes_in_chunk == 0) \ 9218334Speter fprintf ((FILE), "\t.byte\t"); \ 9318334Speter else \ 9418334Speter fputc (',', (FILE)); \ 9518334Speter fprintf ((FILE), "0x%02x", *_ascii_bytes); \ 9618334Speter bytes_in_chunk += 5; \ 9718334Speter } \ 9818334Speter } \ 9918334Speter if (bytes_in_chunk > 0) \ 10018334Speter fprintf ((FILE), "\n"); \ 10118334Speter } \ 10218334Speter while (0) 10318334Speter 10450397Sobrien/* A C statement (sans semicolon) to output to the stdio stream 10550397Sobrien FILE the assembler definition of uninitialized global DECL named 10650397Sobrien NAME whose size is SIZE bytes and alignment is ALIGN bytes. 10750397Sobrien Try to use asm_output_aligned_bss to implement this macro. */ 10850397Sobrien 10950397Sobrien#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ 11050397Sobrien asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) 11190075Sobrien 11290075Sobrien/* Handle special EH pointer encodings. Absolute, pc-relative, and 11390075Sobrien indirect are handled automatically. */ 11490075Sobrien#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \ 11590075Sobrien do { \ 11690075Sobrien if ((SIZE) == 4 && ((ENCODING) & 0x70) == DW_EH_PE_datarel) \ 11790075Sobrien { \ 11890075Sobrien fputs (ASM_LONG, FILE); \ 11990075Sobrien assemble_name (FILE, XSTR (ADDR, 0)); \ 12090075Sobrien fputs (((ENCODING) & DW_EH_PE_indirect ? "@GOT" : "@GOTOFF"), FILE); \ 12190075Sobrien goto DONE; \ 12290075Sobrien } \ 12390075Sobrien } while (0) 12490075Sobrien 12590075Sobrien/* Used by crtstuff.c to initialize the base of data-relative relocations. 12690075Sobrien These are GOT relative on x86, so return the pic register. */ 12790075Sobrien#ifdef __PIC__ 12890075Sobrien#define CRT_GET_RFIB_DATA(BASE) \ 12990075Sobrien { \ 13090075Sobrien register void *ebx_ __asm__("ebx"); \ 13190075Sobrien BASE = ebx_; \ 13290075Sobrien } 13390075Sobrien#else 13490075Sobrien#define CRT_GET_RFIB_DATA(BASE) \ 13590075Sobrien __asm__ ("call\t.LPR%=\n" \ 13690075Sobrien ".LPR%=:\n\t" \ 13790075Sobrien "popl\t%0\n\t" \ 13890075Sobrien /* Due to a GAS bug, this cannot use EAX. That encodes \ 13990075Sobrien smaller than the traditional EBX, which results in the \ 14090075Sobrien offset being off by one. */ \ 14190075Sobrien "addl\t$_GLOBAL_OFFSET_TABLE_+[.-.LPR%=],%0" \ 14290075Sobrien : "=d"(BASE)) 14390075Sobrien#endif 14490075Sobrien 14590075Sobrien#undef CPP_SPEC 14690075Sobrien#define CPP_SPEC "%(cpp_cpu)" 147