a series of #define statements, one for each constant named in
a (define_constants ...) pattern.
- Copyright (C) 1987, 1991, 1995, 1998, 1999, 2000, 2001, 2003, 2004
- Free Software Foundation, Inc.
+ Copyright (C) 1987-2015 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING. If not, write to
-the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA. */
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
/* This program does not use gensupport.c because it does not need to
look at insn patterns, only (define_constants), and we want to
#include "bconfig.h"
#include "system.h"
#include "coretypes.h"
-#include "tm.h"
-#include "rtl.h"
#include "errors.h"
-#include "gensupport.h"
+#include "read-md.h"
/* Called via traverse_md_constants; emit a #define for
the current constant definition. */
static int
-print_md_constant (void **slot, void *info)
+print_md_constant (void **slot, void *info ATTRIBUTE_UNUSED)
{
struct md_constant *def = (struct md_constant *) *slot;
- FILE *file = (FILE *) info;
- fprintf (file, "#define %s %s\n", def->name, def->value);
+ if (!def->parent_enum)
+ printf ("#define %s %s\n", def->name, def->value);
+ return 1;
+}
+
+/* Called via traverse_enums. Emit an enum definition for
+ enum_type *SLOT. */
+
+static int
+print_enum_type (void **slot, void *info ATTRIBUTE_UNUSED)
+{
+ struct enum_type *def;
+ struct enum_value *value;
+ char *value_name;
+
+ def = (struct enum_type *) *slot;
+ printf ("\nenum %s {", def->name);
+ for (value = def->values; value; value = value->next)
+ {
+ printf ("\n %s = %s", value->def->name, value->def->value);
+ if (value->next)
+ putc (',', stdout);
+ }
+ printf ("\n};\n");
+
+ /* Define NUM_<enum>_VALUES to be the largest enum value + 1. */
+ value_name = ACONCAT (("num_", def->name, "_values", NULL));
+ upcase_string (value_name);
+ printf ("#define %s %d\n", value_name, def->num_values);
+
+ /* Declare the array that is generated by genenum. */
+ printf ("extern const char *const %s_strings[];\n", def->name);
+
return 1;
}
{
progname = "genconstants";
- if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
+ if (!read_md_files (argc, argv, NULL, NULL))
return (FATAL_EXIT_CODE);
/* Initializing the MD reader has the side effect of loading up
puts ("#ifndef GCC_INSN_CONSTANTS_H");
puts ("#define GCC_INSN_CONSTANTS_H\n");
- traverse_md_constants (print_md_constant, stdout);
+ traverse_md_constants (print_md_constant, 0);
+ traverse_enum_types (print_enum_type, 0);
puts ("\n#endif /* GCC_INSN_CONSTANTS_H */");