summaryrefslogtreecommitdiff
path: root/gcc/config/avr
diff options
context:
space:
mode:
authorgjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-03 11:03:16 +0000
committergjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-03 11:03:16 +0000
commit2aa6267d9dec539ac1a9bdb94ebf1ddb5407e793 (patch)
tree7c455fd99b4713b39076bcbdf55f3ba6156db71d /gcc/config/avr
parent765568b02e32831b30d682e638cf5642cae36a8d (diff)
downloadgcc-2aa6267d9dec539ac1a9bdb94ebf1ddb5407e793.tar.gz
gcc/
Fix various problems with specs file generation. PR target/65296 * config.gcc (extra_gcc_objs) [avr]: Remove. * config/avr/driver-avr.c: Remove file. * config/avr/t-avr (driver-avr.o): Remove rule. (gen-avr-mmcu-specs): Use CXX_FOR_BUILD, CXXFLAGS_FOR_BUILD and INCLUDES to build. Depend on TM_H. * config/avr/gen-avr-mmcu-specs.c: Tidy up code. Fix various build warnings. Fix non-matching types and non-existing %-codes. (tm.h): Include. (*lib) [!WITH_AVRLIBC]: Don't link libdev.a. (*libgcc) [WITH_AVRLIBC]: Add "-lm". * config/avr/avrlibc.h (LIBGCC_SPEC): Remove definition. * config/avr/avr.h (DRIVER_SELF_SPECS): Fix handling of -march=. (CPP_SPEC, CC1PLUS_SPEC, ASM_SPEC, LINK_SPEC, LIB_SPEC) (LIBGCC_SPEC): Remove definitions. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221141 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/avr')
-rw-r--r--gcc/config/avr/avr.h32
-rw-r--r--gcc/config/avr/avrlibc.h10
-rw-r--r--gcc/config/avr/driver-avr.c30
-rw-r--r--gcc/config/avr/gen-avr-mmcu-specs.c146
-rw-r--r--gcc/config/avr/t-avr8
5 files changed, 106 insertions, 120 deletions
diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h
index 7cb351adf8f..1f2f3da906d 100644
--- a/gcc/config/avr/avr.h
+++ b/gcc/config/avr/avr.h
@@ -492,42 +492,18 @@ typedef struct avr_args
#define ADJUST_INSN_LENGTH(INSN, LENGTH) \
(LENGTH = avr_adjust_insn_length (INSN, LENGTH))
-#define DRIVER_SELF_SPECS " %{mmcu=*:-specs=device-specs/specs-%*%s %<mmcu=*} "
-#define CPP_SPEC ""
+#define DRIVER_SELF_SPECS \
+ " %{!mmcu=*:%{!march=*:-specs=device-specs/specs-avr2%s} " \
+ " %{march=*:-specs=device-specs/specs-%*%s}} " \
+ " %{mmcu=*:-specs=device-specs/specs-%*%s %<mmcu=*} "
/* We want cc1plus used as a preprocessor to pick up the cpp spec from the
per-device spec files */
#define CPLUSPLUS_CPP_SPEC "%(cpp)"
-#define CC1_SPEC ""
-
-#define CC1PLUS_SPEC "%{!frtti:-fno-rtti} \
- %{!fenforce-eh-specs:-fno-enforce-eh-specs} \
- %{!fexceptions:-fno-exceptions}"
-
-#define ASM_SPEC "%{march=*:-mmcu=%*}%{mrelax: --mlink-relax}"
-
-#define LINK_SPEC "\
-%{mrelax:--relax\
- %{mpmem-wrap-around:%{mmcu=at90usb8*:--pmem-wrap-around=8k}\
- %{mmcu=atmega16*:--pmem-wrap-around=16k}\
- %{mmcu=atmega32*|\
- mmcu=at90can32*:--pmem-wrap-around=32k}\
- %{mmcu=atmega64*|\
- mmcu=at90can64*|\
- mmcu=at90usb64*:--pmem-wrap-around=64k}}}\
-%{march=*:-m%*}\
-%{shared:%eshared is not supported}"
-
-#define LIB_SPEC \
- "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lc }}}}}"
-
#define LIBSTDCXX "gcc"
/* No libstdc++ for now. Empty string doesn't work. */
-#define LIBGCC_SPEC \
- "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc }}}}}"
-
/* The actual definition will come from the device-specific spec file. */
#define STARTFILE_SPEC ""
diff --git a/gcc/config/avr/avrlibc.h b/gcc/config/avr/avrlibc.h
index 9a51c0fde7a..b8801a7449e 100644
--- a/gcc/config/avr/avrlibc.h
+++ b/gcc/config/avr/avrlibc.h
@@ -19,11 +19,13 @@ 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/>. */
-/* AVR-Libc implements functions from libgcc.a in libm.a, see PR54461. */
+/* AVR-Libc implements functions from libgcc.a in libm.a, see PR54461.
+ More AVR-Libc specific specs originate from gen-avr-mmcu-specs.c:
-#undef LIBGCC_SPEC
-#define LIBGCC_SPEC \
- "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc -lm }}}}}"
+ - LIBGCC_SPEC (*libgcc)
+ - LIB_SPEC (*lib)
+
+*/
#undef LINK_GCC_C_SEQUENCE_SPEC
#define LINK_GCC_C_SEQUENCE_SPEC \
diff --git a/gcc/config/avr/driver-avr.c b/gcc/config/avr/driver-avr.c
deleted file mode 100644
index f81974be757..00000000000
--- a/gcc/config/avr/driver-avr.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Subroutines for the gcc driver.
- Copyright (C) 2009-2015 Free Software Foundation, Inc.
- Contributed by Anatoly Sokolov <aesok@post.ru>
-
-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.h"
-#include "system.h"
-#include "coretypes.h"
-#include "tm.h"
-
-/* Current architecture. */
-const avr_arch_t *avr_current_arch = NULL;
-
-/* Current device. */
-const avr_mcu_t *avr_current_device = NULL;
diff --git a/gcc/config/avr/gen-avr-mmcu-specs.c b/gcc/config/avr/gen-avr-mmcu-specs.c
index a5ada6fde8b..9dcd4a0c87f 100644
--- a/gcc/config/avr/gen-avr-mmcu-specs.c
+++ b/gcc/config/avr/gen-avr-mmcu-specs.c
@@ -26,9 +26,30 @@
#include "avr-arch.h"
#include "avr-devices.c"
+#define GCC_DEFAULTS_H
+
+#include "tm.h"
+
+#if defined (WITH_AVRLIBC)
+static const bool with_avrlibc = true;
+#else
+static const bool with_avrlibc = false;
+#endif /* WITH_AVRLIBC */
+
+
+/* Return true iff STR starts with PREFIX. */
+
+static bool
+str_prefix_p (const char *str, const char *prefix)
+{
+ return 0 == strncmp (str, prefix, strlen (prefix));
+}
+
+
static void
print_mcu (const avr_mcu_t *mcu)
{
+ const char *sp8_spec;
const avr_mcu_t *arch_mcu;
for (arch_mcu = mcu; arch_mcu->macro; )
@@ -37,100 +58,121 @@ print_mcu (const avr_mcu_t *mcu)
exit (EXIT_FAILURE);
char name[100];
- if (snprintf (name, sizeof name, "specs-%s", mcu->name) >= sizeof name)
+ if (snprintf (name, sizeof name, "specs-%s", mcu->name) >= (int) sizeof name)
exit (EXIT_FAILURE);
FILE *f = fopen (name ,"w");
- const char *sp8, *errata_skip, *rmw;
- /* Leave "avr2" and "avr25" alone. These two architectures are
- the only ones that mix devices with 8-bit SP and 16-bit SP. */
+ bool errata_skip = 0 != (mcu->dev_attribute & AVR_ERRATA_SKIP);
+ bool rmw = 0 != (mcu->dev_attribute & AVR_ISA_RMW);
+ bool sp8 = 0 != (mcu->dev_attribute & AVR_SHORT_SP);
+
if (mcu->macro == NULL
&& (mcu->arch == ARCH_AVR2 || mcu->arch == ARCH_AVR25))
- sp8 = "";
+ {
+ // Leave "avr2" and "avr25" alone. These two architectures are
+ // the only ones that mix devices with 8-bit SP and 16-bit SP.
+ sp8_spec = "";
+ }
+ else
+ {
+ sp8_spec = sp8
+ ? " -msp8"
+ : " %<msp8";
+ }
- sp8 = ((mcu->dev_attribute & AVR_SHORT_SP)
- ? " -msp8" : " %<msp8");
+ const char *errata_skip_spec = errata_skip
+ ? " %{!mno-skip-bug:-mskip-bug}"
+ : " %{!mskip-bug:-mno-skip-bug}";
- errata_skip = (mcu->dev_attribute & AVR_ERRATA_SKIP) ? " -mskip-bug" : "";
- rmw = (mcu->dev_attribute & AVR_ISA_RMW) ? "%{!mno-rmw: -mrmw}" : "";
+ const char *rmw_spec = rmw
+ ? " %{!mno-rmw: -mrmw}"
+ : " %{mrmw}";
const char *arch_name = avr_arch_types[mcu->arch].arch_name;
- fprintf (f, "*self_spec:\n%%{!march=*:-march=%s}%s\n\n", arch_name, sp8);
+ fprintf (f, "*self_spec:\n"
+ " %%{!march=*:-march=%s}"
+ " %s\n\n", arch_name, sp8_spec);
if (mcu->macro)
fprintf (f, "*cpp:\n-D__AVR_DEV_LIB_NAME__=%s -D%s "
"-D__AVR_DEVICE_NAME__=%s\n\n",
mcu->library_name, mcu->macro, mcu->name);
- fprintf (f, "*cc1:\n%s%s", errata_skip, rmw);
+ fprintf (f, "*cc1:\n%s%s", errata_skip_spec, rmw_spec);
if (mcu->n_flash != arch_mcu->n_flash)
fprintf (f, " %%{!mn-flash:-mn-flash=%d}", mcu->n_flash);
fprintf (f, "\n\n");
- fprintf (f, "*cc1plus:\n%s%s ", errata_skip, rmw);
+
+ fprintf (f, "*cc1plus:\n%s%s ", errata_skip_spec, rmw_spec);
if (mcu->n_flash != arch_mcu->n_flash)
- fprintf (f, "%%{!mn-flash:-mn-flash=%d}", mcu->n_flash);
- fprintf (f, "%%{!frtti: -fno-rtti}"
- "%%{!fenforce-eh-specs: -fno-enforce-eh-specs}"
- "%%{!fexceptions: -fno-exceptions}\n\n");
-
- fprintf (f, "*asm:\n%%{march=*:-mmcu=%%*}%{mrelax: --mlink-relax}%s\n\n",
- *errata_skip ? "" : " -mno-skip-bug");
-
- fprintf (f, "*link:\n%%{mrelax:--relax");
- if (strncmp (mcu->name, "at90usb8", strlen ("at90usb8")) == 0)
- fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=8k}");
- if (strncmp (mcu->name, "atmega16", strlen ("atmega16")) == 0)
- fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=16k}");
- if (strncmp (mcu->name, "atmega32", strlen ("atmega32")) == 0
- || strncmp (mcu->name, "at90can32", strlen ("at90can32")) == 0)
- fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=32k}");
- if (strncmp (mcu->name, "atmega64", strlen ("atmega64")) == 0
- || strncmp (mcu->name, "at90can64", strlen ("at90can64")) == 0
- || strncmp (mcu->name, "at90usb64", strlen ("at90usb64")) == 0)
- fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=64k}");
- fprintf (f, "} %%{march=*:-m%%*}");
+ fprintf (f, " %%{!mn-flash:-mn-flash=%d}", mcu->n_flash);
+ fprintf (f, (" %%{!frtti: -fno-rtti}"
+ " %%{!fenforce-eh-specs: -fno-enforce-eh-specs}"
+ " %%{!fexceptions: -fno-exceptions}\n\n"));
+
+ fprintf (f, "*asm:\n"
+ " %%{march=*:-mmcu=%%*}"
+ " %%{mrelax: --mlink-relax}"
+ " %s%s\n\n", rmw_spec, (errata_skip
+ ? " %{mno-skip-bug}"
+ : " %{!mskip-bug:-mno-skip-bug}"));
+ fprintf (f, "*link:\n"
+ " %%{mrelax:--relax");
+ {
+ int wrap_k =
+ str_prefix_p (mcu->name, "at90usb8") ? 8
+ : str_prefix_p (mcu->name, "atmega16") ? 16
+ : (str_prefix_p (mcu->name, "atmega32")
+ || str_prefix_p (mcu->name, "at90can32")) ? 32
+ : (str_prefix_p (mcu->name, "atmega64")
+ || str_prefix_p (mcu->name, "at90can64")
+ || str_prefix_p (mcu->name, "at90usb64")) ? 64
+ : 0;
+
+ if (wrap_k)
+ fprintf (f, " %%{mpmem-wrap-around: --pmem-wrap-around=%dk}", wrap_k);
+ }
+ fprintf (f, "}"
+ " %%{march=*:-m%%*}");
+
if (mcu->data_section_start
!= avr_arch_types[mcu->arch].default_data_section_start)
fprintf (f, " -Tdata 0x%lX", 0x800000UL + mcu->data_section_start);
+
if (mcu->text_section_start != 0x0)
- fprintf (f, " -Ttext 0x%lX", mcu->text_section_start);
+ fprintf (f, " -Ttext 0x%lX", 0UL + mcu->text_section_start);
fprintf (f, " %%{shared:%%eshared is not supported}\n\n");
+ bool has_libs = mcu->arch != ARCH_AVR1;
+
fprintf (f, "*lib:\n");
- if (strncmp (mcu->name, "mmcu=at90s1", strlen ("mmcu=at90s1")) != 0
- && strncmp (mcu->name, "mmcu=attiny11", strlen ("mmcu=attiny11")) != 0
- && strncmp (mcu->name, "mmcu=attiny12", strlen ("mmcu=attiny12")) != 0
- && strncmp (mcu->name, "mmcu=attiny15", strlen ("mmcu=attiny15")) != 0
- && strncmp (mcu->name, "mmcu=attiny28", strlen ("mmcu=attiny28")) != 0)
+ if (has_libs)
{
fprintf (f, "-lc");
- if (mcu->macro)
+ if (with_avrlibc
+ && mcu->macro)
fprintf (f, " dev/%s/libdev.a%%s", mcu->name);
}
fprintf (f, "\n\n");
fprintf (f, "*libgcc:\n");
- if (strncmp (mcu->name, "mmcu=at90s1", strlen ("mmcu=at90s1")) != 0
- && strncmp (mcu->name, "mmcu=attiny11", strlen ("mmcu=attiny11")) != 0
- && strncmp (mcu->name, "mmcu=attiny12", strlen ("mmcu=attiny12")) != 0
- && strncmp (mcu->name, "mmcu=attiny15", strlen ("mmcu=attiny15")) != 0
- && strncmp (mcu->name, "mmcu=attiny28", strlen ("mmcu=attiny28")) != 0)
- fprintf (f, "-lgcc");
+ if (has_libs)
+ fprintf (f, with_avrlibc
+ ? "-lgcc -lm"
+ : "-lgcc");
fprintf (f, "\n\n");
- fprintf (f, "*startfile:\ndev/%s/crt1.o%%s\n\n", mcu->name);
+ fprintf (f, "*startfile:\n"
+ "dev/%s/crt1.o%%s\n\n", mcu->name);
}
+
int main (void)
{
- enum avr_arch arch = ARCH_UNKNOWN;
- size_t i, n_mcus = 0;
- const avr_mcu_t *mcu;
-
- for (mcu = avr_mcu_types; mcu->name; mcu++)
+ for (const avr_mcu_t *mcu = avr_mcu_types; mcu->name; mcu++)
print_mcu (mcu);
return EXIT_SUCCESS;
diff --git a/gcc/config/avr/t-avr b/gcc/config/avr/t-avr
index 5ff8ba9af84..4c5e23b9685 100644
--- a/gcc/config/avr/t-avr
+++ b/gcc/config/avr/t-avr
@@ -16,10 +16,6 @@
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
-driver-avr.o: $(srcdir)/config/avr/driver-avr.c \
- $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)
- $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
-
avr-devices.o: $(srcdir)/config/avr/avr-devices.c \
$(srcdir)/config/avr/avr-mcus.def \
$(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)
@@ -69,8 +65,8 @@ gen-avr-mmcu-texi$(build_exeext): $(srcdir)/config/avr/gen-avr-mmcu-texi.c \
gen-avr-mmcu-specs$(build_exeext): $(srcdir)/config/avr/gen-avr-mmcu-specs.c \
$(AVR_MCUS) $(srcdir)/config/avr/avr-devices.c \
- $(srcdir)/config/avr/avr-arch.h
- $(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $< -o $@
+ $(srcdir)/config/avr/avr-arch.h $(TM_H)
+ $(CXX_FOR_BUILD) $(CXXFLAGS_FOR_BUILD) $< -o $@ $(INCLUDES)
$(srcdir)/doc/avr-mmcu.texi: gen-avr-mmcu-texi$(build_exeext)
$(RUN_GEN) ./$< > $@