Patchwork [AVR,4.5] Fix PR45261: gcc does not indicate failure status on unsupported MCU

login
register
mail settings
Submitter Georg-Johann Lay
Date Feb. 28, 2011, 10:22 a.m.
Message ID <4D6B7769.9090803@gjlay.de>
Download mbox | patch
Permalink /patch/84770/
State New
Headers show

Comments

Georg-Johann Lay - Feb. 28, 2011, 10:22 a.m.
This is a backport to gcc-4.5-branch to fix PR45261


2011-02-28  Georg-Johann Lay  <avr@gjlay.de>

	PR target/45261
	* config/avr/avr.c (avr_option_override): Use error on bad options.
	(avr_help): New function.
	(TARGET_HELP): Define.
Denis Chertykov - Feb. 28, 2011, 5:13 p.m.
2011/2/28 Georg-Johann Lay <avr@gjlay.de>:
> This is a backport to gcc-4.5-branch to fix PR45261
>
>
> 2011-02-28  Georg-Johann Lay  <avr@gjlay.de>
>
>        PR target/45261
>        * config/avr/avr.c (avr_option_override): Use error on bad options.
>        (avr_help): New function.
>        (TARGET_HELP): Define.
>

Applied.

Denis.

Patch

Index: config/avr/avr.c
===================================================================
--- config/avr/avr.c	(revision 170557)
+++ config/avr/avr.c	(working copy)
@@ -91,6 +91,7 @@  static bool avr_hard_regno_scratch_ok (u
 static unsigned int avr_case_values_threshold (void);
 static bool avr_frame_pointer_required_p (void);
 static bool avr_can_eliminate (const int, const int);
+static void avr_help (void);
 
 /* Allocate registers from r25 to r8 for parameters for function calls.  */
 #define FIRST_CUM_REG 26
@@ -192,6 +193,9 @@  static const struct attribute_spec avr_a
 #undef TARGET_CAN_ELIMINATE
 #define TARGET_CAN_ELIMINATE avr_can_eliminate
 
+#undef TARGET_HELP
+#define TARGET_HELP avr_help
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 void
@@ -207,10 +211,8 @@  avr_override_options (void)
 
   if (!t->name)
     {
-      fprintf (stderr, "unknown MCU '%s' specified\nKnown MCU names:\n",
-	       avr_mcu_name);
-      for (t = avr_mcu_types; t->name; t++)
-	fprintf (stderr,"   %s\n", t->name);
+      error ("unrecognized argument to -mmcu= option: %qs", avr_mcu_name);
+      inform (input_location,  "See --target-help for supported MCUs");
     }
 
   avr_current_device = t;
@@ -223,6 +225,42 @@  avr_override_options (void)
   init_machine_status = avr_init_machine_status;
 }
 
+/* Implement TARGET_HELP */
+/* Report extra information for --target-help */
+
+static void
+avr_help (void)
+{
+  const struct mcu_type_s *t;
+  const char * const indent = "  ";
+  int len;
+
+  /* Give a list of MCUs that are accepted by -mmcu=* .
+     Note that MCUs supported by the compiler might differ from
+     MCUs supported by binutils. */
+
+  len = strlen (indent);
+  printf ("Known MCU names:\n%s", indent);
+
+  /* Print a blank-separated list of all supported MCUs */
+
+  for (t = avr_mcu_types; t->name; t++)
+    {
+      printf ("%s ", t->name);
+      len += 1 + strlen (t->name);
+
+      /* Break long lines */
+      
+      if (len > 66 && (t+1)->name)
+        {
+          printf ("\n%s", indent);
+          len = strlen (indent);
+        }
+    }
+
+  printf ("\n\n");
+}
+
 /*  return register class from register number.  */
 
 static const enum reg_class reg_class_tab[]={