sysv4.h revision 117395
118334Speter/* Target definitions for GNU compiler for Intel 80386 running System V.4 2117395Skan Copyright (C) 1991, 2001, 2002 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#define TARGET_VERSION fprintf (stderr, " (i386 System V Release 4)"); 2518334Speter 2618334Speter/* The svr4 ABI for the i386 says that records and unions are returned 2718334Speter in memory. */ 2818334Speter 2918334Speter#undef RETURN_IN_MEMORY 3018334Speter#define RETURN_IN_MEMORY(TYPE) \ 3190075Sobrien (TYPE_MODE (TYPE) == BLKmode \ 3290075Sobrien || (VECTOR_MODE_P (TYPE_MODE (TYPE)) && int_size_in_bytes (TYPE) == 8)) 3318334Speter 3418334Speter/* Output at beginning of assembler file. */ 3518334Speter/* The .file command should always begin the output. */ 3618334Speter 3718334Speter#undef ASM_FILE_START 3818334Speter#define ASM_FILE_START(FILE) \ 3918334Speter do { \ 4018334Speter output_file_directive (FILE, main_input_filename); \ 4118334Speter fprintf (FILE, "\t.version\t\"01.01\"\n"); \ 4218334Speter } while (0) 4318334Speter 4418334Speter#undef DBX_REGISTER_NUMBER 4590075Sobrien#define DBX_REGISTER_NUMBER(n) svr4_dbx_register_map[n] 4618334Speter 4718334Speter/* The routine used to output sequences of byte values. We use a special 4818334Speter version of this for most svr4 targets because doing so makes the 4918334Speter generated assembly code more compact (and thus faster to assemble) 5018334Speter as well as more readable. Note that if we find subparts of the 5118334Speter character sequence which end with NUL (and which are shorter than 5218334Speter STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */ 5318334Speter 5418334Speter#undef ASM_OUTPUT_ASCII 5518334Speter#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \ 5618334Speter do \ 5718334Speter { \ 5890075Sobrien register const unsigned char *_ascii_bytes = \ 5990075Sobrien (const unsigned char *) (STR); \ 6090075Sobrien register const unsigned char *limit = _ascii_bytes + (LENGTH); \ 6118334Speter register unsigned bytes_in_chunk = 0; \ 6218334Speter for (; _ascii_bytes < limit; _ascii_bytes++) \ 6318334Speter { \ 6490075Sobrien register const unsigned char *p; \ 6518334Speter if (bytes_in_chunk >= 64) \ 6618334Speter { \ 6718334Speter fputc ('\n', (FILE)); \ 6818334Speter bytes_in_chunk = 0; \ 6918334Speter } \ 7018334Speter for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \ 7118334Speter continue; \ 7290075Sobrien if (p < limit && (p - _ascii_bytes) <= (long) STRING_LIMIT) \ 7318334Speter { \ 7418334Speter if (bytes_in_chunk > 0) \ 7518334Speter { \ 7618334Speter fputc ('\n', (FILE)); \ 7718334Speter bytes_in_chunk = 0; \ 7818334Speter } \ 7918334Speter ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \ 8018334Speter _ascii_bytes = p; \ 8118334Speter } \ 8218334Speter else \ 8318334Speter { \ 8418334Speter if (bytes_in_chunk == 0) \ 8518334Speter fprintf ((FILE), "\t.byte\t"); \ 8618334Speter else \ 8718334Speter fputc (',', (FILE)); \ 8818334Speter fprintf ((FILE), "0x%02x", *_ascii_bytes); \ 8918334Speter bytes_in_chunk += 5; \ 9018334Speter } \ 9118334Speter } \ 9218334Speter if (bytes_in_chunk > 0) \ 9318334Speter fprintf ((FILE), "\n"); \ 9418334Speter } \ 9518334Speter while (0) 9618334Speter 9750397Sobrien/* A C statement (sans semicolon) to output to the stdio stream 9850397Sobrien FILE the assembler definition of uninitialized global DECL named 9950397Sobrien NAME whose size is SIZE bytes and alignment is ALIGN bytes. 10050397Sobrien Try to use asm_output_aligned_bss to implement this macro. */ 10150397Sobrien 10250397Sobrien#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ 10350397Sobrien asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) 10490075Sobrien 10590075Sobrien/* Handle special EH pointer encodings. Absolute, pc-relative, and 10690075Sobrien indirect are handled automatically. */ 10790075Sobrien#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \ 10890075Sobrien do { \ 10990075Sobrien if ((SIZE) == 4 && ((ENCODING) & 0x70) == DW_EH_PE_datarel) \ 11090075Sobrien { \ 11190075Sobrien fputs (ASM_LONG, FILE); \ 11290075Sobrien assemble_name (FILE, XSTR (ADDR, 0)); \ 11390075Sobrien fputs (((ENCODING) & DW_EH_PE_indirect ? "@GOT" : "@GOTOFF"), FILE); \ 11490075Sobrien goto DONE; \ 11590075Sobrien } \ 11690075Sobrien } while (0) 11790075Sobrien 11890075Sobrien/* Used by crtstuff.c to initialize the base of data-relative relocations. 11990075Sobrien These are GOT relative on x86, so return the pic register. */ 12090075Sobrien#ifdef __PIC__ 12190075Sobrien#define CRT_GET_RFIB_DATA(BASE) \ 12290075Sobrien { \ 12390075Sobrien register void *ebx_ __asm__("ebx"); \ 12490075Sobrien BASE = ebx_; \ 12590075Sobrien } 12690075Sobrien#else 12790075Sobrien#define CRT_GET_RFIB_DATA(BASE) \ 12890075Sobrien __asm__ ("call\t.LPR%=\n" \ 12990075Sobrien ".LPR%=:\n\t" \ 13090075Sobrien "popl\t%0\n\t" \ 13190075Sobrien /* Due to a GAS bug, this cannot use EAX. That encodes \ 13290075Sobrien smaller than the traditional EBX, which results in the \ 13390075Sobrien offset being off by one. */ \ 13490075Sobrien "addl\t$_GLOBAL_OFFSET_TABLE_+[.-.LPR%=],%0" \ 13590075Sobrien : "=d"(BASE)) 13690075Sobrien#endif 137