aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-12-17 17:36:59 +0000
committergingerBill <bill@gingerbill.org>2020-12-17 17:36:59 +0000
commit3558848da818dc330d139ff5d756bb9b9498b1d4 (patch)
treee610f06a230cca9d89bf075ec55e520dae83ad8e /src
parent720f2c7c61ddfc79deba2bb29b3727b50314cafb (diff)
Fix ir_print.cpp for typeid constants
Diffstat (limited to 'src')
-rw-r--r--src/ir.cpp12
-rw-r--r--src/ir_print.cpp5
2 files changed, 15 insertions, 2 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index f69b25494..90cce3699 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -1638,6 +1638,7 @@ irValue *ir_check_compound_lit_constant(irModule *m, Ast *expr) {
if (expr == nullptr) {
return nullptr;
}
+
if (expr->kind == Ast_CompoundLit) {
ast_node(cl, CompoundLit, expr);
for_array(i, cl->elems) {
@@ -1661,6 +1662,7 @@ irValue *ir_check_compound_lit_constant(irModule *m, Ast *expr) {
}
}
+
return nullptr;
}
@@ -6743,7 +6745,10 @@ irValue *ir_type_info(irProcedure *proc, Type *type) {
return ir_emit_array_ep(proc, ir_global_type_info_data, ir_const_i32(id));
}
-irValue *ir_typeid(irModule *m, Type *type) {
+u64 ir_typeid_as_integer(irModule *m, Type *type) {
+ if (type == nullptr) {
+ return 0;
+ }
type = default_type(type);
u64 id = cast(u64)ir_type_info_index(m->info, type);
@@ -6808,8 +6813,11 @@ irValue *ir_typeid(irModule *m, Type *type) {
data |= (reserved &~ (1ull<<1)) << 63ull; // kind
}
+ return id;
+}
- return ir_value_constant(t_typeid, exact_value_u64(data));
+irValue *ir_typeid(irModule *m, Type *type) {
+ return ir_value_constant(t_typeid, exact_value_u64(ir_typeid_as_integer(m, type)));
}
diff --git a/src/ir_print.cpp b/src/ir_print.cpp
index a58ddbe0f..594cc57c2 100644
--- a/src/ir_print.cpp
+++ b/src/ir_print.cpp
@@ -787,6 +787,11 @@ void ir_print_exact_value(irFileBuffer *f, irModule *m, ExactValue value, Type *
}
switch (value.kind) {
+ case ExactValue_Typeid:
+ GB_ASSERT(is_type_typeid(type));
+ ir_write_u64(f, ir_typeid_as_integer(m, value.value_typeid));
+ break;
+
case ExactValue_Bool:
if (value.value_bool) {
ir_write_string(f, are_types_identical(type, t_llvm_bool) ? str_lit("true") : str_lit("1"));