| # 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 |
| } |