# 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 Snippet 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 ="
}
##################################################################
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;
}
##################################################################
-# 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/ {
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
}
if (core == "avr1")
next
+ opts = option[core]
+
# split device specific feature list
n = split($4,dev_attribute,"|")
- # set tiny_stack false by default
- tiny_stack[name] = 0
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 (tiny_stack[name] == 1)
- tiny_stack[core] = 1
-}
-
-##################################################################
-#
-# 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 = "/"
+ if (dev_attribute[i] == "AVR_SHORT_SP")
+ opts = opts "/" opt_tiny
}
- # The ... x msp8
- m_options = m_options " " option[mtiny[1]]
-
- ##############################################################
- # Map Device to its multilib
-
- for (t = 0; t < n_mcu; t++)
+ if (!have[opts])
{
- core = toCore[mcu[t]]
-
- line = option[core] ":" option[mcu[t]]
- gsub ("=", "?", line)
- gsub (":", "=", line)
+ 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
}
+}
- ####################################################################
- # 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
- }
+##################################################################
+#
+##################################################################
+END {
############################################################
# 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
}