config.gcc (rx-*-linux*): New target.
authorYoshinori Sato <ysato@users.sourceforge.jp>
Wed, 29 May 2019 18:36:06 +0000 (03:36 +0900)
committerJeff Law <law@gcc.gnu.org>
Wed, 29 May 2019 18:36:06 +0000 (12:36 -0600)
* config.gcc (rx-*-linux*): New target.
* config/rx/elf.opt: New file.
* config/rx/linux.h: Likewise.
* config/rx/t-linux: Likewise.
* config/rx/rx.c (TARGET_SAVE_ACC_REGISTER): If not defined,
make it zero.
* config/rx/rx.h (ASM_APP_ON): Allow to be overridden.
(ASM_APP_OFF): Likewise.
* config/rx/rx.opt: Drop -msim and -mas100-syntax, they were
moved elsewhere.

* config.host (rx-*-linux*): Add new case.
* config/rx/t-rx (HOST_LIBGCC2_CFLAGS): Force DFmode to SFmode.

From-SVN: r271748

gcc/ChangeLog
gcc/config.gcc
gcc/config/rx/elf.opt [new file with mode: 0644]
gcc/config/rx/linux.h [new file with mode: 0644]
gcc/config/rx/rx.c
gcc/config/rx/rx.h
gcc/config/rx/rx.opt
gcc/config/rx/t-linux [new file with mode: 0644]
libgcc/ChangeLog
libgcc/config.host
libgcc/config/rx/t-rx

index a3056bfcafe8fade48bc57b6fa1c84332905e531..334fe7fc3a27044fe5dca6101cc7714391ed0435 100644 (file)
@@ -1,3 +1,16 @@
+2019-05-29  Yoshinori Sato  <ysato@users.sourceforge.jp>
+
+       * config.gcc (rx-*-linux*): New target.
+       * config/rx/elf.opt: New file.
+       * config/rx/linux.h: Likewise.
+       * config/rx/t-linux: Likewise.
+       * config/rx/rx.c (TARGET_SAVE_ACC_REGISTER): If not defined,
+       make it zero.
+       * config/rx/rx.h (ASM_APP_ON): Allow to be overridden.
+       (ASM_APP_OFF): Likewise.
+       * config/rx/rx.opt: Drop -msim and -mas100-syntax, they were
+       moved elsewhere.
+
 2019-05-29  Jan Hubicka  <jh@suse.cz>
 
        * tree-ssa-alias.c (same_type_for_tbaa): Return ture if main
index f47bb460b70b92a19b3072658327eceb99af542c..67c3c2c7a42a33c1643bd3fa8fd620678c0a26ed 100644 (file)
@@ -2801,6 +2801,11 @@ rl78-*-elf*)
 rx-*-elf*)
        tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
        tmake_file="${tmake_file} rx/t-rx"
+       extra_options="${extra_options} rx/elf.opt"
+       ;;
+rx-*-linux*)
+       tm_file="elfos.h linux.h glibc-stdint.h rx/linux.h ../../libgcc/config/rx/rx-abi.h"
+       tmake_file="${tmake_file} rx/t-linux"
        ;;
 s390-*-linux*)
        tm_file="s390/s390.h dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h s390/linux.h"
diff --git a/gcc/config/rx/elf.opt b/gcc/config/rx/elf.opt
new file mode 100644 (file)
index 0000000..907e030
--- /dev/null
@@ -0,0 +1,44 @@
+; Command line options for the Renesas RX port of GCC.
+; Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+; Contributed by Red Hat.
+;
+; This file is part of GCC.
+;
+; GCC is free software; you can redistribute it and/or modify it under
+; the terms of the GNU General Public License as published by the Free
+; Software Foundation; either version 3, or (at your option) any later
+; version.
+;
+; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+; WARRANTY; without even the implied warranty of MERCHANTABILITY or
+; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+; for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with GCC; see the file COPYING3.  If not see
+; <http://www.gnu.org/licenses/>.
+;---------------------------------------------------
+
+; elf target extra options
+
+msim
+Target
+Use the simulator runtime.
+
+;---------------------------------------------------
+
+mas100-syntax
+Target Mask(AS100_SYNTAX) Report
+Generate assembler output that is compatible with the Renesas AS100 assembler.  This may restrict some of the compiler's capabilities.  The default is to generate GAS compatable syntax.
+
+;---------------------------------------------------
+
+mint-register=
+Target RejectNegative Joined UInteger Var(rx_interrupt_registers) Init(0)
+Specifies the number of registers to reserve for interrupt handlers.
+
+;---------------------------------------------------
+
+msave-acc-in-interrupts
+Target Mask(SAVE_ACC_REGISTER)
+Specifies whether interrupt functions should save and restore the accumulator register.
diff --git a/gcc/config/rx/linux.h b/gcc/config/rx/linux.h
new file mode 100644 (file)
index 0000000..9ee484a
--- /dev/null
@@ -0,0 +1,231 @@
+/* GCC backend definitions for the rx-linux
+   Copyright (C) 2019 Yoshinori Sato
+   Based on rx.h
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3, or (at your
+   option) any later version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+
+#include "config/rx/rx.h"
+
+#undef TARGET_CPU_CPP_BUILTINS
+#define TARGET_CPU_CPP_BUILTINS()               \
+  do                                            \
+    {                                           \
+      builtin_define ("__RX__");               \
+      builtin_assert ("cpu=RX");               \
+      if (rx_cpu_type == RX610)                        \
+        builtin_assert ("machine=RX610");      \
+     else                                      \
+        builtin_assert ("machine=RX600");      \
+                                               \
+      if (TARGET_BIG_ENDIAN_DATA)              \
+       builtin_define ("__RX_BIG_ENDIAN__");   \
+      else                                     \
+       builtin_define ("__RX_LITTLE_ENDIAN__");\
+                                               \
+      if (TARGET_64BIT_DOUBLES)                        \
+       builtin_define ("__RX_64BIT_DOUBLES__");\
+      else                                     \
+       builtin_define ("__RX_32BIT_DOUBLES__");\
+                                               \
+      if (ALLOW_RX_FPU_INSNS)                  \
+       builtin_define ("__RX_FPU_INSNS__");    \
+                                               \
+    }                                           \
+  while (0)
+
+#undef  CC1_SPEC
+#define CC1_SPEC "\
+  %{mcpu=rx200:%{fpu:%erx200 cpu does not have FPU hardware}}"
+
+#undef  ASM_SPEC
+#define ASM_SPEC "\
+%{mbig-endian-data:-mbig-endian-data} \
+%{m64bit-doubles:-m64bit-doubles} \
+%{!m64bit-doubles:-m32bit-doubles} \
+%{msmall-data-limit*:-msmall-data-limit} \
+%{mrelax:-relax} \
+"
+
+#undef DATA_SECTION_ASM_OP
+#define DATA_SECTION_ASM_OP                            \
+   "\t.section .data,\"aw\",@progbits\n\t.p2align 2"
+
+#undef SDATA_SECTION_ASM_OP
+#define SDATA_SECTION_ASM_OP                           \
+   "\t.section .data2,\"aw\",@progbits\n\t.p2align 1"
+
+#undef  READONLY_DATA_SECTION_ASM_OP
+#define READONLY_DATA_SECTION_ASM_OP                   \
+   "\t.section .rodata,\"a\",@progbits\n\t.p2align 2"
+
+#undef BSS_SECTION_ASM_OP
+#define BSS_SECTION_ASM_OP                             \
+   "\t.section .bss\n\t.p2align 2"
+
+#undef SBSS_SECTION_ASM_OP
+#define SBSS_SECTION_ASM_OP                            \
+   "\t.section .bss2\n\t.p2align 1"
+
+/* The following definitions are conditional depending upon whether the
+   compiler is being built or crtstuff.c is being compiled by the built
+   compiler.  */
+#undef TEXT_SECTION_ASM_OP
+#define TEXT_SECTION_ASM_OP          \
+  "\t.section .text,\"ax\""
+#undef CTORS_SECTION_ASM_OP
+#define CTORS_SECTION_ASM_OP         \
+  "\t.section\t.init_array,\"aw\",@init_array"
+#undef DTORS_SECTION_ASM_OP
+#define DTORS_SECTION_ASM_OP         \
+  "\t.section\t.fini_array,\"aw\",@fini_array"
+#undef INIT_ARRAY_SECTION_ASM_OP
+#define INIT_ARRAY_SECTION_ASM_OP   \
+  "\t.section\t.init_array,\"aw\",@init_array"
+#undef FINI_ARRAY_SECTION_ASM_OP
+#define FINI_ARRAY_SECTION_ASM_OP   \
+  "\t.section\t.fini_array,\"aw\",@fini_array"
+
+#undef GLOBAL_ASM_OP
+#define GLOBAL_ASM_OP          "\t.global\t"
+#undef  USER_LABEL_PREFIX
+
+#undef ASM_OUTPUT_ALIGN
+#define ASM_OUTPUT_ALIGN(STREAM, LOG)          \
+  do                                           \
+    {                                          \
+      if ((LOG) == 0)                          \
+        break;                                 \
+      fprintf (STREAM, "\t.balign %d\n", 1 << (LOG));  \
+    }                                          \
+  while (0)
+
+#undef ASM_OUTPUT_ADDR_VEC_ELT
+#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
+  fprintf (FILE, "\t.long .L%d\n", VALUE)
+
+/* This is how to output an element of a case-vector that is relative.
+   Note: The local label referenced by the "1b" below is emitted by
+   the tablejump insn.  */
+
+#undef ASM_OUTPUT_ADDR_DIFF_ELT
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
+  fprintf (FILE, "\t.long .L%d - 1b\n", VALUE)
+
+#undef ASM_OUTPUT_SIZE_DIRECTIVE
+#define ASM_OUTPUT_SIZE_DIRECTIVE(STREAM, NAME, SIZE)                  \
+  do                                                                   \
+    {                                                                  \
+      HOST_WIDE_INT size_ = (SIZE);                                    \
+                                                                       \
+      fputs (SIZE_ASM_OP, STREAM);                                     \
+      assemble_name (STREAM, NAME);                                    \
+      fprintf (STREAM, ", " HOST_WIDE_INT_PRINT_DEC "\n", size_);      \
+    }                                                                  \
+  while (0)
+
+#undef ASM_OUTPUT_MEASURED_SIZE
+#define ASM_OUTPUT_MEASURED_SIZE(STREAM, NAME)                         \
+  do                                                                   \
+    {                                                                  \
+      fputs (SIZE_ASM_OP, STREAM);                                     \
+      assemble_name (STREAM, NAME);                                    \
+      fputs (", .-", STREAM);                                          \
+      assemble_name (STREAM, NAME);                                    \
+      putc ('\n', STREAM);                                             \
+    }                                                                  \
+  while (0)
+
+#undef ASM_OUTPUT_TYPE_DIRECTIVE
+#define ASM_OUTPUT_TYPE_DIRECTIVE(STREAM, NAME, TYPE)                  \
+  do                                                                   \
+    {                                                                  \
+      fputs (TYPE_ASM_OP, STREAM);                                     \
+      assemble_name (STREAM, NAME);                                    \
+      fputs (", ", STREAM);                                            \
+      fprintf (STREAM, TYPE_OPERAND_FMT, TYPE);                                \
+      putc ('\n', STREAM);                                             \
+    }                                                                  \
+  while (0)
+
+#undef  ASM_GENERATE_INTERNAL_LABEL
+#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)                \
+  do                                                           \
+    {                                                          \
+      sprintf (LABEL, "*.%s%u", PREFIX, (unsigned) (NUM));                     \
+    }                                                          \
+  while (0)
+
+#undef  ASM_OUTPUT_EXTERNAL
+#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME)                  \
+  do                                                           \
+    {                                                          \
+      default_elf_asm_output_external (FILE, DECL, NAME);      \
+    }                                                          \
+  while (0)
+
+#undef  ASM_OUTPUT_ALIGNED_COMMON
+#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)             \
+  do                                                                   \
+    {                                                                  \
+      fprintf ((FILE), "%s", COMMON_ASM_OP);                           \
+      assemble_name ((FILE), (NAME));                                  \
+      fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n",       \
+              (SIZE), (ALIGN) / BITS_PER_UNIT);                        \
+    }                                                                  \
+  while (0)
+
+#undef  SKIP_ASM_OP
+#define SKIP_ASM_OP   "\t.zero\t"
+
+#undef  ASM_OUTPUT_LIMITED_STRING
+#define ASM_OUTPUT_LIMITED_STRING(FILE, STR)           \
+  do                                                   \
+    {                                                  \
+      const unsigned char *_limited_str =              \
+       (const unsigned char *) (STR);                  \
+      unsigned ch;                                     \
+                                                       \
+      fprintf ((FILE), "\t.string\t\"");               \
+                                                       \
+      for (; (ch = *_limited_str); _limited_str++)     \
+        {                                              \
+         int escape;                                   \
+                                                       \
+         switch (escape = ESCAPES[ch])                 \
+           {                                           \
+           case 0:                                     \
+             putc (ch, (FILE));                        \
+             break;                                    \
+           case 1:                                     \
+             fprintf ((FILE), "\\%03o", ch);           \
+             break;                                    \
+           default:                                    \
+             putc ('\\', (FILE));                      \
+             putc (escape, (FILE));                    \
+             break;                                    \
+           }                                           \
+        }                                              \
+                                                       \
+      fprintf ((FILE), "\"\n");                                \
+    }                                                  \
+  while (0)
+
+#undef  PREFERRED_DEBUGGING_TYPE
+
+#undef TARGET_AS100_SYNTAX
+#define TARGET_AS100_SYNTAX 0
index f70e8f340046846b37195e11f25ee72e84da7258..0695f3b653851a8b5139baf71002c09f7deae75c 100644 (file)
@@ -1438,10 +1438,14 @@ bit_count (unsigned int x)
   return (x + (x >> 16)) & 0x3f;
 }
 
+#if defined(TARGET_SAVE_ACC_REGISTER)
 #define MUST_SAVE_ACC_REGISTER                 \
   (TARGET_SAVE_ACC_REGISTER                    \
    && (is_interrupt_func (NULL_TREE)           \
        || is_fast_interrupt_func (NULL_TREE)))
+#else
+#define MUST_SAVE_ACC_REGISTER 0
+#endif
 
 /* Returns either the lowest numbered and highest numbered registers that
    occupy the call-saved area of the stack frame, if the registers are
index b50b48f8afbc6b7d8f829651d59864fd323e5e97..672e087cd1313e7154523bb887816c3ad54f7d3a 100644 (file)
@@ -408,7 +408,9 @@ typedef unsigned int CUMULATIVE_ARGS;
 #define GLOBAL_ASM_OP          \
   (TARGET_AS100_SYNTAX ? "\t.GLB\t" : "\t.global\t")
 #define ASM_COMMENT_START      " ;"
+#undef ASM_APP_ON
 #define ASM_APP_ON             ""
+#undef ASM_APP_OFF
 #define ASM_APP_OFF            ""
 #define LOCAL_LABEL_PREFIX     "L"
 #undef  USER_LABEL_PREFIX
index 50814a17a75dcd330c5e24373210a4083cfd6e54..4e80c860e43c4fa4601f227d83fbf6c5a15886b8 100644 (file)
@@ -82,18 +82,6 @@ Maximum size of global and static variables which can be placed into the small d
 
 ;---------------------------------------------------
 
-msim
-Target
-Use the simulator runtime.
-
-;---------------------------------------------------
-
-mas100-syntax
-Target Mask(AS100_SYNTAX) Report
-Generate assembler output that is compatible with the Renesas AS100 assembler.  This may restrict some of the compiler's capabilities.  The default is to generate GAS compatible syntax.
-
-;---------------------------------------------------
-
 mrelax
 Target
 Enable linker relaxation.
diff --git a/gcc/config/rx/t-linux b/gcc/config/rx/t-linux
new file mode 100644 (file)
index 0000000..0975b26
--- /dev/null
@@ -0,0 +1,34 @@
+# Makefile fragment for building GCC for the rx-linux.
+# Copyright (C) 2019 Yoshinori Sato
+# Based on t-rx
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 3, or (at your
+# option) any later version.
+#
+# GCC is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See
+# the GNU General Public License for more details.
+#
+# You should have received a copy of the  GNU General Public
+# License along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Enable multilibs:
+
+MULTILIB_OPTIONS    =
+MULTILIB_DIRNAMES   =
+
+MULTILIB_MATCHES    = nofpu=mnofpu  nofpu=mcpu?rx200  nofpu=mcpu?RX200
+
+MULTILIB_EXCEPTIONS =
+MULTILIB_EXTRA_OPTS =
+
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
+
+EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o
index c86decfab0ed1d28421c6deccb578478e79deb5f..082fabc244de37ecaaf67d1a27e25aa245f778d9 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-29  Yoshinori Sato  <ysato@users.sourceforge.jp>
+
+       * config.host (rx-*-linux*): Add new case.
+       * config/rx/t-rx (HOST_LIBGCC2_CFLAGS): Force DFmode to SFmode.
+
 2019-05-29  Sam Tebbs  <sam.tebbs@arm.com>
 
        * config/aarch64/aarch64-unwind.h (aarch64_cie_signed_with_b_key): New
index 91fed5fa473079513b820783c7f34bf0dc49f0e7..ff2f0fa1e58014e711fbec0166fff175b7dfce79 100644 (file)
@@ -1211,6 +1211,9 @@ rx-*-elf)
        tmake_file="rx/t-rx t-fdpbit"
        tm_file="$tm_file rx/rx-abi.h rx/rx-lib.h"
        ;;
+rx-*-linux*)
+       tmake_file="rx/t-rx"
+       ;;
 s390-*-linux*)
        tmake_file="${tmake_file} s390/t-crtstuff s390/t-linux s390/32/t-floattodi t-stack s390/t-stack-s390"
        md_unwind_header=s390/linux-unwind.h
index ace3b16f39edd9651914813c5ee664fe4250f296..34cdc97cc030a2e8f41d1d4a06b9f2cbf258257b 100644 (file)
@@ -23,6 +23,7 @@
 # the normal libgcc sources:
 
 LIB2ADD = $(srcdir)/config/rx/rx-abi-functions.c
+HOST_LIBGCC2_CFLAGS += -DDF=SF
 
 
 # We need special handling of the floating point conversion