From ac2cfa6cc35175311f92c25acbdd244f0f3bbb87 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 29 Oct 2019 08:39:45 +0000 Subject: [PATCH] Add a simulate_enum_decl langhook Similarly to the simulate_builtin_function_decl patch, this one adds a hook for simulating an enum declaration in the source language. Again, the main SVE ACLE patch has tests for various error conditions. 2019-10-29 Richard Sandiford gcc/ * coretypes.h (string_int_pair): New typedef. * langhooks-def.h (LANG_HOOKS_SIMULATE_ENUM_DECL): Define. (LANG_HOOKS_FOR_TYPES_INITIALIZER): Include it. * langhooks.h (lang_hooks_for_types::simulate_enum_decl): New hook. gcc/c/ * c-tree.h (c_simulate_enum_decl): Declare. * c-decl.c (c_simulate_enum_decl): New function. * c-objc-common.h (LANG_HOOKS_SIMULATE_ENUM_DECL): Define to the above. gcc/cp/ * cp-objcp-common.h (cxx_simulate_enum_decl): Declare. (LANG_HOOKS_SIMULATE_ENUM_DECL): Define to the above. * decl.c (cxx_simulate_enum_decl): New function. From-SVN: r277555 --- gcc/ChangeLog | 7 +++++++ gcc/c/ChangeLog | 6 ++++++ gcc/c/c-decl.c | 30 ++++++++++++++++++++++++++++++ gcc/c/c-objc-common.h | 2 ++ gcc/c/c-tree.h | 2 ++ gcc/coretypes.h | 1 + gcc/cp/ChangeLog | 6 ++++++ gcc/cp/cp-objcp-common.h | 4 ++++ gcc/cp/decl.c | 34 ++++++++++++++++++++++++++++++++++ gcc/langhooks-def.h | 2 ++ gcc/langhooks.h | 4 ++++ 11 files changed, 98 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7d69ac..4bb1f91 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2019-10-29 Richard Sandiford + * coretypes.h (string_int_pair): New typedef. + * langhooks-def.h (LANG_HOOKS_SIMULATE_ENUM_DECL): Define. + (LANG_HOOKS_FOR_TYPES_INITIALIZER): Include it. + * langhooks.h (lang_hooks_for_types::simulate_enum_decl): New hook. + +2019-10-29 Richard Sandiford + * langhooks.h (lang_hooks::simulate_builtin_function_decl): New hook. (simulate_builtin_function_decl): Declare. * langhooks-def.h (LANG_HOOKS_SIMULATE_BUILTIN_FUNCTION_DECL): Define. diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 3b0e3ba..b76dfc2 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,5 +1,11 @@ 2019-10-29 Richard Sandiford + * c-tree.h (c_simulate_enum_decl): Declare. + * c-decl.c (c_simulate_enum_decl): New function. + * c-objc-common.h (LANG_HOOKS_SIMULATE_ENUM_DECL): Define to the above. + +2019-10-29 Richard Sandiford + * c-tree.h (c_simulate_builtin_function_decl): Declare. * c-decl.c (c_simulate_builtin_function_decl): New function. * c-objc-common.h (LANG_HOOKS_SIMULATE_BUILTIN_FUNCTION_DECL): Define diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 1013996..ae0ee3a 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -8907,6 +8907,36 @@ build_enumerator (location_t decl_loc, location_t loc, return tree_cons (decl, value, NULL_TREE); } +/* Implement LANG_HOOKS_SIMULATE_ENUM_DECL. */ + +tree +c_simulate_enum_decl (location_t loc, const char *name, + vec values) +{ + location_t saved_loc = input_location; + input_location = loc; + + struct c_enum_contents the_enum; + tree enumtype = start_enum (loc, &the_enum, get_identifier (name)); + + tree value_chain = NULL_TREE; + string_int_pair *value; + unsigned int i; + FOR_EACH_VEC_ELT (values, i, value) + { + tree decl = build_enumerator (loc, loc, &the_enum, + get_identifier (value->first), + build_int_cst (integer_type_node, + value->second)); + TREE_CHAIN (decl) = value_chain; + value_chain = decl; + } + + finish_enum (enumtype, nreverse (value_chain), NULL_TREE); + + input_location = saved_loc; + return enumtype; +} /* Create the FUNCTION_DECL for a function definition. DECLSPECS, DECLARATOR and ATTRIBUTES are the parts of diff --git a/gcc/c/c-objc-common.h b/gcc/c/c-objc-common.h index 8d3bcc2..c8739e0 100644 --- a/gcc/c/c-objc-common.h +++ b/gcc/c/c-objc-common.h @@ -75,6 +75,8 @@ along with GCC; see the file COPYING3. If not see #undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN #define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN c_dump_tree +#undef LANG_HOOKS_SIMULATE_ENUM_DECL +#define LANG_HOOKS_SIMULATE_ENUM_DECL c_simulate_enum_decl #undef LANG_HOOKS_TYPE_FOR_MODE #define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode #undef LANG_HOOKS_TYPE_FOR_SIZE diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h index d01d422..71cd77d 100644 --- a/gcc/c/c-tree.h +++ b/gcc/c/c-tree.h @@ -563,6 +563,8 @@ extern tree finish_enum (tree, tree, tree); extern void finish_function (void); extern tree finish_struct (location_t, tree, tree, tree, class c_struct_parse_info *); +extern tree c_simulate_enum_decl (location_t, const char *, + vec); extern struct c_arg_info *build_arg_info (void); extern struct c_arg_info *get_parm_info (bool, tree); extern tree grokfield (location_t, struct c_declarator *, diff --git a/gcc/coretypes.h b/gcc/coretypes.h index b683f12..a18aaa2 100644 --- a/gcc/coretypes.h +++ b/gcc/coretypes.h @@ -341,6 +341,7 @@ namespace gcc { } typedef std::pair tree_pair; +typedef std::pair string_int_pair; /* Define a name->value mapping. */ template diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 02cb6f3..c244438 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2019-10-29 Richard Sandiford + * cp-objcp-common.h (cxx_simulate_enum_decl): Declare. + (LANG_HOOKS_SIMULATE_ENUM_DECL): Define to the above. + * decl.c (cxx_simulate_enum_decl): New function. + +2019-10-29 Richard Sandiford + * cp-tree.h (cxx_simulate_builtin_function_decl): Declare. * decl.c (cxx_simulate_builtin_function_decl): New function. * cp-objcp-common.h (LANG_HOOKS_SIMULATE_BUILTIN_FUNCTION_DECL): Define diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h index 1827e53..e5d34f1 100644 --- a/gcc/cp/cp-objcp-common.h +++ b/gcc/cp/cp-objcp-common.h @@ -35,6 +35,8 @@ extern tree cp_get_global_decls (); extern tree cp_pushdecl (tree); extern void cp_register_dumps (gcc::dump_manager *); extern tree cxx_make_type_hook (tree_code); +extern tree cxx_simulate_enum_decl (location_t, const char *, + vec); /* Lang hooks that are shared between C++ and ObjC++ are defined here. Hooks specific to C++ or ObjC++ go in cp/cp-lang.c and objcp/objcp-lang.c, @@ -131,6 +133,8 @@ extern tree cxx_make_type_hook (tree_code); #undef LANG_HOOKS_MAKE_TYPE #define LANG_HOOKS_MAKE_TYPE cxx_make_type_hook +#undef LANG_HOOKS_SIMULATE_ENUM_DECL +#define LANG_HOOKS_SIMULATE_ENUM_DECL cxx_simulate_enum_decl #undef LANG_HOOKS_TYPE_FOR_MODE #define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode #undef LANG_HOOKS_TYPE_FOR_SIZE diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index dccde80..95c8415 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -15433,6 +15433,40 @@ lookup_enumerator (tree enumtype, tree name) return e? TREE_VALUE (e) : NULL_TREE; } +/* Implement LANG_HOOKS_SIMULATE_ENUM_DECL. */ + +tree +cxx_simulate_enum_decl (location_t loc, const char *name, + vec values) +{ + location_t saved_loc = input_location; + input_location = loc; + + tree enumtype = start_enum (get_identifier (name), NULL_TREE, NULL_TREE, + NULL_TREE, false, NULL); + if (!OPAQUE_ENUM_P (enumtype)) + { + error_at (loc, "multiple definition of %q#T", enumtype); + inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (enumtype)), + "previous definition here"); + return enumtype; + } + SET_OPAQUE_ENUM_P (enumtype, false); + DECL_SOURCE_LOCATION (TYPE_NAME (enumtype)) = loc; + + string_int_pair *value; + unsigned int i; + FOR_EACH_VEC_ELT (values, i, value) + build_enumerator (get_identifier (value->first), + build_int_cst (integer_type_node, value->second), + enumtype, NULL_TREE, loc); + + finish_enum_value_list (enumtype); + finish_enum (enumtype); + + input_location = saved_loc; + return enumtype; +} /* We're defining DECL. Make sure that its type is OK. */ diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h index af0c1b3..54f80e5 100644 --- a/gcc/langhooks-def.h +++ b/gcc/langhooks-def.h @@ -171,6 +171,7 @@ extern tree lhd_make_node (enum tree_code); extern tree lhd_unit_size_without_reusable_padding (tree); #define LANG_HOOKS_MAKE_TYPE lhd_make_node +#define LANG_HOOKS_SIMULATE_ENUM_DECL NULL #define LANG_HOOKS_CLASSIFY_RECORD NULL #define LANG_HOOKS_TYPE_FOR_SIZE lhd_type_for_size #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR lhd_incomplete_type_error @@ -204,6 +205,7 @@ extern tree lhd_unit_size_without_reusable_padding (tree); #define LANG_HOOKS_FOR_TYPES_INITIALIZER { \ LANG_HOOKS_MAKE_TYPE, \ + LANG_HOOKS_SIMULATE_ENUM_DECL, \ LANG_HOOKS_CLASSIFY_RECORD, \ LANG_HOOKS_TYPE_FOR_MODE, \ LANG_HOOKS_TYPE_FOR_SIZE, \ diff --git a/gcc/langhooks.h b/gcc/langhooks.h index 76f530e..e50162f 100644 --- a/gcc/langhooks.h +++ b/gcc/langhooks.h @@ -64,6 +64,10 @@ struct lang_hooks_for_types language-specific processing is required. */ tree (*make_type) (enum tree_code); + /* Make an enum type with the given name and values, associating + them all with the given source location. */ + tree (*simulate_enum_decl) (location_t, const char *, vec); + /* Return what kind of RECORD_TYPE this is, mainly for purposes of debug information. If not defined, record types are assumed to be structures. */ -- 2.7.4