annotate gcc/config/avr/genmultilib.awk @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1 # Copyright (C) 2011-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
2 #
kono
parents:
diff changeset
3 # This file is part of GCC.
kono
parents:
diff changeset
4 #
kono
parents:
diff changeset
5 # GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
6 # the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
7 # Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
8 # version.
kono
parents:
diff changeset
9 #
kono
parents:
diff changeset
10 # GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
12 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
13 # for more details.
kono
parents:
diff changeset
14 #
kono
parents:
diff changeset
15 # You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
16 # along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
17 # <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 ##################################################################
kono
parents:
diff changeset
20 #
kono
parents:
diff changeset
21 # Transform Core/Device Information from avr-mcus.def to a
kono
parents:
diff changeset
22 # Representation that is understood by GCC's multilib Machinery.
kono
parents:
diff changeset
23 #
kono
parents:
diff changeset
24 # The Script works as a Filter from STDIN to STDOUT.
kono
parents:
diff changeset
25 # It generates a Makefile Snippet that sets some
kono
parents:
diff changeset
26 # MULTILIB_* Variables as needed.
kono
parents:
diff changeset
27 #
kono
parents:
diff changeset
28 ##################################################################
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 BEGIN {
kono
parents:
diff changeset
31 FS ="[(, \t]+"
kono
parents:
diff changeset
32 option[""] = ""
kono
parents:
diff changeset
33 comment = 1
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 dir_tiny = "tiny-stack"
kono
parents:
diff changeset
36 opt_tiny = "msp8"
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 dir_rcall = "short-calls"
kono
parents:
diff changeset
39 opt_rcall = "mshort-calls"
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 # awk Variable Makefile Variable
kono
parents:
diff changeset
42 # ------------------------------------------
kono
parents:
diff changeset
43 # m_options <-> MULTILIB_OPTIONS
kono
parents:
diff changeset
44 # m_dirnames <-> MULTILIB_DIRNAMES
kono
parents:
diff changeset
45 # m_required <-> MULTILIB_REQUIRED
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
46 # m_reuse <-> MULTILIB_REUSE
111
kono
parents:
diff changeset
47 m_sep = ""
kono
parents:
diff changeset
48 m_options = "\nMULTILIB_OPTIONS = "
kono
parents:
diff changeset
49 m_dirnames = "\nMULTILIB_DIRNAMES ="
kono
parents:
diff changeset
50 m_required = "\nMULTILIB_REQUIRED ="
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
51 m_reuse = "\nMULTILIB_REUSE ="
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
52
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
53 have_long_double_is_double = (HAVE_LONG_DOUBLE_IS_DOUBLE \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
54 == "HAVE_LONG_DOUBLE_IS_DOUBLE")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
55 have_double32 = (HAVE_DOUBLE32 == "HAVE_DOUBLE32")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
56 have_double64 = (HAVE_DOUBLE64 == "HAVE_DOUBLE64")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
57 have_long_double32 = (HAVE_LONG_DOUBLE32 == "HAVE_LONG_DOUBLE32")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
58 have_long_double64 = (HAVE_LONG_DOUBLE64 == "HAVE_LONG_DOUBLE64")
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
59
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
60 have_double_multi = (have_double32 && have_double64)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
61 have_long_double_multi = (! have_long_double_is_double \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
62 && have_long_double32 && have_long_double64)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
63
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
64 # How to switch away from the default.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
65 dir_double = "double" (96 - with_double)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
66 opt_double = "mdouble=" (96 - with_double)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
68 dir_long_double = "long-double" (96 - with_long_double)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
69 opt_long_double = "mlong-double=" (96 - with_long_double)
111
kono
parents:
diff changeset
70 }
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 ##################################################################
kono
parents:
diff changeset
73 # Add some Comments to the generated Files and copy-paste
kono
parents:
diff changeset
74 # Copyright Notice from above.
kono
parents:
diff changeset
75 ##################################################################
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 /^#/ {
kono
parents:
diff changeset
78 if (!comment)
kono
parents:
diff changeset
79 next
kono
parents:
diff changeset
80 else if (comment == 1)
kono
parents:
diff changeset
81 {
kono
parents:
diff changeset
82 print "# Auto-generated Makefile Snip"
kono
parents:
diff changeset
83 print "# Generated by : ./gcc/config/avr/genmultilib.awk"
kono
parents:
diff changeset
84 print "# Generated from : ./gcc/config/avr/avr-mcus.def"
kono
parents:
diff changeset
85 print "# Used by : tmake_file from Makefile and genmultilib"
kono
parents:
diff changeset
86 print ""
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 comment = 2;
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 print
kono
parents:
diff changeset
92 }
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 /^$/ {
kono
parents:
diff changeset
95 # The first empty line stops copy-pasting the GPL comments
kono
parents:
diff changeset
96 # from this file to the generated file.
kono
parents:
diff changeset
97
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
98 if (comment)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
99 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
100 print
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
101
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
102 if (have_double_multi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
103 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
104 print "# dir_double = " dir_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
105 print "# opt_double = -" opt_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
106 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
107 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
108 print "# No multilib for double."
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
109
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
110 if (have_long_double_multi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
111 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
112 print "# dir_long_double = " dir_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
113 print "# opt_long_double = -" opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
114 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
115 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
116 print "# No multilib for long double."
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
117 }
111
kono
parents:
diff changeset
118 comment = 0
kono
parents:
diff changeset
119 }
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 ##################################################################
kono
parents:
diff changeset
122 # Run over all AVR_MCU Lines. If we encounter a required multilib
kono
parents:
diff changeset
123 # variant, add according combination of options to m_required,
kono
parents:
diff changeset
124 # but onyl once. Add encountered cores to m_dirnames and
kono
parents:
diff changeset
125 # according -mmcu= options to m_options.
kono
parents:
diff changeset
126 ##################################################################
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 /^AVR_MCU/ {
kono
parents:
diff changeset
129 name = $2
kono
parents:
diff changeset
130 gsub ("\"", "", name)
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 if ($5 == "NULL")
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 core = name
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 # avr1 is supported for Assembler only: It gets no multilib
kono
parents:
diff changeset
137 if (core == "avr1")
kono
parents:
diff changeset
138 next
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 option[core] = "mmcu=" core
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 m_options = m_options m_sep option[core]
kono
parents:
diff changeset
143 m_dirnames = m_dirnames " " core
kono
parents:
diff changeset
144 m_sep = "/"
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 next
kono
parents:
diff changeset
147 }
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 # avr1 is supported for Assembler only: Its Devices are ignored
kono
parents:
diff changeset
150 if (core == "avr1")
kono
parents:
diff changeset
151 next
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 opts = option[core]
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 # split device specific feature list
kono
parents:
diff changeset
156 n = split($4,dev_attribute,"|")
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 for (i=1; i <= n; i++)
kono
parents:
diff changeset
159 {
kono
parents:
diff changeset
160 if (dev_attribute[i] == "AVR_SHORT_SP")
kono
parents:
diff changeset
161 opts = opts "/" opt_tiny
kono
parents:
diff changeset
162 if (dev_attribute[i] == "AVR_ISA_RCALL")
kono
parents:
diff changeset
163 opts = opts "/" opt_rcall
kono
parents:
diff changeset
164 }
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 if (!have[opts])
kono
parents:
diff changeset
167 {
kono
parents:
diff changeset
168 have[opts] = 1
kono
parents:
diff changeset
169 # Some special handling for the default mmcu: Remove a
kono
parents:
diff changeset
170 # leading "mmcu=avr2/" in order not to confuse genmultilib.
kono
parents:
diff changeset
171 gsub (/^mmcu=avr2\//, "", opts)
kono
parents:
diff changeset
172 if (opts != "mmcu=avr2")
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
173 {
111
kono
parents:
diff changeset
174 m_required = m_required " \\\n\t" opts
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
175 if (have_double_multi && have_long_double_multi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
176 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
177 m_required = m_required " \\\n\t" opts "/" opt_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
178 m_required = m_required " \\\n\t" opts "/" opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
179
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
180 # We have only 3 different combinations because -mdouble=64
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
181 # implies -mlong-double=64, and -mlong-double=32 implies
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
182 # -mdouble=32, hence add respective reuses. The reuse is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
183 # not needed in the case with_double != with_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
184 # which means with_double=32 with_long_double=64 because
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
185 # the driver will rectify combining -mdouble=64 and
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
186 # -mlong-double=32.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
187 if (with_double == with_long_double)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
188 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
189 d_opts = with_double == 32 ? opt_double : opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
190 d_opts = opts "/" d_opts
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
191 d_reuse = opts "/" opt_double "/" opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
192 gsub (/=/, ".", d_opts)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
193 gsub (/=/, ".", d_reuse)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
194 m_reuse = m_reuse " \\\n\t" d_opts "=" d_reuse
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
195 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
196 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
197 else if (have_double_multi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
198 m_required = m_required " \\\n\t" opts "/" opt_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
199 else if (have_long_double_multi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
200 m_required = m_required " \\\n\t" opts "/" opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
201 }
111
kono
parents:
diff changeset
202 }
kono
parents:
diff changeset
203 }
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 ##################################################################
kono
parents:
diff changeset
206 #
kono
parents:
diff changeset
207 ##################################################################
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 END {
kono
parents:
diff changeset
210 ############################################################
kono
parents:
diff changeset
211 # Output that Stuff
kono
parents:
diff changeset
212 ############################################################
kono
parents:
diff changeset
213
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
214 # Intended Target: $(top_builddir)/gcc/t-multilib-avr
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
215
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
216 if (have_double_multi && have_long_double_multi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
217 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
218 print m_options " " opt_tiny " " opt_rcall " " opt_double "/" opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
219 print m_dirnames " " dir_tiny " " dir_rcall " " dir_double " " dir_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
220 # Notice that the ./double* and ./long-double* variants cannot
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
221 # be copied by t-avrlibc because the . default multilib is built
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
222 # after all the others.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
223 m_required = m_required " \\\n\t" opt_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
224 m_required = m_required " \\\n\t" opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
225 if (with_double == with_long_double)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
226 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
227 d_opts = with_double == 32 ? opt_double : opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
228 d_reuse = opt_double "/" opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
229 gsub (/=/, ".", d_opts)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
230 gsub (/=/, ".", d_reuse)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
231 m_reuse = m_reuse " \\\n\t" d_opts "=" d_reuse
111
kono
parents:
diff changeset
232
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
233 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
234 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
235 else if (have_double_multi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
236 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
237 print m_options " " opt_tiny " " opt_rcall " " opt_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
238 print m_dirnames " " dir_tiny " " dir_rcall " " dir_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
239 m_required = m_required " \\\n\t" opt_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
240 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
241 else if (have_long_double_multi)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
242 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
243 print m_options " " opt_tiny " " opt_rcall " " opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
244 print m_dirnames " " dir_tiny " " dir_rcall " " dir_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
245 m_required = m_required " \\\n\t" opt_long_double
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
246 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
247 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
248 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
249 print m_options " " opt_tiny " " opt_rcall
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
250 print m_dirnames " " dir_tiny " " dir_rcall
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
251 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
252
111
kono
parents:
diff changeset
253 print m_required
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
254 print m_reuse
111
kono
parents:
diff changeset
255 }