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