diff mbox series

[avr,applied] Tidy up gen-avr-mmcu-specs.cc

Message ID d020c46f-0778-48e7-8d5e-d72f6f2cfe7d@gjlay.de
State New
Headers show
Series [avr,applied] Tidy up gen-avr-mmcu-specs.cc | expand

Commit Message

Georg-Johann Lay Feb. 8, 2024, 1:15 p.m. UTC
This patchlet tidies up gen-avr-mmcu-specs.cc.
Some information was computed more than once, in different
functions. The patch uses a new struct to pass around information.

Johann

AVR: Tidy up gen-avr-mmcu-specs.cc

gcc/
	* config/avr/gen-avr-mmcu-specs.cc (struct McuInfo): New.
	(main, print_mcu, diagnose_mrodata_in_ram): Pass it down.

--
diff mbox series

Patch

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_<Name>__".
   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" :"%<msp8";
     }
 
-  if (is_arch
-      && ARCH_AVRXMEGA3 == arch_id)
+  if (mi.is_arch
+      && ARCH_AVRXMEGA3 == mi.arch_id)
     {
       // Leave "avrxmega3" alone.  This architectures is the only one
       // that mixes devices with and without JMP / CALL.
@@ -241,33 +246,30 @@  print_mcu (const avr_mcu_t *mcu)
       rcall_spec = rcall ? "-mshort-calls" : "%<mshort-calls";
     }
 
-  const char *flmap_spec = flmap ? "-mflmap" : "%<mflmap";
+  const char *flmap_spec = mi.flmap ? "-mflmap" : "%<mflmap";
   const char *link_arch_spec = "%{mmcu=*:-m%*}";
   const char *link_arch_flmap_spec = "%{mmcu=*:-m%*%{!mrodata-in-ram:_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);
 
-  if (have_flmap)
+  if (mi.have_flmap)
     link_arch_spec = link_arch_flmap_spec;
 
   fprintf (f, "#\n"
 	   "# Auto-generated specs for AVR ");
-  if (is_arch)
-    fprintf (f, "core architecture %s\n", arch->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%%<mmcu=* -mmcu=%s ", arch->name);
+      fprintf (f, "\t%%<mmcu=* -mmcu=%s ", mi.arch->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;
 }