genmultilib.awk revision 1.4
1# Copyright (C) 2011-2016 Free Software Foundation, Inc.
2#
3# This file is part of GCC.
4#
5# GCC is free software; you can redistribute it and/or modify it under
6# the terms of the GNU General Public License as published by the Free
7# Software Foundation; either version 3, or (at your option) any later
8# version.
9#
10# GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11# WARRANTY; without even the implied warranty of MERCHANTABILITY or
12# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13# for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with GCC; see the file COPYING3.  If not see
17# <http://www.gnu.org/licenses/>.
18
19##################################################################
20#  
21# Transform Core/Device Information from avr-mcus.def to a
22# Representation that is understood by GCC's multilib Machinery.
23#
24# The Script works as a Filter from STDIN to STDOUT.
25# 
26# FORMAT = "Makefile": Generate Makefile Snipet that sets some
27#                      MULTILIB_* Variables as needed.
28#
29##################################################################
30
31BEGIN {
32    FS ="[(, \t]+"
33    option[""] = ""
34    tiny_stack[""] = 1
35    comment = 1
36    n_mcu = 0
37    n_cores = 0
38
39    mtiny[0] = ""
40    mtiny[1] = "tiny-stack"
41    option["tiny-stack"] = "msp8"
42}
43
44##################################################################
45# Add some Comments to the generated Files and copy-paste
46# Copyright Notice from above.
47##################################################################
48
49/^#/ {
50    if (!comment)
51	next
52    else if (comment == 1)
53    {
54	if (FORMAT == "Makefile")
55	{
56	    print "# Auto-generated Makefile Snip"
57	    print "# Generated by    : ./gcc/config/avr/genmultilib.awk"
58	    print "# Generated from  : ./gcc/config/avr/avr-mcus.def"
59	    print "# Used by         : tmake_file from Makefile and genmultilib"
60	    print ""
61	}
62    }
63
64    comment = 2;
65
66    print
67}
68
69/^$/ {
70    # The first empty line stops copy-pasting the GPL comments
71    # from this file to the generated file.
72
73    comment = 0
74}
75
76##################################################################
77# Run over all AVR_MCU Lines and gather Information:
78# cores[]     : Enumerates the Cores (avr2, avr25, ...)
79# mcu[]       : Enumerates the Devices
80# tiny_stack[]: Maps Core/Device to 0 (2-byte SP) or 1 (1-byte SP)
81# option[]    : Maps Core/Device to the mmcu= option to get it
82# toCore[]    : Maps Device to its Core
83##################################################################
84
85/^AVR_MCU/ {
86    name = $2
87    gsub ("\"", "", name)
88
89    if ($5 == "NULL")
90    {
91	core = name
92
93	# avr1 is supported for Assembler only:  It gets no multilib
94	if (core == "avr1")
95	    next
96
97	cores[n_cores] = core
98	n_cores++
99	tiny_stack[core] = 0
100	option[core] = "mmcu=" core
101
102	next
103    }
104
105    # avr1 is supported for Assembler only:  Its Devices are ignored
106    if (core == "avr1")
107	next
108
109    # split device specific feature list
110    n = split($4,dev_attribute,"|")
111
112    # set tiny_stack false by default
113    tiny_stack[name] = 0
114    for (i=1; i <= n; i++)
115      if (dev_attribute[i] == "AVR_SHORT_SP") {
116        tiny_stack[name]  = 1
117        break
118      }
119
120    mcu[n_mcu] = name
121    n_mcu++
122    option[name]      = "mmcu=" name
123    toCore[name]      = core
124
125    if (tiny_stack[name] == 1)
126	tiny_stack[core] = 1
127}
128
129##################################################################
130# 
131# We gathered all the Information, now build/output the following:
132#
133#    awk Variable         target Variable          FORMAT
134#  -----------------------------------------------------------
135#    m_options     <->    MULTILIB_OPTIONS         Makefile
136#    m_dirnames    <->    MULTILIB_DIRNAMES           "
137#    m_exceptions  <->    MULTILIB_EXCEPTIONS         "
138#
139##################################################################
140
141END {
142    m_options    = "\nMULTILIB_OPTIONS = "
143    m_dirnames   = "\nMULTILIB_DIRNAMES ="
144    m_exceptions = "\nMULTILIB_EXCEPTIONS ="
145
146    ##############################################################
147    # Compose MULTILIB_OPTIONS.  This represents the Cross-Product
148    #    (avr2, avr25, ...) x msp8
149
150    sep = ""
151    for (c = 0; c < n_cores; c++)
152    {
153	m_options = m_options sep option[cores[c]]
154	sep = "/"
155    }
156
157    # The ... x msp8
158    m_options = m_options " " option[mtiny[1]]
159
160    ##############################################################
161    # Map Device to its multilib
162
163    for (t = 0; t < n_mcu; t++)
164    {
165	core = toCore[mcu[t]]
166	
167	line = option[core] ":" option[mcu[t]]
168	gsub ("=", "?", line)
169	gsub (":", "=", line)
170    }
171
172    ####################################################################
173    # Compose MULTILIB_DIRNAMES and MULTILIB_EXEPTIONS
174
175    n_mtiny = 2
176    for (t = 0; t < n_mtiny; t++)
177	for (c = -1; c < n_cores; c++)
178	{
179	    if (c == -1)
180		core = ""
181	    else
182		core = cores[c]
183
184	    # The Directory Name for this multilib
185
186	    if (core != "" && mtiny[t] != "")
187	    {
188		mdir = core "/" mtiny[t]
189		mopt = option[core] "/" option[mtiny[t]]
190	    }
191	    else
192	    {
193		mdir = core mtiny[t]
194		mopt = option[core] option[mtiny[t]]
195	    }
196
197	    if (core != "" && tiny_stack[core] == 0 && mtiny[t] != "")
198	    {
199		# There's not a single SP = 8 Devices for this Core:
200		# Don't build respective multilib
201		m_exceptions = m_exceptions " \\\n\t" mopt
202		continue
203	    }
204
205	    if (core != "avr2" || mtiny[t] == "")
206		m_dirnames = m_dirnames " " mdir
207	}
208
209    ############################################################
210    # Output that Stuff
211    ############################################################
212
213    if (FORMAT == "Makefile")
214    {
215	# Intended Target: ./gcc/config/avr/t-multilib
216
217	print m_options
218	print m_dirnames
219	print m_exceptions
220    }
221}
222