===================================================================
@@ -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) > $@
===================================================================
@@ -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
}
===================================================================
@@ -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