]>
Commit | Line | Data |
---|---|---|
f1717362 | 1 | # Copyright (C) 2011-2016 Free Software Foundation, Inc. |
b32bc361 | 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 | # | |
b32bc361 | 29 | ################################################################## |
30 | ||
31 | BEGIN { | |
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" | |
d32d7e3a | 41 | option["tiny-stack"] = "msp8" |
b32bc361 | 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 | { | |
b32bc361 | 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 | ||
b32bc361 | 66 | |
67 | } | |
68 | ||
69 | /^$/ { | |
d32d7e3a | 70 | # The first empty line stops copy-pasting the GPL comments |
71 | # from this file to the generated file. | |
b32bc361 | 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 | ||
976c7653 | 89 | if ($5 == "NULL") |
b32bc361 | 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 | |
f0aa7fe2 | 100 | option[core] = "mmcu=" core |
b32bc361 | 101 | |
102 | next | |
103 | } | |
104 | ||
105 | # avr1 is supported for Assembler only: Its Devices are ignored | |
106 | if (core == "avr1") | |
107 | next | |
108 | ||
976c7653 | 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 | ||
b32bc361 | 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 " | |
b32bc361 | 138 | # |
139 | ################################################################## | |
140 | ||
141 | END { | |
142 | m_options = "\nMULTILIB_OPTIONS = " | |
143 | m_dirnames = "\nMULTILIB_DIRNAMES =" | |
144 | m_exceptions = "\nMULTILIB_EXCEPTIONS =" | |
b32bc361 | 145 | |
b32bc361 | 146 | ############################################################## |
147 | # Compose MULTILIB_OPTIONS. This represents the Cross-Product | |
d32d7e3a | 148 | # (avr2, avr25, ...) x msp8 |
b32bc361 | 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 | ||
d32d7e3a | 157 | # The ... x msp8 |
b32bc361 | 158 | m_options = m_options " " option[mtiny[1]] |
159 | ||
160 | ############################################################## | |
161 | # Map Device to its multilib | |
162 | ||
b32bc361 | 163 | for (t = 0; t < n_mcu; t++) |
164 | { | |
165 | core = toCore[mcu[t]] | |
166 | ||
d32d7e3a | 167 | line = option[core] ":" option[mcu[t]] |
168 | gsub ("=", "?", line) | |
169 | gsub (":", "=", line) | |
b32bc361 | 170 | } |
171 | ||
172 | #################################################################### | |
d32d7e3a | 173 | # Compose MULTILIB_DIRNAMES and MULTILIB_EXEPTIONS |
b32bc361 | 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 | |
b32bc361 | 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 | |
b32bc361 | 220 | } |
b32bc361 | 221 | } |