sysv4.h revision 132718
1132718Skan/* Target definitions for GCC 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 6132718SkanThis file is part of GCC. 718334Speter 8132718SkanGCC 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 13132718SkanGCC 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 19132718Skanalong with GCC; 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 37132718Skan#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true 38132718Skan#undef X86_FILE_START_VERSION_DIRECTIVE 39132718Skan#define X86_FILE_START_VERSION_DIRECTIVE true 4018334Speter 4118334Speter#undef DBX_REGISTER_NUMBER 4290075Sobrien#define DBX_REGISTER_NUMBER(n) svr4_dbx_register_map[n] 4318334Speter 4418334Speter/* The routine used to output sequences of byte values. We use a special 4518334Speter version of this for most svr4 targets because doing so makes the 4618334Speter generated assembly code more compact (and thus faster to assemble) 4718334Speter as well as more readable. Note that if we find subparts of the 4818334Speter character sequence which end with NUL (and which are shorter than 4918334Speter STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */ 5018334Speter 5118334Speter#undef ASM_OUTPUT_ASCII 5218334Speter#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \ 5318334Speter do \ 5418334Speter { \ 55132718Skan const unsigned char *_ascii_bytes = \ 5690075Sobrien (const unsigned char *) (STR); \ 57132718Skan const unsigned char *limit = _ascii_bytes + (LENGTH); \ 58132718Skan unsigned bytes_in_chunk = 0; \ 5918334Speter for (; _ascii_bytes < limit; _ascii_bytes++) \ 6018334Speter { \ 61132718Skan const unsigned char *p; \ 6218334Speter if (bytes_in_chunk >= 64) \ 6318334Speter { \ 6418334Speter fputc ('\n', (FILE)); \ 6518334Speter bytes_in_chunk = 0; \ 6618334Speter } \ 6718334Speter for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \ 6818334Speter continue; \ 6990075Sobrien if (p < limit && (p - _ascii_bytes) <= (long) STRING_LIMIT) \ 7018334Speter { \ 7118334Speter if (bytes_in_chunk > 0) \ 7218334Speter { \ 7318334Speter fputc ('\n', (FILE)); \ 7418334Speter bytes_in_chunk = 0; \ 7518334Speter } \ 7618334Speter ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \ 7718334Speter _ascii_bytes = p; \ 7818334Speter } \ 7918334Speter else \ 8018334Speter { \ 8118334Speter if (bytes_in_chunk == 0) \ 8218334Speter fprintf ((FILE), "\t.byte\t"); \ 8318334Speter else \ 8418334Speter fputc (',', (FILE)); \ 8518334Speter fprintf ((FILE), "0x%02x", *_ascii_bytes); \ 8618334Speter bytes_in_chunk += 5; \ 8718334Speter } \ 8818334Speter } \ 8918334Speter if (bytes_in_chunk > 0) \ 9018334Speter fprintf ((FILE), "\n"); \ 9118334Speter } \ 9218334Speter while (0) 9318334Speter 9450397Sobrien/* A C statement (sans semicolon) to output to the stdio stream 9550397Sobrien FILE the assembler definition of uninitialized global DECL named 9650397Sobrien NAME whose size is SIZE bytes and alignment is ALIGN bytes. 9750397Sobrien Try to use asm_output_aligned_bss to implement this macro. */ 9850397Sobrien 9950397Sobrien#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ 10050397Sobrien asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) 10190075Sobrien 10290075Sobrien/* Handle special EH pointer encodings. Absolute, pc-relative, and 10390075Sobrien indirect are handled automatically. */ 10490075Sobrien#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \ 10590075Sobrien do { \ 10690075Sobrien if ((SIZE) == 4 && ((ENCODING) & 0x70) == DW_EH_PE_datarel) \ 10790075Sobrien { \ 10890075Sobrien fputs (ASM_LONG, FILE); \ 10990075Sobrien assemble_name (FILE, XSTR (ADDR, 0)); \ 11090075Sobrien fputs (((ENCODING) & DW_EH_PE_indirect ? "@GOT" : "@GOTOFF"), FILE); \ 11190075Sobrien goto DONE; \ 11290075Sobrien } \ 11390075Sobrien } while (0) 11490075Sobrien 11590075Sobrien/* Used by crtstuff.c to initialize the base of data-relative relocations. 11690075Sobrien These are GOT relative on x86, so return the pic register. */ 11790075Sobrien#ifdef __PIC__ 11890075Sobrien#define CRT_GET_RFIB_DATA(BASE) \ 11990075Sobrien { \ 12090075Sobrien register void *ebx_ __asm__("ebx"); \ 12190075Sobrien BASE = ebx_; \ 12290075Sobrien } 12390075Sobrien#else 12490075Sobrien#define CRT_GET_RFIB_DATA(BASE) \ 12590075Sobrien __asm__ ("call\t.LPR%=\n" \ 12690075Sobrien ".LPR%=:\n\t" \ 12790075Sobrien "popl\t%0\n\t" \ 12890075Sobrien /* Due to a GAS bug, this cannot use EAX. That encodes \ 12990075Sobrien smaller than the traditional EBX, which results in the \ 13090075Sobrien offset being off by one. */ \ 13190075Sobrien "addl\t$_GLOBAL_OFFSET_TABLE_+[.-.LPR%=],%0" \ 13290075Sobrien : "=d"(BASE)) 13390075Sobrien#endif 134