defaults.h revision 51885
118334Speter/* Definitions of various defaults for how to do assembler output
218334Speter   (most of which are designed to be appropriate for GAS or for
318334Speter   some BSD assembler).
451885Sobrien   Copyright (C) 1992, 1996 Free Software Foundation, Inc.
551885Sobrien   Contributed by Ron Guilmette (rfg@monkeys.com)
618334Speter
718334SpeterThis file is part of GNU CC.
818334Speter
918334SpeterGNU CC is free software; you can redistribute it and/or modify
1018334Speterit under the terms of the GNU General Public License as published by
1118334Speterthe Free Software Foundation; either version 2, or (at your option)
1218334Speterany later version.
1318334Speter
1418334SpeterGNU CC is distributed in the hope that it will be useful,
1518334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of
1618334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1718334SpeterGNU General Public License for more details.
1818334Speter
1918334SpeterYou should have received a copy of the GNU General Public License
2018334Speteralong with GNU CC; see the file COPYING.  If not, write to
2118334Speterthe Free Software Foundation, 59 Temple Place - Suite 330,
2218334SpeterBoston, MA 02111-1307, USA.  */
2318334Speter
2418334Speter/* Store in OUTPUT a string (made with alloca) containing
2518334Speter   an assembler-name for a local static variable or function named NAME.
2618334Speter   LABELNO is an integer which is different for each call.  */
2718334Speter
2818334Speter#ifndef ASM_FORMAT_PRIVATE_NAME
2918334Speter#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO)			\
3018334Speter  do {									\
3118334Speter    int len = strlen (NAME);						\
3218334Speter    char *temp = (char *) alloca (len + 3);				\
3318334Speter    temp[0] = 'L';							\
3418334Speter    strcpy (&temp[1], (NAME));						\
3518334Speter    temp[len + 1] = '.';						\
3618334Speter    temp[len + 2] = 0;							\
3718334Speter    (OUTPUT) = (char *) alloca (strlen (NAME) + 11);			\
3818334Speter    ASM_GENERATE_INTERNAL_LABEL (OUTPUT, temp, LABELNO);		\
3918334Speter  } while (0)
4018334Speter#endif
4118334Speter
4218334Speter#ifndef ASM_STABD_OP
4318334Speter#define ASM_STABD_OP ".stabd"
4418334Speter#endif
4518334Speter
4618334Speter/* This is how to output an element of a case-vector that is absolute.
4718334Speter   Some targets don't use this, but we have to define it anyway.  */
4818334Speter
4918334Speter#ifndef ASM_OUTPUT_ADDR_VEC_ELT
5018334Speter#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
5118334Speterdo { fprintf (FILE, "\t%s\t", ASM_LONG);				\
5218334Speter     ASM_OUTPUT_INTERNAL_LABEL (FILE, "L", (VALUE));			\
5318334Speter     fputc ('\n', FILE);						\
5418334Speter   } while (0)
5518334Speter#endif
5618334Speter
5718334Speter/* choose a reasonable default for ASM_OUTPUT_ASCII.  */
5818334Speter
5918334Speter#ifndef ASM_OUTPUT_ASCII
6018334Speter#define ASM_OUTPUT_ASCII(MYFILE, MYSTRING, MYLENGTH) \
6118334Speter  do {									      \
6218334Speter    FILE *_hide_asm_out_file = (MYFILE);				      \
6318334Speter    unsigned char *_hide_p = (unsigned char *) (MYSTRING);		      \
6418334Speter    int _hide_thissize = (MYLENGTH);					      \
6518334Speter    {									      \
6618334Speter      FILE *asm_out_file = _hide_asm_out_file;				      \
6718334Speter      unsigned char *p = _hide_p;					      \
6818334Speter      int thissize = _hide_thissize;					      \
6918334Speter      int i;								      \
7018334Speter      fprintf (asm_out_file, "\t.ascii \"");				      \
7118334Speter									      \
7218334Speter      for (i = 0; i < thissize; i++)					      \
7318334Speter	{								      \
7418334Speter	  register int c = p[i];					      \
7518334Speter	  if (c == '\"' || c == '\\')					      \
7618334Speter	    putc ('\\', asm_out_file);					      \
7718334Speter	  if (c >= ' ' && c < 0177)					      \
7818334Speter	    putc (c, asm_out_file);					      \
7918334Speter	  else								      \
8018334Speter	    {								      \
8118334Speter	      fprintf (asm_out_file, "\\%o", c);			      \
8218334Speter	      /* After an octal-escape, if a digit follows,		      \
8318334Speter		 terminate one string constant and start another.	      \
8418334Speter		 The Vax assembler fails to stop reading the escape	      \
8518334Speter		 after three digits, so this is the only way we		      \
8618334Speter		 can get it to parse the data properly.  */		      \
8718334Speter	      if (i < thissize - 1					      \
8818334Speter		  && p[i + 1] >= '0' && p[i + 1] <= '9')		      \
8918334Speter		fprintf (asm_out_file, "\"\n\t.ascii \"");		      \
9018334Speter	  }								      \
9118334Speter	}								      \
9218334Speter      fprintf (asm_out_file, "\"\n");					      \
9318334Speter    }									      \
9418334Speter  }									      \
9518334Speter  while (0)
9618334Speter#endif
9718334Speter
9818334Speter#ifndef ASM_IDENTIFY_GCC
9918334Speter  /* Default the definition, only if ASM_IDENTIFY_GCC is not set,
10018334Speter     because if it is set, we might not want ASM_IDENTIFY_LANGUAGE
10118334Speter     outputting labels, if we do want it to, then it must be defined
10218334Speter     in the tm.h file.  */
10318334Speter#ifndef ASM_IDENTIFY_LANGUAGE
10418334Speter#define ASM_IDENTIFY_LANGUAGE(FILE) output_lang_identify (FILE);
10518334Speter#endif
10618334Speter#endif
10718334Speter
10818334Speter/* This is how we tell the assembler to equate two values.  */
10918334Speter#ifdef SET_ASM_OP
11018334Speter#ifndef ASM_OUTPUT_DEF
11118334Speter#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)				\
11218334Speter do {	fprintf ((FILE), "\t%s\t", SET_ASM_OP);				\
11318334Speter	assemble_name (FILE, LABEL1);					\
11418334Speter	fprintf (FILE, ",");						\
11518334Speter	assemble_name (FILE, LABEL2);					\
11618334Speter	fprintf (FILE, "\n");						\
11718334Speter  } while (0)
11818334Speter#endif
11918334Speter#endif
12018334Speter
12151885Sobrien/* This is how to output a reference to a user-level label named NAME.  */
12251885Sobrien
12351885Sobrien#ifndef ASM_OUTPUT_LABELREF
12451885Sobrien#define ASM_OUTPUT_LABELREF(FILE,NAME)  \
12551885Sobrien  do { fputs (USER_LABEL_PREFIX, FILE); fputs (NAME, FILE); } while (0)
12651885Sobrien#endif
12751885Sobrien
12818334Speter/* This determines whether or not we support weak symbols.  */
12918334Speter#ifndef SUPPORTS_WEAK
13018334Speter#ifdef ASM_WEAKEN_LABEL
13118334Speter#define SUPPORTS_WEAK 1
13218334Speter#else
13318334Speter#define SUPPORTS_WEAK 0
13418334Speter#endif
13518334Speter#endif
13651885Sobrien
13751885Sobrien/* If we have a definition of INCOMING_RETURN_ADDR_RTX, assume that
13851885Sobrien   the rest of the DWARF 2 frame unwind support is also provided.  */
13951885Sobrien#if !defined (DWARF2_UNWIND_INFO) && defined (INCOMING_RETURN_ADDR_RTX)
14051885Sobrien#define DWARF2_UNWIND_INFO 1
14151885Sobrien#endif
142