| # Copyright (C) 2011-2015 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. |
| # |
| # FORMAT = "Makefile": Generate 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" |
| } |
| |
| ################################################################## |
| # Add some Comments to the generated Files and copy-paste |
| # Copyright Notice from above. |
| ################################################################## |
| |
| /^#/ { |
| if (!comment) |
| 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 "" |
| } |
| } |
| |
| comment = 2; |
| |
| print |
| } |
| |
| /^$/ { |
| # The first empty line stops copy-pasting the GPL comments |
| # from this file to the generated file. |
| |
| comment = 0 |
| } |
| |
| ################################################################## |
| # 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 |
| ################################################################## |
| |
| /^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 |
| |
| cores[n_cores] = core |
| n_cores++ |
| tiny_stack[core] = 0 |
| option[core] = "mmcu=" core |
| |
| next |
| } |
| |
| # avr1 is supported for Assembler only: Its Devices are ignored |
| if (core == "avr1") |
| next |
| |
| # 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 = "/" |
| } |
| |
| # 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 |
| |
| print m_options |
| print m_dirnames |
| print m_exceptions |
| } |
| } |