1/* Definitions for PA_RISC with ELF format 2 Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. 3 4This file is part of GNU CC. 5 6GNU CC is free software; you can redistribute it and/or modify 7it under the terms of the GNU General Public License as published by 8the Free Software Foundation; either version 2, or (at your option) 9any later version. 10 11GNU CC is distributed in the hope that it will be useful, 12but WITHOUT ANY WARRANTY; without even the implied warranty of 13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14GNU General Public License for more details. 15 16You should have received a copy of the GNU General Public License 17along with GNU CC; see the file COPYING. If not, write to 18the Free Software Foundation, 59 Temple Place - Suite 330, 19Boston, MA 02111-1307, USA. */ 20 21 22/* A C expression whose value is RTL representing the location of the 23 incoming return address at the beginning of any function, before the 24 prologue. You only need to define this macro if you want to support 25 call frame debugging information like that provided by DWARF 2. */ 26#define INCOMING_RETURN_ADDR_RTX (gen_rtx_REG (word_mode, 2)) 27#define DWARF_FRAME_RETURN_COLUMN (DWARF_FRAME_REGNUM (2)) 28 29/* This macro chooses the encoding of pointers embedded in the exception 30 handling sections. If at all possible, this should be defined such 31 that the exception handling section will not require dynamic relocations, 32 and so may be read-only. 33 34 FIXME: We use DW_EH_PE_aligned to output a PLABEL constructor for 35 global function pointers. */ 36#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \ 37 (CODE == 2 && GLOBAL ? DW_EH_PE_aligned : DW_EH_PE_absptr) 38 39/* Handle special EH pointer encodings. Absolute, pc-relative, and 40 indirect are handled automatically. Since pc-relative encoding is 41 not possible on the PA and we don't have the infrastructure for 42 data relative encoding, we use aligned plabels for global function 43 pointers. */ 44#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \ 45 do { \ 46 if (((ENCODING) & 0x0F) == DW_EH_PE_aligned) \ 47 { \ 48 fputs (integer_asm_op (SIZE, FALSE), FILE); \ 49 fputs ("P%", FILE); \ 50 assemble_name (FILE, XSTR (ADDR, 0)); \ 51 goto DONE; \ 52 } \ 53 } while (0) 54 55#undef TARGET_OS_CPP_BUILTINS 56#define TARGET_OS_CPP_BUILTINS() \ 57 do \ 58 { \ 59 builtin_define ("__ELF__"); \ 60 builtin_define ("__gnu_linux__"); \ 61 builtin_define_std ("linux"); \ 62 builtin_define_std ("unix"); \ 63 builtin_assert ("machine=bigendian"); \ 64 builtin_assert ("system=posix"); \ 65 builtin_assert ("system=unix"); \ 66 } \ 67 while (0) 68 69#undef CPP_SPEC 70#define CPP_SPEC "%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE}" 71 72#undef LIB_SPEC 73#define LIB_SPEC \ 74 "%{pthread:-lpthread} \ 75 %{shared:-lgcc -lc} \ 76 %{!shared:%{mieee-fp:-lieee} %{shared-libgcc:-lgcc} %{profile:-lc_p}%{!profile:-lc}}" 77 78#undef ASM_SPEC 79#define ASM_SPEC \ 80 "%{v:-V} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*}" 81 82/* Define this for shared library support because it isn't in the main 83 linux.h file. */ 84 85#undef LINK_SPEC 86#define LINK_SPEC "\ 87 %{shared:-shared} \ 88 %{!shared: \ 89 %{!static: \ 90 %{rdynamic:-export-dynamic} \ 91 %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ 92 %{static:-static}}" 93 94/* glibc's profiling functions don't need gcc to allocate counters. */ 95#define NO_PROFILE_COUNTERS 1 96 97/* Define the strings used for the special svr4 .type and .size directives. 98 These strings generally do not vary from one system running svr4 to 99 another, but if a given system (e.g. m88k running svr) needs to use 100 different pseudo-op names for these, they may be overridden in the 101 file which includes this one. */ 102 103#undef STRING_ASM_OP 104#define STRING_ASM_OP ".stringz" 105 106#define TEXT_SECTION_ASM_OP "\t.text" 107#define DATA_SECTION_ASM_OP "\t.data" 108#define BSS_SECTION_ASM_OP "\t.section\t.bss" 109 110/* Output at beginning of assembler file. We override the definition 111 from <linux.h> so that we can get the proper .LEVEL directive. */ 112#undef ASM_FILE_START 113#define ASM_FILE_START(FILE) \ 114 do \ 115 { \ 116 if (write_symbols != NO_DEBUG) \ 117 { \ 118 output_file_directive (FILE, main_input_filename); \ 119 fputs ("\t.version\t\"01.01\"\n", FILE); \ 120 } \ 121 if (TARGET_64BIT) \ 122 fputs("\t.LEVEL 2.0w\n", FILE); \ 123 else if (TARGET_PA_20) \ 124 fputs("\t.LEVEL 2.0\n", FILE); \ 125 else if (TARGET_PA_11) \ 126 fputs("\t.LEVEL 1.1\n", FILE); \ 127 else \ 128 fputs("\t.LEVEL 1.0\n", FILE); \ 129 if (profile_flag) \ 130 fputs ("\t.IMPORT _mcount, CODE\n", FILE); \ 131 } \ 132 while (0) 133 134/* We want local labels to start with period if made with asm_fprintf. */ 135#undef LOCAL_LABEL_PREFIX 136#define LOCAL_LABEL_PREFIX "." 137 138/* Define these to generate the Linux/ELF/SysV style of internal 139 labels all the time - i.e. to be compatible with 140 ASM_GENERATE_INTERNAL_LABEL in <elfos.h>. Compare these with the 141 ones in pa.h and note the lack of dollar signs in these. FIXME: 142 shouldn't we fix pa.h to use ASM_GENERATE_INTERNAL_LABEL instead? */ 143 144#undef ASM_OUTPUT_ADDR_VEC_ELT 145#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ 146 if (TARGET_BIG_SWITCH) \ 147 fprintf (FILE, "\tstw %%r1,-16(%%r30)\n\tldil LR'.L%d,%%r1\n\tbe RR'.L%d(%%sr4,%%r1)\n\tldw -16(%%r30),%%r1\n", VALUE, VALUE); \ 148 else \ 149 fprintf (FILE, "\tb .L%d\n\tnop\n", VALUE) 150 151#undef ASM_OUTPUT_ADDR_DIFF_ELT 152#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ 153 if (TARGET_BIG_SWITCH) \ 154 fprintf (FILE, "\tstw %%r1,-16(%%r30)\n\tldw T'.L%d(%%r19),%%r1\n\tbv %%r0(%%r1)\n\tldw -16(%%r30),%%r1\n", VALUE); \ 155 else \ 156 fprintf (FILE, "\tb .L%d\n\tnop\n", VALUE) 157 158/* Use the default. */ 159#undef ASM_OUTPUT_LABEL 160 161/* NOTE: ASM_OUTPUT_INTERNAL_LABEL() is defined for us by elfos.h, and 162 does what we want (i.e. uses colons). It must be compatible with 163 ASM_GENERATE_INTERNAL_LABEL(), so do not define it here. */ 164 165/* Use the default. */ 166#undef TARGET_ASM_GLOBALIZE_LABEL 167/* Globalizing directive for a label. */ 168#define GLOBAL_ASM_OP ".globl " 169 170/* FIXME: Hacked from the <elfos.h> one so that we avoid multiple 171 labels in a function declaration (since pa.c seems determined to do 172 it differently) */ 173 174#undef ASM_DECLARE_FUNCTION_NAME 175#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ 176 do \ 177 { \ 178 ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \ 179 ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \ 180 } \ 181 while (0) 182 183/* As well as globalizing the label, we need to encode the label 184 to ensure a plabel is generated in an indirect call. */ 185 186#undef ASM_OUTPUT_EXTERNAL_LIBCALL 187#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ 188 do \ 189 { \ 190 if (!FUNCTION_NAME_P (XSTR (FUN, 0))) \ 191 hppa_encode_label (FUN); \ 192 (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0)); \ 193 } \ 194 while (0) 195 196/* Linux always uses gas. */ 197#undef TARGET_GAS 198#define TARGET_GAS 1 199