blob: 25a1f4f6684420ae43dc4a68c20359fc7a7db2c9 [file] [log] [blame]
# Copyright (C) 2011-2022 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/>.
##################################################################
#
# Transform Core/Device Information from avr-mcus.def to a
# Representation that is understood by GCC's multilib Machinery.
#
# The Script works as a Filter from STDIN to STDOUT.
# It generates a Makefile Snippet that sets some
# MULTILIB_* Variables as needed.
#
##################################################################
BEGIN {
FS ="[(, \t]+"
option[""] = ""
comment = 1
dir_tiny = "tiny-stack"
opt_tiny = "msp8"
dir_rcall = "short-calls"
opt_rcall = "mshort-calls"
# awk Variable Makefile Variable
# ------------------------------------------
# m_options <-> MULTILIB_OPTIONS
# m_dirnames <-> MULTILIB_DIRNAMES
# m_required <-> MULTILIB_REQUIRED
# m_reuse <-> MULTILIB_REUSE
m_sep = ""
m_options = "\nMULTILIB_OPTIONS = "
m_dirnames = "\nMULTILIB_DIRNAMES ="
m_required = "\nMULTILIB_REQUIRED ="
m_reuse = "\nMULTILIB_REUSE ="
have_long_double_is_double = (HAVE_LONG_DOUBLE_IS_DOUBLE \
== "HAVE_LONG_DOUBLE_IS_DOUBLE")
have_double32 = (HAVE_DOUBLE32 == "HAVE_DOUBLE32")
have_double64 = (HAVE_DOUBLE64 == "HAVE_DOUBLE64")
have_long_double32 = (HAVE_LONG_DOUBLE32 == "HAVE_LONG_DOUBLE32")
have_long_double64 = (HAVE_LONG_DOUBLE64 == "HAVE_LONG_DOUBLE64")
have_double_multi = (have_double32 && have_double64)
have_long_double_multi = (! have_long_double_is_double \
&& have_long_double32 && have_long_double64)
# How to switch away from the default.
dir_double = "double" (96 - with_double)
opt_double = "mdouble=" (96 - with_double)
dir_long_double = "long-double" (96 - with_long_double)
opt_long_double = "mlong-double=" (96 - with_long_double)
if (with_multilib_list != "")
{
split(with_multilib_list, multilib_list, ",")
for (i in multilib_list)
{
multilibs[multilib_list[i]] = 1
}
}
}
##################################################################
# Add some Comments to the generated Files and copy-paste
# Copyright Notice from above.
##################################################################
/^#/ {
if (!comment)
next
else if (comment == 1)
{
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;
print
}
/^$/ {
# The first empty line stops copy-pasting the GPL comments
# from this file to the generated file.
if (comment)
{
print
if (have_double_multi)
{
print "# dir_double = " dir_double
print "# opt_double = -" opt_double
}
else
print "# No multilib for double."
if (have_long_double_multi)
{
print "# dir_long_double = " dir_long_double
print "# opt_long_double = -" opt_long_double
}
else
print "# No multilib for long double."
}
comment = 0
}
##################################################################
# 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/ {
name = $2
gsub ("\"", "", name)
if ($5 == "NULL")
{
core = name
# avr1 is supported for Assembler only: It gets no multilib
if (core == "avr1")
next
if (with_multilib_list != "" && !(core in multilibs))
next
option[core] = "mmcu=" core
m_options = m_options m_sep option[core]
m_dirnames = m_dirnames " " core
m_sep = "/"
next
}
# avr1 is supported for Assembler only: Its Devices are ignored
if (core == "avr1")
next
if (with_multilib_list != "" && !(core in multilibs))
next
opts = option[core]
# split device specific feature list
n = split($4,dev_attribute,"|")
for (i=1; i <= n; i++)
{
if (dev_attribute[i] == "AVR_SHORT_SP")
opts = opts "/" opt_tiny
if (dev_attribute[i] == "AVR_ISA_RCALL")
opts = opts "/" opt_rcall
}
if (!have[opts])
{
have[opts] = 1
# Some special handling for the default mmcu: Remove a
# leading "mmcu=avr2/" in order not to confuse genmultilib.
gsub (/^mmcu=avr2\//, "", opts)
if (opts != "mmcu=avr2")
{
m_required = m_required " \\\n\t" opts
if (have_double_multi && have_long_double_multi)
{
m_required = m_required " \\\n\t" opts "/" opt_double
m_required = m_required " \\\n\t" opts "/" opt_long_double
# We have only 3 different combinations because -mdouble=64
# implies -mlong-double=64, and -mlong-double=32 implies
# -mdouble=32, hence add respective reuses. The reuse is
# not needed in the case with_double != with_long_double
# which means with_double=32 with_long_double=64 because
# the driver will rectify combining -mdouble=64 and
# -mlong-double=32.
if (with_double == with_long_double)
{
d_opts = with_double == 32 ? opt_double : opt_long_double
d_opts = opts "/" d_opts
d_reuse = opts "/" opt_double "/" opt_long_double
gsub (/=/, ".", d_opts)
gsub (/=/, ".", d_reuse)
m_reuse = m_reuse " \\\n\t" d_opts "=" d_reuse
}
}
else if (have_double_multi)
m_required = m_required " \\\n\t" opts "/" opt_double
else if (have_long_double_multi)
m_required = m_required " \\\n\t" opts "/" opt_long_double
}
}
}
##################################################################
#
##################################################################
END {
############################################################
# Output that Stuff
############################################################
# Intended Target: $(top_builddir)/gcc/t-multilib-avr
if (have_double_multi && have_long_double_multi)
{
print m_options " " opt_tiny " " opt_rcall " " opt_double "/" opt_long_double
print m_dirnames " " dir_tiny " " dir_rcall " " dir_double " " dir_long_double
# Notice that the ./double* and ./long-double* variants cannot
# be copied by t-avrlibc because the . default multilib is built
# after all the others.
m_required = m_required " \\\n\t" opt_double
m_required = m_required " \\\n\t" opt_long_double
if (with_double == with_long_double)
{
d_opts = with_double == 32 ? opt_double : opt_long_double
d_reuse = opt_double "/" opt_long_double
gsub (/=/, ".", d_opts)
gsub (/=/, ".", d_reuse)
m_reuse = m_reuse " \\\n\t" d_opts "=" d_reuse
}
}
else if (have_double_multi)
{
print m_options " " opt_tiny " " opt_rcall " " opt_double
print m_dirnames " " dir_tiny " " dir_rcall " " dir_double
m_required = m_required " \\\n\t" opt_double
}
else if (have_long_double_multi)
{
print m_options " " opt_tiny " " opt_rcall " " opt_long_double
print m_dirnames " " dir_tiny " " dir_rcall " " dir_long_double
m_required = m_required " \\\n\t" opt_long_double
}
else
{
print m_options " " opt_tiny " " opt_rcall
print m_dirnames " " dir_tiny " " dir_rcall
}
print m_required
print m_reuse
}