(root)/
gcc-13.2.0/
gcc/
config/
rx/
linux.h
       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