/* Copyright (C) 1998-2014 Free Software Foundation, Inc. Contributed by Joern Rennecke 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 . */ #include #include #include #define IN_GEN_AVR_MMCU_TEXI #include "avr-arch.h" #include "avr-devices.c" static void print_mcu (const avr_mcu_t *mcu) { const avr_mcu_t *arch_mcu; for (arch_mcu = mcu; arch_mcu->macro; ) arch_mcu--; if (arch_mcu->arch != mcu->arch) exit (EXIT_FAILURE); char name[100]; if (snprintf (name, sizeof name, "specs-%s", mcu->name) >= 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. */ if (mcu->macro == NULL && (mcu->arch == ARCH_AVR2 || mcu->arch == ARCH_AVR25)) sp8 = ""; sp8 = ((mcu->dev_attribute & AVR_SHORT_SP) ? " -msp8" : " %dev_attribute & AVR_ERRATA_SKIP) ? " -mskip-bug" : ""; rmw = (mcu->dev_attribute & AVR_ISA_RMW) ? "%%{!mno-rmw: -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); 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); 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); 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%%*}"); 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, " %%{shared:%%eshared is not supported}\n\n"); 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) { fprintf (f, "-lc"); if (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"); fprintf (f, "\n\n"); fprintf (f, "*startfile:\ndev/%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++) print_mcu (mcu); return EXIT_SUCCESS; }