# Copyright (C) 2011-2020 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 # . ################################################################## # # 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) } ################################################################## # 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 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 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 }