From a23112fae6b68873955e5b0b3e32426d4f0a663e Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Tue, 29 Aug 2023 09:02:45 +0200 Subject: [PATCH] Added parentof. --- releasenotes.md | 1 + src/compiler/codegen_internal.h | 11 +++-- src/compiler/compiler_internal.h | 1 + src/compiler/enums.h | 2 + src/compiler/llvm_codegen_expr.c | 36 +++++++++++--- src/compiler/llvm_codegen_internal.h | 1 + src/compiler/llvm_codegen_module.c | 1 + src/compiler/llvm_codegen_stmt.c | 12 ++++- src/compiler/llvm_codegen_type.c | 30 +++++++++--- src/compiler/sema_expr.c | 15 ++++++ src/compiler/symtab.c | 1 + src/compiler/types.c | 20 ++++++++ src/version.h | 2 +- test/test_suite/abi/small_struct_x64.c3t | 4 +- .../test_suite/arrays/complex_array_const.c3t | 2 +- .../attributes/user_defined_attributes.c3t | 3 +- .../compile_time/untyped_conversions.c3t | 21 ++++---- .../compile_time_introspection/parentof.c3t | 49 +++++++++++++++++++ .../compile_time_introspection/qnameof.c3t | 2 +- .../concurrency/atomic_load_store_debug.c3t | 8 +-- .../enumerations/enum_associated_value.c3t | 9 ++-- .../enum_associated_values_other.c3t | 28 ++++++----- test/test_suite/errors/error_introspect.c3t | 14 +++--- .../errors/optional_taddr_and_access.c3t | 4 +- .../test_suite/expressions/pointer_access.c3t | 8 +-- .../func_ptr_conversions_and_names.c3t | 13 +++-- test/test_suite/functions/test_regression.c3t | 13 ++--- .../functions/test_regression_mingw.c3t | 17 ++++--- .../test_suite/functions/typeless_varargs.c3t | 3 +- .../initializer_lists/general_tests.c3t | 5 +- test/test_suite/initializer_lists/statics.c3t | 5 +- .../initializer_lists/subarrays.c3t | 4 +- test/test_suite/macros/userland_bitcast.c3t | 2 +- .../methods/enum_distinct_err_methods.c3t | 4 +- .../pointers/subarray_variant_to_ptr.c3t | 5 +- .../statements/custom_foreach_with_ref.c3t | 31 +++++++++++- .../statements/foreach_custom_macro.c3t | 2 +- test/test_suite/stdlib/map.c3t | 2 +- test/test_suite/struct/nested_struct_init.c3t | 12 ++--- test/test_suite/struct/struct_as_value.c3t | 2 +- test/test_suite/struct/struct_codegen.c3t | 2 +- .../struct/struct_const_construct_simple.c3t | 2 +- test/test_suite/variant/variant_assign.c3t | 6 +-- test/test_suite/variant/variant_switch.c3t | 6 +-- test/test_suite/variant/variant_test.c3t | 10 ++-- 45 files changed, 307 insertions(+), 124 deletions(-) create mode 100644 test/test_suite/compile_time_introspection/parentof.c3t diff --git a/releasenotes.md b/releasenotes.md index 010e43396..adb0659a8 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -3,6 +3,7 @@ ## 0.5.0 Change List ### Changes / improvements +- Added parentof typeid property. - Slice assignment is expanded. - Strong optional handling requirements. - Better dead code analysis, and added dead code errors. diff --git a/src/compiler/codegen_internal.h b/src/compiler/codegen_internal.h index 08bd665e1..d4d053f25 100644 --- a/src/compiler/codegen_internal.h +++ b/src/compiler/codegen_internal.h @@ -3,11 +3,12 @@ enum IntrospectIndex { INTROSPECT_INDEX_KIND = 0, - INTROSPECT_INDEX_DTABLE = 1, - INTROSPECT_INDEX_SIZEOF = 2, - INTROSPECT_INDEX_INNER = 3, - INTROSPECT_INDEX_LEN = 4, - INTROSPECT_INDEX_ADDITIONAL = 5, + INTROSPECT_INDEX_PARENTOF = 1, + INTROSPECT_INDEX_DTABLE = 2, + INTROSPECT_INDEX_SIZEOF = 3, + INTROSPECT_INDEX_INNER = 4, + INTROSPECT_INDEX_LEN = 5, + INTROSPECT_INDEX_ADDITIONAL = 6, INTROSPECT_INDEX_TOTAL, }; diff --git a/src/compiler/compiler_internal.h b/src/compiler/compiler_internal.h index 2431d857b..202c534ce 100644 --- a/src/compiler/compiler_internal.h +++ b/src/compiler/compiler_internal.h @@ -2391,6 +2391,7 @@ TypeSize type_size(Type *type); // Only call after all types are resolved. void type_init_cint(void); Type *type_new_func(Decl *decl, Signature *sig); void type_func_prototype_init(uint32_t capacity); +Type *type_find_parent_type(Type *type); bool type_is_subtype(Type *type, Type *possible_subtype); bool type_is_abi_aggregate(Type *type); bool type_is_int128(Type *type); diff --git a/src/compiler/enums.h b/src/compiler/enums.h index e84b28a96..1887aa118 100644 --- a/src/compiler/enums.h +++ b/src/compiler/enums.h @@ -305,6 +305,7 @@ typedef enum typedef enum { TYPEID_INFO_KIND, + TYPEID_INFO_PARENTOF, TYPEID_INFO_INNER, TYPEID_INFO_LEN, TYPEID_INFO_SIZEOF, @@ -968,6 +969,7 @@ typedef enum TYPE_PROPERTY_NAMES, TYPE_PROPERTY_NAMEOF, TYPE_PROPERTY_PARAMS, + TYPE_PROPERTY_PARENTOF, TYPE_PROPERTY_QNAMEOF, TYPE_PROPERTY_RETURNS, TYPE_PROPERTY_SIZEOF, diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 90e6bbf39..c7fe8def9 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -3732,6 +3732,17 @@ static void llvm_emit_float_comp(GenContext *c, BEValue *be_value, BEValue *lhs, llvm_value_set(be_value, val, type_bool); } +void llvm_emit_lhs_is_subtype(GenContext *c, BEValue *result, BEValue *lhs, BEValue *rhs) +{ + llvm_value_rvalue(c, lhs); + llvm_value_rvalue(c, rhs); + LLVMBasicBlockRef retry_block = llvm_basic_block_new(c, "check_subtype"); + llvm_emit_br(c, retry_block); + llvm_emit_comp(c, result, lhs, rhs, BINARYOP_EQ); + LLVMBasicBlockRef next_block = llvm_basic_block_new(c, "next_block"); + TODO +} + void llvm_emit_comp(GenContext *c, BEValue *result, BEValue *lhs, BEValue *rhs, BinaryOp binary_op) { assert(binary_op >= BINARYOP_GT && binary_op <= BINARYOP_EQ); @@ -6279,13 +6290,23 @@ static inline void llvm_emit_typeid_info(GenContext *c, BEValue *value, Expr *ex LLVMValueRef ref = LLVMBuildIntToPtr(c->builder, value->value, c->ptr_type, "introspect*"); AlignSize align = llvm_abi_alignment(c, c->introspect_type); AlignSize alignment; + TypeIdInfoKind info_kind = expr->typeid_info_expr.kind; + if (info_kind == TYPEID_INFO_PARENTOF) + { + LLVMValueRef parent = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_PARENTOF, align, &alignment); + LLVMValueRef parent_value = llvm_load(c, c->typeid_type, parent, alignment, "typeid.parent"); + LLVMValueRef is_zero = LLVMBuildICmp(c->builder, LLVMIntEQ, parent_value, LLVMConstNull(c->typeid_type), ""); + parent_value = LLVMBuildSelect(c->builder, is_zero, llvm_get_typeid(c, type_void), parent_value, ""); + llvm_value_set(value, parent_value, expr->type); + return; + } bool safe_mode = active_target.feature.safe_mode; - if (safe_mode || expr->typeid_info_expr.kind == TYPEID_INFO_KIND) + if (safe_mode || info_kind == TYPEID_INFO_KIND) { kind = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_KIND, align, &alignment); kind = llvm_load(c, c->byte_type, kind, alignment, "typeid.kind"); } - switch (expr->typeid_info_expr.kind) + switch (info_kind) { case TYPEID_INFO_KIND: llvm_value_set(value, kind, expr->type); @@ -6320,8 +6341,8 @@ static inline void llvm_emit_typeid_info(GenContext *c, BEValue *value, Expr *ex LLVMValueRef val = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_INNER, align, &alignment); val = llvm_load(c, c->typeid_type, val, alignment, "typeid.inner"); llvm_value_set(value, val, expr->type); + return; } - break; case TYPEID_INFO_NAMES: if (safe_mode) { @@ -6351,8 +6372,8 @@ static inline void llvm_emit_typeid_info(GenContext *c, BEValue *value, Expr *ex LLVMValueRef val = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_ADDITIONAL, align, &alignment); Type *subarray = type_get_subarray(type_chars); llvm_value_set(value, llvm_emit_aggregate_two(c, subarray, val, len), subarray); + return; } - break; case TYPEID_INFO_LEN: if (safe_mode) { @@ -6382,18 +6403,19 @@ static inline void llvm_emit_typeid_info(GenContext *c, BEValue *value, Expr *ex LLVMValueRef val = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_LEN, align, &alignment); val = llvm_load(c, c->size_type, val, alignment, "typeid.len"); llvm_value_set(value, val, expr->type); + return; } - break; case TYPEID_INFO_SIZEOF: { LLVMValueRef val = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_SIZEOF, align, &alignment); val = llvm_load(c, c->size_type, val, alignment, "typeid.size"); llvm_value_set(value, val, expr->type); + return; } - break; - default: + case TYPEID_INFO_PARENTOF: UNREACHABLE } + UNREACHABLE } void llvm_emit_try_unwrap_chain(GenContext *c, BEValue *value, Expr *expr) diff --git a/src/compiler/llvm_codegen_internal.h b/src/compiler/llvm_codegen_internal.h index ddb226b5f..8fd9367e0 100644 --- a/src/compiler/llvm_codegen_internal.h +++ b/src/compiler/llvm_codegen_internal.h @@ -400,6 +400,7 @@ INLINE bool llvm_basic_block_is_unused(LLVMBasicBlockRef block); bool llvm_emit_check_block_branch(GenContext *context); // -- Comparisons --- +void llvm_emit_lhs_is_subtype(GenContext *c, BEValue *result, BEValue *lhs, BEValue *rhs); void llvm_emit_comp(GenContext *c, BEValue *result, BEValue *lhs, BEValue *rhs, BinaryOp binary_op); void llvm_emit_int_comp(GenContext *c, BEValue *result, BEValue *lhs, BEValue *rhs, BinaryOp binary_op); void llvm_emit_int_comp_zero(GenContext *c, BEValue *result, BEValue *lhs, BinaryOp binary_op); diff --git a/src/compiler/llvm_codegen_module.c b/src/compiler/llvm_codegen_module.c index bb88bac56..d36980e0c 100644 --- a/src/compiler/llvm_codegen_module.c +++ b/src/compiler/llvm_codegen_module.c @@ -16,6 +16,7 @@ static inline LLVMTypeRef create_introspection_type(GenContext *c) LLVMTypeRef type = LLVMStructCreateNamed(c->context, ".introspect"); LLVMTypeRef introspect_type[INTROSPECT_INDEX_TOTAL] = { [INTROSPECT_INDEX_KIND] = c->byte_type, + [INTROSPECT_INDEX_PARENTOF] = c->typeid_type, [INTROSPECT_INDEX_DTABLE] = c->ptr_type, [INTROSPECT_INDEX_SIZEOF] = c->size_type, [INTROSPECT_INDEX_INNER] = c->typeid_type, diff --git a/src/compiler/llvm_codegen_stmt.c b/src/compiler/llvm_codegen_stmt.c index c9cb47bce..924b86699 100644 --- a/src/compiler/llvm_codegen_stmt.c +++ b/src/compiler/llvm_codegen_stmt.c @@ -624,7 +624,8 @@ static void llvm_emit_switch_body_if_chain(GenContext *c, LLVMBasicBlockRef block = case_stmt->case_stmt.backend_block; if (case_stmt == default_case) continue; BEValue be_value; - llvm_emit_exprid(c, &be_value, case_stmt->case_stmt.expr); + Expr *expr = exprptr(case_stmt->case_stmt.expr); + llvm_emit_expr(c, &be_value, expr); llvm_value_rvalue(c, &be_value); BEValue equals; Expr *to_expr = exprptrzero(case_stmt->case_stmt.to_expr); @@ -641,7 +642,14 @@ static void llvm_emit_switch_body_if_chain(GenContext *c, } else { - llvm_emit_comp(c, &equals, &be_value, switch_value, BINARYOP_EQ); + /*if (expr->type == type_typeid) + { + llvm_emit_lhs_is_subtype(c, &equals, &be_value, switch_value); + } + else*/ + { + llvm_emit_comp(c, &equals, &be_value, switch_value, BINARYOP_EQ); + } } next = llvm_basic_block_new(c, "next_if"); llvm_emit_cond_br(c, &equals, block, next); diff --git a/src/compiler/llvm_codegen_type.c b/src/compiler/llvm_codegen_type.c index 6953606ca..0f224dd7c 100644 --- a/src/compiler/llvm_codegen_type.c +++ b/src/compiler/llvm_codegen_type.c @@ -424,20 +424,32 @@ static inline LLVMValueRef llvm_generate_introspection_global(GenContext *c, LLV { assert(type->backend_typeid); } + assert(type == type->canonical); + Type *parent_type = type_find_parent_type(type); + LLVMValueRef parent_typeid; + LLVMValueRef global_name = NULL; + if (!additional) + { + scratch_buffer_clear(); + scratch_buffer_append("$ct."); + type_mangle_introspect_name_to_buffer(type); + global_name = LLVMAddGlobal(c->module, c->introspect_type, scratch_buffer_to_string()); + type->backend_typeid = LLVMBuildPtrToInt(c->builder, global_name, c->typeid_type, ""); + } LLVMValueRef values[INTROSPECT_INDEX_TOTAL] = { [INTROSPECT_INDEX_KIND] = LLVMConstInt(c->byte_type, introspect_type, false), + [INTROSPECT_INDEX_PARENTOF] = parent_type ? llvm_get_typeid(c, parent_type->canonical) : LLVMConstNull(c->typeid_type), [INTROSPECT_INDEX_DTABLE] = LLVMConstNull(c->ptr_type), [INTROSPECT_INDEX_SIZEOF] = LLVMConstInt(c->size_type, type_size(type), false), [INTROSPECT_INDEX_INNER] = inner ? llvm_get_typeid(c, inner) : llvm_get_zero(c, type_typeid), [INTROSPECT_INDEX_LEN] = LLVMConstInt(c->size_type,len, false), [INTROSPECT_INDEX_ADDITIONAL] = additional ? additional : LLVMConstArray(c->size_type, NULL, 0) }; - LLVMValueRef global_name; - scratch_buffer_clear(); - scratch_buffer_append("$ct."); - type_mangle_introspect_name_to_buffer(type); if (additional) { + scratch_buffer_clear(); + scratch_buffer_append("$ct."); + type_mangle_introspect_name_to_buffer(type); LLVMValueRef constant = llvm_get_struct(c, values, INTROSPECT_INDEX_TOTAL); global_name = LLVMAddGlobal(c->module, LLVMTypeOf(constant), scratch_buffer_to_string()); LLVMSetInitializer(global_name, constant); @@ -445,7 +457,6 @@ static inline LLVMValueRef llvm_generate_introspection_global(GenContext *c, LLV else { LLVMValueRef strukt = llvm_get_struct_named(c->introspect_type, values, INTROSPECT_INDEX_TOTAL); - global_name = LLVMAddGlobal(c->module, c->introspect_type, scratch_buffer_to_string()); LLVMSetInitializer(global_name, strukt); } LLVMSetAlignment(global_name, llvm_abi_alignment(c, c->introspect_type)); @@ -499,7 +510,14 @@ static LLVMValueRef llvm_get_introspection_for_enum(GenContext *c, Type *type) const char *name = enum_vals[i]->name; scratch_buffer_clear(); scratch_buffer_append(".enum."); - scratch_buffer_append_unsigned_int(i); + if (!obfuscate) + { + scratch_buffer_append(name); + } + else + { + scratch_buffer_append_unsigned_int(i); + } const char *name_desc = scratch_buffer_to_string(); if (obfuscate) { diff --git a/src/compiler/sema_expr.c b/src/compiler/sema_expr.c index f6e2f9357..2712aa4aa 100644 --- a/src/compiler/sema_expr.c +++ b/src/compiler/sema_expr.c @@ -3087,6 +3087,7 @@ static inline bool sema_expr_analyse_member_access(SemaContext *context, Expr *e case TYPE_PROPERTY_NAMES: case TYPE_PROPERTY_VALUES: case TYPE_PROPERTY_ASSOCIATED: + case TYPE_PROPERTY_PARENTOF: break; } @@ -3214,6 +3215,15 @@ static inline bool sema_create_const_inner(SemaContext *context, Expr *expr, Typ return true; } +static inline bool sema_create_const_parent(SemaContext *context, Expr *expr, Type *type) +{ + if (!sema_resolve_type_decl(context, type)) return false; + Type *parent = type_find_parent_type(type->canonical); + if (!parent) parent = type_void; + expr_rewrite_const_typeid(expr, parent); + return true; +} + static inline bool sema_create_const_min(SemaContext *context, Expr *expr, Type *type, Type *flat) { if (type_is_float(flat)) @@ -3451,6 +3461,8 @@ static bool sema_expr_rewrite_to_typeid_property(SemaContext *context, Expr *exp case TYPE_PROPERTY_KINDOF: sema_expr_rewrite_typeid_kind(expr, typeid); return true; + case TYPE_PROPERTY_PARENTOF: + return sema_expr_rewrite_typeid_call(expr, typeid, TYPEID_INFO_PARENTOF, type_typeid); case TYPE_PROPERTY_NAMES: return sema_expr_rewrite_typeid_call(expr, typeid, TYPEID_INFO_NAMES, type_get_subarray(type_string)); case TYPE_PROPERTY_ALIGNOF: @@ -3564,6 +3576,7 @@ static bool sema_type_property_is_valid_for_type(Type *original_type, TypeProper case TYPE_PROPERTY_ALIGNOF: case TYPE_PROPERTY_NAMEOF: case TYPE_PROPERTY_QNAMEOF: + case TYPE_PROPERTY_PARENTOF: return true; case TYPE_PROPERTY_LEN: switch (type->type_kind) @@ -3622,6 +3635,8 @@ static bool sema_expr_rewrite_to_type_property(SemaContext *context, Expr *expr, return true; case TYPE_PROPERTY_INNER: return sema_create_const_inner(context, expr, type); + case TYPE_PROPERTY_PARENTOF: + return sema_create_const_parent(context, expr, type); case TYPE_PROPERTY_KINDOF: return sema_create_const_kind(context, expr, type); case TYPE_PROPERTY_LEN: diff --git a/src/compiler/symtab.c b/src/compiler/symtab.c index 3ecd57118..8f33ccf82 100644 --- a/src/compiler/symtab.c +++ b/src/compiler/symtab.c @@ -190,6 +190,7 @@ void symtab_init(uint32_t capacity) type_property_list[TYPE_PROPERTY_NAMES] = KW_DEF("names"); type_property_list[TYPE_PROPERTY_NAN] = KW_DEF("nan"); type_property_list[TYPE_PROPERTY_PARAMS] = KW_DEF("params"); + type_property_list[TYPE_PROPERTY_PARENTOF] = KW_DEF("parentof"); type_property_list[TYPE_PROPERTY_QNAMEOF] = KW_DEF("qnameof"); type_property_list[TYPE_PROPERTY_RETURNS] = KW_DEF("returns"); type_property_list[TYPE_PROPERTY_SIZEOF] = KW_DEF("sizeof"); diff --git a/src/compiler/types.c b/src/compiler/types.c index f6d237cdb..373ce2747 100644 --- a/src/compiler/types.c +++ b/src/compiler/types.c @@ -1593,6 +1593,26 @@ bool type_is_scalar(Type *type) } UNREACHABLE } + +Type *type_find_parent_type(Type *type) +{ + assert(type->canonical); + switch (type->type_kind) + { + case TYPE_DISTINCT: + { + Decl *decl = type->decl; + return decl->is_substruct ? decl->distinct_decl.base_type : NULL; + } + case TYPE_STRUCT: + { + Decl *decl = type->decl; + return decl->is_substruct ? decl->strukt.members[0]->type : NULL; + } + default: + return NULL; + } +} /** * Check if a type is contained in another type. * diff --git a/src/version.h b/src/version.h index d26206ff7..43d134621 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define COMPILER_VERSION "0.4.621" \ No newline at end of file +#define COMPILER_VERSION "0.4.622" \ No newline at end of file diff --git a/test/test_suite/abi/small_struct_x64.c3t b/test/test_suite/abi/small_struct_x64.c3t index 823464552..4bd5f361a 100644 --- a/test/test_suite/abi/small_struct_x64.c3t +++ b/test/test_suite/abi/small_struct_x64.c3t @@ -20,10 +20,10 @@ fn Foo getFoo(Foo f) /* #expect: test.ll -%.introspect = type { i8, ptr, i64, i64, i64, [0 x i64] } +%.introspect = type { i8, i64, ptr, i64, i64, i64, [0 x i64] } %Foo = type { i8, i8, i8 } -@"$ct.test.Foo" = linkonce global %.introspect { i8 10, ptr null, i64 3, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 3, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 ; Function Attrs: nounwind define i32 @test.testing() #0 { diff --git a/test/test_suite/arrays/complex_array_const.c3t b/test/test_suite/arrays/complex_array_const.c3t index 58a1fc23e..48eefbe58 100644 --- a/test/test_suite/arrays/complex_array_const.c3t +++ b/test/test_suite/arrays/complex_array_const.c3t @@ -15,7 +15,7 @@ Connection[3] link @private /* #expect: test.ll -@"$ct.test.Connection" = linkonce global %.introspect { i8 10, ptr null, i64 24, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Connection" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 24, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [6 x i8] c"link1\00", align 1 @.str.1 = private unnamed_addr constant [6 x i8] c"link2\00", align 1 @.str.2 = private unnamed_addr constant [6 x i8] c"link3\00", align 1 diff --git a/test/test_suite/attributes/user_defined_attributes.c3t b/test/test_suite/attributes/user_defined_attributes.c3t index 1fa117e4a..98e823261 100644 --- a/test/test_suite/attributes/user_defined_attributes.c3t +++ b/test/test_suite/attributes/user_defined_attributes.c3t @@ -32,7 +32,8 @@ fn void main() @TestZero /* #expect: test.ll %Foo = type { i32, [1020 x i8], i32, [1020 x i8] } -@"$ct.test.Foo" = linkonce global %.introspect { i8 10, ptr null, i64 2048, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 + +@"$ct.test.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 2048, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @test.f = local_unnamed_addr global %Foo zeroinitializer, align 1024 define weak void @test.testme2() #0 { diff --git a/test/test_suite/compile_time/untyped_conversions.c3t b/test/test_suite/compile_time/untyped_conversions.c3t index b9bbe579e..cee0535eb 100644 --- a/test/test_suite/compile_time/untyped_conversions.c3t +++ b/test/test_suite/compile_time/untyped_conversions.c3t @@ -24,27 +24,26 @@ fn void main() /* #expect: test.ll - -%.introspect = type { i8, ptr, i64, i64, i64, [0 x i64] } +%.introspect = type { i8, i64, ptr, i64, i64, i64, [0 x i64] } %Foo = type { i32, i32 } %"int[]" = type { ptr, i64 } %any = type { ptr, i64 } -@"$ct.test.Foo" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [9 x i8] c"%s %s %s\00", align 1 -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.a2$int" = linkonce global %.introspect { i8 15, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.int" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.sa$int" = linkonce global %.introspect { i8 16, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.v2$int" = linkonce global %.introspect { i8 17, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.int" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.a2$int" = linkonce global %.introspect { i8 15, i64 0, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.int" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.sa$int" = linkonce global %.introspect { i8 16, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.v2$int" = linkonce global %.introspect { i8 17, i64 0, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.int" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 @.__const = private unnamed_addr constant [1 x %Foo] [%Foo { i32 1, i32 2 }], align 4 @.__const.1 = private unnamed_addr constant %Foo { i32 1, i32 2 }, align 4 @.__const.2 = private unnamed_addr constant [1 x [2 x i32]] [[2 x i32] [i32 1, i32 2]], align 4 @.__const.3 = private unnamed_addr constant [1 x [2 x double]] [[2 x double] [double 1.000000e+00, double 2.000000e+00]], align 16 @.str.4 = private unnamed_addr constant [15 x i8] c"%s %s {%s, %s}\00", align 1 -@"$ct.a1$a2$int" = linkonce global %.introspect { i8 15, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.a2$int" to i64), i64 1, [0 x i64] zeroinitializer }, align 8 -@"$ct.double" = linkonce global %.introspect { i8 4, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.a2$double" = linkonce global %.introspect { i8 15, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.double" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.a1$a2$double" = linkonce global %.introspect { i8 15, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.a2$double" to i64), i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.a1$a2$int" = linkonce global %.introspect { i8 15, i64 0, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.a2$int" to i64), i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.a1$a2$double" = linkonce global %.introspect { i8 15, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.a2$double" to i64), i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.a2$double" = linkonce global %.introspect { i8 15, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.double" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.double" = linkonce global %.introspect { i8 4, i64 0, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 @.__const.5 = private unnamed_addr constant [2 x i32] [i32 1, i32 2], align 4 @.__const.6 = private unnamed_addr constant [2 x i32] [i32 3, i32 4], align 4 @.__const.7 = private unnamed_addr constant [2 x i32] [i32 2, i32 7], align 4 diff --git a/test/test_suite/compile_time_introspection/parentof.c3t b/test/test_suite/compile_time_introspection/parentof.c3t new file mode 100644 index 000000000..e1b28f3cc --- /dev/null +++ b/test/test_suite/compile_time_introspection/parentof.c3t @@ -0,0 +1,49 @@ +// #target: macos-x64 +module foo; +struct Foo +{ + int a; +} +struct Bar +{ + inline Foo f; +} +fn void main() +{ + assert(Foo.parentof == void.typeid); + assert(Bar.parentof == Foo.typeid); + typeid x = Foo.typeid; + assert(x.parentof == void.typeid); + x = Bar.typeid; + assert(x.parentof == Foo.typeid); +} + +/* #expect: foo.ll + +@"$ct.foo.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.foo.Bar" = linkonce global %.introspect { i8 10, i64 ptrtoint (ptr @"$ct.foo.Foo" to i64), ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.void" = linkonce global %.introspect { i8 0, i64 0, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 + +define void @foo.main() #0 { +entry: + %x = alloca i64, align 8 + store i64 ptrtoint (ptr @"$ct.foo.Foo" to i64), ptr %x, align 8 + %0 = load i64, ptr %x, align 8 + %"introspect*" = inttoptr i64 %0 to ptr + %1 = getelementptr inbounds %.introspect, ptr %"introspect*", i32 0, i32 1 + %typeid.parent = load i64, ptr %1, align 8 + %2 = icmp eq i64 %typeid.parent, 0 + %3 = select i1 %2, i64 ptrtoint (ptr @"$ct.void" to i64), i64 %typeid.parent + %eq = icmp eq i64 %3, ptrtoint (ptr @"$ct.void" to i64) + call void @llvm.assume(i1 %eq) + store i64 ptrtoint (ptr @"$ct.foo.Bar" to i64), ptr %x, align 8 + %4 = load i64, ptr %x, align 8 + %"introspect*1" = inttoptr i64 %4 to ptr + %5 = getelementptr inbounds %.introspect, ptr %"introspect*1", i32 0, i32 1 + %typeid.parent2 = load i64, ptr %5, align 8 + %6 = icmp eq i64 %typeid.parent2, 0 + %7 = select i1 %6, i64 ptrtoint (ptr @"$ct.void" to i64), i64 %typeid.parent2 + %eq3 = icmp eq i64 %7, ptrtoint (ptr @"$ct.foo.Foo" to i64) + call void @llvm.assume(i1 %eq3) + ret void +} \ No newline at end of file diff --git a/test/test_suite/compile_time_introspection/qnameof.c3t b/test/test_suite/compile_time_introspection/qnameof.c3t index 3b3748c4c..cf63a6bbb 100644 --- a/test/test_suite/compile_time_introspection/qnameof.c3t +++ b/test/test_suite/compile_time_introspection/qnameof.c3t @@ -22,7 +22,7 @@ fn void main() /* #expect: qnametest.ll -@"$ct.qnametest.Blob" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.qnametest.Blob" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @qnametest.x = local_unnamed_addr global i32 0, align 4 @.str = private unnamed_addr constant [12 x i8] c"printf: %s\0A\00", align 1 @.str.1 = private unnamed_addr constant [7 x i8] c"printf\00", align 1 diff --git a/test/test_suite/concurrency/atomic_load_store_debug.c3t b/test/test_suite/concurrency/atomic_load_store_debug.c3t index 9c1fcb2d6..7355d97b6 100644 --- a/test/test_suite/concurrency/atomic_load_store_debug.c3t +++ b/test/test_suite/concurrency/atomic_load_store_debug.c3t @@ -24,12 +24,12 @@ source_filename = "test" target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-darwin" -%.introspect = type { i8, ptr, i64, i64, i64, [0 x i64] } +%.introspect = type { i8, i64, ptr, i64, i64, i64, [0 x i64] } %any = type { ptr, i64 } -@"$ct.test.Ghh" = linkonce global %.introspect { i8 10, ptr null, i64 12, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Ghh" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 12, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1 -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 define void @test.main() #0 !dbg !5 { entry: @@ -80,7 +80,7 @@ declare i1 @llvm.expect.i1(i1, i1) #2 !1 = !{i32 2, !"Debug Info Version", i32 3} !2 = !{i32 1, !"uwtable", i32 2} !3 = distinct !DICompileUnit(language: DW_LANG_C11, file: !4, producer: "c3c", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false) -!4 = !DIFile(filename: "atomic_load_store_debug.c3", +!4 = !DIFile(filename: "atomic_load_store_debug.c3" !5 = distinct !DISubprogram(name: "main", linkageName: "test.main", scope: !4, file: !4, line: 10, type: !6, scopeLine: 10, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !3, retainedNodes: !8) !6 = !DISubroutineType(types: !7) !7 = !{null} diff --git a/test/test_suite/enumerations/enum_associated_value.c3t b/test/test_suite/enumerations/enum_associated_value.c3t index cc516d9df..382f3fafb 100644 --- a/test/test_suite/enumerations/enum_associated_value.c3t +++ b/test/test_suite/enumerations/enum_associated_value.c3t @@ -18,14 +18,17 @@ fn void main() /* #expect: test.ll -@"$ct.uint" = linkonce global %.introspect { i8 3, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.test.Foo" = linkonce global { i8, ptr, i64, i64, i64, [2 x %"char[]"] } { i8 8, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.uint" to i64), i64 2, [2 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 1 }, %"char[]" { ptr @.enum.1, i64 1 }] }, align 8 +%.introspect = type { i8, i64, ptr, i64, i64, i64, [0 x i64] } +%"char[]" = type { ptr, i64 } +@.enum.A = internal constant [2 x i8] c"A\00", align 1 +@.enum.B = internal constant [2 x i8] c"B\00", align 1 +@"$ct.uint" = linkonce global %.introspect { i8 3, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Foo" = linkonce global { i8, i64, ptr, i64, i64, i64, [2 x %"char[]"] } { i8 8, i64 0, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.uint" to i64), i64 2, [2 x %"char[]"] [%"char[]" { ptr @.enum.A, i64 1 }, %"char[]" { ptr @.enum.B, i64 1 }] }, align 8 @"test.Foo$val" = linkonce constant [2 x i32] [i32 123, i32 333], align 4 @.str = private unnamed_addr constant [9 x i8] c"Number A\00", align 1 @.str.1 = private unnamed_addr constant [9 x i8] c"Number B\00", align 1 @"test.Foo$testme" = linkonce constant [2 x ptr] [ptr @.str, ptr @.str.1], align 8 @.str.2 = private unnamed_addr constant [17 x i8] c"%d (%s) %d (%s)\0A\00", align 1 - ; Function Attrs: nounwind define void @test.main() #0 { entry: diff --git a/test/test_suite/enumerations/enum_associated_values_other.c3t b/test/test_suite/enumerations/enum_associated_values_other.c3t index 346513498..8c1e3adce 100644 --- a/test/test_suite/enumerations/enum_associated_values_other.c3t +++ b/test/test_suite/enumerations/enum_associated_values_other.c3t @@ -24,11 +24,11 @@ enum Foo : int(String val) /* #expect: abc.ll -@"$ct.abc.Abc" = linkonce global %.introspect { i8 10, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 -@.enum.0 = internal constant [4 x i8] c"ABC\00", align 1 -@.enum.1 = internal constant [4 x i8] c"DEF\00", align 1 -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.abc.Foo" = linkonce global { i8, ptr, i64, i64, i64, [2 x %"char[]"] } { i8 8, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.int" to i64), i64 2, [2 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 3 }, %"char[]" { ptr @.enum.1, i64 3 }] }, align 8 +@"$ct.abc.Abc" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@.enum.ABC = internal constant [4 x i8] c"ABC\00", align 1 +@.enum.DEF = internal constant [4 x i8] c"DEF\00", align 1 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.abc.Foo" = linkonce global { i8, i64, ptr, i64, i64, i64, [2 x %"char[]"] } { i8 8, i64 0, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.int" to i64), i64 2, [2 x %"char[]"] [%"char[]" { ptr @.enum.ABC, i64 3 }, %"char[]" { ptr @.enum.DEF, i64 3 }] }, align 8 @.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1 @.str.1 = private unnamed_addr constant [6 x i8] c"world\00", align 1 @"abc.Foo$val" = linkonce constant [2 x %"char[]"] [%"char[]" { ptr @.str, i64 5 }, %"char[]" { ptr @.str.1, i64 5 }], align 8 @@ -37,19 +37,21 @@ enum Foo : int(String val) // #expect: test.ll -@"$ct.abc.Abc" = linkonce global %.introspect { i8 10, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.abc.Abc" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @abc.dabc = external global i32, align 4 -@.enum.0 = internal constant [4 x i8] c"ABC\00", align 1 -@.enum.1 = internal constant [4 x i8] c"DEF\00", align 1 -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.abc.Foo" = linkonce global { i8, ptr, i64, i64, i64, [2 x %"char[]"] } { i8 8, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.int" to i64), i64 2, [2 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 3 }, %"char[]" { ptr @.enum.1, i64 3 }] }, align 8 +@.enum.ABC = internal constant [4 x i8] c"ABC\00", align 1 +@.enum.DEF = internal constant [4 x i8] c"DEF\00", align 1 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.abc.Foo" = linkonce global { i8, i64, ptr, i64, i64, i64, [2 x %"char[]"] } { i8 8, i64 0, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.int" to i64), i64 2, [2 x %"char[]"] [%"char[]" { ptr @.enum.ABC, i64 3 }, %"char[]" { ptr @.enum.DEF, i64 3 }] }, align 8 @.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1 @.str.1 = private unnamed_addr constant [6 x i8] c"world\00", align 1 @"abc.Foo$val" = linkonce constant [2 x %"char[]"] [%"char[]" { ptr @.str, i64 5 }, %"char[]" { ptr @.str.1, i64 5 }], align 8 @.str.2 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 -@"$ct.char" = linkonce global %.introspect { i8 3, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.sa$char" = linkonce global %.introspect { i8 16, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 - +@"$ct.String" = linkonce global %.introspect { i8 18, i64 ptrtoint (ptr @"$ct.sa$char" to i64), ptr null, i64 16, i64 ptrtoint (ptr @"$ct.sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.sa$char" = linkonce global %.introspect { i8 16, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.char" = linkonce global %.introspect { i8 3, i64 0, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@std.core.mem.thread_allocator = external thread_local global ptr, align 8 +@"$ct.anyfault" = linkonce global %.introspect { i8 6, i64 0, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 define void @test.main(ptr %0, i64 %1) #0 { entry: diff --git a/test/test_suite/errors/error_introspect.c3t b/test/test_suite/errors/error_introspect.c3t index d47e4dac0..58caf8938 100644 --- a/test/test_suite/errors/error_introspect.c3t +++ b/test/test_suite/errors/error_introspect.c3t @@ -22,18 +22,18 @@ fn void main() @.fault = internal constant [4 x i8] c"BAR\00", align 1 @"foo.Foo$BAZ" = linkonce constant %.fault { i64 ptrtoint (ptr @"$ct.foo.Foo" to i64), %"char[]" { ptr @.fault.1, i64 3 }, i64 2 }, align 8 @.fault.1 = internal constant [4 x i8] c"BAZ\00", align 1 -@"$ct.foo.Foo" = linkonce global %.introspect { i8 9, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.foo.Foo" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [4 x i8] c"BAR\00", align 1 @.str.2 = private unnamed_addr constant [4 x i8] c"BAZ\00", align 1 @.str.3 = private unnamed_addr constant [14 x i8] c"Foo.names: %s\00", align 1 -@"$ct.char" = linkonce global %.introspect { i8 3, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.sa$char" = linkonce global %.introspect { i8 16, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.String" = linkonce global %.introspect { i8 18, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.sa$String" = linkonce global %.introspect { i8 16, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.String" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.sa$String" = linkonce global %.introspect { i8 16, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.String" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.String" = linkonce global %.introspect { i8 18, i64 ptrtoint (ptr @"$ct.sa$char" to i64), ptr null, i64 16, i64 ptrtoint (ptr @"$ct.sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.sa$char" = linkonce global %.introspect { i8 16, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.char" = linkonce global %.introspect { i8 3, i64 0, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 @.str.4 = private unnamed_addr constant [15 x i8] c"Foo.values: %s\00", align 1 -@"$ct.a2$foo.Foo" = linkonce global %.introspect { i8 15, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.foo.Foo" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.a2$foo.Foo" = linkonce global %.introspect { i8 15, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.foo.Foo" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 @.str.6 = private unnamed_addr constant [17 x i8] c"Foo.elements: %s\00", align 1 -@"$ct.long" = linkonce global %.introspect { i8 2, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.long" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 entry: %x = alloca %"char[][]", align 8 diff --git a/test/test_suite/errors/optional_taddr_and_access.c3t b/test/test_suite/errors/optional_taddr_and_access.c3t index f23796c7c..2beb92188 100644 --- a/test/test_suite/errors/optional_taddr_and_access.c3t +++ b/test/test_suite/errors/optional_taddr_and_access.c3t @@ -27,10 +27,10 @@ fn void main() %Foo = type { i32, i32 } -@"$ct.test.Foo" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @"test.MyErr$FOO" = linkonce constant %.fault { i64 ptrtoint (ptr @"$ct.test.MyErr" to i64), %"char[]" { ptr @.fault, i64 3 }, i64 1 }, align 8 @.fault = internal constant [4 x i8] c"FOO\00", align 1 -@"$ct.test.MyErr" = linkonce global %.introspect { i8 9, ptr null, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.MyErr" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 @.str.1 = private unnamed_addr constant [17 x i8] c"Not visible: %d\0A\00", align 1 diff --git a/test/test_suite/expressions/pointer_access.c3t b/test/test_suite/expressions/pointer_access.c3t index 71bf0e36f..823a426f6 100644 --- a/test/test_suite/expressions/pointer_access.c3t +++ b/test/test_suite/expressions/pointer_access.c3t @@ -42,10 +42,10 @@ fn void testSimple() %.anon = type { i32, i32 } %.anon.0 = type { double } -@"$ct.pointer_access.c" = linkonce global %.introspect { i8 10, ptr null, i64 40, i64 0, i64 5, [0 x i64] zeroinitializer }, align 8 -@"$ct.pointer_access.$anon" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.pointer_access.$anon.4" = linkonce global %.introspect { i8 11, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.pointer_access.ExtraSimple" = linkonce global %.introspect { i8 10, ptr null, i64 72, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 +@"$ct.pointer_access.c" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 40, i64 0, i64 5, [0 x i64] zeroinitializer }, align 8 +@"$ct.pointer_access.$anon" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.pointer_access.$anon.4" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.pointer_access.ExtraSimple" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 72, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [71 x i8] c"a = %d, c.e = %f, c.f = %f, c.j = %f, g = %d, o0 = %f, r = %d, s = %d\0A\00", align 1 define void @pointer_access.testSimple() #0 { diff --git a/test/test_suite/functions/func_ptr_conversions_and_names.c3t b/test/test_suite/functions/func_ptr_conversions_and_names.c3t index c24098a1a..73a465060 100644 --- a/test/test_suite/functions/func_ptr_conversions_and_names.c3t +++ b/test/test_suite/functions/func_ptr_conversions_and_names.c3t @@ -32,14 +32,14 @@ fn void main() /* #expect: test.ll @.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1 -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 @.str.1 = private unnamed_addr constant [3 x i8] c"%d\00", align 1 @.str.2 = private unnamed_addr constant [3 x i8] c"%d\00", align 1 @.str.3 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 @.str.4 = private unnamed_addr constant [13 x i8] c"fn int(int)*\00", align 1 -@"$ct.char" = linkonce global %.introspect { i8 3, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.sa$char" = linkonce global %.introspect { i8 16, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.String" = linkonce global %.introspect { i8 18, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.String" = linkonce global %.introspect { i8 18, i64 ptrtoint (ptr @"$ct.sa$char" to i64), ptr null, i64 16, i64 ptrtoint (ptr @"$ct.sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.sa$char" = linkonce global %.introspect { i8 16, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.char" = linkonce global %.introspect { i8 3, i64 0, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 @.str.5 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 @.str.6 = private unnamed_addr constant [13 x i8] c"fn int(int)*\00", align 1 @.str.7 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 @@ -48,9 +48,8 @@ fn void main() @.str.10 = private unnamed_addr constant [7 x i8] c"test2*\00", align 1 @.str.11 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 @.str.12 = private unnamed_addr constant [14 x i8] c"fn int!(int)*\00", align 1 -@"$ct.fn$int$int$" = linkonce global %.introspect { i8 13, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.p$fn$int$int$" = linkonce global %.introspect { i8 19, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.fn$int$int$" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 - +@"$ct.p$fn$int$int$" = linkonce global %.introspect { i8 19, i64 0, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.fn$int$int$" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.fn$int$int$" = linkonce global %.introspect { i8 13, i64 0, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 define void @test.main() #0 { entry: diff --git a/test/test_suite/functions/test_regression.c3t b/test/test_suite/functions/test_regression.c3t index 1e6f324a6..db8b0ec84 100644 --- a/test/test_suite/functions/test_regression.c3t +++ b/test/test_suite/functions/test_regression.c3t @@ -243,12 +243,13 @@ fn Type getValue(Blob blob) %List = type { i64, i64, ptr, ptr } %Foo = type { i32, i32 } -@"$ct.test.Bobo" = linkonce global %.introspect { i8 10, ptr null, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 -@"$ct.test.Blob" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.test.Foor" = linkonce global %.introspect { i8 11, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.test.Foo2" = linkonce global %.introspect { i8 10, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.test.MyEnum" = linkonce global { i8, ptr, i64, i64, i64, [3 x %"char[]"] } { i8 8, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 4 }, %"char[]" { ptr @.enum.1, i64 5 }, %"char[]" { ptr @.enum.2, i64 3 }] }, align 8 +@"$ct.test.Bobo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Blob" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Foor" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Foo2" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.MyEnum" = linkonce global { i8, i64, ptr, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 0, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { ptr @.enum.HELO, i64 4 }, %"char[]" { ptr @.enum.WORLD, i64 5 }, %"char[]" { ptr @.enum.BYE, i64 3 }] }, align 8 @test_static.x = internal unnamed_addr global i32 1, align 4 define void @test.Foo2.printme(ptr %0) #0 { diff --git a/test/test_suite/functions/test_regression_mingw.c3t b/test/test_suite/functions/test_regression_mingw.c3t index a292c0026..640d432a2 100644 --- a/test/test_suite/functions/test_regression_mingw.c3t +++ b/test/test_suite/functions/test_regression_mingw.c3t @@ -259,13 +259,16 @@ $"$ct.int" = comdat any $"$ct.test.MyEnum" = comdat any -@"$ct.test.Bobo" = linkonce global %.introspect { i8 10, ptr null, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, comdat, align 8 -@"$ct.test.Blob" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 -@"$ct.test.Foor" = linkonce global %.introspect { i8 11, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 -@"$ct.test.Foo2" = linkonce global %.introspect { i8 10, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8 -@"$ct.test.Foo" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, comdat, align 8 -@"$ct.test.MyEnum" = linkonce global { i8, ptr, i64, i64, i64, [3 x %"char[]"] } { i8 8, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 4 }, %"char[]" { ptr @.enum.1, i64 5 }, %"char[]" { ptr @.enum.2, i64 3 }] }, comdat, align 8 +@"$ct.test.Bobo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, comdat, align 8 +@"$ct.test.Blob" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 +@"$ct.test.Foor" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 +@"$ct.test.Foo2" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8 +@"$ct.test.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 +@.enum.HELO = internal constant [5 x i8] c"HELO\00", align 1 +@.enum.WORLD = internal constant [6 x i8] c"WORLD\00", align 1 +@.enum.BYE = internal constant [4 x i8] c"BYE\00", align 1 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, comdat, align 8 +@"$ct.test.MyEnum" = linkonce global { i8, i64, ptr, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 0, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { ptr @.enum.HELO, i64 4 }, %"char[]" { ptr @.enum.WORLD, i64 5 }, %"char[]" { ptr @.enum.BYE, i64 3 }] }, comdat, align 8 @.str = private unnamed_addr constant [13 x i8] c"helloWorld!\0A\00", align 1 @test_static.x = internal unnamed_addr global i32 1, align 4 @.str.1 = private unnamed_addr constant [16 x i8] c"Test static %d\0A\00", align 1 diff --git a/test/test_suite/functions/typeless_varargs.c3t b/test/test_suite/functions/typeless_varargs.c3t index 4fcd8a420..d256145ba 100644 --- a/test/test_suite/functions/typeless_varargs.c3t +++ b/test/test_suite/functions/typeless_varargs.c3t @@ -22,8 +22,7 @@ fn int main() /* #expect: test.ll - -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 define void @test.retest(ptr %0, i64 %1) #0 { entry: diff --git a/test/test_suite/initializer_lists/general_tests.c3t b/test/test_suite/initializer_lists/general_tests.c3t index b644bc030..79b0a2765 100644 --- a/test/test_suite/initializer_lists/general_tests.c3t +++ b/test/test_suite/initializer_lists/general_tests.c3t @@ -31,13 +31,14 @@ fn int test() /* #expect: general_tests.ll + %Baz = type { double } %Bar = type { i32, i32 } %"int[]" = type { ptr, i64 } %"Bar[]" = type { ptr, i64 } -@"$ct.general_tests.Baz" = linkonce global %.introspect { i8 11, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.general_tests.Bar" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.general_tests.Baz" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.general_tests.Bar" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.__const = private unnamed_addr constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8 @test.foo1 = internal unnamed_addr global i32 22, align 4 @.str = private unnamed_addr constant [7 x i8] c"Hello!\00", align 1 diff --git a/test/test_suite/initializer_lists/statics.c3t b/test/test_suite/initializer_lists/statics.c3t index fff830c3a..119cdbfed 100644 --- a/test/test_suite/initializer_lists/statics.c3t +++ b/test/test_suite/initializer_lists/statics.c3t @@ -35,9 +35,10 @@ fn int main() %Bar = type { i32, i32 } %"Bar[]" = type { ptr, i64 } -@"$ct.statics.Baz" = linkonce global %.introspect { i8 11, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.statics.Bar" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.statics.Baz" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.statics.Bar" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.__const = private unnamed_addr constant [1 x %Bar] [%Bar { i32 1, i32 2 }], align 4 +@.taddr = private global [1 x %Bar] [%Bar { i32 1, i32 2 }], align 8 @test.c = internal unnamed_addr global %"Bar[]" { ptr @.taddr, i64 1 }, align 8 @.str = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 diff --git a/test/test_suite/initializer_lists/subarrays.c3t b/test/test_suite/initializer_lists/subarrays.c3t index eca81d4c3..4d466106e 100644 --- a/test/test_suite/initializer_lists/subarrays.c3t +++ b/test/test_suite/initializer_lists/subarrays.c3t @@ -51,8 +51,8 @@ fn int main() %File = type { ptr } %Baz = type { double } -@"$ct.subarrays.Baz" = linkonce global %.introspect { i8 11, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.subarrays.Bar" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.subarrays.Baz" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.subarrays.Bar" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.taddr = private global [2 x %Bar] [%Bar { i32 3, i32 4 }, %Bar { i32 8, i32 9 }], align 8 @subarrays.arrbar = local_unnamed_addr global %"Bar[]" { ptr @.taddr, i64 2 }, align 8 @.taddr.3 = private global [2 x i32] [i32 1, i32 2], align 4 diff --git a/test/test_suite/macros/userland_bitcast.c3t b/test/test_suite/macros/userland_bitcast.c3t index b9dad9812..0e65197b4 100644 --- a/test/test_suite/macros/userland_bitcast.c3t +++ b/test/test_suite/macros/userland_bitcast.c3t @@ -79,7 +79,7 @@ fn void main() %Foo = type { i16, i8, i8, i16, i16 } -@"$ct.userland_bitcast.Foo" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 5, [0 x i64] zeroinitializer }, align 8 +@"$ct.userland_bitcast.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 5, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [16 x i8] c"%f => %d => %f\0A\00", align 1 @.str.1 = private unnamed_addr constant [18 x i8] c"%e => %llu => %e\0A\00", align 1 diff --git a/test/test_suite/methods/enum_distinct_err_methods.c3t b/test/test_suite/methods/enum_distinct_err_methods.c3t index 2afb7ac8f..0e9b0116f 100644 --- a/test/test_suite/methods/enum_distinct_err_methods.c3t +++ b/test/test_suite/methods/enum_distinct_err_methods.c3t @@ -54,7 +54,7 @@ entry: %3 = call i64 @std.io.File.printn(ptr %retparam, ptr %2, ptr @.str, i64 14) ret void } - +; Function Attrs: nounwind define void @foo.Bar.hello(ptr %0) #0 { entry: %retparam = alloca i64, align 8 @@ -65,6 +65,7 @@ entry: %3 = call i64 @std.io.File.printn(ptr %retparam, ptr %2, ptr @.str.1, i64 14) ret void } +; Function Attrs: nounwind define void @foo.MyEnum.hello(ptr %0) #0 { entry: %retparam = alloca i64, align 8 @@ -75,6 +76,7 @@ entry: %3 = call i64 @std.io.File.printn(ptr %retparam, ptr %2, ptr @.str.2, i64 17) ret void } +; Function Attrs: nounwind define i32 @main() #0 { entry: %f = alloca i64, align 8 diff --git a/test/test_suite/pointers/subarray_variant_to_ptr.c3t b/test/test_suite/pointers/subarray_variant_to_ptr.c3t index 166c4128b..842396467 100644 --- a/test/test_suite/pointers/subarray_variant_to_ptr.c3t +++ b/test/test_suite/pointers/subarray_variant_to_ptr.c3t @@ -29,7 +29,7 @@ fn void main() %any = type { ptr, i64 } %"int[]" = type { ptr, i64 } -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 define void @foo.test1(i64 %0, ptr %1) #0 { entry: @@ -47,6 +47,7 @@ entry: ret void } +; Function Attrs: nounwind define void @foo.test2(ptr %0, i64 %1) #0 { entry: %z = alloca %"int[]", align 8 @@ -81,6 +82,8 @@ entry: %hi = load ptr, ptr %3, align 8 call void @foo.test1(i64 %lo, ptr %hi) %4 = getelementptr inbounds [2 x i32], ptr %w, i64 0, i64 0 + %5 = insertvalue %"int[]" undef, ptr %4, 0 + %6 = insertvalue %"int[]" %5, i64 2, 1 call void @foo.test2(ptr %4, i64 2) ret void } \ No newline at end of file diff --git a/test/test_suite/statements/custom_foreach_with_ref.c3t b/test/test_suite/statements/custom_foreach_with_ref.c3t index 5ce980701..a5d77f2a5 100644 --- a/test/test_suite/statements/custom_foreach_with_ref.c3t +++ b/test/test_suite/statements/custom_foreach_with_ref.c3t @@ -84,7 +84,8 @@ fn void main() /* #expect: foo.ll %Foo = type { [3 x i32] } -@"$ct.foo.Foo" = linkonce global %.introspect { i8 10, ptr null, i64 12, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 + +@"$ct.foo.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 12, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [11 x i8] c"getFields\0A\00", align 1 @.__const = private unnamed_addr constant [5 x i32] [i32 3, i32 5, i32 2, i32 10, i32 111], align 16 @.str.1 = private unnamed_addr constant [11 x i8] c"Call made\0A\00", align 1 @@ -101,8 +102,10 @@ fn void main() @.str.12 = private unnamed_addr constant [27 x i8] c"Pull value tempptr %d: %d\0A\00", align 1 @.str.13 = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 @.str.14 = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 + ; Function Attrs: nounwind declare void @printf(ptr, ...) #0 + ; Function Attrs: nounwind define void @foo.getFields(ptr noalias sret([5 x i32]) align 4 %0) #0 { entry: @@ -112,12 +115,14 @@ entry: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 20, i1 false) ret void } + ; Function Attrs: nounwind define ptr @foo.call(ptr %0) #0 { entry: call void (ptr, ...) @printf(ptr @.str.1) ret ptr %0 } + ; Function Attrs: nounwind define void @foo.main() #0 { entry: @@ -179,11 +184,13 @@ entry: store i32 3, ptr %.anon1, align 4 store i32 0, ptr %.anon2, align 4 br label %loop.cond + loop.cond: ; preds = %loop.body, %entry %11 = load i32, ptr %.anon2, align 4 %12 = load i32, ptr %.anon1, align 4 %lt = icmp slt i32 %11, %12 br i1 %lt, label %loop.body, label %loop.exit + loop.body: ; preds = %loop.cond %13 = load i32, ptr %.anon2, align 4 store i32 %13, ptr %i, align 4 @@ -203,15 +210,18 @@ loop.body: ; preds = %loop.cond %add = add i32 %22, 1 store i32 %add, ptr %.anon2, align 4 br label %loop.cond + loop.exit: ; preds = %loop.cond store i32 3, ptr %.anon3, align 4 store i32 0, ptr %.anon4, align 4 br label %loop.cond5 + loop.cond5: ; preds = %loop.body7, %loop.exit %23 = load i32, ptr %.anon4, align 4 %24 = load i32, ptr %.anon3, align 4 %lt6 = icmp slt i32 %23, %24 br i1 %lt6, label %loop.body7, label %loop.exit14 + loop.body7: ; preds = %loop.cond5 %25 = load i32, ptr %.anon4, align 4 store i32 %25, ptr %i8, align 4 @@ -234,15 +244,18 @@ loop.body7: ; preds = %loop.cond5 %add13 = add i32 %35, 1 store i32 %add13, ptr %.anon4, align 4 br label %loop.cond5 + loop.exit14: ; preds = %loop.cond5 store i32 3, ptr %.anon15, align 4 store i32 0, ptr %.anon16, align 4 br label %loop.cond17 + loop.cond17: ; preds = %loop.body19, %loop.exit14 %36 = load i32, ptr %.anon16, align 4 %37 = load i32, ptr %.anon15, align 4 %lt18 = icmp slt i32 %36, %37 br i1 %lt18, label %loop.body19, label %loop.exit25 + loop.body19: ; preds = %loop.cond17 %38 = load i32, ptr %.anon16, align 4 store i32 %38, ptr %i20, align 4 @@ -261,15 +274,18 @@ loop.body19: ; preds = %loop.cond17 %add24 = add i32 %46, 1 store i32 %add24, ptr %.anon16, align 4 br label %loop.cond17 + loop.exit25: ; preds = %loop.cond17 store i32 3, ptr %.anon26, align 4 store i32 0, ptr %.anon27, align 4 br label %loop.cond28 + loop.cond28: ; preds = %loop.body30, %loop.exit25 %47 = load i32, ptr %.anon27, align 4 %48 = load i32, ptr %.anon26, align 4 %lt29 = icmp slt i32 %47, %48 br i1 %lt29, label %loop.body30, label %loop.exit36 + loop.body30: ; preds = %loop.cond28 %49 = load i32, ptr %.anon27, align 4 store i32 %49, ptr %i31, align 4 @@ -288,15 +304,18 @@ loop.body30: ; preds = %loop.cond28 %add35 = add i32 %57, 1 store i32 %add35, ptr %.anon27, align 4 br label %loop.cond28 + loop.exit36: ; preds = %loop.cond28 store i32 3, ptr %.anon37, align 4 store i32 0, ptr %.anon38, align 4 br label %loop.cond39 + loop.cond39: ; preds = %loop.body41, %loop.exit36 %58 = load i32, ptr %.anon38, align 4 %59 = load i32, ptr %.anon37, align 4 %lt40 = icmp slt i32 %58, %59 br i1 %lt40, label %loop.body41, label %loop.exit48 + loop.body41: ; preds = %loop.cond39 %60 = load i32, ptr %.anon38, align 4 store i32 %60, ptr %i42, align 4 @@ -318,14 +337,17 @@ loop.body41: ; preds = %loop.cond39 %add47 = add i32 %69, 1 store i32 %add47, ptr %.anon38, align 4 br label %loop.cond39 + loop.exit48: ; preds = %loop.cond39 call void @llvm.memcpy.p0.p0.i32(ptr align 16 %.anon49, ptr align 16 @.__const.9, i32 20, i1 false) store i64 0, ptr %.anon50, align 8 br label %loop.cond51 + loop.cond51: ; preds = %loop.body52, %loop.exit48 %70 = load i64, ptr %.anon50, align 8 %gt = icmp ugt i64 5, %70 br i1 %gt, label %loop.body52, label %loop.exit57 + loop.body52: ; preds = %loop.cond51 %71 = load i64, ptr %.anon50, align 8 store i64 %71, ptr %i53, align 8 @@ -343,14 +365,17 @@ loop.body52: ; preds = %loop.cond51 %add56 = add i64 %78, 1 store i64 %add56, ptr %.anon50, align 8 br label %loop.cond51 + loop.exit57: ; preds = %loop.cond51 call void @foo.getFields(ptr sret([5 x i32]) align 4 %.anon58) store i64 0, ptr %.anon59, align 8 br label %loop.cond60 + loop.cond60: ; preds = %loop.body62, %loop.exit57 %79 = load i64, ptr %.anon59, align 8 %gt61 = icmp ugt i64 5, %79 br i1 %gt61, label %loop.body62, label %loop.exit66 + loop.body62: ; preds = %loop.cond60 %80 = load i64, ptr %.anon59, align 8 store i64 %80, ptr %i63, align 8 @@ -365,15 +390,18 @@ loop.body62: ; preds = %loop.cond60 %add65 = add i64 %86, 1 store i64 %add65, ptr %.anon59, align 8 br label %loop.cond60 + loop.exit66: ; preds = %loop.cond60 call void @foo.getFields(ptr sret([5 x i32]) align 4 %sretparam) store ptr %sretparam, ptr %.anon67, align 8 store i64 0, ptr %.anon68, align 8 br label %loop.cond69 + loop.cond69: ; preds = %loop.body71, %loop.exit66 %87 = load i64, ptr %.anon68, align 8 %gt70 = icmp ugt i64 5, %87 br i1 %gt70, label %loop.body71, label %loop.exit75 + loop.body71: ; preds = %loop.cond69 %88 = load i64, ptr %.anon68, align 8 store i64 %88, ptr %i72, align 8 @@ -389,6 +417,7 @@ loop.body71: ; preds = %loop.cond69 %add74 = add i64 %95, 1 store i64 %add74, ptr %.anon68, align 8 br label %loop.cond69 + loop.exit75: ; preds = %loop.cond69 %96 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 %97 = getelementptr inbounds [3 x i32], ptr %96, i64 0, i64 0 diff --git a/test/test_suite/statements/foreach_custom_macro.c3t b/test/test_suite/statements/foreach_custom_macro.c3t index af70fd596..c100c6b30 100644 --- a/test/test_suite/statements/foreach_custom_macro.c3t +++ b/test/test_suite/statements/foreach_custom_macro.c3t @@ -35,7 +35,7 @@ extern fn int printf(char *fmt, ...); %Foo = type { %"int[]" } %"int[]" = type { ptr, i64 } -@"$ct.foo.Foo" = linkonce global %.introspect { i8 10, ptr null, i64 16, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.foo.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 16, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @.__const = private unnamed_addr constant [3 x i32] [i32 1, i32 3, i32 10], align 4 @.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 diff --git a/test/test_suite/stdlib/map.c3t b/test/test_suite/stdlib/map.c3t index 8deb94bb6..f00487570 100644 --- a/test/test_suite/stdlib/map.c3t +++ b/test/test_suite/stdlib/map.c3t @@ -282,7 +282,7 @@ entry: br label %dtable_check dtable_check: ; preds = %dtable_next, %entry - %dtable_ref = phi ptr [ getelementptr inbounds (%.introspect, ptr @"$ct.test.Foo", i32 0, i32 1), %entry ], [ %next_dtable_ref, %dtable_next ] + %dtable_ref = phi ptr [ getelementptr inbounds (%.introspect, ptr @"$ct.test.Foo", i32 0, i32 2), %entry ], [ %next_dtable_ref, %dtable_next ] %dtable_ptr = load ptr, ptr %dtable_ref, align 8 %0 = icmp eq ptr %dtable_ptr, null br i1 %0, label %dtable_found, label %dtable_next diff --git a/test/test_suite/struct/nested_struct_init.c3t b/test/test_suite/struct/nested_struct_init.c3t index fa717fa9d..359ac7e27 100644 --- a/test/test_suite/struct/nested_struct_init.c3t +++ b/test/test_suite/struct/nested_struct_init.c3t @@ -38,12 +38,12 @@ fn void main() %Matrix2x2_b = type { %.anon.1 } %.anon.1 = type { [4 x float] } -@"$ct.foo.$anon" = linkonce global %.introspect { i8 10, ptr null, i64 16, i64 0, i64 4, [0 x i64] zeroinitializer }, align 8 -@"$ct.foo.$anon.3" = linkonce global %.introspect { i8 11, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.foo.Matrix2x2" = linkonce global %.introspect { i8 10, ptr null, i64 16, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 -@"$ct.foo.$anon.6" = linkonce global %.introspect { i8 10, ptr null, i64 16, i64 0, i64 4, [0 x i64] zeroinitializer }, align 8 -@"$ct.foo.$anon.7" = linkonce global %.introspect { i8 11, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"$ct.foo.Matrix2x2_b" = linkonce global %.introspect { i8 10, ptr null, i64 16, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.foo.$anon" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 16, i64 0, i64 4, [0 x i64] zeroinitializer }, align 8 +@"$ct.foo.$anon.3" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.foo.Matrix2x2" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 16, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.foo.$anon.6" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 16, i64 0, i64 4, [0 x i64] zeroinitializer }, align 8 +@"$ct.foo.$anon.7" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.foo.Matrix2x2_b" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 16, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @.__const = private unnamed_addr constant %Matrix2x2 { %.anon { %.anon.0 { float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00 } } }, align 4 @.__const.8 = private unnamed_addr constant %Matrix2x2_b { %.anon.1 { [4 x float] [float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00] } }, align 4 @.str = private unnamed_addr constant [13 x i8] c"%f %f %f %f\0A\00", align 1 diff --git a/test/test_suite/struct/struct_as_value.c3t b/test/test_suite/struct/struct_as_value.c3t index 6aa992353..56c8eff48 100644 --- a/test/test_suite/struct/struct_as_value.c3t +++ b/test/test_suite/struct/struct_as_value.c3t @@ -16,7 +16,7 @@ fn Event test(int x) /* #expect: test.ll %Event = type { i32 } -@"$ct.test.Event" = linkonce global %.introspect { i8 10, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Event" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @.__const = private unnamed_addr constant %Event { i32 1 }, align 4 @.__const.1 = private unnamed_addr constant %Event { i32 2 }, align 4 diff --git a/test/test_suite/struct/struct_codegen.c3t b/test/test_suite/struct/struct_codegen.c3t index eef4d8bb5..966691695 100644 --- a/test/test_suite/struct/struct_codegen.c3t +++ b/test/test_suite/struct/struct_codegen.c3t @@ -16,7 +16,7 @@ fn void test1() %Point = type { i32, i32 } -@"$ct.test.Point" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.test.Point" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.__const = private unnamed_addr constant %Point { i32 5, i32 6 }, align 4 define void @test.test1() #0 { diff --git a/test/test_suite/struct/struct_const_construct_simple.c3t b/test/test_suite/struct/struct_const_construct_simple.c3t index f6e3ea9c0..2cf67dad1 100644 --- a/test/test_suite/struct/struct_const_construct_simple.c3t +++ b/test/test_suite/struct/struct_const_construct_simple.c3t @@ -20,7 +20,7 @@ Foo foo8 @private = FOO7; /* #expect: structo.ll -@"$ct.structo.Foo" = linkonce global %.introspect { i8 10, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"$ct.structo.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @structo.x = protected unnamed_addr global i64 16, align 8 @structo.foo1 = protected unnamed_addr global %Foo { i32 1, i64 2 }, align 8 @structo.foo2 = protected unnamed_addr global %Foo { i32 2, i64 0 }, align 8 diff --git a/test/test_suite/variant/variant_assign.c3t b/test/test_suite/variant/variant_assign.c3t index 1f2203b43..cf344de75 100644 --- a/test/test_suite/variant/variant_assign.c3t +++ b/test/test_suite/variant/variant_assign.c3t @@ -58,9 +58,9 @@ fn int main() /* #expect: foo.ll -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.double" = linkonce global %.introspect { i8 4, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.bool" = linkonce global %.introspect { i8 1, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.double" = linkonce global %.introspect { i8 4, i64 0, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.bool" = linkonce global %.introspect { i8 1, i64 0, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 define void @foo.test(i64 %0, ptr %1) #0 { entry: diff --git a/test/test_suite/variant/variant_switch.c3t b/test/test_suite/variant/variant_switch.c3t index e6b643e57..8ef1ec0e6 100644 --- a/test/test_suite/variant/variant_switch.c3t +++ b/test/test_suite/variant/variant_switch.c3t @@ -30,9 +30,9 @@ fn int main() /* #expect: foo.ll -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.double" = linkonce global %.introspect { i8 4, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.bool" = linkonce global %.introspect { i8 1, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.double" = linkonce global %.introspect { i8 4, i64 0, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.bool" = linkonce global %.introspect { i8 1, i64 0, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 define void @foo.test(i64 %0, ptr %1) #0 { entry: diff --git a/test/test_suite/variant/variant_test.c3t b/test/test_suite/variant/variant_test.c3t index 7eb7a0ad8..62ee1fc73 100644 --- a/test/test_suite/variant/variant_test.c3t +++ b/test/test_suite/variant/variant_test.c3t @@ -66,11 +66,11 @@ fn void main() %any = type { ptr, i64 } %"any[]" = type { ptr, i64 } -@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.double" = linkonce global %.introspect { i8 4, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.any" = linkonce global %.introspect { i8 7, ptr null, i64 16, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.p$int" = linkonce global %.introspect { i8 19, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"$ct.bool" = linkonce global %.introspect { i8 1, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.double" = linkonce global %.introspect { i8 4, i64 0, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.any" = linkonce global %.introspect { i8 7, i64 0, ptr null, i64 16, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.p$int" = linkonce global %.introspect { i8 19, i64 0, ptr null, i64 8, i64 ptrtoint (ptr @"$ct.int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"$ct.bool" = linkonce global %.introspect { i8 1, i64 0, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 define void @foo.test(i64 %0, ptr %1) #0 { entry: