1 /* GCC backend definitions for the rx-linux 2 Copyright (C) 2019 Yoshinori Sato 3 Based on rx.h 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it 8 under the terms of the GNU General Public License as published 9 by the Free Software Foundation; either version 3, or (at your 10 option) any later version. 11 12 GCC is distributed in the hope that it will be useful, but WITHOUT 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 15 License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 22 #include "config/rx/rx.h" 23 24 #undef TARGET_CPU_CPP_BUILTINS 25 #define TARGET_CPU_CPP_BUILTINS() \ 26 do \ 27 { \ 28 builtin_define ("__RX__"); \ 29 builtin_assert ("cpu=RX"); \ 30 if (rx_cpu_type == RX610) \ 31 builtin_assert ("machine=RX610"); \ 32 else \ 33 builtin_assert ("machine=RX600"); \ 34 \ 35 if (TARGET_BIG_ENDIAN_DATA) \ 36 builtin_define ("__RX_BIG_ENDIAN__"); \ 37 else \ 38 builtin_define ("__RX_LITTLE_ENDIAN__");\ 39 \ 40 if (TARGET_64BIT_DOUBLES) \ 41 builtin_define ("__RX_64BIT_DOUBLES__");\ 42 else \ 43 builtin_define ("__RX_32BIT_DOUBLES__");\ 44 \ 45 if (ALLOW_RX_FPU_INSNS) \ 46 builtin_define ("__RX_FPU_INSNS__"); \ 47 \ 48 } \ 49 while (0) 50 51 #undef CC1_SPEC 52 #define CC1_SPEC "\ 53 %{mcpu=rx200:%{fpu:%erx200 cpu does not have FPU hardware}}" 54 55 #undef ASM_SPEC 56 #define ASM_SPEC "\ 57 %{mbig-endian-data:-mbig-endian-data} \ 58 %{m64bit-doubles:-m64bit-doubles} \ 59 %{!m64bit-doubles:-m32bit-doubles} \ 60 %{msmall-data-limit*:-msmall-data-limit} \ 61 %{mrelax:-relax} \ 62 " 63 64 #undef DATA_SECTION_ASM_OP 65 #define DATA_SECTION_ASM_OP \ 66 "\t.section .data,\"aw\",@progbits\n\t.p2align 2" 67 68 #undef SDATA_SECTION_ASM_OP 69 #define SDATA_SECTION_ASM_OP \ 70 "\t.section .data2,\"aw\",@progbits\n\t.p2align 1" 71 72 #undef READONLY_DATA_SECTION_ASM_OP 73 #define READONLY_DATA_SECTION_ASM_OP \ 74 "\t.section .rodata,\"a\",@progbits\n\t.p2align 2" 75 76 #undef BSS_SECTION_ASM_OP 77 #define BSS_SECTION_ASM_OP \ 78 "\t.section .bss\n\t.p2align 2" 79 80 #undef SBSS_SECTION_ASM_OP 81 #define SBSS_SECTION_ASM_OP \ 82 "\t.section .bss2\n\t.p2align 1" 83 84 /* The following definitions are conditional depending upon whether the 85 compiler is being built or crtstuff.c is being compiled by the built 86 compiler. */ 87 #undef TEXT_SECTION_ASM_OP 88 #define TEXT_SECTION_ASM_OP \ 89 "\t.section .text,\"ax\"" 90 #undef CTORS_SECTION_ASM_OP 91 #define CTORS_SECTION_ASM_OP \ 92 "\t.section\t.init_array,\"aw\",@init_array" 93 #undef DTORS_SECTION_ASM_OP 94 #define DTORS_SECTION_ASM_OP \ 95 "\t.section\t.fini_array,\"aw\",@fini_array" 96 #undef INIT_ARRAY_SECTION_ASM_OP 97 #define INIT_ARRAY_SECTION_ASM_OP \ 98 "\t.section\t.init_array,\"aw\",@init_array" 99 #undef FINI_ARRAY_SECTION_ASM_OP 100 #define FINI_ARRAY_SECTION_ASM_OP \ 101 "\t.section\t.fini_array,\"aw\",@fini_array" 102 103 #undef GLOBAL_ASM_OP 104 #define GLOBAL_ASM_OP "\t.global\t" 105 #undef USER_LABEL_PREFIX 106 107 #undef ASM_OUTPUT_ALIGN 108 #define ASM_OUTPUT_ALIGN(STREAM, LOG) \ 109 do \ 110 { \ 111 if ((LOG) == 0) \ 112 break; \ 113 fprintf (STREAM, "\t.balign %d\n", 1 << (LOG)); \ 114 } \ 115 while (0) 116 117 #undef ASM_OUTPUT_ADDR_VEC_ELT 118 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ 119 fprintf (FILE, "\t.long .L%d\n", VALUE) 120 121 /* This is how to output an element of a case-vector that is relative. 122 Note: The local label referenced by the "1b" below is emitted by 123 the tablejump insn. */ 124 125 #undef ASM_OUTPUT_ADDR_DIFF_ELT 126 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ 127 fprintf (FILE, "\t.long .L%d - 1b\n", VALUE) 128 129 #undef ASM_OUTPUT_SIZE_DIRECTIVE 130 #define ASM_OUTPUT_SIZE_DIRECTIVE(STREAM, NAME, SIZE) \ 131 do \ 132 { \ 133 HOST_WIDE_INT size_ = (SIZE); \ 134 \ 135 fputs (SIZE_ASM_OP, STREAM); \ 136 assemble_name (STREAM, NAME); \ 137 fprintf (STREAM, ", " HOST_WIDE_INT_PRINT_DEC "\n", size_); \ 138 } \ 139 while (0) 140 141 #undef ASM_OUTPUT_MEASURED_SIZE 142 #define ASM_OUTPUT_MEASURED_SIZE(STREAM, NAME) \ 143 do \ 144 { \ 145 fputs (SIZE_ASM_OP, STREAM); \ 146 assemble_name (STREAM, NAME); \ 147 fputs (", .-", STREAM); \ 148 assemble_name (STREAM, NAME); \ 149 putc ('\n', STREAM); \ 150 } \ 151 while (0) 152 153 #undef ASM_OUTPUT_TYPE_DIRECTIVE 154 #define ASM_OUTPUT_TYPE_DIRECTIVE(STREAM, NAME, TYPE) \ 155 do \ 156 { \ 157 fputs (TYPE_ASM_OP, STREAM); \ 158 assemble_name (STREAM, NAME); \ 159 fputs (", ", STREAM); \ 160 fprintf (STREAM, TYPE_OPERAND_FMT, TYPE); \ 161 putc ('\n', STREAM); \ 162 } \ 163 while (0) 164 165 #undef ASM_GENERATE_INTERNAL_LABEL 166 #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \ 167 do \ 168 { \ 169 sprintf (LABEL, "*.%s%u", PREFIX, (unsigned) (NUM)); \ 170 } \ 171 while (0) 172 173 #undef ASM_OUTPUT_EXTERNAL 174 #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ 175 do \ 176 { \ 177 default_elf_asm_output_external (FILE, DECL, NAME); \ 178 } \ 179 while (0) 180 181 #undef ASM_OUTPUT_ALIGNED_COMMON 182 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ 183 do \ 184 { \ 185 fprintf ((FILE), "%s", COMMON_ASM_OP); \ 186 assemble_name ((FILE), (NAME)); \ 187 fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", \ 188 (SIZE), (ALIGN) / BITS_PER_UNIT); \ 189 } \ 190 while (0) 191 192 #undef SKIP_ASM_OP 193 #define SKIP_ASM_OP "\t.zero\t" 194 195 #undef ASM_OUTPUT_LIMITED_STRING 196 #define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \ 197 do \ 198 { \ 199 const unsigned char *_limited_str = \ 200 (const unsigned char *) (STR); \ 201 unsigned ch; \ 202 \ 203 fprintf ((FILE), "\t.string\t\""); \ 204 \ 205 for (; (ch = *_limited_str); _limited_str++) \ 206 { \ 207 int escape; \ 208 \ 209 switch (escape = ESCAPES[ch]) \ 210 { \ 211 case 0: \ 212 putc (ch, (FILE)); \ 213 break; \ 214 case 1: \ 215 fprintf ((FILE), "\\%03o", ch); \ 216 break; \ 217 default: \ 218 putc ('\\', (FILE)); \ 219 putc (escape, (FILE)); \ 220 break; \ 221 } \ 222 } \ 223 \ 224 fprintf ((FILE), "\"\n"); \ 225 } \ 226 while (0) 227 228 #undef PREFERRED_DEBUGGING_TYPE 229 230 #undef TARGET_AS100_SYNTAX 231 #define TARGET_AS100_SYNTAX 0 232