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