Index: config/avr/t-avr
===================================================================
--- config/avr/t-avr	(revision 247631)
+++ config/avr/t-avr	(working copy)
@@ -89,14 +89,13 @@ install-device-specs: s-device-specs ins
 		$(INSTALL_DATA) $${file} $(DESTDIR)$(libsubdir)/$${file}; \
 	done
 
-# Map -mmcu= to the right multilib variant
+# Get multilib layout
 # MULTILIB_OPTIONS
 # MULTILIB_DIRNAMES
-# MULTILIB_EXCEPTIONS
-# MULTILIB_MATCHES
+# MULTILIB_REQUIRED
 
 s-mlib: $(srcdir)/config/avr/t-multilib
 
 $(srcdir)/config/avr/t-multilib: $(srcdir)/config/avr/genmultilib.awk \
 				 $(AVR_MCUS)
-	$(AWK) -f $< -v FORMAT=Makefile   $< $(AVR_MCUS) > $@
+	$(AWK) -f $< $< $(AVR_MCUS) > $@
Index: config/avr/genmultilib.awk
===================================================================
--- config/avr/genmultilib.awk	(revision 247631)
+++ config/avr/genmultilib.awk	(working copy)
@@ -22,23 +22,28 @@
 # Representation that is understood by GCC's multilib Machinery.
 #
 # The Script works as a Filter from STDIN to STDOUT.
-# 
-# FORMAT = "Makefile": Generate Makefile Snipet that sets some
-#                      MULTILIB_* Variables as needed.
+# It generates a Makefile Snipet that sets some
+# MULTILIB_* Variables as needed.
 #
 ##################################################################
 
 BEGIN {
     FS ="[(, \t]+"
     option[""] = ""
-    tiny_stack[""] = 1
     comment = 1
-    n_mcu = 0
-    n_cores = 0
 
-    mtiny[0] = ""
-    mtiny[1] = "tiny-stack"
-    option["tiny-stack"] = "msp8"
+    dir_tiny = "tiny-stack"
+    opt_tiny = "msp8"
+
+    #    awk Variable         Makefile Variable  
+    #  ------------------------------------------
+    #    m_options     <->    MULTILIB_OPTIONS
+    #    m_dirnames    <->    MULTILIB_DIRNAMES
+    #    m_required    <->    MULTILIB_REQUIRED
+    m_sep = ""
+    m_options    = "\nMULTILIB_OPTIONS = "
+    m_dirnames   = "\nMULTILIB_DIRNAMES ="
+    m_required   = "\nMULTILIB_REQUIRED ="
 }
 
 ##################################################################
@@ -51,14 +56,11 @@ BEGIN {
 	next
     else if (comment == 1)
     {
-	if (FORMAT == "Makefile")
-	{
-	    print "# Auto-generated Makefile Snip"
-	    print "# Generated by    : ./gcc/config/avr/genmultilib.awk"
-	    print "# Generated from  : ./gcc/config/avr/avr-mcus.def"
-	    print "# Used by         : tmake_file from Makefile and genmultilib"
-	    print ""
-	}
+	print "# Auto-generated Makefile Snip"
+	print "# Generated by    : ./gcc/config/avr/genmultilib.awk"
+	print "# Generated from  : ./gcc/config/avr/avr-mcus.def"
+	print "# Used by         : tmake_file from Makefile and genmultilib"
+	print ""
     }
 
     comment = 2;
@@ -74,12 +76,10 @@ BEGIN {
 }
 
 ##################################################################
-# Run over all AVR_MCU Lines and gather Information:
-# cores[]     : Enumerates the Cores (avr2, avr25, ...)
-# mcu[]       : Enumerates the Devices
-# tiny_stack[]: Maps Core/Device to 0 (2-byte SP) or 1 (1-byte SP)
-# option[]    : Maps Core/Device to the mmcu= option to get it
-# toCore[]    : Maps Device to its Core
+# Run over all AVR_MCU Lines.  If we encounter a required multilib
+# variant, add according combination of options to m_required,
+# but onyl once.  Add encountered cores to m_dirnames and
+# according -mmcu= options to m_options.
 ##################################################################
 
 /^AVR_MCU/ {
@@ -94,11 +94,12 @@ BEGIN {
 	if (core == "avr1")
 	    next
 
-	cores[n_cores] = core
-	n_cores++
-	tiny_stack[core] = 0
 	option[core] = "mmcu=" core
 
+	m_options  = m_options m_sep option[core]
+	m_dirnames = m_dirnames " " core
+	m_sep = "/"
+
 	next
     }
 
@@ -109,113 +110,37 @@ BEGIN {
     # split device specific feature list
     n = split($4,dev_attribute,"|")
 
-    # set tiny_stack false by default
-    tiny_stack[name] = 0
+    opts = option[core]
+
     for (i=1; i <= n; i++)
-      if (dev_attribute[i] == "AVR_SHORT_SP") {
-        tiny_stack[name]  = 1
-        break
-      }
-
-    mcu[n_mcu] = name
-    n_mcu++
-    option[name]      = "mmcu=" name
-    toCore[name]      = core
+    {
+      if (dev_attribute[i] == "AVR_SHORT_SP")
+        opts = opts "/" opt_tiny
+    }
 
-    if (tiny_stack[name] == 1)
-	tiny_stack[core] = 1
+    if (!have[opts])
+    {
+	have[opts] = 1
+	# Some special handling for the default mmcu: Remove a
+	# leading "mmcu=avr2/" in order not to confuse genmultilib.
+	opts = gensub (/mmcu=avr2\//, "", 1, opts)
+	if (opts != "mmcu=avr2")
+	    m_required = m_required " \\\n\t" opts
+    }
 }
 
 ##################################################################
 # 
-# We gathered all the Information, now build/output the following:
-#
-#    awk Variable         target Variable          FORMAT
-#  -----------------------------------------------------------
-#    m_options     <->    MULTILIB_OPTIONS         Makefile
-#    m_dirnames    <->    MULTILIB_DIRNAMES           "
-#    m_exceptions  <->    MULTILIB_EXCEPTIONS         "
-#
 ##################################################################
 
 END {
-    m_options    = "\nMULTILIB_OPTIONS = "
-    m_dirnames   = "\nMULTILIB_DIRNAMES ="
-    m_exceptions = "\nMULTILIB_EXCEPTIONS ="
-
-    ##############################################################
-    # Compose MULTILIB_OPTIONS.  This represents the Cross-Product
-    #    (avr2, avr25, ...) x msp8
-
-    sep = ""
-    for (c = 0; c < n_cores; c++)
-    {
-	m_options = m_options sep option[cores[c]]
-	sep = "/"
-    }
-
-    # The ... x msp8
-    m_options = m_options " " option[mtiny[1]]
-
-    ##############################################################
-    # Map Device to its multilib
-
-    for (t = 0; t < n_mcu; t++)
-    {
-	core = toCore[mcu[t]]
-	
-	line = option[core] ":" option[mcu[t]]
-	gsub ("=", "?", line)
-	gsub (":", "=", line)
-    }
-
-    ####################################################################
-    # Compose MULTILIB_DIRNAMES and MULTILIB_EXEPTIONS
-
-    n_mtiny = 2
-    for (t = 0; t < n_mtiny; t++)
-	for (c = -1; c < n_cores; c++)
-	{
-	    if (c == -1)
-		core = ""
-	    else
-		core = cores[c]
-
-	    # The Directory Name for this multilib
-
-	    if (core != "" && mtiny[t] != "")
-	    {
-		mdir = core "/" mtiny[t]
-		mopt = option[core] "/" option[mtiny[t]]
-	    }
-	    else
-	    {
-		mdir = core mtiny[t]
-		mopt = option[core] option[mtiny[t]]
-	    }
-
-	    if (core != "" && tiny_stack[core] == 0 && mtiny[t] != "")
-	    {
-		# There's not a single SP = 8 Devices for this Core:
-		# Don't build respective multilib
-		m_exceptions = m_exceptions " \\\n\t" mopt
-		continue
-	    }
-
-	    if (core != "avr2" || mtiny[t] == "")
-		m_dirnames = m_dirnames " " mdir
-	}
-
     ############################################################
     # Output that Stuff
     ############################################################
 
-    if (FORMAT == "Makefile")
-    {
-	# Intended Target: ./gcc/config/avr/t-multilib
+    # Intended Target: ./gcc/config/avr/t-multilib
 
-	print m_options
-	print m_dirnames
-	print m_exceptions
-    }
+    print m_options  " " opt_tiny
+    print m_dirnames " " dir_tiny
+    print m_required
 }
Index: config/avr/t-multilib
===================================================================
--- config/avr/t-multilib	(revision 247631)
+++ config/avr/t-multilib	(working copy)
@@ -23,19 +23,22 @@
 
 MULTILIB_OPTIONS = mmcu=avr2/mmcu=avr25/mmcu=avr3/mmcu=avr31/mmcu=avr35/mmcu=avr4/mmcu=avr5/mmcu=avr51/mmcu=avr6/mmcu=avrxmega2/mmcu=avrxmega4/mmcu=avrxmega5/mmcu=avrxmega6/mmcu=avrxmega7/mmcu=avrtiny msp8
 
-MULTILIB_DIRNAMES =  avr2 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega2 avrxmega4 avrxmega5 avrxmega6 avrxmega7 avrtiny tiny-stack avr25/tiny-stack
+MULTILIB_DIRNAMES = avr2 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega2 avrxmega4 avrxmega5 avrxmega6 avrxmega7 avrtiny tiny-stack
 
-MULTILIB_EXCEPTIONS = \
-	mmcu=avr3/msp8 \
-	mmcu=avr31/msp8 \
-	mmcu=avr35/msp8 \
-	mmcu=avr4/msp8 \
-	mmcu=avr5/msp8 \
-	mmcu=avr51/msp8 \
-	mmcu=avr6/msp8 \
-	mmcu=avrxmega2/msp8 \
-	mmcu=avrxmega4/msp8 \
-	mmcu=avrxmega5/msp8 \
-	mmcu=avrxmega6/msp8 \
-	mmcu=avrxmega7/msp8 \
-	mmcu=avrtiny/msp8
+MULTILIB_REQUIRED = \
+	msp8 \
+	mmcu=avr25 \
+	mmcu=avr25/msp8 \
+	mmcu=avr3 \
+	mmcu=avr31 \
+	mmcu=avr35 \
+	mmcu=avr4 \
+	mmcu=avr5 \
+	mmcu=avr51 \
+	mmcu=avr6 \
+	mmcu=avrxmega2 \
+	mmcu=avrxmega4 \
+	mmcu=avrxmega5 \
+	mmcu=avrxmega6 \
+	mmcu=avrxmega7 \
+	mmcu=avrtiny
