aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gcc/elna-builtins.cc2
-rw-r--r--gcc/gcc/elna-tree.cc21
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;