Patchwork Remove TARGET_HELP hook

login
register
mail settings
Submitter Joseph S. Myers
Date June 20, 2011, 3:46 p.m.
Message ID <Pine.LNX.4.64.1106201544450.16125@digraph.polyomino.org.uk>
Download mbox | patch
Permalink /patch/101141/
State New
Headers show

Comments

Joseph S. Myers - June 20, 2011, 3:46 p.m.
When moving hooks used in opts.c to the common hooks structure so they
can be called from the driver, I did not move the TARGET_HELP hook
because this hook is obsoleted by the generic Enum .opt facility (only
being used to print list of enumerated arguments to options).
Instead, this patch converts the one remaining target with a
TARGET_HELP implementation, AVR, to use Enum for the relevant option
(with a .def file in the same style as various other targets), and
removes and poisons the hook.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu, and
tested building cc1 and xgcc for cross to avr-elf.  Will common to
trunk in the absence of target maintainer objections.

contrib:
2011-06-20  Joseph Myers  <joseph@codesourcery.com>

	* gcc_update (gcc/config/avr/avr-tables.opt): New dependencies.

gcc:
2011-06-20  Joseph Myers  <joseph@codesourcery.com>

	* config/avr/avr-mcus.def, config/avr/genopt.sh: New files.
	* config/avr/avr-tables.opt: New file (generated).
	* config.gcc (avr-*-*): Use avr/avr-tables.opt.
	* config/avr/avr-devices.c (avr_mcu_types): Move contents to
	avr-mcus.def.
	* config/avr/avr.c (avr_help, TARGET_HELP): Remove.
	(avr_option_override): Don't process -mmcu= argument here.  Set
	avr_current_device using avr_mcu_index.
	(avr_file_start): Use avr_current_device->name instead of
	avr_mcu_name.
	* config/avr/avr.opt (mmcu=): Use Enum.
	* config/avr/t-avr (avr-devices.o): Update dependencies.
	($(srcdir)/config/avr/avr-tables.opt): New.
	* target.def (help): Remove.
	* doc/tm.texi.in (TARGET_HELP): Remove.
	* doc/tm.texi: Regenerate.
	* opts.c: Don't include target.h.
	(common_handle_option): Don't call targetm.help.
	* system.h (TARGET_HELP): Poison.
	* Makefile.in (opts.o): Update dependencies.
Weddington, Eric - June 20, 2011, 4:39 p.m.
> -----Original Message-----
> From: Joseph Myers [mailto:joseph@codesourcery.com]
> Sent: Monday, June 20, 2011 9:47 AM
> To: gcc-patches@gcc.gnu.org
> Cc: chertykov@gmail.com; aesok@post.ru; Weddington, Eric
> Subject: Remove TARGET_HELP hook
> 
> When moving hooks used in opts.c to the common hooks structure so they
> can be called from the driver, I did not move the TARGET_HELP hook
> because this hook is obsoleted by the generic Enum .opt facility (only
> being used to print list of enumerated arguments to options).
> Instead, this patch converts the one remaining target with a
> TARGET_HELP implementation, AVR, to use Enum for the relevant option
> (with a .def file in the same style as various other targets), and
> removes and poisons the hook.
> 
> Bootstrapped with no regressions on x86_64-unknown-linux-gnu, and
> tested building cc1 and xgcc for cross to avr-elf.  Will common to
> trunk in the absence of target maintainer objections.

I assume that this new method still prints out the avr mcu list in a similar fashion?

I have no overwhelming objections. Though I'd rather wait a little to see if either Denis or Anatoly have any objections.

Thanks for doing this work, Joseph.

Eric
Denis Chertykov - June 20, 2011, 4:53 p.m.
2011/6/20 Weddington, Eric <Eric.Weddington@atmel.com>:
>
>
>> -----Original Message-----
>> From: Joseph Myers [mailto:joseph@codesourcery.com]
>> Sent: Monday, June 20, 2011 9:47 AM
>> To: gcc-patches@gcc.gnu.org
>> Cc: chertykov@gmail.com; aesok@post.ru; Weddington, Eric
>> Subject: Remove TARGET_HELP hook
>>
>> When moving hooks used in opts.c to the common hooks structure so they
>> can be called from the driver, I did not move the TARGET_HELP hook
>> because this hook is obsoleted by the generic Enum .opt facility (only
>> being used to print list of enumerated arguments to options).
>> Instead, this patch converts the one remaining target with a
>> TARGET_HELP implementation, AVR, to use Enum for the relevant option
>> (with a .def file in the same style as various other targets), and
>> removes and poisons the hook.
>>
>> Bootstrapped with no regressions on x86_64-unknown-linux-gnu, and
>> tested building cc1 and xgcc for cross to avr-elf.  Will common to
>> trunk in the absence of target maintainer objections.
>
> I assume that this new method still prints out the avr mcu list in a similar fashion?
>
> I have no overwhelming objections. Though I'd rather wait a little to see if either Denis or Anatoly have any objections.
>
> Thanks for doing this work, Joseph.

I can not object to this patch.

Denis.
Joseph S. Myers - June 20, 2011, 4:57 p.m.
On Mon, 20 Jun 2011, Weddington, Eric wrote:

> I assume that this new method still prints out the avr mcu list in a 
> similar fashion?

Yes.  Any enumerated options get such lists printed as long as there is a 
help text on the Enum entry in the .opt file.
Georg-Johann Lay - June 20, 2011, 5:33 p.m.
Joseph S. Myers schrieb:
> When moving hooks used in opts.c to the common hooks structure so they
> can be called from the driver, I did not move the TARGET_HELP hook
> because this hook is obsoleted by the generic Enum .opt facility (only
> being used to print list of enumerated arguments to options).
> Instead, this patch converts the one remaining target with a
> TARGET_HELP implementation, AVR, to use Enum for the relevant option
> (with a .def file in the same style as various other targets), and
> removes and poisons the hook.
> 
> Bootstrapped with no regressions on x86_64-unknown-linux-gnu, and
> tested building cc1 and xgcc for cross to avr-elf.  Will common to
> trunk in the absence of target maintainer objections.
> 
[...]
> Index: gcc/config/avr/avr-tables.opt
> ===================================================================
> --- gcc/config/avr/avr-tables.opt	(revision 0)
> +++ gcc/config/avr/avr-tables.opt	(revision 0)

As it's auto-generated: must it reside in repository?

Johann
Joseph S. Myers - June 20, 2011, 7:20 p.m.
On Mon, 20 Jun 2011, Georg-Johann Lay wrote:

> > Index: gcc/config/avr/avr-tables.opt
> > ===================================================================
> > --- gcc/config/avr/avr-tables.opt	(revision 0)
> > +++ gcc/config/avr/avr-tables.opt	(revision 0)
> 
> As it's auto-generated: must it reside in repository?

The machinery for selecting .opt files to use and for using them (both in 
the compiler and in .pot generation) expects them all to be in the source 
directory.
Weddington, Eric - June 20, 2011, 9:02 p.m.
> -----Original Message-----
> From: Joseph Myers [mailto:joseph@codesourcery.com]
> Sent: Monday, June 20, 2011 1:20 PM
> To: Georg-Johann Lay
> Cc: gcc-patches@gcc.gnu.org; chertykov@gmail.com; aesok@post.ru;
> Weddington, Eric
> Subject: Re: Remove TARGET_HELP hook
> 
> On Mon, 20 Jun 2011, Georg-Johann Lay wrote:
> 
> > > Index: gcc/config/avr/avr-tables.opt
> > > ===================================================================
> > > --- gcc/config/avr/avr-tables.opt	(revision 0)
> > > +++ gcc/config/avr/avr-tables.opt	(revision 0)
> >
> > As it's auto-generated: must it reside in repository?
> 
> The machinery for selecting .opt files to use and for using them (both in
> the compiler and in .pot generation) expects them all to be in the source
> directory.

Right. So, as I understand it, when we add a new device, we run the shell script to regenerate the .opt file and commit the updated file, correct?
Joseph S. Myers - June 20, 2011, 10:02 p.m.
On Mon, 20 Jun 2011, Weddington, Eric wrote:

> > > As it's auto-generated: must it reside in repository?
> > 
> > The machinery for selecting .opt files to use and for using them (both in
> > the compiler and in .pot generation) expects them all to be in the source
> > directory.
> 
> Right. So, as I understand it, when we add a new device, we run the 
> shell script to regenerate the .opt file and commit the updated file, 
> correct?

Yes - and the makefile rules will regenerate the .opt file without you 
needing to run the script manually, but you do need to commit the updated 
file.
Weddington, Eric - June 20, 2011, 10:16 p.m.
> -----Original Message-----
> From: Joseph Myers [mailto:joseph@codesourcery.com]
> Sent: Monday, June 20, 2011 4:03 PM
> To: Weddington, Eric
> Cc: Georg-Johann Lay; gcc-patches@gcc.gnu.org; chertykov@gmail.com;
> aesok@post.ru
> Subject: RE: Remove TARGET_HELP hook
> 
> On Mon, 20 Jun 2011, Weddington, Eric wrote:

> > Right. So, as I understand it, when we add a new device, we run the
> > shell script to regenerate the .opt file and commit the updated file,
> > correct?
> 
> Yes - and the makefile rules will regenerate the .opt file without you
> needing to run the script manually, but you do need to commit the updated
> file.

Thanks for the explanation.

Eric

Patch

Index: contrib/gcc_update
===================================================================
--- contrib/gcc_update	(revision 175148)
+++ contrib/gcc_update	(working copy)
@@ -81,6 +81,7 @@  gcc/config.in: gcc/cstamp-h.in
 gcc/fixinc/fixincl.x: gcc/fixinc/fixincl.tpl gcc/fixinc/inclhack.def
 gcc/config/arm/arm-tune.md: gcc/config/arm/arm-cores.def gcc/config/arm/gentune.sh
 gcc/config/arm/arm-tables.opt: gcc/config/arm/arm-arches.def gcc/config/arm/arm-cores.def gcc/config/arm/arm-fpus.def gcc/config/arm/genopt.sh
+gcc/config/avr/avr-tables.opt: gcc/config/avr/avr-mcus.def gcc/config/avr/genopt.sh
 gcc/config/m68k/m68k-tables.opt: gcc/config/m68k/m68k-devices.def gcc/config/m68k/m68k-isas.def gcc/config/m68k/m68k-microarchs.def gcc/config/m68k/genopt.sh
 gcc/config/mips/mips-tables.opt: gcc/config/mips/mips-cpus.def gcc/config/mips/genopt.sh
 gcc/config/rs6000/rs6000-tables.opt: gcc/config/rs6000/rs6000-cpus.def gcc/config/rs6000/genopt.sh
Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi	(revision 175148)
+++ gcc/doc/tm.texi	(working copy)
@@ -766,13 +766,6 @@  Set target-dependent initial values of f
 Set target-dependent default values for @option{--param} settings, using calls to @code{set_default_param_value}.
 @end deftypefn
 
-@deftypefn {Target Hook} void TARGET_HELP (void)
-This hook is called in response to the user invoking
-@option{--target-help} on the command line.  It gives the target a
-chance to display extra information on the target specific command
-line options found in its @file{.opt} file.
-@end deftypefn
-
 @defmac SWITCHABLE_TARGET
 Some targets need to switch between substantially different subtargets
 during compilation.  For example, the MIPS target has one subtarget for
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in	(revision 175148)
+++ gcc/doc/tm.texi.in	(working copy)
@@ -754,13 +754,6 @@  options are changed via @code{#pragma GC
 
 @hook TARGET_OPTION_DEFAULT_PARAMS
 
-@hook TARGET_HELP
-This hook is called in response to the user invoking
-@option{--target-help} on the command line.  It gives the target a
-chance to display extra information on the target specific command
-line options found in its @file{.opt} file.
-@end deftypefn
-
 @defmac SWITCHABLE_TARGET
 Some targets need to switch between substantially different subtargets
 during compilation.  For example, the MIPS target has one subtarget for
Index: gcc/target.def
===================================================================
--- gcc/target.def	(revision 175148)
+++ gcc/target.def	(working copy)
@@ -1021,13 +1021,6 @@  DEFHOOK
  void, (void),
  hook_void_void)
 
-/* Display extra, target specific information in response to a
-   --target-help switch.  */
-DEFHOOK
-(help,
- "",
- void, (void), NULL)
-
 DEFHOOK_UNDOC
 (eh_return_filter_mode,
  "Return machine mode for filter value.",
Index: gcc/opts.c
===================================================================
--- gcc/opts.c	(revision 175148)
+++ gcc/opts.c	(working copy)
@@ -34,7 +34,6 @@  along with GCC; see the file COPYING3.  
 #include "diagnostic.h"
 #include "opts-diagnostic.h"
 #include "insn-attr.h"		/* For INSN_SCHEDULING and DELAY_SLOTS.  */
-#include "target.h"
 #include "common/common-target.h"
 
 /* Parse the -femit-struct-debug-detailed option value
@@ -1269,10 +1268,6 @@  common_handle_option (struct gcc_options
     case OPT__target_help:
       print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask);
       opts->x_exit_after_options = true;
-
-      /* Allow the target a chance to give the user some additional information.  */
-      if (targetm.help)
-	targetm.help ();
       break;
 
     case OPT__help_:
Index: gcc/system.h
===================================================================
--- gcc/system.h	(revision 175148)
+++ gcc/system.h	(working copy)
@@ -839,7 +839,7 @@  extern void fancy_abort (const char *, i
 	TARGET_PROMOTE_FUNCTION_ARGS TARGET_PROMOTE_FUNCTION_RETURN \
 	LANG_HOOKS_MISSING_ARGUMENT LANG_HOOKS_HASH_TYPES \
 	TARGET_HANDLE_OFAST TARGET_OPTION_OPTIMIZATION \
-        TARGET_IRA_COVER_CLASSES
+        TARGET_IRA_COVER_CLASSES TARGET_HELP
 
 /* Hooks into libgcc2.  */
  #pragma GCC poison LIBGCC2_DOUBLE_TYPE_SIZE LIBGCC2_WORDS_BIG_ENDIAN \
Index: gcc/config.gcc
===================================================================
--- gcc/config.gcc	(revision 175148)
+++ gcc/config.gcc	(working copy)
@@ -318,6 +318,7 @@  avr-*-*)
 	cpu_type=avr
 	c_target_objs="avr-c.o"
 	cxx_target_objs="avr-c.o"
+	extra_options="${extra_options} avr/avr-tables.opt"
 	;;
 bfin*-*)
 	cpu_type=bfin
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in	(revision 175148)
+++ gcc/Makefile.in	(working copy)
@@ -2842,7 +2842,7 @@  diagnostic.o : diagnostic.c $(CONFIG_H) 
    version.h $(INPUT_H) intl.h $(DIAGNOSTIC_H) diagnostic.def
 opts.o : opts.c $(OPTS_H) $(OPTIONS_H) $(DIAGNOSTIC_CORE_H) $(CONFIG_H) $(SYSTEM_H) \
    coretypes.h $(TM_H) $(RTL_H) \
-   $(DIAGNOSTIC_H) $(INSN_ATTR_H) intl.h $(TARGET_H) $(COMMON_TARGET_H) \
+   $(DIAGNOSTIC_H) $(INSN_ATTR_H) intl.h $(COMMON_TARGET_H) \
    $(FLAGS_H) $(PARAMS_H) opts-diagnostic.h
 opts-global.o : opts-global.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
    $(DIAGNOSTIC_H) $(OPTS_H) $(FLAGS_H) $(GGC_H) $(TREE_H) langhooks.h \
Index: gcc/config/avr/avr.opt
===================================================================
--- gcc/config/avr/avr.opt	(revision 175148)
+++ gcc/config/avr/avr.opt	(working copy)
@@ -1,6 +1,6 @@ 
 ; Options for the ATMEL AVR port of the compiler.
 
-; Copyright (C) 2005, 2007, 2008, 2010 Free Software Foundation, Inc.
+; Copyright (C) 2005, 2007, 2008, 2010, 2011 Free Software Foundation, Inc.
 ;
 ; This file is part of GCC.
 ;
@@ -23,7 +23,7 @@  Target Report Mask(CALL_PROLOGUES)
 Use subroutines for function prologues and epilogues
 
 mmcu=
-Target RejectNegative Joined Var(avr_mcu_name) Init("avr2")
+Target RejectNegative Joined Var(avr_mcu_index) Init(0) Enum(avr_mcu)
 -mmcu=MCU	Select the target MCU
 
 mdeb
Index: gcc/config/avr/t-avr
===================================================================
--- gcc/config/avr/t-avr	(revision 175148)
+++ gcc/config/avr/t-avr	(working copy)
@@ -1,5 +1,5 @@ 
 # Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
-# 2009, 2010 Free Software Foundation, Inc.
+# 2009, 2010, 2011 Free Software Foundation, Inc.
 #
 # This file is part of GCC.
 #
@@ -22,6 +22,7 @@  driver-avr.o: $(srcdir)/config/avr/drive
 	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
 
 avr-devices.o: $(srcdir)/config/avr/avr-devices.c \
+  $(srcdir)/config/avr/avr-mcus.def \
   $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H)
 	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
 
@@ -29,6 +30,10 @@  avr-c.o: $(srcdir)/config/avr/avr-c.c \
   $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(C_COMMON_H)
 	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
 
+$(srcdir)/config/avr/avr-tables.opt: $(srcdir)/config/avr/genopt.sh \
+  $(srcdir)/config/avr/avr-mcus.def
+	$(SHELL) $(srcdir)/config/avr/genopt.sh $(srcdir)/config/avr > \
+		$(srcdir)/config/avr/avr-tables.opt
 
 LIB1ASMSRC = avr/libgcc.S
 LIB1ASMFUNCS = \
Index: gcc/config/avr/avr-devices.c
===================================================================
--- gcc/config/avr/avr-devices.c	(revision 175148)
+++ gcc/config/avr/avr-devices.c	(working copy)
@@ -39,190 +39,11 @@  const struct base_arch_s avr_arch_types[
   { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0x0060, "__AVR_ARCH__=6",   "avr6" }
 };
 
-/* List of all known AVR MCU types - if updated, it has to be kept
-   in sync in several places (FIXME: is there a better way?):
-    - here;
-    - t-avr (MULTILIB_MATCHES);
-    - gas/config/tc-avr.c;
-    - avr-libc.  */
-
 const struct mcu_type_s avr_mcu_types[] = {
-    /* Classic, <= 8K.  */
-  { "avr2",                 ARCH_AVR2, NULL,                        0, 0x0060, "s8515" },
-  { "at90s2313",            ARCH_AVR2, "__AVR_AT90S2313__",         1, 0x0060, "s2313" },
-  { "at90s2323",            ARCH_AVR2, "__AVR_AT90S2323__",         1, 0x0060, "s2323" },
-  { "at90s2333",            ARCH_AVR2, "__AVR_AT90S2333__",         1, 0x0060, "s2333" },
-  { "at90s2343",            ARCH_AVR2, "__AVR_AT90S2343__",         1, 0x0060, "s2343" },
-  { "attiny22",             ARCH_AVR2, "__AVR_ATtiny22__",          1, 0x0060, "tn22" },
-  { "attiny26",             ARCH_AVR2, "__AVR_ATtiny26__",          1, 0x0060, "tn26" },
-  { "at90s4414",            ARCH_AVR2, "__AVR_AT90S4414__",         0, 0x0060, "s4414" },
-  { "at90s4433",            ARCH_AVR2, "__AVR_AT90S4433__",         1, 0x0060, "s4433" },
-  { "at90s4434",            ARCH_AVR2, "__AVR_AT90S4434__",         0, 0x0060, "s4434" },
-  { "at90s8515",            ARCH_AVR2, "__AVR_AT90S8515__",         0, 0x0060, "s8515" },
-  { "at90c8534",            ARCH_AVR2, "__AVR_AT90C8534__",         0, 0x0060, "c8534" },
-  { "at90s8535",            ARCH_AVR2, "__AVR_AT90S8535__",         0, 0x0060, "s8535" },
-    /* Classic + MOVW, <= 8K.  */
-  { "avr25",                ARCH_AVR25, NULL,                       0, 0x0060, "tn85" },
-  { "ata6289",              ARCH_AVR25, "__AVR_ATA6289__",          0, 0x0100, "a6289" },
-  { "attiny13",             ARCH_AVR25, "__AVR_ATtiny13__",         1, 0x0060, "tn13" },
-  { "attiny13a",            ARCH_AVR25, "__AVR_ATtiny13A__",        1, 0x0060, "tn13a" },
-  { "attiny2313",           ARCH_AVR25, "__AVR_ATtiny2313__",       1, 0x0060, "tn2313" },
-  { "attiny2313a",          ARCH_AVR25, "__AVR_ATtiny2313A__",      1, 0x0060, "tn2313a" },
-  { "attiny24",             ARCH_AVR25, "__AVR_ATtiny24__",         1, 0x0060, "tn24" },
-  { "attiny24a",            ARCH_AVR25, "__AVR_ATtiny24A__",        1, 0x0060, "tn24a" },
-  { "attiny4313",           ARCH_AVR25, "__AVR_ATtiny4313__",       1, 0x0060, "tn4313" },
-  { "attiny44",             ARCH_AVR25, "__AVR_ATtiny44__",         0, 0x0060, "tn44" },
-  { "attiny44a",            ARCH_AVR25, "__AVR_ATtiny44A__",        0, 0x0060, "tn44a" },
-  { "attiny84",             ARCH_AVR25, "__AVR_ATtiny84__",         0, 0x0060, "tn84" },
-  { "attiny84a",            ARCH_AVR25, "__AVR_ATtiny84A__",        0, 0x0060, "tn84" },
-  { "attiny25",             ARCH_AVR25, "__AVR_ATtiny25__",         1, 0x0060, "tn25" },
-  { "attiny45",             ARCH_AVR25, "__AVR_ATtiny45__",         0, 0x0060, "tn45" },
-  { "attiny85",             ARCH_AVR25, "__AVR_ATtiny85__",         0, 0x0060, "tn85" },
-  { "attiny261",            ARCH_AVR25, "__AVR_ATtiny261__",        1, 0x0060, "tn261" },
-  { "attiny261a",           ARCH_AVR25, "__AVR_ATtiny261A__",       1, 0x0060, "tn261a" },
-  { "attiny461",            ARCH_AVR25, "__AVR_ATtiny461__",        0, 0x0060, "tn461" },
-  { "attiny461a",           ARCH_AVR25, "__AVR_ATtiny461A__",       0, 0x0060, "tn461a" },
-  { "attiny861",            ARCH_AVR25, "__AVR_ATtiny861__",        0, 0x0060, "tn861" },
-  { "attiny861a",           ARCH_AVR25, "__AVR_ATtiny861A__",       0, 0x0060, "tn861a" },
-  { "attiny43u",            ARCH_AVR25, "__AVR_ATtiny43U__",        0, 0x0060, "tn43u" },
-  { "attiny87",             ARCH_AVR25, "__AVR_ATtiny87__",         0, 0x0100, "tn87" },
-  { "attiny48",             ARCH_AVR25, "__AVR_ATtiny48__",         0, 0x0100, "tn48" },
-  { "attiny88",             ARCH_AVR25, "__AVR_ATtiny88__",         0, 0x0100, "tn88" },
-  { "at86rf401",            ARCH_AVR25, "__AVR_AT86RF401__",        1, 0x0060, "86401" },
-    /* Classic, > 8K, <= 64K.  */
-  { "avr3",                 ARCH_AVR3, NULL,                        0, 0x0060, "43355" },
-  { "at43usb355",           ARCH_AVR3, "__AVR_AT43USB355__",        0, 0x0060, "43355" },
-  { "at76c711",             ARCH_AVR3, "__AVR_AT76C711__",          0, 0x0060, "76711" },
-    /* Classic, == 128K.  */
-  { "avr31",                ARCH_AVR31, NULL,                       0, 0x0060, "m103" },
-  { "atmega103",            ARCH_AVR31, "__AVR_ATmega103__",        0, 0x0060, "m103" },
-  { "at43usb320",           ARCH_AVR31, "__AVR_AT43USB320__",       0, 0x0060, "43320" },
-    /* Classic + MOVW + JMP/CALL.  */
-  { "avr35",                ARCH_AVR35, NULL,                       0, 0x0100, "usb162" },
-  { "at90usb82",            ARCH_AVR35, "__AVR_AT90USB82__",        0, 0x0100, "usb82" },
-  { "at90usb162",           ARCH_AVR35, "__AVR_AT90USB162__",       0, 0x0100, "usb162" },
-  { "atmega8u2",            ARCH_AVR35, "__AVR_ATmega8U2__",        0, 0x0100, "m8u2" },
-  { "atmega16u2",           ARCH_AVR35, "__AVR_ATmega16U2__",       0, 0x0100, "m16u2" },
-  { "atmega32u2",           ARCH_AVR35, "__AVR_ATmega32U2__",       0, 0x0100, "m32u2" },
-  { "attiny167",            ARCH_AVR35, "__AVR_ATtiny167__",        0, 0x0100, "tn167" },
-    /* Enhanced, <= 8K.  */
-  { "avr4",                 ARCH_AVR4, NULL,                        0, 0x0060, "m8" },
-  { "atmega8",              ARCH_AVR4, "__AVR_ATmega8__",           0, 0x0060, "m8" },
-  { "atmega48",             ARCH_AVR4, "__AVR_ATmega48__",          0, 0x0100, "m48" },
-  { "atmega48a",            ARCH_AVR4, "__AVR_ATmega48A__",         0, 0x0100, "m48a" },
-  { "atmega48p",            ARCH_AVR4, "__AVR_ATmega48P__",         0, 0x0100, "m48p" },
-  { "atmega88",             ARCH_AVR4, "__AVR_ATmega88__",          0, 0x0100, "m88" },
-  { "atmega88a",            ARCH_AVR4, "__AVR_ATmega88A__",         0, 0x0100, "m88a" },
-  { "atmega88p",            ARCH_AVR4, "__AVR_ATmega88P__",         0, 0x0100, "m88p" },
-  { "atmega88pa",           ARCH_AVR4, "__AVR_ATmega88PA__",        0, 0x0100, "m88pa" },
-  { "atmega8515",           ARCH_AVR4, "__AVR_ATmega8515__",        0, 0x0060, "m8515" },
-  { "atmega8535",           ARCH_AVR4, "__AVR_ATmega8535__",        0, 0x0060, "m8535" },
-  { "atmega8hva",           ARCH_AVR4, "__AVR_ATmega8HVA__",        0, 0x0100, "m8hva" },
-  { "at90pwm1",             ARCH_AVR4, "__AVR_AT90PWM1__",          0, 0x0100, "90pwm1" },
-  { "at90pwm2",             ARCH_AVR4, "__AVR_AT90PWM2__",          0, 0x0100, "90pwm2" },
-  { "at90pwm2b",            ARCH_AVR4, "__AVR_AT90PWM2B__",         0, 0x0100, "90pwm2b" },
-  { "at90pwm3",             ARCH_AVR4, "__AVR_AT90PWM3__",          0, 0x0100, "90pwm3" },
-  { "at90pwm3b",            ARCH_AVR4, "__AVR_AT90PWM3B__",         0, 0x0100, "90pwm3b" },
-  { "at90pwm81",            ARCH_AVR4, "__AVR_AT90PWM81__",         0, 0x0100, "90pwm81" },
-    /* Enhanced, > 8K, <= 64K.  */
-  { "avr5",                 ARCH_AVR5, NULL,                        0, 0x0060, "m16" },
-  { "atmega16",             ARCH_AVR5, "__AVR_ATmega16__",          0, 0x0060, "m16" },
-  { "atmega16a",            ARCH_AVR5, "__AVR_ATmega16A__",         0, 0x0060, "m16a" },
-  { "atmega161",            ARCH_AVR5, "__AVR_ATmega161__",         0, 0x0060, "m161" },
-  { "atmega162",            ARCH_AVR5, "__AVR_ATmega162__",         0, 0x0100, "m162" },
-  { "atmega163",            ARCH_AVR5, "__AVR_ATmega163__",         0, 0x0060, "m163" },
-  { "atmega164a",           ARCH_AVR5, "__AVR_ATmega164A__",        0, 0x0060, "m164a" },
-  { "atmega164p",           ARCH_AVR5, "__AVR_ATmega164P__",        0, 0x0100, "m164p" },
-  { "atmega165",            ARCH_AVR5, "__AVR_ATmega165__",         0, 0x0100, "m165" },
-  { "atmega165a",           ARCH_AVR5, "__AVR_ATmega165A__",        0, 0x0100, "m165a" },
-  { "atmega165p",           ARCH_AVR5, "__AVR_ATmega165P__",        0, 0x0100, "m165p" },
-  { "atmega168",            ARCH_AVR5, "__AVR_ATmega168__",         0, 0x0100, "m168" },
-  { "atmega168a",           ARCH_AVR5, "__AVR_ATmega168A__",        0, 0x0100, "m168a" },
-  { "atmega168p",           ARCH_AVR5, "__AVR_ATmega168P__",        0, 0x0100, "m168p" },
-  { "atmega169",            ARCH_AVR5, "__AVR_ATmega169__",         0, 0x0100, "m169" },
-  { "atmega169a",           ARCH_AVR5, "__AVR_ATmega169A__",        0, 0x0100, "m169a" },
-  { "atmega169p",           ARCH_AVR5, "__AVR_ATmega169P__",        0, 0x0100, "m169p" },
-  { "atmega169pa",          ARCH_AVR5, "__AVR_ATmega169PA__",       0, 0x0100, "m169pa" },
-  { "atmega32",             ARCH_AVR5, "__AVR_ATmega32__",          0, 0x0060, "m32" },
-  { "atmega323",            ARCH_AVR5, "__AVR_ATmega323__",         0, 0x0060, "m323" },
-  { "atmega324a",           ARCH_AVR5, "__AVR_ATmega324A__",        0, 0x0100, "m324a" },
-  { "atmega324p",           ARCH_AVR5, "__AVR_ATmega324P__",        0, 0x0100, "m324p" },
-  { "atmega324pa",          ARCH_AVR5, "__AVR_ATmega324PA__",       0, 0x0100, "m324pa" },
-  { "atmega325",            ARCH_AVR5, "__AVR_ATmega325__",         0, 0x0100, "m325" },
-  { "atmega325a",           ARCH_AVR5, "__AVR_ATmega325A__",        0, 0x0100, "m325a" },
-  { "atmega325p",           ARCH_AVR5, "__AVR_ATmega325P__",        0, 0x0100, "m325p" },
-  { "atmega3250",           ARCH_AVR5, "__AVR_ATmega3250__",        0, 0x0100, "m3250" },
-  { "atmega3250a",          ARCH_AVR5, "__AVR_ATmega3250A__",       0, 0x0100, "m3250a" },
-  { "atmega3250p",          ARCH_AVR5, "__AVR_ATmega3250P__",       0, 0x0100, "m3250p" },
-  { "atmega328",            ARCH_AVR5, "__AVR_ATmega328__",         0, 0x0100, "m328" },
-  { "atmega328p",           ARCH_AVR5, "__AVR_ATmega328P__",        0, 0x0100, "m328p" },
-  { "atmega329",            ARCH_AVR5, "__AVR_ATmega329__",         0, 0x0100, "m329" },
-  { "atmega329a",           ARCH_AVR5, "__AVR_ATmega329A__",        0, 0x0100, "m329a" },
-  { "atmega329p",           ARCH_AVR5, "__AVR_ATmega329P__",        0, 0x0100, "m329p" },
-  { "atmega329pa",          ARCH_AVR5, "__AVR_ATmega329PA__",       0, 0x0100, "m329pa" },
-  { "atmega3290",           ARCH_AVR5, "__AVR_ATmega3290__",        0, 0x0100, "m3290" },
-  { "atmega3290a",          ARCH_AVR5, "__AVR_ATmega3290A__",       0, 0x0100, "m3290a" },
-  { "atmega3290p",          ARCH_AVR5, "__AVR_ATmega3290P__",       0, 0x0100, "m3290p" },
-  { "atmega406",            ARCH_AVR5, "__AVR_ATmega406__",         0, 0x0100, "m406" },
-  { "atmega64",             ARCH_AVR5, "__AVR_ATmega64__",          0, 0x0100, "m64" },
-  { "atmega640",            ARCH_AVR5, "__AVR_ATmega640__",         0, 0x0200, "m640" },
-  { "atmega644",            ARCH_AVR5, "__AVR_ATmega644__",         0, 0x0100, "m644" },
-  { "atmega644a",           ARCH_AVR5, "__AVR_ATmega644A__",        0, 0x0100, "m644a" },
-  { "atmega644p",           ARCH_AVR5, "__AVR_ATmega644P__",        0, 0x0100, "m644p" },
-  { "atmega644pa",          ARCH_AVR5, "__AVR_ATmega644PA__",       0, 0x0100, "m644pa" },
-  { "atmega645",            ARCH_AVR5, "__AVR_ATmega645__",         0, 0x0100, "m645" },
-  { "atmega645a",           ARCH_AVR5, "__AVR_ATmega645A__",        0, 0x0100, "m645a" },
-  { "atmega645p",           ARCH_AVR5, "__AVR_ATmega645P__",        0, 0x0100, "m645p" },
-  { "atmega6450",           ARCH_AVR5, "__AVR_ATmega6450__",        0, 0x0100, "m6450" },
-  { "atmega6450a",          ARCH_AVR5, "__AVR_ATmega6450A__",       0, 0x0100, "m6450a" },
-  { "atmega6450p",          ARCH_AVR5, "__AVR_ATmega6450P__",       0, 0x0100, "m6450p" },
-  { "atmega649",            ARCH_AVR5, "__AVR_ATmega649__",         0, 0x0100, "m649" },
-  { "atmega649a",           ARCH_AVR5, "__AVR_ATmega649A__",        0, 0x0100, "m649a" },
-  { "atmega649p",           ARCH_AVR5, "__AVR_ATmega649P__",        0, 0x0100, "m649p" },
-  { "atmega6490",           ARCH_AVR5, "__AVR_ATmega6490__",        0, 0x0100, "m6490" },
-  { "atmega16hva",          ARCH_AVR5, "__AVR_ATmega16HVA__",       0, 0x0100, "m16hva" },
-  { "atmega16hva2",         ARCH_AVR5, "__AVR_ATmega16HVA2__",      0, 0x0100, "m16hva2" },
-  { "atmega16hvb",          ARCH_AVR5, "__AVR_ATmega16HVB__",       0, 0x0100, "m16hvb" },
-  { "atmega32hvb",          ARCH_AVR5, "__AVR_ATmega32HVB__",       0, 0x0100, "m32hvb" },
-  { "atmega64hve",          ARCH_AVR5, "__AVR_ATmega64HVE__",       0, 0x0100, "m64hve" },
-  { "at90can32",            ARCH_AVR5, "__AVR_AT90CAN32__",         0, 0x0100, "can32" },
-  { "at90can64",            ARCH_AVR5, "__AVR_AT90CAN64__",         0, 0x0100, "can64" },
-  { "at90pwm216",           ARCH_AVR5, "__AVR_AT90PWM216__",        0, 0x0100, "90pwm216" },
-  { "at90pwm316",           ARCH_AVR5, "__AVR_AT90PWM316__",        0, 0x0100, "90pwm316" },
-  { "atmega32c1",           ARCH_AVR5, "__AVR_ATmega32C1__",        0, 0x0100, "m32c1" },
-  { "atmega64c1",           ARCH_AVR5, "__AVR_ATmega64C1__",        0, 0x0100, "m64c1" },
-  { "atmega16m1",           ARCH_AVR5, "__AVR_ATmega16M1__",        0, 0x0100, "m16m1" },
-  { "atmega32m1",           ARCH_AVR5, "__AVR_ATmega32M1__",        0, 0x0100, "m32m1" },
-  { "atmega64m1",           ARCH_AVR5, "__AVR_ATmega64M1__",        0, 0x0100, "m64m1" },
-  { "atmega16u4",           ARCH_AVR5, "__AVR_ATmega16U4__",        0, 0x0100, "m16u4" },
-  { "atmega32u4",           ARCH_AVR5, "__AVR_ATmega32U4__",        0, 0x0100, "m32u4" },
-  { "atmega32u6",           ARCH_AVR5, "__AVR_ATmega32U6__",        0, 0x0100, "m32u6" },
-  { "at90scr100",           ARCH_AVR5, "__AVR_AT90SCR100__",        0, 0x0100, "90scr100" },
-  { "at90usb646",           ARCH_AVR5, "__AVR_AT90USB646__",        0, 0x0100, "usb646" },
-  { "at90usb647",           ARCH_AVR5, "__AVR_AT90USB647__",        0, 0x0100, "usb647" },
-  { "at94k",                ARCH_AVR5, "__AVR_AT94K__",             0, 0x0060, "at94k" },
-  { "m3000",                ARCH_AVR5, "__AVR_M3000__",             0, 0x1000, "m3000" },
-    /* Enhanced, == 128K.  */
-  { "avr51",                ARCH_AVR51, NULL,                       0, 0x0100, "m128" },
-  { "atmega128",            ARCH_AVR51, "__AVR_ATmega128__",        0, 0x0100, "m128" },
-  { "atmega1280",           ARCH_AVR51, "__AVR_ATmega1280__",       0, 0x0200, "m1280" },
-  { "atmega1281",           ARCH_AVR51, "__AVR_ATmega1281__",       0, 0x0200, "m1281" },
-  { "atmega1284p",          ARCH_AVR51, "__AVR_ATmega1284P__",      0, 0x0100, "m1284p" },
-  { "atmega128rfa1",        ARCH_AVR51, "__AVR_ATmega128RFA1__",    0, 0x0200, "m128rfa1" },
-  { "at90can128",           ARCH_AVR51, "__AVR_AT90CAN128__",       0, 0x0100, "can128" },
-  { "at90usb1286",          ARCH_AVR51, "__AVR_AT90USB1286__",      0, 0x0100, "usb1286" },
-  { "at90usb1287",          ARCH_AVR51, "__AVR_AT90USB1287__",      0, 0x0100, "usb1286" },
-    /* 3-Byte PC.  */
-  { "avr6",                 ARCH_AVR6, NULL,                        0, 0x0200, "m2561" },
-  { "atmega2560",           ARCH_AVR6, "__AVR_ATmega2560__",        0, 0x0200, "m2560" },
-  { "atmega2561",           ARCH_AVR6, "__AVR_ATmega2561__",        0, 0x0200, "m2561" },
-    /* Assembler only.  */
-  { "avr1",                 ARCH_AVR1, NULL,                        0, 0x0060, "s1200" },
-  { "at90s1200",            ARCH_AVR1, "__AVR_AT90S1200__",         0, 0x0060, "s1200" },
-  { "attiny11",             ARCH_AVR1, "__AVR_ATtiny11__",          0, 0x0060, "tn11" },
-  { "attiny12",             ARCH_AVR1, "__AVR_ATtiny12__",          0, 0x0060, "tn12" },
-  { "attiny15",             ARCH_AVR1, "__AVR_ATtiny15__",          0, 0x0060, "tn15" },
-  { "attiny28",             ARCH_AVR1, "__AVR_ATtiny28__",          0, 0x0060, "tn28" },
+#define AVR_MCU(NAME, ARCH, MACRO, SHORT_SP, DATA_SEC, LIBRARY_NAME)	\
+  { NAME, ARCH, MACRO, SHORT_SP, DATA_SEC, LIBRARY_NAME },
+#include "avr-mcus.def"
+#undef AVR_MCU
     /* End of list.  */
   { NULL,                   ARCH_UNKNOWN, NULL,                     0,      0, NULL }
 };
Index: gcc/config/avr/avr-mcus.def
===================================================================
--- gcc/config/avr/avr-mcus.def	(revision 0)
+++ gcc/config/avr/avr-mcus.def	(revision 0)
@@ -0,0 +1,211 @@ 
+/* AVR MCUs.
+   Copyright (C) 2009, 2010, 2011
+   Free Software Foundation, Inc.
+
+   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/>.  */
+
+/* List of all known AVR MCU types - if updated, it has to be kept
+   in sync in several places (FIXME: is there a better way?):
+    - here;
+    - t-avr (MULTILIB_MATCHES);
+    - gas/config/tc-avr.c;
+    - avr-libc.
+
+   Before including this file, define a macro:
+
+   AVR_MCU (NAME, ARCH, MACRO, SHORT_SP, DATA_SEC, LIBRARY_NAME)
+
+   where the arguments are the fields of struct mcu_type_s.  */
+
+/* "avr2" must be first for the "0" default to work as intended.  */
+
+/* Classic, <= 8K.  */
+AVR_MCU ("avr2",                 ARCH_AVR2, NULL,                        0, 0x0060, "s8515")
+AVR_MCU ("at90s2313",            ARCH_AVR2, "__AVR_AT90S2313__",         1, 0x0060, "s2313")
+AVR_MCU ("at90s2323",            ARCH_AVR2, "__AVR_AT90S2323__",         1, 0x0060, "s2323")
+AVR_MCU ("at90s2333",            ARCH_AVR2, "__AVR_AT90S2333__",         1, 0x0060, "s2333")
+AVR_MCU ("at90s2343",            ARCH_AVR2, "__AVR_AT90S2343__",         1, 0x0060, "s2343")
+AVR_MCU ("attiny22",             ARCH_AVR2, "__AVR_ATtiny22__",          1, 0x0060, "tn22")
+AVR_MCU ("attiny26",             ARCH_AVR2, "__AVR_ATtiny26__",          1, 0x0060, "tn26")
+AVR_MCU ("at90s4414",            ARCH_AVR2, "__AVR_AT90S4414__",         0, 0x0060, "s4414")
+AVR_MCU ("at90s4433",            ARCH_AVR2, "__AVR_AT90S4433__",         1, 0x0060, "s4433")
+AVR_MCU ("at90s4434",            ARCH_AVR2, "__AVR_AT90S4434__",         0, 0x0060, "s4434")
+AVR_MCU ("at90s8515",            ARCH_AVR2, "__AVR_AT90S8515__",         0, 0x0060, "s8515")
+AVR_MCU ("at90c8534",            ARCH_AVR2, "__AVR_AT90C8534__",         0, 0x0060, "c8534")
+AVR_MCU ("at90s8535",            ARCH_AVR2, "__AVR_AT90S8535__",         0, 0x0060, "s8535")
+/* Classic + MOVW, <= 8K.  */
+AVR_MCU ("avr25",                ARCH_AVR25, NULL,                       0, 0x0060, "tn85")
+AVR_MCU ("ata6289",              ARCH_AVR25, "__AVR_ATA6289__",          0, 0x0100, "a6289")
+AVR_MCU ("attiny13",             ARCH_AVR25, "__AVR_ATtiny13__",         1, 0x0060, "tn13")
+AVR_MCU ("attiny13a",            ARCH_AVR25, "__AVR_ATtiny13A__",        1, 0x0060, "tn13a")
+AVR_MCU ("attiny2313",           ARCH_AVR25, "__AVR_ATtiny2313__",       1, 0x0060, "tn2313")
+AVR_MCU ("attiny2313a",          ARCH_AVR25, "__AVR_ATtiny2313A__",      1, 0x0060, "tn2313a")
+AVR_MCU ("attiny24",             ARCH_AVR25, "__AVR_ATtiny24__",         1, 0x0060, "tn24")
+AVR_MCU ("attiny24a",            ARCH_AVR25, "__AVR_ATtiny24A__",        1, 0x0060, "tn24a")
+AVR_MCU ("attiny4313",           ARCH_AVR25, "__AVR_ATtiny4313__",       1, 0x0060, "tn4313")
+AVR_MCU ("attiny44",             ARCH_AVR25, "__AVR_ATtiny44__",         0, 0x0060, "tn44")
+AVR_MCU ("attiny44a",            ARCH_AVR25, "__AVR_ATtiny44A__",        0, 0x0060, "tn44a")
+AVR_MCU ("attiny84",             ARCH_AVR25, "__AVR_ATtiny84__",         0, 0x0060, "tn84")
+AVR_MCU ("attiny84a",            ARCH_AVR25, "__AVR_ATtiny84A__",        0, 0x0060, "tn84")
+AVR_MCU ("attiny25",             ARCH_AVR25, "__AVR_ATtiny25__",         1, 0x0060, "tn25")
+AVR_MCU ("attiny45",             ARCH_AVR25, "__AVR_ATtiny45__",         0, 0x0060, "tn45")
+AVR_MCU ("attiny85",             ARCH_AVR25, "__AVR_ATtiny85__",         0, 0x0060, "tn85")
+AVR_MCU ("attiny261",            ARCH_AVR25, "__AVR_ATtiny261__",        1, 0x0060, "tn261")
+AVR_MCU ("attiny261a",           ARCH_AVR25, "__AVR_ATtiny261A__",       1, 0x0060, "tn261a")
+AVR_MCU ("attiny461",            ARCH_AVR25, "__AVR_ATtiny461__",        0, 0x0060, "tn461")
+AVR_MCU ("attiny461a",           ARCH_AVR25, "__AVR_ATtiny461A__",       0, 0x0060, "tn461a")
+AVR_MCU ("attiny861",            ARCH_AVR25, "__AVR_ATtiny861__",        0, 0x0060, "tn861")
+AVR_MCU ("attiny861a",           ARCH_AVR25, "__AVR_ATtiny861A__",       0, 0x0060, "tn861a")
+AVR_MCU ("attiny43u",            ARCH_AVR25, "__AVR_ATtiny43U__",        0, 0x0060, "tn43u")
+AVR_MCU ("attiny87",             ARCH_AVR25, "__AVR_ATtiny87__",         0, 0x0100, "tn87")
+AVR_MCU ("attiny48",             ARCH_AVR25, "__AVR_ATtiny48__",         0, 0x0100, "tn48")
+AVR_MCU ("attiny88",             ARCH_AVR25, "__AVR_ATtiny88__",         0, 0x0100, "tn88")
+AVR_MCU ("at86rf401",            ARCH_AVR25, "__AVR_AT86RF401__",        1, 0x0060, "86401")
+/* Classic, > 8K, <= 64K.  */
+AVR_MCU ("avr3",                 ARCH_AVR3, NULL,                        0, 0x0060, "43355")
+AVR_MCU ("at43usb355",           ARCH_AVR3, "__AVR_AT43USB355__",        0, 0x0060, "43355")
+AVR_MCU ("at76c711",             ARCH_AVR3, "__AVR_AT76C711__",          0, 0x0060, "76711")
+/* Classic, == 128K.  */
+AVR_MCU ("avr31",                ARCH_AVR31, NULL,                       0, 0x0060, "m103")
+AVR_MCU ("atmega103",            ARCH_AVR31, "__AVR_ATmega103__",        0, 0x0060, "m103")
+AVR_MCU ("at43usb320",           ARCH_AVR31, "__AVR_AT43USB320__",       0, 0x0060, "43320")
+/* Classic + MOVW + JMP/CALL.  */
+AVR_MCU ("avr35",                ARCH_AVR35, NULL,                       0, 0x0100, "usb162")
+AVR_MCU ("at90usb82",            ARCH_AVR35, "__AVR_AT90USB82__",        0, 0x0100, "usb82")
+AVR_MCU ("at90usb162",           ARCH_AVR35, "__AVR_AT90USB162__",       0, 0x0100, "usb162")
+AVR_MCU ("atmega8u2",            ARCH_AVR35, "__AVR_ATmega8U2__",        0, 0x0100, "m8u2")
+AVR_MCU ("atmega16u2",           ARCH_AVR35, "__AVR_ATmega16U2__",       0, 0x0100, "m16u2")
+AVR_MCU ("atmega32u2",           ARCH_AVR35, "__AVR_ATmega32U2__",       0, 0x0100, "m32u2")
+AVR_MCU ("attiny167",            ARCH_AVR35, "__AVR_ATtiny167__",        0, 0x0100, "tn167")
+/* Enhanced, <= 8K.  */
+AVR_MCU ("avr4",                 ARCH_AVR4, NULL,                        0, 0x0060, "m8")
+AVR_MCU ("atmega8",              ARCH_AVR4, "__AVR_ATmega8__",           0, 0x0060, "m8")
+AVR_MCU ("atmega48",             ARCH_AVR4, "__AVR_ATmega48__",          0, 0x0100, "m48")
+AVR_MCU ("atmega48a",            ARCH_AVR4, "__AVR_ATmega48A__",         0, 0x0100, "m48a")
+AVR_MCU ("atmega48p",            ARCH_AVR4, "__AVR_ATmega48P__",         0, 0x0100, "m48p")
+AVR_MCU ("atmega88",             ARCH_AVR4, "__AVR_ATmega88__",          0, 0x0100, "m88")
+AVR_MCU ("atmega88a",            ARCH_AVR4, "__AVR_ATmega88A__",         0, 0x0100, "m88a")
+AVR_MCU ("atmega88p",            ARCH_AVR4, "__AVR_ATmega88P__",         0, 0x0100, "m88p")
+AVR_MCU ("atmega88pa",           ARCH_AVR4, "__AVR_ATmega88PA__",        0, 0x0100, "m88pa")
+AVR_MCU ("atmega8515",           ARCH_AVR4, "__AVR_ATmega8515__",        0, 0x0060, "m8515")
+AVR_MCU ("atmega8535",           ARCH_AVR4, "__AVR_ATmega8535__",        0, 0x0060, "m8535")
+AVR_MCU ("atmega8hva",           ARCH_AVR4, "__AVR_ATmega8HVA__",        0, 0x0100, "m8hva")
+AVR_MCU ("at90pwm1",             ARCH_AVR4, "__AVR_AT90PWM1__",          0, 0x0100, "90pwm1")
+AVR_MCU ("at90pwm2",             ARCH_AVR4, "__AVR_AT90PWM2__",          0, 0x0100, "90pwm2")
+AVR_MCU ("at90pwm2b",            ARCH_AVR4, "__AVR_AT90PWM2B__",         0, 0x0100, "90pwm2b")
+AVR_MCU ("at90pwm3",             ARCH_AVR4, "__AVR_AT90PWM3__",          0, 0x0100, "90pwm3")
+AVR_MCU ("at90pwm3b",            ARCH_AVR4, "__AVR_AT90PWM3B__",         0, 0x0100, "90pwm3b")
+AVR_MCU ("at90pwm81",            ARCH_AVR4, "__AVR_AT90PWM81__",         0, 0x0100, "90pwm81")
+/* Enhanced, > 8K, <= 64K.  */
+AVR_MCU ("avr5",                 ARCH_AVR5, NULL,                        0, 0x0060, "m16")
+AVR_MCU ("atmega16",             ARCH_AVR5, "__AVR_ATmega16__",          0, 0x0060, "m16")
+AVR_MCU ("atmega16a",            ARCH_AVR5, "__AVR_ATmega16A__",         0, 0x0060, "m16a")
+AVR_MCU ("atmega161",            ARCH_AVR5, "__AVR_ATmega161__",         0, 0x0060, "m161")
+AVR_MCU ("atmega162",            ARCH_AVR5, "__AVR_ATmega162__",         0, 0x0100, "m162")
+AVR_MCU ("atmega163",            ARCH_AVR5, "__AVR_ATmega163__",         0, 0x0060, "m163")
+AVR_MCU ("atmega164a",           ARCH_AVR5, "__AVR_ATmega164A__",        0, 0x0060, "m164a")
+AVR_MCU ("atmega164p",           ARCH_AVR5, "__AVR_ATmega164P__",        0, 0x0100, "m164p")
+AVR_MCU ("atmega165",            ARCH_AVR5, "__AVR_ATmega165__",         0, 0x0100, "m165")
+AVR_MCU ("atmega165a",           ARCH_AVR5, "__AVR_ATmega165A__",        0, 0x0100, "m165a")
+AVR_MCU ("atmega165p",           ARCH_AVR5, "__AVR_ATmega165P__",        0, 0x0100, "m165p")
+AVR_MCU ("atmega168",            ARCH_AVR5, "__AVR_ATmega168__",         0, 0x0100, "m168")
+AVR_MCU ("atmega168a",           ARCH_AVR5, "__AVR_ATmega168A__",        0, 0x0100, "m168a")
+AVR_MCU ("atmega168p",           ARCH_AVR5, "__AVR_ATmega168P__",        0, 0x0100, "m168p")
+AVR_MCU ("atmega169",            ARCH_AVR5, "__AVR_ATmega169__",         0, 0x0100, "m169")
+AVR_MCU ("atmega169a",           ARCH_AVR5, "__AVR_ATmega169A__",        0, 0x0100, "m169a")
+AVR_MCU ("atmega169p",           ARCH_AVR5, "__AVR_ATmega169P__",        0, 0x0100, "m169p")
+AVR_MCU ("atmega169pa",          ARCH_AVR5, "__AVR_ATmega169PA__",       0, 0x0100, "m169pa")
+AVR_MCU ("atmega32",             ARCH_AVR5, "__AVR_ATmega32__",          0, 0x0060, "m32")
+AVR_MCU ("atmega323",            ARCH_AVR5, "__AVR_ATmega323__",         0, 0x0060, "m323")
+AVR_MCU ("atmega324a",           ARCH_AVR5, "__AVR_ATmega324A__",        0, 0x0100, "m324a")
+AVR_MCU ("atmega324p",           ARCH_AVR5, "__AVR_ATmega324P__",        0, 0x0100, "m324p")
+AVR_MCU ("atmega324pa",          ARCH_AVR5, "__AVR_ATmega324PA__",       0, 0x0100, "m324pa")
+AVR_MCU ("atmega325",            ARCH_AVR5, "__AVR_ATmega325__",         0, 0x0100, "m325")
+AVR_MCU ("atmega325a",           ARCH_AVR5, "__AVR_ATmega325A__",        0, 0x0100, "m325a")
+AVR_MCU ("atmega325p",           ARCH_AVR5, "__AVR_ATmega325P__",        0, 0x0100, "m325p")
+AVR_MCU ("atmega3250",           ARCH_AVR5, "__AVR_ATmega3250__",        0, 0x0100, "m3250")
+AVR_MCU ("atmega3250a",          ARCH_AVR5, "__AVR_ATmega3250A__",       0, 0x0100, "m3250a")
+AVR_MCU ("atmega3250p",          ARCH_AVR5, "__AVR_ATmega3250P__",       0, 0x0100, "m3250p")
+AVR_MCU ("atmega328",            ARCH_AVR5, "__AVR_ATmega328__",         0, 0x0100, "m328")
+AVR_MCU ("atmega328p",           ARCH_AVR5, "__AVR_ATmega328P__",        0, 0x0100, "m328p")
+AVR_MCU ("atmega329",            ARCH_AVR5, "__AVR_ATmega329__",         0, 0x0100, "m329")
+AVR_MCU ("atmega329a",           ARCH_AVR5, "__AVR_ATmega329A__",        0, 0x0100, "m329a")
+AVR_MCU ("atmega329p",           ARCH_AVR5, "__AVR_ATmega329P__",        0, 0x0100, "m329p")
+AVR_MCU ("atmega329pa",          ARCH_AVR5, "__AVR_ATmega329PA__",       0, 0x0100, "m329pa")
+AVR_MCU ("atmega3290",           ARCH_AVR5, "__AVR_ATmega3290__",        0, 0x0100, "m3290")
+AVR_MCU ("atmega3290a",          ARCH_AVR5, "__AVR_ATmega3290A__",       0, 0x0100, "m3290a")
+AVR_MCU ("atmega3290p",          ARCH_AVR5, "__AVR_ATmega3290P__",       0, 0x0100, "m3290p")
+AVR_MCU ("atmega406",            ARCH_AVR5, "__AVR_ATmega406__",         0, 0x0100, "m406")
+AVR_MCU ("atmega64",             ARCH_AVR5, "__AVR_ATmega64__",          0, 0x0100, "m64")
+AVR_MCU ("atmega640",            ARCH_AVR5, "__AVR_ATmega640__",         0, 0x0200, "m640")
+AVR_MCU ("atmega644",            ARCH_AVR5, "__AVR_ATmega644__",         0, 0x0100, "m644")
+AVR_MCU ("atmega644a",           ARCH_AVR5, "__AVR_ATmega644A__",        0, 0x0100, "m644a")
+AVR_MCU ("atmega644p",           ARCH_AVR5, "__AVR_ATmega644P__",        0, 0x0100, "m644p")
+AVR_MCU ("atmega644pa",          ARCH_AVR5, "__AVR_ATmega644PA__",       0, 0x0100, "m644pa")
+AVR_MCU ("atmega645",            ARCH_AVR5, "__AVR_ATmega645__",         0, 0x0100, "m645")
+AVR_MCU ("atmega645a",           ARCH_AVR5, "__AVR_ATmega645A__",        0, 0x0100, "m645a")
+AVR_MCU ("atmega645p",           ARCH_AVR5, "__AVR_ATmega645P__",        0, 0x0100, "m645p")
+AVR_MCU ("atmega6450",           ARCH_AVR5, "__AVR_ATmega6450__",        0, 0x0100, "m6450")
+AVR_MCU ("atmega6450a",          ARCH_AVR5, "__AVR_ATmega6450A__",       0, 0x0100, "m6450a")
+AVR_MCU ("atmega6450p",          ARCH_AVR5, "__AVR_ATmega6450P__",       0, 0x0100, "m6450p")
+AVR_MCU ("atmega649",            ARCH_AVR5, "__AVR_ATmega649__",         0, 0x0100, "m649")
+AVR_MCU ("atmega649a",           ARCH_AVR5, "__AVR_ATmega649A__",        0, 0x0100, "m649a")
+AVR_MCU ("atmega649p",           ARCH_AVR5, "__AVR_ATmega649P__",        0, 0x0100, "m649p")
+AVR_MCU ("atmega6490",           ARCH_AVR5, "__AVR_ATmega6490__",        0, 0x0100, "m6490")
+AVR_MCU ("atmega16hva",          ARCH_AVR5, "__AVR_ATmega16HVA__",       0, 0x0100, "m16hva")
+AVR_MCU ("atmega16hva2",         ARCH_AVR5, "__AVR_ATmega16HVA2__",      0, 0x0100, "m16hva2")
+AVR_MCU ("atmega16hvb",          ARCH_AVR5, "__AVR_ATmega16HVB__",       0, 0x0100, "m16hvb")
+AVR_MCU ("atmega32hvb",          ARCH_AVR5, "__AVR_ATmega32HVB__",       0, 0x0100, "m32hvb")
+AVR_MCU ("atmega64hve",          ARCH_AVR5, "__AVR_ATmega64HVE__",       0, 0x0100, "m64hve")
+AVR_MCU ("at90can32",            ARCH_AVR5, "__AVR_AT90CAN32__",         0, 0x0100, "can32")
+AVR_MCU ("at90can64",            ARCH_AVR5, "__AVR_AT90CAN64__",         0, 0x0100, "can64")
+AVR_MCU ("at90pwm216",           ARCH_AVR5, "__AVR_AT90PWM216__",        0, 0x0100, "90pwm216")
+AVR_MCU ("at90pwm316",           ARCH_AVR5, "__AVR_AT90PWM316__",        0, 0x0100, "90pwm316")
+AVR_MCU ("atmega32c1",           ARCH_AVR5, "__AVR_ATmega32C1__",        0, 0x0100, "m32c1")
+AVR_MCU ("atmega64c1",           ARCH_AVR5, "__AVR_ATmega64C1__",        0, 0x0100, "m64c1")
+AVR_MCU ("atmega16m1",           ARCH_AVR5, "__AVR_ATmega16M1__",        0, 0x0100, "m16m1")
+AVR_MCU ("atmega32m1",           ARCH_AVR5, "__AVR_ATmega32M1__",        0, 0x0100, "m32m1")
+AVR_MCU ("atmega64m1",           ARCH_AVR5, "__AVR_ATmega64M1__",        0, 0x0100, "m64m1")
+AVR_MCU ("atmega16u4",           ARCH_AVR5, "__AVR_ATmega16U4__",        0, 0x0100, "m16u4")
+AVR_MCU ("atmega32u4",           ARCH_AVR5, "__AVR_ATmega32U4__",        0, 0x0100, "m32u4")
+AVR_MCU ("atmega32u6",           ARCH_AVR5, "__AVR_ATmega32U6__",        0, 0x0100, "m32u6")
+AVR_MCU ("at90scr100",           ARCH_AVR5, "__AVR_AT90SCR100__",        0, 0x0100, "90scr100")
+AVR_MCU ("at90usb646",           ARCH_AVR5, "__AVR_AT90USB646__",        0, 0x0100, "usb646")
+AVR_MCU ("at90usb647",           ARCH_AVR5, "__AVR_AT90USB647__",        0, 0x0100, "usb647")
+AVR_MCU ("at94k",                ARCH_AVR5, "__AVR_AT94K__",             0, 0x0060, "at94k")
+AVR_MCU ("m3000",                ARCH_AVR5, "__AVR_M3000__",             0, 0x1000, "m3000")
+/* Enhanced, == 128K.  */
+AVR_MCU ("avr51",                ARCH_AVR51, NULL,                       0, 0x0100, "m128")
+AVR_MCU ("atmega128",            ARCH_AVR51, "__AVR_ATmega128__",        0, 0x0100, "m128")
+AVR_MCU ("atmega1280",           ARCH_AVR51, "__AVR_ATmega1280__",       0, 0x0200, "m1280")
+AVR_MCU ("atmega1281",           ARCH_AVR51, "__AVR_ATmega1281__",       0, 0x0200, "m1281")
+AVR_MCU ("atmega1284p",          ARCH_AVR51, "__AVR_ATmega1284P__",      0, 0x0100, "m1284p")
+AVR_MCU ("atmega128rfa1",        ARCH_AVR51, "__AVR_ATmega128RFA1__",    0, 0x0200, "m128rfa1")
+AVR_MCU ("at90can128",           ARCH_AVR51, "__AVR_AT90CAN128__",       0, 0x0100, "can128")
+AVR_MCU ("at90usb1286",          ARCH_AVR51, "__AVR_AT90USB1286__",      0, 0x0100, "usb1286")
+AVR_MCU ("at90usb1287",          ARCH_AVR51, "__AVR_AT90USB1287__",      0, 0x0100, "usb1286")
+/* 3-Byte PC.  */
+AVR_MCU ("avr6",                 ARCH_AVR6, NULL,                        0, 0x0200, "m2561")
+AVR_MCU ("atmega2560",           ARCH_AVR6, "__AVR_ATmega2560__",        0, 0x0200, "m2560")
+AVR_MCU ("atmega2561",           ARCH_AVR6, "__AVR_ATmega2561__",        0, 0x0200, "m2561")
+/* Assembler only.  */
+AVR_MCU ("avr1",                 ARCH_AVR1, NULL,                        0, 0x0060, "s1200")
+AVR_MCU ("at90s1200",            ARCH_AVR1, "__AVR_AT90S1200__",         0, 0x0060, "s1200")
+AVR_MCU ("attiny11",             ARCH_AVR1, "__AVR_ATtiny11__",          0, 0x0060, "tn11")
+AVR_MCU ("attiny12",             ARCH_AVR1, "__AVR_ATtiny12__",          0, 0x0060, "tn12")
+AVR_MCU ("attiny15",             ARCH_AVR1, "__AVR_ATtiny15__",          0, 0x0060, "tn15")
+AVR_MCU ("attiny28",             ARCH_AVR1, "__AVR_ATtiny28__",          0, 0x0060, "tn28")
Index: gcc/config/avr/avr-tables.opt
===================================================================
--- gcc/config/avr/avr-tables.opt	(revision 0)
+++ gcc/config/avr/avr-tables.opt	(revision 0)
@@ -0,0 +1,523 @@ 
+; -*- buffer-read-only: t -*-
+; Generated automatically by genopt.sh from avr-mcus.def.
+
+; Copyright (C) 2011 Free Software Foundation, Inc.
+;
+; 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/>.
+
+Enum
+Name(avr_mcu) Type(int)
+Known MCU names:
+
+EnumValue
+Enum(avr_mcu) String(avr2) Value(0)
+
+EnumValue
+Enum(avr_mcu) String(at90s2313) Value(1)
+
+EnumValue
+Enum(avr_mcu) String(at90s2323) Value(2)
+
+EnumValue
+Enum(avr_mcu) String(at90s2333) Value(3)
+
+EnumValue
+Enum(avr_mcu) String(at90s2343) Value(4)
+
+EnumValue
+Enum(avr_mcu) String(attiny22) Value(5)
+
+EnumValue
+Enum(avr_mcu) String(attiny26) Value(6)
+
+EnumValue
+Enum(avr_mcu) String(at90s4414) Value(7)
+
+EnumValue
+Enum(avr_mcu) String(at90s4433) Value(8)
+
+EnumValue
+Enum(avr_mcu) String(at90s4434) Value(9)
+
+EnumValue
+Enum(avr_mcu) String(at90s8515) Value(10)
+
+EnumValue
+Enum(avr_mcu) String(at90c8534) Value(11)
+
+EnumValue
+Enum(avr_mcu) String(at90s8535) Value(12)
+
+EnumValue
+Enum(avr_mcu) String(avr25) Value(13)
+
+EnumValue
+Enum(avr_mcu) String(ata6289) Value(14)
+
+EnumValue
+Enum(avr_mcu) String(attiny13) Value(15)
+
+EnumValue
+Enum(avr_mcu) String(attiny13a) Value(16)
+
+EnumValue
+Enum(avr_mcu) String(attiny2313) Value(17)
+
+EnumValue
+Enum(avr_mcu) String(attiny2313a) Value(18)
+
+EnumValue
+Enum(avr_mcu) String(attiny24) Value(19)
+
+EnumValue
+Enum(avr_mcu) String(attiny24a) Value(20)
+
+EnumValue
+Enum(avr_mcu) String(attiny4313) Value(21)
+
+EnumValue
+Enum(avr_mcu) String(attiny44) Value(22)
+
+EnumValue
+Enum(avr_mcu) String(attiny44a) Value(23)
+
+EnumValue
+Enum(avr_mcu) String(attiny84) Value(24)
+
+EnumValue
+Enum(avr_mcu) String(attiny84a) Value(25)
+
+EnumValue
+Enum(avr_mcu) String(attiny25) Value(26)
+
+EnumValue
+Enum(avr_mcu) String(attiny45) Value(27)
+
+EnumValue
+Enum(avr_mcu) String(attiny85) Value(28)
+
+EnumValue
+Enum(avr_mcu) String(attiny261) Value(29)
+
+EnumValue
+Enum(avr_mcu) String(attiny261a) Value(30)
+
+EnumValue
+Enum(avr_mcu) String(attiny461) Value(31)
+
+EnumValue
+Enum(avr_mcu) String(attiny461a) Value(32)
+
+EnumValue
+Enum(avr_mcu) String(attiny861) Value(33)
+
+EnumValue
+Enum(avr_mcu) String(attiny861a) Value(34)
+
+EnumValue
+Enum(avr_mcu) String(attiny43u) Value(35)
+
+EnumValue
+Enum(avr_mcu) String(attiny87) Value(36)
+
+EnumValue
+Enum(avr_mcu) String(attiny48) Value(37)
+
+EnumValue
+Enum(avr_mcu) String(attiny88) Value(38)
+
+EnumValue
+Enum(avr_mcu) String(at86rf401) Value(39)
+
+EnumValue
+Enum(avr_mcu) String(avr3) Value(40)
+
+EnumValue
+Enum(avr_mcu) String(at43usb355) Value(41)
+
+EnumValue
+Enum(avr_mcu) String(at76c711) Value(42)
+
+EnumValue
+Enum(avr_mcu) String(avr31) Value(43)
+
+EnumValue
+Enum(avr_mcu) String(atmega103) Value(44)
+
+EnumValue
+Enum(avr_mcu) String(at43usb320) Value(45)
+
+EnumValue
+Enum(avr_mcu) String(avr35) Value(46)
+
+EnumValue
+Enum(avr_mcu) String(at90usb82) Value(47)
+
+EnumValue
+Enum(avr_mcu) String(at90usb162) Value(48)
+
+EnumValue
+Enum(avr_mcu) String(atmega8u2) Value(49)
+
+EnumValue
+Enum(avr_mcu) String(atmega16u2) Value(50)
+
+EnumValue
+Enum(avr_mcu) String(atmega32u2) Value(51)
+
+EnumValue
+Enum(avr_mcu) String(attiny167) Value(52)
+
+EnumValue
+Enum(avr_mcu) String(avr4) Value(53)
+
+EnumValue
+Enum(avr_mcu) String(atmega8) Value(54)
+
+EnumValue
+Enum(avr_mcu) String(atmega48) Value(55)
+
+EnumValue
+Enum(avr_mcu) String(atmega48a) Value(56)
+
+EnumValue
+Enum(avr_mcu) String(atmega48p) Value(57)
+
+EnumValue
+Enum(avr_mcu) String(atmega88) Value(58)
+
+EnumValue
+Enum(avr_mcu) String(atmega88a) Value(59)
+
+EnumValue
+Enum(avr_mcu) String(atmega88p) Value(60)
+
+EnumValue
+Enum(avr_mcu) String(atmega88pa) Value(61)
+
+EnumValue
+Enum(avr_mcu) String(atmega8515) Value(62)
+
+EnumValue
+Enum(avr_mcu) String(atmega8535) Value(63)
+
+EnumValue
+Enum(avr_mcu) String(atmega8hva) Value(64)
+
+EnumValue
+Enum(avr_mcu) String(at90pwm1) Value(65)
+
+EnumValue
+Enum(avr_mcu) String(at90pwm2) Value(66)
+
+EnumValue
+Enum(avr_mcu) String(at90pwm2b) Value(67)
+
+EnumValue
+Enum(avr_mcu) String(at90pwm3) Value(68)
+
+EnumValue
+Enum(avr_mcu) String(at90pwm3b) Value(69)
+
+EnumValue
+Enum(avr_mcu) String(at90pwm81) Value(70)
+
+EnumValue
+Enum(avr_mcu) String(avr5) Value(71)
+
+EnumValue
+Enum(avr_mcu) String(atmega16) Value(72)
+
+EnumValue
+Enum(avr_mcu) String(atmega16a) Value(73)
+
+EnumValue
+Enum(avr_mcu) String(atmega161) Value(74)
+
+EnumValue
+Enum(avr_mcu) String(atmega162) Value(75)
+
+EnumValue
+Enum(avr_mcu) String(atmega163) Value(76)
+
+EnumValue
+Enum(avr_mcu) String(atmega164a) Value(77)
+
+EnumValue
+Enum(avr_mcu) String(atmega164p) Value(78)
+
+EnumValue
+Enum(avr_mcu) String(atmega165) Value(79)
+
+EnumValue
+Enum(avr_mcu) String(atmega165a) Value(80)
+
+EnumValue
+Enum(avr_mcu) String(atmega165p) Value(81)
+
+EnumValue
+Enum(avr_mcu) String(atmega168) Value(82)
+
+EnumValue
+Enum(avr_mcu) String(atmega168a) Value(83)
+
+EnumValue
+Enum(avr_mcu) String(atmega168p) Value(84)
+
+EnumValue
+Enum(avr_mcu) String(atmega169) Value(85)
+
+EnumValue
+Enum(avr_mcu) String(atmega169a) Value(86)
+
+EnumValue
+Enum(avr_mcu) String(atmega169p) Value(87)
+
+EnumValue
+Enum(avr_mcu) String(atmega169pa) Value(88)
+
+EnumValue
+Enum(avr_mcu) String(atmega32) Value(89)
+
+EnumValue
+Enum(avr_mcu) String(atmega323) Value(90)
+
+EnumValue
+Enum(avr_mcu) String(atmega324a) Value(91)
+
+EnumValue
+Enum(avr_mcu) String(atmega324p) Value(92)
+
+EnumValue
+Enum(avr_mcu) String(atmega324pa) Value(93)
+
+EnumValue
+Enum(avr_mcu) String(atmega325) Value(94)
+
+EnumValue
+Enum(avr_mcu) String(atmega325a) Value(95)
+
+EnumValue
+Enum(avr_mcu) String(atmega325p) Value(96)
+
+EnumValue
+Enum(avr_mcu) String(atmega3250) Value(97)
+
+EnumValue
+Enum(avr_mcu) String(atmega3250a) Value(98)
+
+EnumValue
+Enum(avr_mcu) String(atmega3250p) Value(99)
+
+EnumValue
+Enum(avr_mcu) String(atmega328) Value(100)
+
+EnumValue
+Enum(avr_mcu) String(atmega328p) Value(101)
+
+EnumValue
+Enum(avr_mcu) String(atmega329) Value(102)
+
+EnumValue
+Enum(avr_mcu) String(atmega329a) Value(103)
+
+EnumValue
+Enum(avr_mcu) String(atmega329p) Value(104)
+
+EnumValue
+Enum(avr_mcu) String(atmega329pa) Value(105)
+
+EnumValue
+Enum(avr_mcu) String(atmega3290) Value(106)
+
+EnumValue
+Enum(avr_mcu) String(atmega3290a) Value(107)
+
+EnumValue
+Enum(avr_mcu) String(atmega3290p) Value(108)
+
+EnumValue
+Enum(avr_mcu) String(atmega406) Value(109)
+
+EnumValue
+Enum(avr_mcu) String(atmega64) Value(110)
+
+EnumValue
+Enum(avr_mcu) String(atmega640) Value(111)
+
+EnumValue
+Enum(avr_mcu) String(atmega644) Value(112)
+
+EnumValue
+Enum(avr_mcu) String(atmega644a) Value(113)
+
+EnumValue
+Enum(avr_mcu) String(atmega644p) Value(114)
+
+EnumValue
+Enum(avr_mcu) String(atmega644pa) Value(115)
+
+EnumValue
+Enum(avr_mcu) String(atmega645) Value(116)
+
+EnumValue
+Enum(avr_mcu) String(atmega645a) Value(117)
+
+EnumValue
+Enum(avr_mcu) String(atmega645p) Value(118)
+
+EnumValue
+Enum(avr_mcu) String(atmega6450) Value(119)
+
+EnumValue
+Enum(avr_mcu) String(atmega6450a) Value(120)
+
+EnumValue
+Enum(avr_mcu) String(atmega6450p) Value(121)
+
+EnumValue
+Enum(avr_mcu) String(atmega649) Value(122)
+
+EnumValue
+Enum(avr_mcu) String(atmega649a) Value(123)
+
+EnumValue
+Enum(avr_mcu) String(atmega649p) Value(124)
+
+EnumValue
+Enum(avr_mcu) String(atmega6490) Value(125)
+
+EnumValue
+Enum(avr_mcu) String(atmega16hva) Value(126)
+
+EnumValue
+Enum(avr_mcu) String(atmega16hva2) Value(127)
+
+EnumValue
+Enum(avr_mcu) String(atmega16hvb) Value(128)
+
+EnumValue
+Enum(avr_mcu) String(atmega32hvb) Value(129)
+
+EnumValue
+Enum(avr_mcu) String(atmega64hve) Value(130)
+
+EnumValue
+Enum(avr_mcu) String(at90can32) Value(131)
+
+EnumValue
+Enum(avr_mcu) String(at90can64) Value(132)
+
+EnumValue
+Enum(avr_mcu) String(at90pwm216) Value(133)
+
+EnumValue
+Enum(avr_mcu) String(at90pwm316) Value(134)
+
+EnumValue
+Enum(avr_mcu) String(atmega32c1) Value(135)
+
+EnumValue
+Enum(avr_mcu) String(atmega64c1) Value(136)
+
+EnumValue
+Enum(avr_mcu) String(atmega16m1) Value(137)
+
+EnumValue
+Enum(avr_mcu) String(atmega32m1) Value(138)
+
+EnumValue
+Enum(avr_mcu) String(atmega64m1) Value(139)
+
+EnumValue
+Enum(avr_mcu) String(atmega16u4) Value(140)
+
+EnumValue
+Enum(avr_mcu) String(atmega32u4) Value(141)
+
+EnumValue
+Enum(avr_mcu) String(atmega32u6) Value(142)
+
+EnumValue
+Enum(avr_mcu) String(at90scr100) Value(143)
+
+EnumValue
+Enum(avr_mcu) String(at90usb646) Value(144)
+
+EnumValue
+Enum(avr_mcu) String(at90usb647) Value(145)
+
+EnumValue
+Enum(avr_mcu) String(at94k) Value(146)
+
+EnumValue
+Enum(avr_mcu) String(m3000) Value(147)
+
+EnumValue
+Enum(avr_mcu) String(avr51) Value(148)
+
+EnumValue
+Enum(avr_mcu) String(atmega128) Value(149)
+
+EnumValue
+Enum(avr_mcu) String(atmega1280) Value(150)
+
+EnumValue
+Enum(avr_mcu) String(atmega1281) Value(151)
+
+EnumValue
+Enum(avr_mcu) String(atmega1284p) Value(152)
+
+EnumValue
+Enum(avr_mcu) String(atmega128rfa1) Value(153)
+
+EnumValue
+Enum(avr_mcu) String(at90can128) Value(154)
+
+EnumValue
+Enum(avr_mcu) String(at90usb1286) Value(155)
+
+EnumValue
+Enum(avr_mcu) String(at90usb1287) Value(156)
+
+EnumValue
+Enum(avr_mcu) String(avr6) Value(157)
+
+EnumValue
+Enum(avr_mcu) String(atmega2560) Value(158)
+
+EnumValue
+Enum(avr_mcu) String(atmega2561) Value(159)
+
+EnumValue
+Enum(avr_mcu) String(avr1) Value(160)
+
+EnumValue
+Enum(avr_mcu) String(at90s1200) Value(161)
+
+EnumValue
+Enum(avr_mcu) String(attiny11) Value(162)
+
+EnumValue
+Enum(avr_mcu) String(attiny12) Value(163)
+
+EnumValue
+Enum(avr_mcu) String(attiny15) Value(164)
+
+EnumValue
+Enum(avr_mcu) String(attiny28) Value(165)
+
Index: gcc/config/avr/genopt.sh
===================================================================
--- gcc/config/avr/genopt.sh	(revision 0)
+++ gcc/config/avr/genopt.sh	(revision 0)
@@ -0,0 +1,59 @@ 
+#!/bin/sh
+# Generate avr-tables.opt from the list in avr-mcus.def.
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# 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/>.
+
+cat <<EOF
+; -*- buffer-read-only: t -*-
+; Generated automatically by genopt.sh from avr-mcus.def.
+
+; Copyright (C) 2011 Free Software Foundation, Inc.
+;
+; 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/>.
+
+Enum
+Name(avr_mcu) Type(int)
+Known MCU names:
+
+EOF
+
+awk -F'[(, 	]+' 'BEGIN {
+    value = 0
+}
+/^AVR_MCU/ {
+    name = $2
+    gsub("\"", "", name)
+    print "EnumValue"
+    print "Enum(avr_mcu) String(" name ") Value(" value ")"
+    print ""
+    value++
+}' $1/avr-mcus.def

Property changes on: gcc/config/avr/genopt.sh
___________________________________________________________________
Added: svn:executable
   + *

Index: gcc/config/avr/avr.c
===================================================================
--- gcc/config/avr/avr.c	(revision 175148)
+++ gcc/config/avr/avr.c	(working copy)
@@ -106,7 +106,6 @@  static rtx avr_function_arg (cumulative_
 			     const_tree, bool);
 static void avr_function_arg_advance (cumulative_args_t, enum machine_mode,
 				      const_tree, bool);
-static void avr_help (void);
 static bool avr_function_ok_for_sibcall (tree, tree);
 static void avr_asm_named_section (const char *name, unsigned int flags, tree decl);
 
@@ -250,9 +249,6 @@  static const struct attribute_spec avr_a
 #undef TARGET_CANNOT_MODIFY_JUMPS_P
 #define TARGET_CANNOT_MODIFY_JUMPS_P avr_cannot_modify_jumps_p
 
-#undef TARGET_HELP
-#define TARGET_HELP avr_help
-
 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
 #define TARGET_FUNCTION_OK_FOR_SIBCALL avr_function_ok_for_sibcall
 
@@ -268,21 +264,9 @@  struct gcc_target targetm = TARGET_INITI
 static void
 avr_option_override (void)
 {
-  const struct mcu_type_s *t;
-
   flag_delete_null_pointer_checks = 0;
 
-  for (t = avr_mcu_types; t->name; t++)
-    if (strcmp (t->name, avr_mcu_name) == 0)
-      break;
-
-  if (!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;
+  avr_current_device = &avr_mcu_types[avr_mcu_index];
   avr_current_arch = &avr_arch_types[avr_current_device->arch];
   avr_extra_arch_macro = avr_current_device->macro;
 
@@ -292,42 +276,6 @@  avr_option_override (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[]={
@@ -5320,11 +5268,11 @@  static void
 avr_file_start (void)
 {
   if (avr_current_arch->asm_only)
-    error ("MCU %qs supported for assembler only", avr_mcu_name);
+    error ("MCU %qs supported for assembler only", avr_current_device->name);
 
   default_file_start ();
 
-/*  fprintf (asm_out_file, "\t.arch %s\n", avr_mcu_name);*/
+/*  fprintf (asm_out_file, "\t.arch %s\n", avr_current_device->name);*/
   fputs ("__SREG__ = 0x3f\n"
 	 "__SP_H__ = 0x3e\n"
 	 "__SP_L__ = 0x3d\n", asm_out_file);