diff options
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/gcc/elna-builtins.cc | 2 | ||||
| -rw-r--r-- | gcc/gcc/elna-tree.cc | 21 |
2 files changed, 12 insertions, 11 deletions
diff --git a/gcc/gcc/elna-builtins.cc b/gcc/gcc/elna-builtins.cc index 56950e3..8eb5ce1 100644 --- a/gcc/gcc/elna-builtins.cc +++ b/gcc/gcc/elna-builtins.cc @@ -253,7 +253,7 @@ namespace elna::gcc } else if (const auto reference = type.get<boot::enumeration_type>()) { - return build_enumeration_type(reference->members); + return build_enumeration_type(*reference); } else if (const auto reference = type.get<boot::extern_type>()) { diff --git a/gcc/gcc/elna-tree.cc b/gcc/gcc/elna-tree.cc index b6384f8..0f94864 100644 --- a/gcc/gcc/elna-tree.cc +++ b/gcc/gcc/elna-tree.cc @@ -186,38 +186,39 @@ namespace elna::gcc return build_constructor(slice_type, elements); } - tree build_enumeration_type(const std::vector<std::string>& members) + tree build_enumeration_type(const boot::enumeration_type& enumeration) { tree composite_type_node = make_node(ENUMERAL_TYPE); - tree base_type = elna_word_type_node; + tree base_type = elna_int_type_node; TREE_TYPE(composite_type_node) = base_type; ENUM_IS_SCOPED(composite_type_node) = 1; + // The precision and signedness are needed to build the member + // constants, so they are set before the members. + TYPE_UNSIGNED(composite_type_node) = TYPE_UNSIGNED(base_type); + TYPE_PRECISION(composite_type_node) = TYPE_PRECISION(base_type); tree *members_pointer = &TYPE_VALUES(composite_type_node); - std::size_t order{ 1 }; + std::vector<std::ptrdiff_t>::const_iterator value_iterator = enumeration.values.begin(); - for (const std::string& member : members) + for (const std::string& member : enumeration.members) { tree member_name = get_identifier(member.c_str()); tree member_declaration = build_decl(UNKNOWN_LOCATION, CONST_DECL, member_name, composite_type_node); DECL_CONTEXT(member_declaration) = composite_type_node; - DECL_INITIAL(member_declaration) = build_int_cst_type(composite_type_node, order++); + DECL_INITIAL(member_declaration) = build_int_cst_type(composite_type_node, *value_iterator++); TREE_CONSTANT(member_declaration) = 1; TREE_READONLY(member_declaration) = 1; - TYPE_MAX_VALUE(composite_type_node) = DECL_INITIAL(member_declaration); - *members_pointer = build_tree_list(member_name, member_declaration); members_pointer = &TREE_CHAIN(*members_pointer); } - TYPE_MIN_VALUE(composite_type_node) = DECL_INITIAL(TREE_VALUE(TYPE_VALUES(composite_type_node))); - TYPE_UNSIGNED(composite_type_node) = TYPE_UNSIGNED(base_type); + TYPE_MIN_VALUE(composite_type_node) = build_int_cst_type(composite_type_node, enumeration.minimum()); + TYPE_MAX_VALUE(composite_type_node) = build_int_cst_type(composite_type_node, enumeration.maximum()); // NOLINTNEXTLINE(bugprone-signed-bitwise) SET_TYPE_ALIGN(composite_type_node, TYPE_ALIGN(base_type)); TYPE_SIZE(composite_type_node) = NULL_TREE; - TYPE_PRECISION(composite_type_node) = TYPE_PRECISION(base_type); layout_type(composite_type_node); return composite_type_node; |
