diff --git a/gcc/config/avr/gen-avr-mmcu-specs.cc b/gcc/config/avr/gen-avr-mmcu-specs.cc index 41ebfa82eb5..ea69145d404 100644 --- a/gcc/config/avr/gen-avr-mmcu-specs.cc +++ b/gcc/config/avr/gen-avr-mmcu-specs.cc @@ -129,62 +129,70 @@ static const bool have_avrxmega3_rodata_in_flash = false; #endif -static void -diagnose_mrodata_in_ram (FILE *f, const char *spec, const avr_mcu_t *mcu) +struct McuInfo { - enum avr_arch_id arch_id = mcu->arch_id; - const avr_arch_t *arch = &avr_arch_types[arch_id]; - const bool is_arch = mcu->macro == NULL; - const bool flmap = (mcu->dev_attribute & AVR_ISA_FLMAP); - const bool have_flmap2 = have_avrxmega2_flmap && arch_id == ARCH_AVRXMEGA2; - const bool have_flmap4 = have_avrxmega4_flmap && arch_id == ARCH_AVRXMEGA4; - const bool have_flmap = flmap && (have_flmap2 || have_flmap4); - - const bool rodata_in_flash = (arch_id == ARCH_AVRTINY - || (arch_id == ARCH_AVRXMEGA3 - && have_avrxmega3_rodata_in_flash)); + enum avr_arch_id arch_id; + const avr_arch_t *arch; + bool is_arch, is_device; + bool flmap, have_flmap2, have_flmap4, have_flmap; + bool rodata_in_flash; // Device name as used by the vendor, extracted from "__AVR___". char mcu_Name[50] = { 0 }; - if (! is_arch) - snprintf (mcu_Name, 1 + strlen (mcu->macro) - strlen ("__AVR___"), - "%s", mcu->macro + strlen ("__AVR_")); + McuInfo (const avr_mcu_t *mcu) + : arch_id (mcu->arch_id), arch (& avr_arch_types[arch_id]), + is_arch (mcu->macro == NULL), is_device (! is_arch), + flmap (mcu->dev_attribute & AVR_ISA_FLMAP), + have_flmap2 (have_avrxmega2_flmap && arch_id == ARCH_AVRXMEGA2), + have_flmap4 (have_avrxmega4_flmap && arch_id == ARCH_AVRXMEGA4), + have_flmap (flmap && (have_flmap2 || have_flmap4)), + rodata_in_flash (arch_id == ARCH_AVRTINY + || (arch_id == ARCH_AVRXMEGA3 + && have_avrxmega3_rodata_in_flash)) + { + if (is_device) + snprintf (mcu_Name, 1 + strlen (mcu->macro) - strlen ("__AVR_" "__"), + "%s", mcu->macro + strlen ("__AVR_")); + } +}; + + +static void +diagnose_mrodata_in_ram (FILE *f, const char *spec, const avr_mcu_t *mcu, + const McuInfo &mi) +{ fprintf (f, "%s:\n", spec); - if (rodata_in_flash && is_arch) + if (mi.rodata_in_flash && mi.is_arch) fprintf (f, "\t%%{mrodata-in-ram: %%e-mrodata-in-ram is not supported" " for %s}", mcu->name); - else if (rodata_in_flash) + else if (mi.rodata_in_flash) fprintf (f, "\t%%{mrodata-in-ram: %%e-mrodata-in-ram is not supported" - " for %s (arch=%s)}", mcu_Name, arch->name); - else if (is_arch) + " for %s (arch=%s)}", mi.mcu_Name, mi.arch->name); + else if (mi.is_arch) { - if (! have_flmap2 && ! have_flmap4) + if (! mi.have_flmap2 && ! mi.have_flmap4) fprintf (f, "\t%%{mno-rodata-in-ram: %%e-mno-rodata-in-ram is not" " supported for %s}", mcu->name); } - else if (! have_flmap) + else if (! mi.have_flmap) fprintf (f, "\t%%{mno-rodata-in-ram: %%e-mno-rodata-in-ram is not supported" - " for %s (arch=%s)}", mcu_Name, arch->name); + " for %s (arch=%s)}", mi.mcu_Name, mi.arch->name); fprintf (f, "\n\n"); } static void -print_mcu (const avr_mcu_t *mcu) +print_mcu (const avr_mcu_t *mcu, const McuInfo &mi) { const char *sp8_spec; const char *rcall_spec; const avr_mcu_t *arch_mcu; - const avr_arch_t *arch; - enum avr_arch_id arch_id = mcu->arch_id; for (arch_mcu = mcu; arch_mcu->macro; ) arch_mcu--; - if (arch_mcu->arch_id != arch_id) + if (arch_mcu->arch_id != mi.arch_id) exit (EXIT_FAILURE); - arch = &avr_arch_types[arch_id]; - char name[100]; if (snprintf (name, sizeof name, "specs-%s", mcu->name) >= (int) sizeof name) exit (EXIT_FAILURE); @@ -196,29 +204,26 @@ print_mcu (const avr_mcu_t *mcu) bool rmw = (mcu->dev_attribute & AVR_ISA_RMW) != 0; bool sp8 = (mcu->dev_attribute & AVR_SHORT_SP) != 0; bool rcall = (mcu->dev_attribute & AVR_ISA_RCALL); - bool flmap = (mcu->dev_attribute & AVR_ISA_FLMAP); - bool is_arch = mcu->macro == NULL; - bool is_device = ! is_arch; int rodata_pm_offset = 0; int pm_base_address = 0; - if (arch->flash_pm_offset + if (mi.arch->flash_pm_offset && mcu->flash_pm_offset - && mcu->flash_pm_offset != arch->flash_pm_offset) + && mcu->flash_pm_offset != mi.arch->flash_pm_offset) { rodata_pm_offset = mcu->flash_pm_offset; } - if (arch->flash_pm_offset) + if (mi.arch->flash_pm_offset) { pm_base_address = mcu->flash_pm_offset ? mcu->flash_pm_offset - : arch->flash_pm_offset; + : mi.arch->flash_pm_offset; } - if (is_arch - && (ARCH_AVR2 == arch_id - || ARCH_AVR25 == arch_id)) + if (mi.is_arch + && (ARCH_AVR2 == mi.arch_id + || ARCH_AVR25 == mi.arch_id)) { // Leave "avr2" and "avr25" alone. These two architectures are // the only ones that mix devices with 8-bit SP and 16-bit SP. @@ -229,8 +234,8 @@ print_mcu (const avr_mcu_t *mcu) sp8_spec = sp8 ? "-msp8" :"%name); + if (mi.is_arch) + fprintf (f, "core architecture %s\n", mi.arch->name); else - fprintf (f, "device %s (core %s, %d-bit SP%s%s)\n", mcu->name, - arch->name, sp8 ? 8 : 16, rcall ? ", short-calls" : "", - have_flmap ? ", FLMAP" : ""); + fprintf (f, "device %s (core %s, %d-bit SP%s%s)\n", mi.mcu_Name, + mi.arch->name, sp8 ? 8 : 16, rcall ? ", short-calls" : "", + mi.have_flmap ? ", FLMAP" : ""); fprintf (f, "%s\n", header); - if (is_device) + if (mi.is_device) fprintf (f, "%s\n", help_copy_paste); #if defined (WITH_AVRLIBC) // AVR-LibC specific. See avrlibc.h for the specs using them as subspecs. - if (is_device) + if (mi.is_device) { fprintf (f, "*avrlibc_startfile:\n"); fprintf (f, "\tcrt%s.o%%s", mcu->name); @@ -280,7 +282,7 @@ print_mcu (const avr_mcu_t *mcu) #endif // WITH_AVRLIBC // Diagnose usage of -m[no-]rodata-in-ram. - diagnose_mrodata_in_ram (f, "*check_rodata_in_ram", mcu); + diagnose_mrodata_in_ram (f, "*check_rodata_in_ram", mcu, mi); // avr-gcc specific specs for the compilation / the compiler proper. @@ -306,7 +308,7 @@ print_mcu (const avr_mcu_t *mcu) // avr-gcc specific specs for assembling / the assembler. - fprintf (f, "*asm_arch:\n\t-mmcu=%s\n\n", arch->name); + fprintf (f, "*asm_arch:\n\t-mmcu=%s\n\n", mi.arch->name); #ifdef HAVE_AS_AVR_MLINK_RELAX_OPTION fprintf (f, "*asm_relax:\n\t%s\n\n", ASM_RELAX_SPEC); @@ -346,16 +348,16 @@ print_mcu (const avr_mcu_t *mcu) fprintf (f, "*link_relax:\n\t%s\n\n", LINK_RELAX_SPEC); fprintf (f, "*link_arch:\n\t%s", link_arch_spec); - if (is_device + if (mi.is_device && rodata_pm_offset) fprintf (f, " --defsym=__RODATA_PM_OFFSET__=0x%x", rodata_pm_offset); fprintf (f, "\n\n"); - if (is_device) + if (mi.is_device) { fprintf (f, "*link_data_start:\n"); if (mcu->data_section_start - != arch->default_data_section_start) + != mi.arch->default_data_section_start) fprintf (f, "\t%%{!Tdata:-Tdata 0x%lX}", 0x800000UL + mcu->data_section_start); fprintf (f, "\n\n"); @@ -371,10 +373,10 @@ print_mcu (const avr_mcu_t *mcu) // Specs known to GCC. - if (is_device) + if (mi.is_device) { fprintf (f, "*self_spec:\n"); - fprintf (f, "\t%%name); + fprintf (f, "\t%%name); fprintf (f, "%s ", flmap_spec); fprintf (f, "%s ", rcall_spec); fprintf (f, "%s\n\n", sp8_spec); @@ -394,18 +396,15 @@ print_mcu (const avr_mcu_t *mcu) fprintf (f, " -U__AVR_PM_BASE_ADDRESS__"); fprintf (f, " -D__AVR_PM_BASE_ADDRESS__=0x%x", pm_base_address); } - if (have_flmap) + if (mi.have_flmap) fprintf (f, " -D__AVR_HAVE_FLMAP__"); fprintf (f, "\n\n"); // *cpp_mcu - const bool rodata_in_flash = (arch_id == ARCH_AVRTINY - || (arch_id == ARCH_AVRXMEGA3 - && have_avrxmega3_rodata_in_flash)); fprintf (f, "*cpp_rodata_in_ram:\n\t-D__AVR_RODATA_IN_RAM__="); - if (rodata_in_flash) + if (mi.rodata_in_flash) fprintf (f, "0"); - else if (! have_flmap) + else if (! mi.have_flmap) fprintf (f, "1"); else fprintf (f, "%%{!mrodata-in-ram:%%{!mno-rodata-in-ram:0}}" @@ -429,7 +428,7 @@ print_mcu (const avr_mcu_t *mcu) int main (void) { for (const avr_mcu_t *mcu = avr_mcu_types; mcu->name; mcu++) - print_mcu (mcu); + print_mcu (mcu, McuInfo (mcu)); return EXIT_SUCCESS; }