Commit 38822076 by Georg-Johann Lay Committed by Georg-Johann Lay

Fix various problems with specs file generation.

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.

From-SVN: r221141
parent b4b78e2d
2015-03-03 Georg-Johann Lay <avr@gjlay.de>
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.
2015-03-03 Eric Botcazou <ebotcazou@adacore.com> 2015-03-03 Eric Botcazou <ebotcazou@adacore.com>
* config/ia64/ia64.c (expand_vec_perm_interleave_2): Use gen_raw_REG * config/ia64/ia64.c (expand_vec_perm_interleave_2): Use gen_raw_REG
......
...@@ -1103,7 +1103,6 @@ avr-*-*) ...@@ -1103,7 +1103,6 @@ avr-*-*)
fi fi
tmake_file="${tmake_file} avr/t-avr avr/t-multilib" tmake_file="${tmake_file} avr/t-avr avr/t-multilib"
use_gcc_stdint=wrap use_gcc_stdint=wrap
extra_gcc_objs="driver-avr.o avr-devices.o"
extra_objs="avr-devices.o avr-log.o" extra_objs="avr-devices.o avr-log.o"
;; ;;
bfin*-elf*) bfin*-elf*)
......
...@@ -492,42 +492,18 @@ typedef struct avr_args ...@@ -492,42 +492,18 @@ typedef struct avr_args
#define ADJUST_INSN_LENGTH(INSN, LENGTH) \ #define ADJUST_INSN_LENGTH(INSN, LENGTH) \
(LENGTH = avr_adjust_insn_length (INSN, LENGTH)) (LENGTH = avr_adjust_insn_length (INSN, LENGTH))
#define DRIVER_SELF_SPECS " %{mmcu=*:-specs=device-specs/specs-%*%s %<mmcu=*} " #define DRIVER_SELF_SPECS \
#define CPP_SPEC "" " %{!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 /* We want cc1plus used as a preprocessor to pick up the cpp spec from the
per-device spec files */ per-device spec files */
#define CPLUSPLUS_CPP_SPEC "%(cpp)" #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" #define LIBSTDCXX "gcc"
/* No libstdc++ for now. Empty string doesn't work. */ /* 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. */ /* The actual definition will come from the device-specific spec file. */
#define STARTFILE_SPEC "" #define STARTFILE_SPEC ""
......
...@@ -19,11 +19,13 @@ You should have received a copy of the GNU General Public License ...@@ -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 along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */ <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 - LIBGCC_SPEC (*libgcc)
#define LIBGCC_SPEC \ - LIB_SPEC (*lib)
"%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc -lm }}}}}"
*/
#undef LINK_GCC_C_SEQUENCE_SPEC #undef LINK_GCC_C_SEQUENCE_SPEC
#define LINK_GCC_C_SEQUENCE_SPEC \ #define LINK_GCC_C_SEQUENCE_SPEC \
......
/* 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;
...@@ -26,9 +26,30 @@ ...@@ -26,9 +26,30 @@
#include "avr-arch.h" #include "avr-arch.h"
#include "avr-devices.c" #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 static void
print_mcu (const avr_mcu_t *mcu) print_mcu (const avr_mcu_t *mcu)
{ {
const char *sp8_spec;
const avr_mcu_t *arch_mcu; const avr_mcu_t *arch_mcu;
for (arch_mcu = mcu; arch_mcu->macro; ) for (arch_mcu = mcu; arch_mcu->macro; )
...@@ -37,100 +58,121 @@ print_mcu (const avr_mcu_t *mcu) ...@@ -37,100 +58,121 @@ print_mcu (const avr_mcu_t *mcu)
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
char name[100]; 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); exit (EXIT_FAILURE);
FILE *f = fopen (name ,"w"); FILE *f = fopen (name ,"w");
const char *sp8, *errata_skip, *rmw; bool errata_skip = 0 != (mcu->dev_attribute & AVR_ERRATA_SKIP);
/* Leave "avr2" and "avr25" alone. These two architectures are bool rmw = 0 != (mcu->dev_attribute & AVR_ISA_RMW);
the only ones that mix devices with 8-bit SP and 16-bit SP. */ bool sp8 = 0 != (mcu->dev_attribute & AVR_SHORT_SP);
if (mcu->macro == NULL if (mcu->macro == NULL
&& (mcu->arch == ARCH_AVR2 || mcu->arch == ARCH_AVR25)) && (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) const char *errata_skip_spec = errata_skip
? " -msp8" : " %<msp8"); ? " %{!mno-skip-bug:-mskip-bug}"
: " %{!mskip-bug:-mno-skip-bug}";
errata_skip = (mcu->dev_attribute & AVR_ERRATA_SKIP) ? " -mskip-bug" : ""; const char *rmw_spec = rmw
rmw = (mcu->dev_attribute & AVR_ISA_RMW) ? "%{!mno-rmw: -mrmw}" : ""; ? " %{!mno-rmw: -mrmw}"
: " %{mrmw}";
const char *arch_name = avr_arch_types[mcu->arch].arch_name; 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) if (mcu->macro)
fprintf (f, "*cpp:\n-D__AVR_DEV_LIB_NAME__=%s -D%s " fprintf (f, "*cpp:\n-D__AVR_DEV_LIB_NAME__=%s -D%s "
"-D__AVR_DEVICE_NAME__=%s\n\n", "-D__AVR_DEVICE_NAME__=%s\n\n",
mcu->library_name, mcu->macro, mcu->name); 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) if (mcu->n_flash != arch_mcu->n_flash)
fprintf (f, " %%{!mn-flash:-mn-flash=%d}", mcu->n_flash); fprintf (f, " %%{!mn-flash:-mn-flash=%d}", mcu->n_flash);
fprintf (f, "\n\n"); 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) if (mcu->n_flash != arch_mcu->n_flash)
fprintf (f, "%%{!mn-flash:-mn-flash=%d}", mcu->n_flash); fprintf (f, " %%{!mn-flash:-mn-flash=%d}", mcu->n_flash);
fprintf (f, "%%{!frtti: -fno-rtti}" fprintf (f, (" %%{!frtti: -fno-rtti}"
"%%{!fenforce-eh-specs: -fno-enforce-eh-specs}" " %%{!fenforce-eh-specs: -fno-enforce-eh-specs}"
"%%{!fexceptions: -fno-exceptions}\n\n"); " %%{!fexceptions: -fno-exceptions}\n\n"));
fprintf (f, "*asm:\n%%{march=*:-mmcu=%%*}%{mrelax: --mlink-relax}%s\n\n", fprintf (f, "*asm:\n"
*errata_skip ? "" : " -mno-skip-bug"); " %%{march=*:-mmcu=%%*}"
" %%{mrelax: --mlink-relax}"
fprintf (f, "*link:\n%%{mrelax:--relax"); " %s%s\n\n", rmw_spec, (errata_skip
if (strncmp (mcu->name, "at90usb8", strlen ("at90usb8")) == 0) ? " %{mno-skip-bug}"
fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=8k}"); : " %{!mskip-bug:-mno-skip-bug}"));
if (strncmp (mcu->name, "atmega16", strlen ("atmega16")) == 0) fprintf (f, "*link:\n"
fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=16k}"); " %%{mrelax:--relax");
if (strncmp (mcu->name, "atmega32", strlen ("atmega32")) == 0 {
|| strncmp (mcu->name, "at90can32", strlen ("at90can32")) == 0) int wrap_k =
fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=32k}"); str_prefix_p (mcu->name, "at90usb8") ? 8
if (strncmp (mcu->name, "atmega64", strlen ("atmega64")) == 0 : str_prefix_p (mcu->name, "atmega16") ? 16
|| strncmp (mcu->name, "at90can64", strlen ("at90can64")) == 0 : (str_prefix_p (mcu->name, "atmega32")
|| strncmp (mcu->name, "at90usb64", strlen ("at90usb64")) == 0) || str_prefix_p (mcu->name, "at90can32")) ? 32
fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=64k}"); : (str_prefix_p (mcu->name, "atmega64")
fprintf (f, "} %%{march=*:-m%%*}"); || 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 if (mcu->data_section_start
!= avr_arch_types[mcu->arch].default_data_section_start) != avr_arch_types[mcu->arch].default_data_section_start)
fprintf (f, " -Tdata 0x%lX", 0x800000UL + mcu->data_section_start); fprintf (f, " -Tdata 0x%lX", 0x800000UL + mcu->data_section_start);
if (mcu->text_section_start != 0x0) 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"); fprintf (f, " %%{shared:%%eshared is not supported}\n\n");
bool has_libs = mcu->arch != ARCH_AVR1;
fprintf (f, "*lib:\n"); fprintf (f, "*lib:\n");
if (strncmp (mcu->name, "mmcu=at90s1", strlen ("mmcu=at90s1")) != 0 if (has_libs)
&& 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, "-lc"); fprintf (f, "-lc");
if (mcu->macro) if (with_avrlibc
&& mcu->macro)
fprintf (f, " dev/%s/libdev.a%%s", mcu->name); fprintf (f, " dev/%s/libdev.a%%s", mcu->name);
} }
fprintf (f, "\n\n"); fprintf (f, "\n\n");
fprintf (f, "*libgcc:\n"); fprintf (f, "*libgcc:\n");
if (strncmp (mcu->name, "mmcu=at90s1", strlen ("mmcu=at90s1")) != 0 if (has_libs)
&& strncmp (mcu->name, "mmcu=attiny11", strlen ("mmcu=attiny11")) != 0 fprintf (f, with_avrlibc
&& strncmp (mcu->name, "mmcu=attiny12", strlen ("mmcu=attiny12")) != 0 ? "-lgcc -lm"
&& strncmp (mcu->name, "mmcu=attiny15", strlen ("mmcu=attiny15")) != 0 : "-lgcc");
&& strncmp (mcu->name, "mmcu=attiny28", strlen ("mmcu=attiny28")) != 0)
fprintf (f, "-lgcc");
fprintf (f, "\n\n"); 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) int main (void)
{ {
enum avr_arch arch = ARCH_UNKNOWN; for (const avr_mcu_t *mcu = avr_mcu_types; mcu->name; mcu++)
size_t i, n_mcus = 0;
const avr_mcu_t *mcu;
for (mcu = avr_mcu_types; mcu->name; mcu++)
print_mcu (mcu); print_mcu (mcu);
return EXIT_SUCCESS; return EXIT_SUCCESS;
......
...@@ -16,10 +16,6 @@ ...@@ -16,10 +16,6 @@
# along with GCC; see the file COPYING3. If not see # along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>. # <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 \ avr-devices.o: $(srcdir)/config/avr/avr-devices.c \
$(srcdir)/config/avr/avr-mcus.def \ $(srcdir)/config/avr/avr-mcus.def \
$(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(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 \ ...@@ -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 \ gen-avr-mmcu-specs$(build_exeext): $(srcdir)/config/avr/gen-avr-mmcu-specs.c \
$(AVR_MCUS) $(srcdir)/config/avr/avr-devices.c \ $(AVR_MCUS) $(srcdir)/config/avr/avr-devices.c \
$(srcdir)/config/avr/avr-arch.h $(srcdir)/config/avr/avr-arch.h $(TM_H)
$(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $< -o $@ $(CXX_FOR_BUILD) $(CXXFLAGS_FOR_BUILD) $< -o $@ $(INCLUDES)
$(srcdir)/doc/avr-mmcu.texi: gen-avr-mmcu-texi$(build_exeext) $(srcdir)/doc/avr-mmcu.texi: gen-avr-mmcu-texi$(build_exeext)
$(RUN_GEN) ./$< > $@ $(RUN_GEN) ./$< > $@
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment