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