OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [optc-save-gen.awk] - Blame information for rev 867

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 684 jeremybenn
#  Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010, 2011
2
#  Free Software Foundation, Inc.
3
#  Contributed by Kelley Cook, June 2004.
4
#  Original code from Neil Booth, May 2003.
5
#
6
# This program is free software; you can redistribute it and/or modify it
7
# under the terms of the GNU General Public License as published by the
8
# Free Software Foundation; either version 3, or (at your option) any
9
# later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; see the file COPYING3.  If not see
18
# <http://www.gnu.org/licenses/>.
19
 
20
# This Awk script reads in the option records generated from
21
# opt-gather.awk, combines the flags of duplicate options and generates a
22
# C file.
23
#
24
 
25
# This program uses functions from opt-functions.awk and code from
26
# opt-read.awk.
27
#
28
# Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-save-gen.awk \
29
#            [-v header_name=header.h] < inputfile > options-save.c
30
 
31
# Dump that array of options into a C file.
32
END {
33
print "/* This file is auto-generated by optc-save-gen.awk.  */"
34
print ""
35
n_headers = split(header_name, headers, " ")
36
for (i = 1; i <= n_headers; i++)
37
        print "#include " quote headers[i] quote
38
print "#include " quote "opts.h" quote
39
print "#include " quote "intl.h" quote
40
print ""
41
print "#include " quote "flags.h" quote
42
print "#include " quote "target.h" quote
43
print ""
44
 
45
if (n_extra_c_includes > 0) {
46
        for (i = 0; i < n_extra_c_includes; i++) {
47
                print "#include " quote extra_c_includes[i] quote
48
        }
49
        print ""
50
}
51
 
52
have_save = 0;
53
if (n_extra_target_vars)
54
        have_save = 1
55
 
56
for (i = 0; i < n_opts; i++) {
57
        if (flag_set_p("Save", flags[i]))
58
                have_save = 1;
59
}
60
 
61
print "/* Save optimization variables into a structure.  */"
62
print "void";
63
print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)";
64
print "{";
65
 
66
n_opt_char = 2;
67
n_opt_short = 0;
68
n_opt_int = 0;
69
n_opt_enum = 1;
70
n_opt_other = 0;
71
var_opt_char[0] = "optimize";
72
var_opt_char[1] = "optimize_size";
73
var_opt_range["optimize"] = "0, 255";
74
var_opt_range["optimize_size"] = "0, 255";
75
var_opt_enum[0] = "flag_fp_contract_mode";
76
 
77
# Sort by size to mimic how the structure is laid out to be friendlier to the
78
# cache.
79
 
80
for (i = 0; i < n_opts; i++) {
81
        if (flag_set_p("Optimization", flags[i])) {
82
                name = var_name(flags[i])
83
                if(name == "")
84
                        continue;
85
 
86
                if(name in var_opt_seen)
87
                        continue;
88
 
89
                var_opt_seen[name]++;
90
                otype = var_type_struct(flags[i]);
91
                if (otype ~ "^((un)?signed +)?int *$")
92
                        var_opt_int[n_opt_int++] = name;
93
 
94
                else if (otype ~ "^((un)?signed +)?short *$")
95
                        var_opt_short[n_opt_short++] = name;
96
 
97
                else if (otype ~ ("^enum +[_" alnum "]+ *"))
98
                        var_opt_enum[n_opt_enum++] = name;
99
 
100
                else if (otype ~ "^((un)?signed +)?char *$") {
101
                        var_opt_char[n_opt_char++] = name;
102
                        if (otype ~ "^unsigned +char *$")
103
                                var_opt_range[name] = "0, 255"
104
                        else if (otype ~ "^signed +char *$")
105
                                var_opt_range[name] = "-128, 127"
106
                }
107
                else
108
                        var_opt_other[n_opt_other++] = name;
109
        }
110
}
111
 
112
for (i = 0; i < n_opt_char; i++) {
113
        name = var_opt_char[i];
114
        if (var_opt_range[name] != "")
115
                print "  gcc_assert (IN_RANGE (opts->x_" name ", " var_opt_range[name] "));";
116
}
117
 
118
print "";
119
for (i = 0; i < n_opt_other; i++) {
120
        print "  ptr->x_" var_opt_other[i] " = opts->x_" var_opt_other[i] ";";
121
}
122
 
123
for (i = 0; i < n_opt_int; i++) {
124
        print "  ptr->x_" var_opt_int[i] " = opts->x_" var_opt_int[i] ";";
125
}
126
 
127
for (i = 0; i < n_opt_enum; i++) {
128
        print "  ptr->x_" var_opt_enum[i] " = opts->x_" var_opt_enum[i] ";";
129
}
130
 
131
for (i = 0; i < n_opt_short; i++) {
132
        print "  ptr->x_" var_opt_short[i] " = opts->x_" var_opt_short[i] ";";
133
}
134
 
135
for (i = 0; i < n_opt_char; i++) {
136
        print "  ptr->x_" var_opt_char[i] " = opts->x_" var_opt_char[i] ";";
137
}
138
 
139
print "}";
140
 
141
print "";
142
print "/* Restore optimization options from a structure.  */";
143
print "void";
144
print "cl_optimization_restore (struct gcc_options *opts, struct cl_optimization *ptr)";
145
print "{";
146
 
147
for (i = 0; i < n_opt_other; i++) {
148
        print "  opts->x_" var_opt_other[i] " = ptr->x_" var_opt_other[i] ";";
149
}
150
 
151
for (i = 0; i < n_opt_int; i++) {
152
        print "  opts->x_" var_opt_int[i] " = ptr->x_" var_opt_int[i] ";";
153
}
154
 
155
for (i = 0; i < n_opt_enum; i++) {
156
        print "  opts->x_" var_opt_enum[i] " = ptr->x_" var_opt_enum[i] ";";
157
}
158
 
159
for (i = 0; i < n_opt_short; i++) {
160
        print "  opts->x_" var_opt_short[i] " = ptr->x_" var_opt_short[i] ";";
161
}
162
 
163
for (i = 0; i < n_opt_char; i++) {
164
        print "  opts->x_" var_opt_char[i] " = ptr->x_" var_opt_char[i] ";";
165
}
166
 
167
print "  targetm.override_options_after_change ();";
168
print "}";
169
 
170
print "";
171
print "/* Print optimization options from a structure.  */";
172
print "void";
173
print "cl_optimization_print (FILE *file,";
174
print "                       int indent_to,";
175
print "                       struct cl_optimization *ptr)";
176
print "{";
177
 
178
print "  fputs (\"\\n\", file);";
179
for (i = 0; i < n_opt_other; i++) {
180
        print "  if (ptr->x_" var_opt_other[i] ")";
181
        print "    fprintf (file, \"%*s%s (%#lx)\\n\",";
182
        print "             indent_to, \"\",";
183
        print "             \"" var_opt_other[i] "\",";
184
        print "             (unsigned long)ptr->x_" var_opt_other[i] ");";
185
        print "";
186
}
187
 
188
for (i = 0; i < n_opt_int; i++) {
189
        print "  if (ptr->x_" var_opt_int[i] ")";
190
        print "    fprintf (file, \"%*s%s (%#x)\\n\",";
191
        print "             indent_to, \"\",";
192
        print "             \"" var_opt_int[i] "\",";
193
        print "             ptr->x_" var_opt_int[i] ");";
194
        print "";
195
}
196
 
197
for (i = 0; i < n_opt_enum; i++) {
198
        print "  fprintf (file, \"%*s%s (%#x)\\n\",";
199
        print "           indent_to, \"\",";
200
        print "           \"" var_opt_enum[i] "\",";
201
        print "           (int) ptr->x_" var_opt_enum[i] ");";
202
        print "";
203
}
204
 
205
for (i = 0; i < n_opt_short; i++) {
206
        print "  if (ptr->x_" var_opt_short[i] ")";
207
        print "    fprintf (file, \"%*s%s (%#x)\\n\",";
208
        print "             indent_to, \"\",";
209
        print "             \"" var_opt_short[i] "\",";
210
        print "             ptr->x_" var_opt_short[i] ");";
211
        print "";
212
}
213
 
214
for (i = 0; i < n_opt_char; i++) {
215
        print "  if (ptr->x_" var_opt_char[i] ")";
216
        print "    fprintf (file, \"%*s%s (%#x)\\n\",";
217
        print "             indent_to, \"\",";
218
        print "             \"" var_opt_char[i] "\",";
219
        print "             ptr->x_" var_opt_char[i] ");";
220
        print "";
221
}
222
 
223
print "}";
224
 
225
print "";
226
print "/* Save selected option variables into a structure.  */"
227
print "void";
228
print "cl_target_option_save (struct cl_target_option *ptr, struct gcc_options *opts)";
229
print "{";
230
 
231
n_target_char = 0;
232
n_target_short = 0;
233
n_target_int = 0;
234
n_target_enum = 0;
235
n_target_other = 0;
236
 
237
if (have_save) {
238
        for (i = 0; i < n_opts; i++) {
239
                if (flag_set_p("Save", flags[i])) {
240
                        name = var_name(flags[i])
241
                        if(name == "")
242
                                name = "target_flags";
243
 
244
                        if(name in var_save_seen)
245
                                continue;
246
 
247
                        var_save_seen[name]++;
248
                        otype = var_type_struct(flags[i])
249
                        if (otype ~ "^((un)?signed +)?int *$")
250
                                var_target_int[n_target_int++] = name;
251
 
252
                        else if (otype ~ "^((un)?signed +)?short *$")
253
                                var_target_short[n_target_short++] = name;
254
 
255
                        else if (otype ~ ("^enum +[_" alnum "]+ *$"))
256
                                var_target_enum[n_target_enum++] = name;
257
 
258
                        else if (otype ~ "^((un)?signed +)?char *$") {
259
                                var_target_char[n_target_char++] = name;
260
                                if (otype ~ "^unsigned +char *$")
261
                                        var_target_range[name] = "0, 255"
262
                                else if (otype ~ "^signed +char *$")
263
                                        var_target_range[name] = "-128, 127"
264
                                if (otype == var_type(flags[i]))
265
                                        var_target_range[name] = ""
266
                        }
267
                        else
268
                                var_target_other[n_target_other++] = name;
269
                }
270
        }
271
} else {
272
        var_target_int[n_target_int++] = "target_flags";
273
}
274
 
275
have_assert = 0;
276
for (i = 0; i < n_target_char; i++) {
277
        name = var_target_char[i];
278
        if (var_target_range[name] != "") {
279
                have_assert = 1;
280
                print "  gcc_assert (IN_RANGE (opts->x_" name ", " var_target_range[name] "));";
281
        }
282
}
283
 
284
if (have_assert)
285
        print "";
286
 
287
print "  if (targetm.target_option.save)";
288
print "    targetm.target_option.save (ptr);";
289
print "";
290
 
291
for (i = 0; i < n_extra_target_vars; i++) {
292
        print "  ptr->x_" extra_target_vars[i] " = opts->x_" extra_target_vars[i] ";";
293
}
294
 
295
for (i = 0; i < n_target_other; i++) {
296
        print "  ptr->x_" var_target_other[i] " = opts->x_" var_target_other[i] ";";
297
}
298
 
299
for (i = 0; i < n_target_enum; i++) {
300
        print "  ptr->x_" var_target_enum[i] " = opts->x_" var_target_enum[i] ";";
301
}
302
 
303
for (i = 0; i < n_target_int; i++) {
304
        print "  ptr->x_" var_target_int[i] " = opts->x_" var_target_int[i] ";";
305
}
306
 
307
for (i = 0; i < n_target_short; i++) {
308
        print "  ptr->x_" var_target_short[i] " = opts->x_" var_target_short[i] ";";
309
}
310
 
311
for (i = 0; i < n_target_char; i++) {
312
        print "  ptr->x_" var_target_char[i] " = opts->x_" var_target_char[i] ";";
313
}
314
 
315
print "}";
316
 
317
print "";
318
print "/* Restore selected current options from a structure.  */";
319
print "void";
320
print "cl_target_option_restore (struct gcc_options *opts, struct cl_target_option *ptr)";
321
print "{";
322
 
323
for (i = 0; i < n_extra_target_vars; i++) {
324
        print "  opts->x_" extra_target_vars[i] " = ptr->x_" extra_target_vars[i] ";";
325
}
326
 
327
for (i = 0; i < n_target_other; i++) {
328
        print "  opts->x_" var_target_other[i] " = ptr->x_" var_target_other[i] ";";
329
}
330
 
331
for (i = 0; i < n_target_enum; i++) {
332
        print "  opts->x_" var_target_enum[i] " = ptr->x_" var_target_enum[i] ";";
333
}
334
 
335
for (i = 0; i < n_target_int; i++) {
336
        print "  opts->x_" var_target_int[i] " = ptr->x_" var_target_int[i] ";";
337
}
338
 
339
for (i = 0; i < n_target_short; i++) {
340
        print "  opts->x_" var_target_short[i] " = ptr->x_" var_target_short[i] ";";
341
}
342
 
343
for (i = 0; i < n_target_char; i++) {
344
        print "  opts->x_" var_target_char[i] " = ptr->x_" var_target_char[i] ";";
345
}
346
 
347
# This must occur after the normal variables in case the code depends on those
348
# variables.
349
print "";
350
print "  if (targetm.target_option.restore)";
351
print "    targetm.target_option.restore (ptr);";
352
 
353
print "}";
354
 
355
print "";
356
print "/* Print optimization options from a structure.  */";
357
print "void";
358
print "cl_target_option_print (FILE *file,";
359
print "                        int indent,";
360
print "                        struct cl_target_option *ptr)";
361
print "{";
362
 
363
print "  fputs (\"\\n\", file);";
364
for (i = 0; i < n_target_other; i++) {
365
        print "  if (ptr->x_" var_target_other[i] ")";
366
        if (host_wide_int[var_target_other[i]] == "yes")
367
                print "    fprintf (file, \"%*s%s (%#\" HOST_WIDE_INT_PRINT \"x)\\n\",";
368
        else
369
                print "    fprintf (file, \"%*s%s (%#x)\\n\",";
370
        print "             indent, \"\",";
371
        print "             \"" var_target_other[i] "\",";
372
        if (host_wide_int[var_target_other[i]] == "yes")
373
                print "             ptr->x_" var_target_other[i] ");";
374
        else
375
                print "             (unsigned long)ptr->x_" var_target_other[i] ");";
376
        print "";
377
}
378
 
379
for (i = 0; i < n_target_enum; i++) {
380
        print "  if (ptr->x_" var_target_enum[i] ")";
381
        print "    fprintf (file, \"%*s%s (%#x)\\n\",";
382
        print "             indent, \"\",";
383
        print "             \"" var_target_enum[i] "\",";
384
        print "             ptr->x_" var_target_enum[i] ");";
385
        print "";
386
}
387
 
388
for (i = 0; i < n_target_int; i++) {
389
        print "  if (ptr->x_" var_target_int[i] ")";
390
        print "    fprintf (file, \"%*s%s (%#x)\\n\",";
391
        print "             indent, \"\",";
392
        print "             \"" var_target_int[i] "\",";
393
        print "             ptr->x_" var_target_int[i] ");";
394
        print "";
395
}
396
 
397
for (i = 0; i < n_target_short; i++) {
398
        print "  if (ptr->x_" var_target_short[i] ")";
399
        print "    fprintf (file, \"%*s%s (%#x)\\n\",";
400
        print "             indent, \"\",";
401
        print "             \"" var_target_short[i] "\",";
402
        print "             ptr->x_" var_target_short[i] ");";
403
        print "";
404
}
405
 
406
for (i = 0; i < n_target_char; i++) {
407
        print "  if (ptr->x_" var_target_char[i] ")";
408
        print "    fprintf (file, \"%*s%s (%#x)\\n\",";
409
        print "             indent, \"\",";
410
        print "             \"" var_target_char[i] "\",";
411
        print "             ptr->x_" var_target_char[i] ");";
412
        print "";
413
}
414
 
415
print "";
416
print "  if (targetm.target_option.print)";
417
print "    targetm.target_option.print (file, indent, ptr);";
418
 
419
print "}";
420
 
421
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.