1*38fd1498Szrj /* Generate from machine description:
2*38fd1498Szrj    a series of #define statements, one for each constant named in
3*38fd1498Szrj    a (define_constants ...) pattern.
4*38fd1498Szrj 
5*38fd1498Szrj    Copyright (C) 1987-2018 Free Software Foundation, Inc.
6*38fd1498Szrj 
7*38fd1498Szrj This file is part of GCC.
8*38fd1498Szrj 
9*38fd1498Szrj GCC is free software; you can redistribute it and/or modify
10*38fd1498Szrj it under the terms of the GNU General Public License as published by
11*38fd1498Szrj the Free Software Foundation; either version 3, or (at your option)
12*38fd1498Szrj any later version.
13*38fd1498Szrj 
14*38fd1498Szrj GCC is distributed in the hope that it will be useful,
15*38fd1498Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
16*38fd1498Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*38fd1498Szrj GNU General Public License for more details.
18*38fd1498Szrj 
19*38fd1498Szrj You should have received a copy of the GNU General Public License
20*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
21*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
22*38fd1498Szrj 
23*38fd1498Szrj /* This program does not use gensupport.c because it does not need to
24*38fd1498Szrj    look at insn patterns, only (define_constants), and we want to
25*38fd1498Szrj    minimize dependencies.  */
26*38fd1498Szrj 
27*38fd1498Szrj #include "bconfig.h"
28*38fd1498Szrj #include "system.h"
29*38fd1498Szrj #include "coretypes.h"
30*38fd1498Szrj #include "errors.h"
31*38fd1498Szrj #include "statistics.h"
32*38fd1498Szrj #include "vec.h"
33*38fd1498Szrj #include "read-md.h"
34*38fd1498Szrj 
35*38fd1498Szrj /* Called via traverse_md_constants; emit a #define for
36*38fd1498Szrj    the current constant definition.  */
37*38fd1498Szrj 
38*38fd1498Szrj static int
print_md_constant(void ** slot,void * info ATTRIBUTE_UNUSED)39*38fd1498Szrj print_md_constant (void **slot, void *info ATTRIBUTE_UNUSED)
40*38fd1498Szrj {
41*38fd1498Szrj   struct md_constant *def = (struct md_constant *) *slot;
42*38fd1498Szrj 
43*38fd1498Szrj   if (!def->parent_enum)
44*38fd1498Szrj     printf ("#define %s %s\n", def->name, def->value);
45*38fd1498Szrj   return 1;
46*38fd1498Szrj }
47*38fd1498Szrj 
48*38fd1498Szrj /* Called via traverse_enums.  Emit an enum definition for
49*38fd1498Szrj    enum_type *SLOT.  */
50*38fd1498Szrj 
51*38fd1498Szrj static int
print_enum_type(void ** slot,void * info ATTRIBUTE_UNUSED)52*38fd1498Szrj print_enum_type (void **slot, void *info ATTRIBUTE_UNUSED)
53*38fd1498Szrj {
54*38fd1498Szrj   struct enum_type *def;
55*38fd1498Szrj   struct enum_value *value;
56*38fd1498Szrj   char *value_name;
57*38fd1498Szrj 
58*38fd1498Szrj   def = (struct enum_type *) *slot;
59*38fd1498Szrj   printf ("\nenum %s {", def->name);
60*38fd1498Szrj   for (value = def->values; value; value = value->next)
61*38fd1498Szrj     {
62*38fd1498Szrj       printf ("\n  %s = %s", value->def->name, value->def->value);
63*38fd1498Szrj       if (value->next)
64*38fd1498Szrj 	putc (',', stdout);
65*38fd1498Szrj     }
66*38fd1498Szrj   printf ("\n};\n");
67*38fd1498Szrj 
68*38fd1498Szrj   /* Define NUM_<enum>_VALUES to be the largest enum value + 1.  */
69*38fd1498Szrj   value_name = ACONCAT (("num_", def->name, "_values", NULL));
70*38fd1498Szrj   upcase_string (value_name);
71*38fd1498Szrj   printf ("#define %s %d\n", value_name, def->num_values);
72*38fd1498Szrj 
73*38fd1498Szrj   /* Declare the array that is generated by genenum.  */
74*38fd1498Szrj   printf ("extern const char *const %s_strings[];\n", def->name);
75*38fd1498Szrj 
76*38fd1498Szrj   return 1;
77*38fd1498Szrj }
78*38fd1498Szrj 
79*38fd1498Szrj int
main(int argc,const char ** argv)80*38fd1498Szrj main (int argc, const char **argv)
81*38fd1498Szrj {
82*38fd1498Szrj   progname = "genconstants";
83*38fd1498Szrj 
84*38fd1498Szrj   noop_reader reader;
85*38fd1498Szrj   if (!reader.read_md_files (argc, argv, NULL))
86*38fd1498Szrj     return (FATAL_EXIT_CODE);
87*38fd1498Szrj 
88*38fd1498Szrj   /* Initializing the MD reader has the side effect of loading up
89*38fd1498Szrj      the constants table that we wish to scan.  */
90*38fd1498Szrj 
91*38fd1498Szrj   puts ("/* Generated automatically by the program `genconstants'");
92*38fd1498Szrj   puts ("   from the machine description file `md'.  */\n");
93*38fd1498Szrj   puts ("#ifndef GCC_INSN_CONSTANTS_H");
94*38fd1498Szrj   puts ("#define GCC_INSN_CONSTANTS_H\n");
95*38fd1498Szrj 
96*38fd1498Szrj   reader.traverse_md_constants (print_md_constant, 0);
97*38fd1498Szrj   reader.traverse_enum_types (print_enum_type, 0);
98*38fd1498Szrj 
99*38fd1498Szrj   puts ("\n#endif /* GCC_INSN_CONSTANTS_H */");
100*38fd1498Szrj 
101*38fd1498Szrj   if (ferror (stdout) || fflush (stdout) || fclose (stdout))
102*38fd1498Szrj     return FATAL_EXIT_CODE;
103*38fd1498Szrj 
104*38fd1498Szrj   return SUCCESS_EXIT_CODE;
105*38fd1498Szrj }
106