genmultilib.awk revision 1.1.1.1
1# Copyright (C) 2011-2013 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 ($4 == "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    tiny_stack[name]  = $5
110    mcu[n_mcu] = name
111    n_mcu++
112    option[name]      = "mmcu=" name
113    toCore[name]      = core
114
115    if (tiny_stack[name] == 1)
116	tiny_stack[core] = 1
117}
118
119##################################################################
120# 
121# We gathered all the Information, now build/output the following:
122#
123#    awk Variable         target Variable          FORMAT
124#  -----------------------------------------------------------
125#    m_options     <->    MULTILIB_OPTIONS         Makefile
126#    m_dirnames    <->    MULTILIB_DIRNAMES           "
127#    m_exceptions  <->    MULTILIB_EXCEPTIONS         "
128#    m_matches     <->    MULTILIB_MATCHES            "
129#
130##################################################################
131
132END {
133    m_options    = "\nMULTILIB_OPTIONS = "
134    m_dirnames   = "\nMULTILIB_DIRNAMES ="
135    m_exceptions = "\nMULTILIB_EXCEPTIONS ="
136    m_matches    = "\nMULTILIB_MATCHES ="
137
138    ##############################################################
139    # Compose MULTILIB_OPTIONS.  This represents the Cross-Product
140    #    (avr2, avr25, ...) x msp8
141
142    sep = ""
143    for (c = 0; c < n_cores; c++)
144    {
145	m_options = m_options sep option[cores[c]]
146	sep = "/"
147    }
148
149    # The ... x msp8
150    m_options = m_options " " option[mtiny[1]]
151
152    ##############################################################
153    # Map Device to its multilib
154
155    for (t = 0; t < n_mcu; t++)
156    {
157	core = toCore[mcu[t]]
158	
159	line = option[core] ":" option[mcu[t]]
160	gsub ("=", "?", line)
161	gsub (":", "=", line)
162
163	m_matches = m_matches " \\\n\t" line
164    }
165
166    ####################################################################
167    # Compose MULTILIB_DIRNAMES and MULTILIB_EXEPTIONS
168
169    n_mtiny = 2
170    for (t = 0; t < n_mtiny; t++)
171	for (c = -1; c < n_cores; c++)
172	{
173	    if (c == -1)
174		core = ""
175	    else
176		core = cores[c]
177
178	    # The Directory Name for this multilib
179
180	    if (core != "" && mtiny[t] != "")
181	    {
182		mdir = core "/" mtiny[t]
183		mopt = option[core] "/" option[mtiny[t]]
184	    }
185	    else
186	    {
187		mdir = core mtiny[t]
188		mopt = option[core] option[mtiny[t]]
189	    }
190
191	    if (core != "" && tiny_stack[core] == 0 && mtiny[t] != "")
192	    {
193		# There's not a single SP = 8 Devices for this Core:
194		# Don't build respective multilib
195		m_exceptions = m_exceptions " \\\n\t" mopt
196		continue
197	    }
198
199	    if (core != "avr2" || mtiny[t] == "")
200		m_dirnames = m_dirnames " " mdir
201	}
202
203    ############################################################
204    # Output that Stuff
205    ############################################################
206
207    if (FORMAT == "Makefile")
208    {
209	# Intended Target: ./gcc/config/avr/t-multilib
210
211	print m_options
212	print m_dirnames
213	print m_exceptions
214	print m_matches
215    }
216}
217