1/* Definitions of various defaults for how to do assembler output 2 (most of which are designed to be appropriate for GAS or for 3 some BSD assembler). 4 Copyright (C) 1992, 1996, 1997, 1998 Free Software Foundation, Inc. 5 Contributed by Ron Guilmette (rfg@monkeys.com) 6 7This file is part of GNU CC. 8 9GNU CC is free software; you can redistribute it and/or modify 10it under the terms of the GNU General Public License as published by 11the Free Software Foundation; either version 2, or (at your option) 12any later version. 13 14GNU CC is distributed in the hope that it will be useful, 15but WITHOUT ANY WARRANTY; without even the implied warranty of 16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17GNU General Public License for more details. 18 19You should have received a copy of the GNU General Public License 20along with GNU CC; see the file COPYING. If not, write to 21the Free Software Foundation, 59 Temple Place - Suite 330, 22Boston, MA 02111-1307, USA. */ 23 24/* Store in OUTPUT a string (made with alloca) containing 25 an assembler-name for a local static variable or function named NAME. 26 LABELNO is an integer which is different for each call. */ 27 28#ifndef ASM_FORMAT_PRIVATE_NAME 29#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \ 30 do { \ 31 int len = strlen (NAME); \ 32 char *temp = (char *) alloca (len + 3); \ 33 temp[0] = 'L'; \ 34 strcpy (&temp[1], (NAME)); \ 35 temp[len + 1] = '.'; \ 36 temp[len + 2] = 0; \ 37 (OUTPUT) = (char *) alloca (strlen (NAME) + 11); \ 38 ASM_GENERATE_INTERNAL_LABEL (OUTPUT, temp, LABELNO); \ 39 } while (0) 40#endif 41 42#ifndef ASM_STABD_OP 43#define ASM_STABD_OP ".stabd" 44#endif 45 46/* This is how to output an element of a case-vector that is absolute. 47 Some targets don't use this, but we have to define it anyway. */ 48 49#ifndef ASM_OUTPUT_ADDR_VEC_ELT 50#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ 51do { fprintf (FILE, "\t%s\t", ASM_LONG); \ 52 ASM_OUTPUT_INTERNAL_LABEL (FILE, "L", (VALUE)); \ 53 fputc ('\n', FILE); \ 54 } while (0) 55#endif 56 57/* choose a reasonable default for ASM_OUTPUT_ASCII. */ 58 59#ifndef ASM_OUTPUT_ASCII 60#define ASM_OUTPUT_ASCII(MYFILE, MYSTRING, MYLENGTH) \ 61 do { \ 62 FILE *_hide_asm_out_file = (MYFILE); \ 63 unsigned char *_hide_p = (unsigned char *) (MYSTRING); \ 64 int _hide_thissize = (MYLENGTH); \ 65 { \ 66 FILE *asm_out_file = _hide_asm_out_file; \ 67 unsigned char *p = _hide_p; \ 68 int thissize = _hide_thissize; \ 69 int i; \ 70 fprintf (asm_out_file, "\t.ascii \""); \ 71 \ 72 for (i = 0; i < thissize; i++) \ 73 { \ 74 register int c = p[i]; \ 75 if (c == '\"' || c == '\\') \ 76 putc ('\\', asm_out_file); \ 77 if (c >= ' ' && c < 0177) \ 78 putc (c, asm_out_file); \ 79 else \ 80 { \ 81 fprintf (asm_out_file, "\\%o", c); \ 82 /* After an octal-escape, if a digit follows, \ 83 terminate one string constant and start another. \ 84 The Vax assembler fails to stop reading the escape \ 85 after three digits, so this is the only way we \ 86 can get it to parse the data properly. */ \ 87 if (i < thissize - 1 \ 88 && p[i + 1] >= '0' && p[i + 1] <= '9') \ 89 fprintf (asm_out_file, "\"\n\t.ascii \""); \ 90 } \ 91 } \ 92 fprintf (asm_out_file, "\"\n"); \ 93 } \ 94 } \ 95 while (0) 96#endif 97 98#ifndef ASM_IDENTIFY_GCC 99 /* Default the definition, only if ASM_IDENTIFY_GCC is not set, 100 because if it is set, we might not want ASM_IDENTIFY_LANGUAGE 101 outputting labels, if we do want it to, then it must be defined 102 in the tm.h file. */ 103#ifndef ASM_IDENTIFY_LANGUAGE 104#define ASM_IDENTIFY_LANGUAGE(FILE) output_lang_identify (FILE); 105#endif 106#endif 107 108/* This is how we tell the assembler to equate two values. */ 109#ifdef SET_ASM_OP 110#ifndef ASM_OUTPUT_DEF 111#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \ 112 do { fprintf ((FILE), "\t%s\t", SET_ASM_OP); \ 113 assemble_name (FILE, LABEL1); \ 114 fprintf (FILE, ","); \ 115 assemble_name (FILE, LABEL2); \ 116 fprintf (FILE, "\n"); \ 117 } while (0) 118#endif 119#endif 120 121/* This is how to output a reference to a user-level label named NAME. */ 122 123#ifndef ASM_OUTPUT_LABELREF 124#define ASM_OUTPUT_LABELREF(FILE,NAME) asm_fprintf ((FILE), "%U%s", (NAME)) 125#endif 126 127/* This determines whether or not we support weak symbols. */ 128#ifndef SUPPORTS_WEAK 129#ifdef ASM_WEAKEN_LABEL 130#define SUPPORTS_WEAK 1 131#else 132#define SUPPORTS_WEAK 0 133#endif 134#endif 135 136/* If the target supports weak symbols, define TARGET_ATTRIBUTE_WEAK to 137 provide a weak attribute. Else define it to nothing. 138 139 This would normally belong in gansidecl.h, but SUPPORTS_WEAK is 140 not available at that time. 141 142 Note, this is only for use by target files which we know are to be 143 compiled by GCC. */ 144#ifndef TARGET_ATTRIBUTE_WEAK 145# if SUPPORTS_WEAK 146# define TARGET_ATTRIBUTE_WEAK __attribute__ ((weak)) 147# else 148# define TARGET_ATTRIBUTE_WEAK 149# endif 150#endif 151 152/* If we have a definition of INCOMING_RETURN_ADDR_RTX, assume that 153 the rest of the DWARF 2 frame unwind support is also provided. */ 154#if !defined (DWARF2_UNWIND_INFO) && defined (INCOMING_RETURN_ADDR_RTX) 155#define DWARF2_UNWIND_INFO 1 156#endif 157