From 4548c474bc87dd2747718349ddbcae6b394bc02a Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Sat, 8 Jun 2024 18:14:26 +0200 Subject: [PATCH] Fix of default argument stacktrace. --- src/compiler/compiler_internal.h | 7 + src/compiler/copying.c | 3 + src/compiler/enums.h | 15 +- src/compiler/expr.c | 6 + src/compiler/llvm_codegen_debug_info.c | 3 +- src/compiler/llvm_codegen_expr.c | 30 +- src/compiler/llvm_codegen_internal.h | 2 + src/compiler/sema_expr.c | 27 +- src/compiler/sema_liveness.c | 3 + src/compiler/sema_stmts.c | 1 + test/test_suite/debug_symbols/defer_macro.c3t | 670 ++++++++++-------- 11 files changed, 445 insertions(+), 322 deletions(-) diff --git a/src/compiler/compiler_internal.h b/src/compiler/compiler_internal.h index 12aa926b3..83b2dae30 100644 --- a/src/compiler/compiler_internal.h +++ b/src/compiler/compiler_internal.h @@ -906,6 +906,11 @@ typedef struct }; } ExprIdentifier; +typedef struct +{ + SourceSpan loc; + Expr *inner; +} ExprDefaultArg; typedef struct { @@ -1181,6 +1186,7 @@ struct Expr_ ExprCompoundLiteral expr_compound_literal; // 16 Expr** expression_list; // 8 ExprGenericIdent generic_ident_expr; + ExprDefaultArg default_arg_expr; ExprIdentifierRaw hash_ident_expr; // 24 ExprIdentifier identifier_expr; // 24 Expr** initializer_list; // 8 @@ -3386,6 +3392,7 @@ INLINE void expr_set_span(Expr *expr, SourceSpan loc) case EXPR_ANYSWITCH: case EXPR_VASPLAT: case EXPR_MACRO_BODY: + case EXPR_DEFAULT_ARG: break; } } diff --git a/src/compiler/copying.c b/src/compiler/copying.c index 35d0f5903..256dc8dd6 100644 --- a/src/compiler/copying.c +++ b/src/compiler/copying.c @@ -440,6 +440,9 @@ Expr *copy_expr(CopyStruct *c, Expr *source_expr) case EXPR_CT_IS_CONST: MACRO_COPY_EXPR(expr->inner_expr); return expr; + case EXPR_DEFAULT_ARG: + MACRO_COPY_EXPR(expr->default_arg_expr.inner); + return expr; case EXPR_CT_DEFINED: MACRO_COPY_EXPR_LIST(expr->expression_list); return expr; diff --git a/src/compiler/enums.h b/src/compiler/enums.h index 8c1f36e68..d4effb9c6 100644 --- a/src/compiler/enums.h +++ b/src/compiler/enums.h @@ -213,9 +213,10 @@ typedef enum typedef enum { - EXPR_POISONED, EXPR_ACCESS, + EXPR_ANYSWITCH, EXPR_ASM, + EXPR_BENCHMARK_HOOK, EXPR_BINARY, EXPR_BITACCESS, EXPR_BITASSIGN, @@ -232,17 +233,17 @@ typedef enum EXPR_CT_ARG, EXPR_CT_CALL, EXPR_CT_CASTABLE, - EXPR_CT_IS_CONST, EXPR_CT_DEFINED, EXPR_CT_EVAL, EXPR_CT_IDENT, + EXPR_CT_IS_CONST, EXPR_DECL, + EXPR_DEFAULT_ARG, EXPR_DESIGNATED_INITIALIZER_LIST, EXPR_DESIGNATOR, EXPR_EMBED, EXPR_EXPRESSION_LIST, EXPR_EXPR_BLOCK, - EXPR_OPTIONAL, EXPR_FORCE_UNWRAP, EXPR_GENERIC_IDENT, EXPR_GROUP, @@ -252,11 +253,14 @@ typedef enum EXPR_LAMBDA, EXPR_LAST_FAULT, EXPR_MACRO_BLOCK, + EXPR_MACRO_BODY, EXPR_MACRO_BODY_EXPANSION, EXPR_NOP, EXPR_OPERATOR_CHARS, + EXPR_OPTIONAL, EXPR_OTHER_CONTEXT, EXPR_POINTER_OFFSET, + EXPR_POISONED, EXPR_POST_UNARY, EXPR_RETHROW, EXPR_RETVAL, @@ -265,11 +269,10 @@ typedef enum EXPR_SLICE_COPY, EXPR_STRINGIFY, EXPR_SUBSCRIPT, - EXPR_SWIZZLE, EXPR_SUBSCRIPT_ADDR, EXPR_SUBSCRIPT_ASSIGN, + EXPR_SWIZZLE, EXPR_TERNARY, - EXPR_BENCHMARK_HOOK, EXPR_TEST_HOOK, EXPR_TRY_UNWRAP, EXPR_TRY_UNWRAP_CHAIN, @@ -277,9 +280,7 @@ typedef enum EXPR_TYPEID_INFO, EXPR_TYPEINFO, EXPR_UNARY, - EXPR_ANYSWITCH, EXPR_VASPLAT, - EXPR_MACRO_BODY, } ExprKind; typedef enum diff --git a/src/compiler/expr.c b/src/compiler/expr.c index 2946a1b46..6d6401f6b 100644 --- a/src/compiler/expr.c +++ b/src/compiler/expr.c @@ -127,6 +127,7 @@ bool expr_may_addr(Expr *expr) case EXPR_GENERIC_IDENT: case EXPR_EMBED: case EXPR_MACRO_BODY: + case EXPR_DEFAULT_ARG: case EXPR_LAST_FAULT: return false; } @@ -250,6 +251,9 @@ bool expr_is_constant_eval(Expr *expr, ConstantEvalKind eval_kind) case EXPR_GROUP: expr = expr->inner_expr; goto RETRY; + case EXPR_DEFAULT_ARG: + expr = expr->default_arg_expr.inner; + goto RETRY; case EXPR_INITIALIZER_LIST: return expr_list_is_constant_eval(expr->initializer_list, eval_kind); case EXPR_DESIGNATED_INITIALIZER_LIST: @@ -777,6 +781,8 @@ bool expr_is_pure(Expr *expr) && exprid_is_pure(expr->ternary_expr.then_expr); case EXPR_ASM: return false; + case EXPR_DEFAULT_ARG: + return expr_is_pure(expr->default_arg_expr.inner); case EXPR_GROUP: return expr_is_pure(expr->inner_expr); } diff --git a/src/compiler/llvm_codegen_debug_info.c b/src/compiler/llvm_codegen_debug_info.c index 95d840833..2af9ae54c 100644 --- a/src/compiler/llvm_codegen_debug_info.c +++ b/src/compiler/llvm_codegen_debug_info.c @@ -222,9 +222,10 @@ void llvm_emit_debug_location(GenContext *c, SourceSpan location) // Avoid re-emitting the same location. LLVMMetadataRef oldloc = LLVMGetCurrentDebugLocation2(c->builder); if (oldloc && c->last_emitted_loc.a == location.a) return; - LLVMMetadataRef loc = llvm_create_debug_location(c, location); + LLVMMetadataRef loc = c->last_loc = llvm_create_debug_location(c, location); c->last_emitted_loc.a = location.a; LLVMSetCurrentDebugLocation2(c->builder, loc); + } static LLVMMetadataRef llvm_debug_forward_comp(GenContext *c, Type *type, const char *external_name, SourceSpan *loc, LLVMMetadataRef scope, LLVMDIFlags flags) diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index e476afcfe..379c903f3 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -5926,7 +5926,7 @@ static void llvm_emit_call_expr(GenContext *c, BEValue *result_value, Expr *expr Expr *arg = args[i]; if (arg) { - llvm_emit_expr(c, value_ref, args[i]); + llvm_emit_expr(c, value_ref, arg); llvm_value_fold_optional(c, value_ref); continue; } @@ -6869,6 +6869,31 @@ static void llvm_emit_swizzle(GenContext *c, BEValue *value, Expr *expr) llvm_value_set(value, res, expr->type); } +static void llvm_emit_default_arg(GenContext *c, BEValue *value, Expr *expr) +{ + if (llvm_use_debug(c)) + { + SourceSpan location = expr->span; + const char *name = "[DEFAULT INIT]"; + size_t namelen = strlen(name); + LLVMMetadataRef file = llvm_get_debug_file(c, location.file_id); + LLVMMetadataRef init_def = LLVMDIBuilderCreateFunction(c->debug.builder, file, name, namelen, name, namelen, + file, location.row, NULL, true, true, location.row, LLVMDIFlagZero, false); + llvm_emit_debug_location(c, expr->default_arg_expr.loc); + DebugScope scope = { .lexical_block = init_def, .inline_loc = c->last_loc }; + DebugScope *old = c->debug.block_stack; + c->debug.block_stack = &scope; + llvm_emit_expr(c, value, expr->default_arg_expr.inner); + llvm_value_fold_optional(c, value); + c->debug.block_stack = old; + c->last_emitted_loc.a = 0; + } + else + { + llvm_emit_expr(c, value, expr->default_arg_expr.inner); + } +} + void llvm_emit_expr(GenContext *c, BEValue *value, Expr *expr) { EMIT_LOC(c, expr); @@ -6883,6 +6908,9 @@ void llvm_emit_expr(GenContext *c, BEValue *value, Expr *expr) case EXPR_MACRO_BODY: case EXPR_OTHER_CONTEXT: UNREACHABLE + case EXPR_DEFAULT_ARG: + llvm_emit_default_arg(c, value, expr); + return; case EXPR_LAMBDA: llvm_emit_lambda(c, value, expr); return; diff --git a/src/compiler/llvm_codegen_internal.h b/src/compiler/llvm_codegen_internal.h index ffb3951c6..6dd107b94 100644 --- a/src/compiler/llvm_codegen_internal.h +++ b/src/compiler/llvm_codegen_internal.h @@ -128,6 +128,8 @@ typedef struct GenContext_ LLVMBasicBlockRef first_block; // The last emitted location. SourceSpan last_emitted_loc; + // Last emitted location metadata + LLVMMetadataRef last_loc; // Used for defer (catch err) LLVMValueRef defer_error_var; // The current block diff --git a/src/compiler/sema_expr.c b/src/compiler/sema_expr.c index 8ad4faf3a..4b1ba885b 100644 --- a/src/compiler/sema_expr.c +++ b/src/compiler/sema_expr.c @@ -18,6 +18,7 @@ typedef enum typedef struct { bool macro; + SourceSpan call_location; const char *name; const char *block_parameter; Decl **params; @@ -521,6 +522,7 @@ static bool sema_binary_is_expr_lvalue(SemaContext *context, Expr *top_expr, Exp case EXPR_ASM: case EXPR_BINARY: case EXPR_BITASSIGN: + case EXPR_DEFAULT_ARG: case EXPR_BUILTIN: case EXPR_BUILTIN_ACCESS: case EXPR_CALL: @@ -583,6 +585,7 @@ static bool expr_may_ref(Expr *expr) case EXPR_LAMBDA: case EXPR_CT_IDENT: case EXPR_EMBED: + case EXPR_DEFAULT_ARG: return false; case EXPR_OTHER_CONTEXT: return expr_may_ref(expr->expr_other_context.inner); @@ -1347,7 +1350,7 @@ INLINE bool sema_call_expand_arguments(SemaContext *context, CalledDecl *callee, Expr *init_expr = param->var.init_expr; if (init_expr) { - Expr *arg = actual_args[i] = copy_expr_single(init_expr); + Expr *arg = copy_expr_single(init_expr); if (arg->resolve_status != RESOLVE_DONE) { @@ -1363,6 +1366,24 @@ INLINE bool sema_call_expand_arguments(SemaContext *context, CalledDecl *callee, sema_context_destroy(&default_context); if (!success) return false; } + if (expr_is_const(arg)) + { + switch (param->var.kind) + { + case VARDECL_PARAM_CT: + case VARDECL_PARAM_CT_TYPE: + actual_args[i] = arg; + continue; + default: + break; + } + } + Expr *function_scope_arg = expr_new(EXPR_DEFAULT_ARG, arg->span); + function_scope_arg->resolve_status = RESOLVE_DONE; + function_scope_arg->type = arg->type; + function_scope_arg->default_arg_expr.inner = arg; + function_scope_arg->default_arg_expr.loc = callee->call_location; + actual_args[i] = function_scope_arg; continue; } @@ -1704,6 +1725,7 @@ static inline bool sema_call_analyse_func_invocation(SemaContext *context, Type Signature *sig = type->function.signature; CalledDecl callee = { .macro = false, + .call_location = expr->span, .name = name, .block_parameter = NULL, .struct_var = struct_var, @@ -1893,6 +1915,7 @@ bool sema_expr_analyse_macro_call(SemaContext *context, Expr *call_expr, Expr *s copy_end(); CalledDecl callee = { .macro = true, + .call_location = call_expr->span, .name = decl->name, .params = params, .block_parameter = decl->func_decl.body_param ? declptr(decl->func_decl.body_param)->name : NULL, @@ -7933,6 +7956,7 @@ static inline bool sema_expr_analyse_ct_defined(SemaContext *context, Expr *expr case EXPR_BUILTIN_ACCESS: case EXPR_DECL: case EXPR_LAST_FAULT: + case EXPR_DEFAULT_ARG: UNREACHABLE case EXPR_CT_ARG: FALLTHROUGH; @@ -8327,6 +8351,7 @@ static inline bool sema_analyse_expr_dispatch(SemaContext *context, Expr *expr) case EXPR_TEST_HOOK: case EXPR_SWIZZLE: case EXPR_MACRO_BODY: + case EXPR_DEFAULT_ARG: UNREACHABLE case EXPR_OTHER_CONTEXT: context = expr->expr_other_context.context; diff --git a/src/compiler/sema_liveness.c b/src/compiler/sema_liveness.c index 0a6f6e2aa..0c5cae3e9 100644 --- a/src/compiler/sema_liveness.c +++ b/src/compiler/sema_liveness.c @@ -345,6 +345,9 @@ RETRY: case EXPR_OPTIONAL: expr = expr->inner_expr; goto RETRY; + case EXPR_DEFAULT_ARG: + expr = expr->default_arg_expr.inner; + goto RETRY; case EXPR_BUILTIN_ACCESS: expr = exprptr(expr->builtin_access_expr.inner); goto RETRY; diff --git a/src/compiler/sema_stmts.c b/src/compiler/sema_stmts.c index b2e32a079..2ddbc8aed 100644 --- a/src/compiler/sema_stmts.c +++ b/src/compiler/sema_stmts.c @@ -682,6 +682,7 @@ static inline bool sema_expr_valid_try_expression(Expr *expr) case EXPR_MACRO_BODY: case EXPR_ACCESS: case EXPR_ASM: + case EXPR_DEFAULT_ARG: return true; } UNREACHABLE diff --git a/test/test_suite/debug_symbols/defer_macro.c3t b/test/test_suite/debug_symbols/defer_macro.c3t index 92da9871f..4a31d4da3 100644 --- a/test/test_suite/debug_symbols/defer_macro.c3t +++ b/test/test_suite/debug_symbols/defer_macro.c3t @@ -145,17 +145,22 @@ entry: store i32 %1, ptr %a, align 4, !dbg !24 store i64 0, ptr %a.f, align 8, !dbg !24 br label %loop.cond, !dbg !25 + loop.cond: ; preds = %loop.body, %entry %load.err = load i64, ptr %a.f, align 8, !dbg !26 %result = icmp eq i64 %load.err, 0, !dbg !26 br i1 %result, label %loop.body, label %loop.exit, !dbg !26 + loop.body: ; preds = %loop.cond store i32 2, ptr %a, align 4, !dbg !28 store i64 0, ptr %a.f, align 8, !dbg !28 br label %loop.cond, !dbg !28 + loop.exit: ; preds = %loop.cond ret void, !dbg !28 } + +; Function Attrs: nounwind uwtable define i32 @test.main(ptr %0, i64 %1) #0 !dbg !30 { entry: %args = alloca %"char[][]", align 8 @@ -171,17 +176,18 @@ entry: %lo = load i32, ptr %result, align 8, !dbg !55 %ptradd1 = getelementptr inbounds i8, ptr %result, i64 8, !dbg !55 %hi = load ptr, ptr %ptradd1, align 8, !dbg !55 - %3 = call ptr @test.create_foo(i32 %lo, ptr %hi, i64 1, ptr null, i64 0), !dbg !56 - store ptr %3, ptr %asdf, align 8, !dbg !56 - %ptradd2 = getelementptr inbounds i8, ptr %args, i64 8, !dbg !57 - %4 = load i64, ptr %ptradd2, align 8, !dbg !57 - %neq = icmp ne i64 0, %4, !dbg !57 - %ternary = select i1 %neq, <4 x float> , <4 x float> , !dbg !58 - %5 = call ptr @test.test(<4 x float> %ternary), !dbg !59 - %6 = call ptr @test.test2(), !dbg !60 - ret i32 0, !dbg !61 + %3 = call ptr @test.create_foo(i32 %lo, ptr %hi, i64 1, ptr null, i64 0), !dbg !57 + store ptr %3, ptr %asdf, align 8, !dbg !57 + %ptradd2 = getelementptr inbounds i8, ptr %args, i64 8, !dbg !58 + %4 = load i64, ptr %ptradd2, align 8, !dbg !58 + %neq = icmp ne i64 0, %4, !dbg !58 + %ternary = select i1 %neq, <4 x float> , <4 x float> , !dbg !59 + %5 = call ptr @test.test(<4 x float> %ternary), !dbg !60 + %6 = call ptr @test.test2(), !dbg !61 + ret i32 0, !dbg !62 } -define ptr @test.create_foo(i32 %0, ptr %1, i64 %2, ptr %3, i64 %4) #0 !dbg !62 { + +define ptr @test.create_foo(i32 %0, ptr %1, i64 %2, ptr %3, i64 %4) #0 !dbg !63 { entry: %attach = alloca %Attach_Arg, align 8 %flags = alloca i64, align 8 @@ -189,17 +195,18 @@ entry: store i32 %0, ptr %attach, align 8 %ptradd = getelementptr inbounds i8, ptr %attach, i64 8 store ptr %1, ptr %ptradd, align 8 - call void @llvm.dbg.declare(metadata ptr %attach, metadata !65, metadata !DIExpression()), !dbg !66 + call void @llvm.dbg.declare(metadata ptr %attach, metadata !66, metadata !DIExpression()), !dbg !67 store i64 %2, ptr %flags, align 8 - call void @llvm.dbg.declare(metadata ptr %flags, metadata !67, metadata !DIExpression()), !dbg !68 + call void @llvm.dbg.declare(metadata ptr %flags, metadata !68, metadata !DIExpression()), !dbg !69 store ptr %3, ptr %name, align 8 %ptradd1 = getelementptr inbounds i8, ptr %name, i64 8 store i64 %4, ptr %ptradd1, align 8 - call void @llvm.dbg.declare(metadata ptr %name, metadata !69, metadata !DIExpression()), !dbg !70 - %5 = call ptr @std.core.mem.calloc(i64 8) #4, !dbg !71 - ret ptr %5, !dbg !71 + call void @llvm.dbg.declare(metadata ptr %name, metadata !70, metadata !DIExpression()), !dbg !71 + %5 = call ptr @std.core.mem.calloc(i64 8) #4, !dbg !72 + ret ptr %5, !dbg !72 } -define ptr @test.test(<4 x float> %0) #0 !dbg !75 { + +define ptr @test.test(<4 x float> %0) #0 !dbg !76 { entry: %color = alloca <4 x float>, align 16 %x = alloca <4 x float>, align 16 @@ -216,78 +223,92 @@ entry: %error_var5 = alloca i64, align 8 %error_var11 = alloca i64, align 8 store <4 x float> %0, ptr %color, align 16 - call void @llvm.dbg.declare(metadata ptr %color, metadata !83, metadata !DIExpression()), !dbg !84 + call void @llvm.dbg.declare(metadata ptr %color, metadata !84, metadata !DIExpression()), !dbg !85 %1 = load <4 x float>, ptr %color, align 16 store <4 x float> %1, ptr %x, align 16 - %2 = call ptr @std.io.stdout(), !dbg !85 + %2 = call ptr @std.io.stdout(), !dbg !86 store ptr %2, ptr %out, align 8 %3 = load <4 x float>, ptr %x, align 16 store <4 x float> %3, ptr %x1, align 16 - call void @llvm.dbg.declare(metadata ptr %len, metadata !89, metadata !DIExpression()), !dbg !91 + call void @llvm.dbg.declare(metadata ptr %len, metadata !90, metadata !DIExpression()), !dbg !92 %4 = load ptr, ptr %out, align 8 store ptr %4, ptr %out2, align 8 %5 = load <4 x float>, ptr %x1, align 16 store <4 x float> %5, ptr %x3, align 16 - %6 = load ptr, ptr %out2, align 8, !dbg !93 - %7 = insertvalue %any undef, ptr %6, 0, !dbg !93 - %8 = insertvalue %any %7, i64 ptrtoint (ptr @"$ct.std.io.File" to i64), 1, !dbg !93 - %9 = insertvalue %any undef, ptr %x3, 0, !dbg !96 - %10 = insertvalue %any %9, i64 ptrtoint (ptr @"$ct.foo.Color" to i64), 1, !dbg !96 - store %any %10, ptr %varargslots, align 16, !dbg !96 - %11 = insertvalue %"any[]" undef, ptr %varargslots, 0, !dbg !96 - %"$$temp" = insertvalue %"any[]" %11, i64 1, 1, !dbg !96 + %6 = load ptr, ptr %out2, align 8, !dbg !94 + %7 = insertvalue %any undef, ptr %6, 0, !dbg !94 + %8 = insertvalue %any %7, i64 ptrtoint (ptr @"$ct.std.io.File" to i64), 1, !dbg !94 + %9 = insertvalue %any undef, ptr %x3, 0, !dbg !97 + %10 = insertvalue %any %9, i64 ptrtoint (ptr @"$ct.foo.Color" to i64), 1, !dbg !97 + store %any %10, ptr %varargslots, align 16, !dbg !97 + %11 = insertvalue %"any[]" undef, ptr %varargslots, 0, !dbg !97 + %"$$temp" = insertvalue %"any[]" %11, i64 1, 1, !dbg !97 store %any %8, ptr %taddr, align 8 %lo = load i64, ptr %taddr, align 8 %ptradd = getelementptr inbounds i8, ptr %taddr, i64 8 %hi = load ptr, ptr %ptradd, align 8 store %"any[]" %"$$temp", ptr %indirectarg, align 8 - %12 = call i64 @std.io.fprintf(ptr %retparam, i64 %lo, ptr %hi, ptr @.str, i64 2, ptr byval(%"any[]") align 8 %indirectarg), !dbg !97 - %not_err = icmp eq i64 %12, 0, !dbg !97 - %13 = call i1 @llvm.expect.i1(i1 %not_err, i1 true), !dbg !97 - br i1 %13, label %after_check, label %assign_optional, !dbg !97 + %12 = call i64 @std.io.fprintf(ptr %retparam, i64 %lo, ptr %hi, ptr @.str, i64 2, ptr byval(%"any[]") align 8 %indirectarg), !dbg !98 + %not_err = icmp eq i64 %12, 0, !dbg !98 + %13 = call i1 @llvm.expect.i1(i1 %not_err, i1 true), !dbg !98 + br i1 %13, label %after_check, label %assign_optional, !dbg !98 + assign_optional: ; preds = %entry - store i64 %12, ptr %error_var, align 8, !dbg !97 - br label %guard_block, !dbg !97 + store i64 %12, ptr %error_var, align 8, !dbg !98 + br label %guard_block, !dbg !98 + after_check: ; preds = %entry - br label %noerr_block, !dbg !97 + br label %noerr_block, !dbg !98 + guard_block: ; preds = %assign_optional - br label %voiderr, !dbg !97 + br label %voiderr, !dbg !98 + noerr_block: ; preds = %after_check - %14 = load i64, ptr %retparam, align 8, !dbg !97 - store i64 %14, ptr %len, align 8, !dbg !97 - %15 = load ptr, ptr %out, align 8, !dbg !98 - %16 = call i64 @std.io.File.write_byte(ptr %15, i8 zeroext 10), !dbg !99 - %not_err6 = icmp eq i64 %16, 0, !dbg !99 - %17 = call i1 @llvm.expect.i1(i1 %not_err6, i1 true), !dbg !99 - br i1 %17, label %after_check8, label %assign_optional7, !dbg !99 + %14 = load i64, ptr %retparam, align 8, !dbg !98 + store i64 %14, ptr %len, align 8, !dbg !98 + %15 = load ptr, ptr %out, align 8, !dbg !99 + %16 = call i64 @std.io.File.write_byte(ptr %15, i8 zeroext 10), !dbg !100 + %not_err6 = icmp eq i64 %16, 0, !dbg !100 + %17 = call i1 @llvm.expect.i1(i1 %not_err6, i1 true), !dbg !100 + br i1 %17, label %after_check8, label %assign_optional7, !dbg !100 + assign_optional7: ; preds = %noerr_block - store i64 %16, ptr %error_var5, align 8, !dbg !99 - br label %guard_block9, !dbg !99 + store i64 %16, ptr %error_var5, align 8, !dbg !100 + br label %guard_block9, !dbg !100 + after_check8: ; preds = %noerr_block - br label %noerr_block10, !dbg !99 + br label %noerr_block10, !dbg !100 + guard_block9: ; preds = %assign_optional7 - br label %voiderr, !dbg !99 -noerr_block10: ; preds = %after_check8 - %18 = load ptr, ptr %out, align 8, !dbg !100 - %19 = call i64 @std.io.File.flush(ptr %18), !dbg !100 - %not_err12 = icmp eq i64 %19, 0, !dbg !100 - %20 = call i1 @llvm.expect.i1(i1 %not_err12, i1 true), !dbg !100 - br i1 %20, label %after_check14, label %assign_optional13, !dbg !100 -assign_optional13: ; preds = %noerr_block10 - store i64 %19, ptr %error_var11, align 8, !dbg !100 - br label %guard_block15, !dbg !100 -after_check14: ; preds = %noerr_block10 - br label %noerr_block16, !dbg !100 -guard_block15: ; preds = %assign_optional13 br label %voiderr, !dbg !100 + +noerr_block10: ; preds = %after_check8 + %18 = load ptr, ptr %out, align 8, !dbg !101 + %19 = call i64 @std.io.File.flush(ptr %18), !dbg !101 + %not_err12 = icmp eq i64 %19, 0, !dbg !101 + %20 = call i1 @llvm.expect.i1(i1 %not_err12, i1 true), !dbg !101 + br i1 %20, label %after_check14, label %assign_optional13, !dbg !101 + +assign_optional13: ; preds = %noerr_block10 + store i64 %19, ptr %error_var11, align 8, !dbg !101 + br label %guard_block15, !dbg !101 + +after_check14: ; preds = %noerr_block10 + br label %noerr_block16, !dbg !101 + +guard_block15: ; preds = %assign_optional13 + br label %voiderr, !dbg !101 + noerr_block16: ; preds = %after_check14 - %21 = load i64, ptr %len, align 8, !dbg !101 - %add = add i64 %21, 1, !dbg !101 - br label %voiderr, !dbg !92 + %21 = load i64, ptr %len, align 8, !dbg !102 + %add = add i64 %21, 1, !dbg !102 + br label %voiderr, !dbg !93 + voiderr: ; preds = %noerr_block16, %guard_block15, %guard_block9, %guard_block - ret ptr null, !dbg !102 + ret ptr null, !dbg !103 } -define ptr @test.test2() #0 !dbg !103 { + +define ptr @test.test2() #0 !dbg !104 { entry: %conflicts = alloca %"Arena*[]", align 8 %scratch = alloca %Arena_Cursor, align 8 @@ -295,26 +316,27 @@ entry: %scratch1 = alloca ptr, align 8 %asdf = alloca ptr, align 8 store %"Arena*[]" zeroinitializer, ptr %conflicts, align 8 - call void @llvm.dbg.declare(metadata ptr %scratch, metadata !106, metadata !DIExpression()), !dbg !116 - %lo = load ptr, ptr %conflicts, align 8, !dbg !118 - %ptradd = getelementptr inbounds i8, ptr %conflicts, i64 8, !dbg !118 - %hi = load i64, ptr %ptradd, align 8, !dbg !118 - %0 = call { ptr, i64 } @arena_scratch_begin(ptr %lo, i64 %hi), !dbg !119 + call void @llvm.dbg.declare(metadata ptr %scratch, metadata !107, metadata !DIExpression()), !dbg !117 + %lo = load ptr, ptr %conflicts, align 8, !dbg !119 + %ptradd = getelementptr inbounds i8, ptr %conflicts, i64 8, !dbg !119 + %hi = load i64, ptr %ptradd, align 8, !dbg !119 + %0 = call { ptr, i64 } @arena_scratch_begin(ptr %lo, i64 %hi), !dbg !120 store { ptr, i64 } %0, ptr %result, align 8 call void @llvm.memcpy.p0.p0.i32(ptr align 8 %scratch, ptr align 8 %result, i32 16, i1 false) - call void @llvm.dbg.declare(metadata ptr %scratch1, metadata !120, metadata !DIExpression()), !dbg !121 - %1 = load ptr, ptr %scratch, align 8, !dbg !122 - store ptr %1, ptr %scratch1, align 8, !dbg !122 - call void @llvm.dbg.declare(metadata ptr %asdf, metadata !124, metadata !DIExpression()), !dbg !126 - store ptr null, ptr %asdf, align 8, !dbg !126 - %2 = load ptr, ptr %asdf, align 8, !dbg !127 - %lo2 = load ptr, ptr %scratch, align 8, !dbg !128 - %ptradd3 = getelementptr inbounds i8, ptr %scratch, i64 8, !dbg !128 - %hi4 = load i64, ptr %ptradd3, align 8, !dbg !128 - call void @arena_scratch_end(ptr %lo2, i64 %hi4) #4, !dbg !130 - ret ptr %2, !dbg !130 + call void @llvm.dbg.declare(metadata ptr %scratch1, metadata !121, metadata !DIExpression()), !dbg !122 + %1 = load ptr, ptr %scratch, align 8, !dbg !123 + store ptr %1, ptr %scratch1, align 8, !dbg !123 + call void @llvm.dbg.declare(metadata ptr %asdf, metadata !125, metadata !DIExpression()), !dbg !127 + store ptr null, ptr %asdf, align 8, !dbg !127 + %2 = load ptr, ptr %asdf, align 8, !dbg !128 + %lo2 = load ptr, ptr %scratch, align 8, !dbg !129 + %ptradd3 = getelementptr inbounds i8, ptr %scratch, i64 8, !dbg !129 + %hi4 = load i64, ptr %ptradd3, align 8, !dbg !129 + call void @arena_scratch_end(ptr %lo2, i64 %hi4) #4, !dbg !131 + ret ptr %2, !dbg !131 } -define i32 @main(i32 %0, ptr %1) #0 !dbg !131 { + +define i32 @main(i32 %0, ptr %1) #0 !dbg !132 { entry: %.anon = alloca i32, align 4 %.anon1 = alloca ptr, align 8 @@ -347,21 +369,21 @@ entry: %len18 = alloca i64, align 8 store ptr null, ptr %.cachedtype, align 8 store i32 %0, ptr %.anon, align 4 - call void @llvm.dbg.declare(metadata ptr %.anon, metadata !135, metadata !DIExpression()), !dbg !136 + call void @llvm.dbg.declare(metadata ptr %.anon, metadata !136, metadata !DIExpression()), !dbg !137 store ptr %1, ptr %.anon1, align 8 - call void @llvm.dbg.declare(metadata ptr %.anon1, metadata !137, metadata !DIExpression()), !dbg !136 + call void @llvm.dbg.declare(metadata ptr %.anon1, metadata !138, metadata !DIExpression()), !dbg !137 %2 = load i32, ptr %.anon, align 4 store i32 %2, ptr %argc, align 4 %3 = load ptr, ptr %.anon1, align 8 store ptr %3, ptr %argv, align 8 - call void @llvm.dbg.declare(metadata ptr %list, metadata !138, metadata !DIExpression()), !dbg !141 + call void @llvm.dbg.declare(metadata ptr %list, metadata !139, metadata !DIExpression()), !dbg !142 %4 = load i32, ptr %argc, align 4 store i32 %4, ptr %argc2, align 4 %5 = load ptr, ptr %argv, align 8 store ptr %5, ptr %argv3, align 8 - call void @llvm.dbg.declare(metadata ptr %list5, metadata !142, metadata !DIExpression()), !dbg !144 - %6 = load i32, ptr %argc2, align 4, !dbg !146 - %sext = sext i32 %6 to i64, !dbg !146 + call void @llvm.dbg.declare(metadata ptr %list5, metadata !143, metadata !DIExpression()), !dbg !145 + %6 = load i32, ptr %argc2, align 4, !dbg !147 + %sext = sext i32 %6 to i64, !dbg !147 store i64 %sext, ptr %elements, align 8 call void @llvm.memcpy.p0.p0.i32(ptr align 8 %allocator, ptr align 8 @std.core.mem.allocator.thread_allocator, i32 16, i1 false) %7 = load i64, ptr %elements, align 8 @@ -370,22 +392,25 @@ entry: %8 = load i64, ptr %elements6, align 8 store i64 %8, ptr %elements8, align 8 call void @llvm.memcpy.p0.p0.i32(ptr align 8 %allocator10, ptr align 8 %allocator7, i32 16, i1 false) - %9 = load i64, ptr %elements8, align 8, !dbg !147 - %mul = mul i64 16, %9, !dbg !155 + %9 = load i64, ptr %elements8, align 8, !dbg !148 + %mul = mul i64 16, %9, !dbg !156 store i64 %mul, ptr %size, align 8 - %10 = load i64, ptr %size, align 8, !dbg !156 - %not = icmp eq i64 %10, 0, !dbg !156 - br i1 %not, label %if.then, label %if.exit, !dbg !156 + %10 = load i64, ptr %size, align 8, !dbg !157 + %not = icmp eq i64 %10, 0, !dbg !157 + br i1 %not, label %if.then, label %if.exit, !dbg !157 + if.then: ; preds = %entry - store ptr null, ptr %blockret11, align 8, !dbg !159 - br label %expr_block.exit, !dbg !159 + store ptr null, ptr %blockret11, align 8, !dbg !160 + br label %expr_block.exit, !dbg !160 + if.exit: ; preds = %entry - %ptradd = getelementptr inbounds i8, ptr %allocator10, i64 8, !dbg !160 - %11 = load i64, ptr %ptradd, align 8, !dbg !160 - %12 = inttoptr i64 %11 to ptr, !dbg !160 + %ptradd = getelementptr inbounds i8, ptr %allocator10, i64 8, !dbg !161 + %11 = load i64, ptr %ptradd, align 8, !dbg !161 + %12 = inttoptr i64 %11 to ptr, !dbg !161 %type = load ptr, ptr %.cachedtype, align 8 %13 = icmp eq ptr %12, %type br i1 %13, label %cache_hit, label %cache_miss + cache_miss: ; preds = %if.exit %ptradd12 = getelementptr inbounds i8, ptr %12, i64 16 %14 = load ptr, ptr %ptradd12, align 8 @@ -393,116 +418,132 @@ cache_miss: ; preds = %if.exit store ptr %15, ptr %.inlinecache, align 8 store ptr %12, ptr %.cachedtype, align 8 br label %16 + cache_hit: ; preds = %if.exit %cache_hit_fn = load ptr, ptr %.inlinecache, align 8 br label %16 + 16: ; preds = %cache_hit, %cache_miss %fn_phi = phi ptr [ %cache_hit_fn, %cache_hit ], [ %15, %cache_miss ] %17 = icmp eq ptr %fn_phi, null br i1 %17, label %missing_function, label %match + missing_function: ; preds = %16 - %18 = load ptr, ptr @std.core.builtin.panic, align 8, !dbg !161 - call void %18(ptr @.panic_msg, i64 44, ptr @.file, i64 16, ptr @.func, i64 6, i32 68), !dbg !161 - unreachable, !dbg !161 + %18 = load ptr, ptr @std.core.builtin.panic, align 8, !dbg !163 + call void %18(ptr @.panic_msg, i64 44, ptr @.file, i64 16, ptr @.func, i64 6, i32 68), !dbg !163 + unreachable, !dbg !163 + match: ; preds = %16 %19 = load ptr, ptr %allocator10, align 8 %20 = load i64, ptr %size, align 8 - %21 = call i64 %fn_phi(ptr %retparam, ptr %19, i64 %20, i32 0, i64 0), !dbg !161 - %not_err = icmp eq i64 %21, 0, !dbg !161 - %22 = call i1 @llvm.expect.i1(i1 %not_err, i1 true), !dbg !161 - br i1 %22, label %after_check, label %assign_optional, !dbg !161 + %21 = call i64 %fn_phi(ptr %retparam, ptr %19, i64 %20, i32 0, i64 0), !dbg !163 + %not_err = icmp eq i64 %21, 0, !dbg !163 + %22 = call i1 @llvm.expect.i1(i1 %not_err, i1 true), !dbg !163 + br i1 %22, label %after_check, label %assign_optional, !dbg !163 + assign_optional: ; preds = %match - store i64 %21, ptr %error_var, align 8, !dbg !161 - br label %panic_block, !dbg !161 + store i64 %21, ptr %error_var, align 8, !dbg !163 + br label %panic_block, !dbg !163 + after_check: ; preds = %match - %23 = load ptr, ptr %retparam, align 8, !dbg !161 - store ptr %23, ptr %blockret11, align 8, !dbg !161 - br label %expr_block.exit, !dbg !161 + %23 = load ptr, ptr %retparam, align 8, !dbg !163 + store ptr %23, ptr %blockret11, align 8, !dbg !163 + br label %expr_block.exit, !dbg !163 + expr_block.exit: ; preds = %after_check, %if.then - %24 = load ptr, ptr %blockret11, align 8, !dbg !161 + %24 = load ptr, ptr %blockret11, align 8, !dbg !163 store ptr %24, ptr %taddr, align 8 %25 = load ptr, ptr %taddr, align 8 - %26 = load i64, ptr %elements8, align 8, !dbg !162 - %add = add i64 0, %26, !dbg !162 - %size13 = sub i64 %add, 0, !dbg !162 - %27 = insertvalue %"char[][]" undef, ptr %25, 0, !dbg !162 - %28 = insertvalue %"char[][]" %27, i64 %size13, 1, !dbg !162 - br label %noerr_block, !dbg !162 + %26 = load i64, ptr %elements8, align 8, !dbg !164 + %add = add i64 0, %26, !dbg !164 + %size13 = sub i64 %add, 0, !dbg !164 + %27 = insertvalue %"char[][]" undef, ptr %25, 0, !dbg !164 + %28 = insertvalue %"char[][]" %27, i64 %size13, 1, !dbg !164 + br label %noerr_block, !dbg !164 + panic_block: ; preds = %assign_optional - %29 = insertvalue %any undef, ptr %error_var, 0, !dbg !162 - %30 = insertvalue %any %29, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1, !dbg !162 + %29 = insertvalue %any undef, ptr %error_var, 0, !dbg !164 + %30 = insertvalue %any %29, i64 ptrtoint (ptr @"$ct.anyfault" to i64), 1, !dbg !164 store %any %30, ptr %varargslots, align 16 %31 = insertvalue %"any[]" undef, ptr %varargslots, 0 %"$$temp" = insertvalue %"any[]" %31, i64 1, 1 store %"any[]" %"$$temp", ptr %indirectarg, align 8 - call void @std.core.builtin.panicf(ptr @.panic_msg.1, i64 36, ptr @.file, i64 16, ptr @.func, i64 6, i32 216, ptr byval(%"any[]") align 8 %indirectarg), !dbg !150 - unreachable, !dbg !150 + call void @std.core.builtin.panicf(ptr @.panic_msg.1, i64 36, ptr @.file, i64 16, ptr @.func, i64 6, i32 216, ptr byval(%"any[]") align 8 %indirectarg), !dbg !151 + unreachable, !dbg !151 + noerr_block: ; preds = %expr_block.exit - store %"char[][]" %28, ptr %list5, align 8, !dbg !150 - call void @llvm.dbg.declare(metadata ptr %i, metadata !163, metadata !DIExpression()), !dbg !165 - store i32 0, ptr %i, align 4, !dbg !166 - br label %loop.cond, !dbg !166 + store %"char[][]" %28, ptr %list5, align 8, !dbg !151 + call void @llvm.dbg.declare(metadata ptr %i, metadata !165, metadata !DIExpression()), !dbg !167 + store i32 0, ptr %i, align 4, !dbg !168 + br label %loop.cond, !dbg !168 + loop.cond: ; preds = %loop.exit, %noerr_block - %32 = load i32, ptr %i, align 4, !dbg !167 - %33 = load i32, ptr %argc2, align 4, !dbg !168 - %lt = icmp slt i32 %32, %33, !dbg !167 - br i1 %lt, label %loop.body, label %loop.exit26, !dbg !167 + %32 = load i32, ptr %i, align 4, !dbg !169 + %33 = load i32, ptr %argc2, align 4, !dbg !170 + %lt = icmp slt i32 %32, %33, !dbg !169 + br i1 %lt, label %loop.body, label %loop.exit26, !dbg !169 + loop.body: ; preds = %loop.cond - call void @llvm.dbg.declare(metadata ptr %arg, metadata !169, metadata !DIExpression()), !dbg !171 - %34 = load ptr, ptr %argv3, align 8, !dbg !172 - %35 = load i32, ptr %i, align 4, !dbg !173 - %sext14 = sext i32 %35 to i64, !dbg !173 - %ptroffset = getelementptr inbounds [8 x i8], ptr %34, i64 %sext14, !dbg !173 - %36 = load ptr, ptr %ptroffset, align 8, !dbg !173 - store ptr %36, ptr %arg, align 8, !dbg !173 - call void @llvm.dbg.declare(metadata ptr %len, metadata !174, metadata !DIExpression()), !dbg !175 - store i64 0, ptr %len, align 8, !dbg !176 - %37 = load ptr, ptr %list5, align 8, !dbg !177 - %38 = load i32, ptr %i, align 4, !dbg !178 - %sext15 = sext i32 %38 to i64, !dbg !178 - %ptroffset16 = getelementptr inbounds [16 x i8], ptr %37, i64 %sext15, !dbg !178 - %39 = load ptr, ptr %arg, align 8, !dbg !179 + call void @llvm.dbg.declare(metadata ptr %arg, metadata !171, metadata !DIExpression()), !dbg !173 + %34 = load ptr, ptr %argv3, align 8, !dbg !174 + %35 = load i32, ptr %i, align 4, !dbg !175 + %sext14 = sext i32 %35 to i64, !dbg !175 + %ptroffset = getelementptr inbounds [8 x i8], ptr %34, i64 %sext14, !dbg !175 + %36 = load ptr, ptr %ptroffset, align 8, !dbg !175 + store ptr %36, ptr %arg, align 8, !dbg !175 + call void @llvm.dbg.declare(metadata ptr %len, metadata !176, metadata !DIExpression()), !dbg !177 + store i64 0, ptr %len, align 8, !dbg !178 + %37 = load ptr, ptr %list5, align 8, !dbg !179 + %38 = load i32, ptr %i, align 4, !dbg !180 + %sext15 = sext i32 %38 to i64, !dbg !180 + %ptroffset16 = getelementptr inbounds [16 x i8], ptr %37, i64 %sext15, !dbg !180 + %39 = load ptr, ptr %arg, align 8, !dbg !181 %40 = load ptr, ptr %arg, align 8 store ptr %40, ptr %ptr, align 8 - call void @llvm.dbg.declare(metadata ptr %len18, metadata !180, metadata !DIExpression()), !dbg !182 - store i64 0, ptr %len18, align 8, !dbg !184 - br label %loop.cond19, !dbg !185 + call void @llvm.dbg.declare(metadata ptr %len18, metadata !182, metadata !DIExpression()), !dbg !184 + store i64 0, ptr %len18, align 8, !dbg !186 + br label %loop.cond19, !dbg !187 + loop.cond19: ; preds = %loop.body21, %loop.body - %41 = load ptr, ptr %ptr, align 8, !dbg !186 - %42 = load i64, ptr %len18, align 8, !dbg !188 - %ptradd20 = getelementptr inbounds i8, ptr %41, i64 %42, !dbg !188 - %43 = load i8, ptr %ptradd20, align 1, !dbg !188 - %intbool = icmp ne i8 %43, 0, !dbg !188 - br i1 %intbool, label %loop.body21, label %loop.exit, !dbg !188 + %41 = load ptr, ptr %ptr, align 8, !dbg !188 + %42 = load i64, ptr %len18, align 8, !dbg !190 + %ptradd20 = getelementptr inbounds i8, ptr %41, i64 %42, !dbg !190 + %43 = load i8, ptr %ptradd20, align 1, !dbg !190 + %intbool = icmp ne i8 %43, 0, !dbg !190 + br i1 %intbool, label %loop.body21, label %loop.exit, !dbg !190 + loop.body21: ; preds = %loop.cond19 - %44 = load i64, ptr %len18, align 8, !dbg !189 - %add22 = add i64 %44, 1, !dbg !189 - store i64 %add22, ptr %len18, align 8, !dbg !189 - br label %loop.cond19, !dbg !189 + %44 = load i64, ptr %len18, align 8, !dbg !191 + %add22 = add i64 %44, 1, !dbg !191 + store i64 %add22, ptr %len18, align 8, !dbg !191 + br label %loop.cond19, !dbg !191 + loop.exit: ; preds = %loop.cond19 - %45 = load i64, ptr %len18, align 8, !dbg !190 - %add23 = add i64 0, %45, !dbg !190 - %size24 = sub i64 %add23, 0, !dbg !190 - %46 = insertvalue %"char[]" undef, ptr %39, 0, !dbg !190 - %47 = insertvalue %"char[]" %46, i64 %size24, 1, !dbg !190 - store %"char[]" %47, ptr %ptroffset16, align 8, !dbg !190 - %48 = load i32, ptr %i, align 4, !dbg !191 - %add25 = add i32 %48, 1, !dbg !191 - store i32 %add25, ptr %i, align 4, !dbg !191 - br label %loop.cond, !dbg !191 + %45 = load i64, ptr %len18, align 8, !dbg !192 + %add23 = add i64 0, %45, !dbg !192 + %size24 = sub i64 %add23, 0, !dbg !192 + %46 = insertvalue %"char[]" undef, ptr %39, 0, !dbg !192 + %47 = insertvalue %"char[]" %46, i64 %size24, 1, !dbg !192 + store %"char[]" %47, ptr %ptroffset16, align 8, !dbg !192 + %48 = load i32, ptr %i, align 4, !dbg !193 + %add25 = add i32 %48, 1, !dbg !193 + store i32 %add25, ptr %i, align 4, !dbg !193 + br label %loop.cond, !dbg !193 + loop.exit26: ; preds = %loop.cond - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %list, ptr align 8 %list5, i32 16, i1 false), !dbg !192 - %lo = load ptr, ptr %list, align 8, !dbg !193 - %ptradd27 = getelementptr inbounds i8, ptr %list, i64 8, !dbg !193 - %hi = load i64, ptr %ptradd27, align 8, !dbg !193 - %49 = call i32 @test.main(ptr %lo, i64 %hi), !dbg !194 - store i32 %49, ptr %blockret, align 4, !dbg !194 - %50 = load ptr, ptr %list, align 8, !dbg !195 - call void @std.core.mem.free(ptr %50) #4, !dbg !197 - br label %expr_block.exit28, !dbg !197 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %list, ptr align 8 %list5, i32 16, i1 false), !dbg !194 + %lo = load ptr, ptr %list, align 8, !dbg !195 + %ptradd27 = getelementptr inbounds i8, ptr %list, i64 8, !dbg !195 + %hi = load i64, ptr %ptradd27, align 8, !dbg !195 + %49 = call i32 @test.main(ptr %lo, i64 %hi), !dbg !196 + store i32 %49, ptr %blockret, align 4, !dbg !196 + %50 = load ptr, ptr %list, align 8, !dbg !197 + call void @std.core.mem.free(ptr %50) #4, !dbg !199 + br label %expr_block.exit28, !dbg !199 + expr_block.exit28: ; preds = %loop.exit26 - %51 = load i32, ptr %blockret, align 4, !dbg !197 - ret i32 %51, !dbg !197 + %51 = load i32, ptr %blockret, align 4, !dbg !199 + ret i32 %51, !dbg !199 } declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 declare { i32, ptr } @attach.to_scope() #0 @@ -522,16 +563,20 @@ check: ; preds = %no_match, %entry %2 = phi ptr [ %0, %entry ], [ %9, %no_match ] %3 = icmp eq ptr %2, null br i1 %3, label %missing_function, label %compare + missing_function: ; preds = %check ret ptr null + compare: ; preds = %check %4 = getelementptr inbounds { ptr, ptr, ptr }, ptr %2, i32 0, i32 1 %5 = load ptr, ptr %4, align 8 %6 = icmp eq ptr %5, %1 br i1 %6, label %match, label %no_match + match: ; preds = %compare %7 = load ptr, ptr %2, align 8 ret ptr %7 + no_match: ; preds = %compare %8 = getelementptr inbounds { ptr, ptr, ptr }, ptr %2, i32 0, i32 2 %9 = load ptr, ptr %8, align 8 @@ -591,140 +636,141 @@ no_match: ; preds = %compare !52 = !DIDerivedType(tag: DW_TAG_member, name: "asdf", scope: !50, file: !5, line: 28, baseType: !12, size: 64, align: 64) !53 = !DILocation(line: 18, column: 8, scope: !30) !54 = !DILocation(line: 18, column: 34, scope: !30) -!55 = !DILocation(line: 33, column: 70, scope: !30) -!56 = !DILocation(line: 18, column: 15, scope: !30) -!57 = !DILocation(line: 21, column: 8, scope: !30) -!58 = !DILocation(line: 21, column: 42, scope: !30) -!59 = !DILocation(line: 21, column: 3, scope: !30) -!60 = !DILocation(line: 23, column: 3, scope: !30) -!61 = !DILocation(line: 24, column: 10, scope: !30) -!62 = distinct !DISubprogram(name: "create_foo", linkageName: "test.create_foo", scope: !5, file: !5, line: 33, type: !63, scopeLine: 33, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition -!63 = !DISubroutineType(types: !64) -!64 = !{!49, !8, !44, !37} -!65 = !DILocalVariable(name: "attach", arg: 1, scope: !62, file: !5, line: 33, type: !8) -!66 = !DILocation(line: 33, column: 31, scope: !62) -!67 = !DILocalVariable(name: "flags", arg: 2, scope: !62, file: !5, line: 33, type: !44) -!68 = !DILocation(line: 33, column: 49, scope: !62) -!69 = !DILocalVariable(name: "name", arg: 3, scope: !62, file: !5, line: 33, type: !37) -!70 = !DILocation(line: 33, column: 63, scope: !62) -!71 = !DILocation(line: 564, column: 10, scope: !72, inlinedAt: !74) -!72 = distinct !DISubprogram(name: "new", linkageName: "new", scope: !73, file: !73, line: 561, scopeLine: 561, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition -!74 = !DILocation(line: 34, column: 15, scope: !62) -!75 = distinct !DISubprogram(name: "test", linkageName: "test.test", scope: !5, file: !5, line: 41, type: !76, scopeLine: 41, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition -!76 = !DISubroutineType(types: !77) -!77 = !{!49, !78} -!78 = !DIDerivedType(tag: DW_TAG_typedef, name: "Color", scope: !5, file: !5, line: 79, baseType: !79, align: 16) -!79 = !DICompositeType(tag: DW_TAG_array_type, baseType: !80, size: 128, align: 32, flags: DIFlagVector, elements: !81) -!80 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float) -!81 = !{!82} -!82 = !DISubrange(count: 4, lowerBound: 0) -!83 = !DILocalVariable(name: "color", arg: 1, scope: !75, file: !5, line: 41, type: !78) -!84 = !DILocation(line: 41, column: 20, scope: !75) -!85 = !DILocation(line: 151, column: 20, scope: !86, inlinedAt: !88) -!86 = distinct !DISubprogram(name: "printn", linkageName: "printn", scope: !87, file: !87, line: 149, scopeLine: 149, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition -!87 = !DIFile(filename: "io.c3" -!88 = !DILocation(line: 42, column: 7, scope: !75) -!89 = !DILocalVariable(name: "len", scope: !90, file: !5, line: 133, type: !44, align: 8) -!90 = distinct !DISubprogram(name: "fprintn", linkageName: "fprintn", scope: !87, file: !87, line: 131, scopeLine: 131, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition -!91 = !DILocation(line: 133, column: 6, scope: !90, inlinedAt: !92) -!92 = !DILocation(line: 151, column: 2, scope: !86, inlinedAt: !88) -!93 = !DILocation(line: 106, column: 19, scope: !94, inlinedAt: !95) -!94 = distinct !DISubprogram(name: "fprint", linkageName: "fprint", scope: !87, file: !87, line: 92, scopeLine: 92, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition -!95 = !DILocation(line: 133, column: 12, scope: !90, inlinedAt: !92) -!96 = !DILocation(line: 106, column: 30, scope: !94, inlinedAt: !95) -!97 = !DILocation(line: 106, column: 11, scope: !94, inlinedAt: !95) -!98 = !DILocation(line: 134, column: 17, scope: !90, inlinedAt: !92) -!99 = !DILocation(line: 134, column: 2, scope: !90, inlinedAt: !92) -!100 = !DILocation(line: 139, column: 4, scope: !90, inlinedAt: !92) -!101 = !DILocation(line: 141, column: 9, scope: !90, inlinedAt: !92) -!102 = !DILocation(line: 45, column: 10, scope: !75) -!103 = distinct !DISubprogram(name: "test2", linkageName: "test.test2", scope: !5, file: !5, line: 48, type: !104, scopeLine: 48, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition -!104 = !DISubroutineType(types: !105) -!105 = !{!12} -!106 = !DILocalVariable(name: "scratch", scope: !107, file: !5, line: 110, type: !108, align: 8) -!107 = distinct !DISubprogram(name: "@scratch", linkageName: "@scratch", scope: !5, file: !5, line: 109, scopeLine: 109, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: -!108 = !DICompositeType(tag: DW_TAG_structure_type, name: "Arena_Cursor", scope: !5, file: !5, line: 88, size: 128, align: 64, elements: !109, identifier: "foo.Arena_Cursor") -!109 = !{!110, !115} -!110 = !DIDerivedType(tag: DW_TAG_member, name: "arena", scope: !108, file: !5, line: 89, baseType: !111, size: 64, align: 64) -!111 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "Arena*", baseType: !112, size: 64, align: 64, dwarfAddressSpace: 0) -!112 = !DICompositeType(tag: DW_TAG_structure_type, name: "Arena", scope: !5, file: !5, line: 84, size: 64, align: 64, elements: !113, identifier: "foo.Arena") -!113 = !{!114} -!114 = !DIDerivedType(tag: DW_TAG_member, name: "cursor", scope: !112, file: !5, line: 85, baseType: !44, size: 64, align: 64) -!115 = !DIDerivedType(tag: DW_TAG_member, name: "cursor", scope: !108, file: !5, line: 90, baseType: !44, size: 64, align: 64, offset: 64) -!116 = !DILocation(line: 110, column: 16, scope: !107, inlinedAt: !117) -!117 = !DILocation(line: 50, column: 3, scope: !103) -!118 = !DILocation(line: 110, column: 40, scope: !107, inlinedAt: !117) -!119 = !DILocation(line: 110, column: 26, scope: !107, inlinedAt: !117) -!120 = !DILocalVariable(name: "scratch", scope: !103, file: !5, line: 50, type: !111, align: 8) -!121 = !DILocation(line: 50, column: 21, scope: !103) -!122 = !DILocation(line: 112, column: 9, scope: !123, inlinedAt: !117) -!123 = distinct !DILexicalBlock(scope: !107, file: !5, line: 112, column: 3) -!124 = !DILocalVariable(name: "asdf", scope: !125, file: !5, line: 51, type: !12, align: 8) -!125 = distinct !DILexicalBlock(scope: !103, file: !5, line: 50, column: 30) -!126 = !DILocation(line: 51, column: 11, scope: !125) -!127 = !DILocation(line: 52, column: 12, scope: !125) -!128 = !DILocation(line: 111, column: 21, scope: !129, inlinedAt: !117) -!129 = distinct !DILexicalBlock(scope: !107, file: !5, line: 111, column: 9) -!130 = !DILocation(line: 111, column: 9, scope: !129, inlinedAt: !117) -!131 = distinct !DISubprogram(name: "_$main", linkageName: "main", scope: !5, file: !5, line: 15, type: !132, scopeLine: 15, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition -!132 = !DISubroutineType(types: !133) -!133 = !{!13, !13, !134} -!134 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "char**", baseType: !41, size: 64, align: 64 -!135 = !DILocalVariable(name: ".anon", arg: 1, scope: !131, file: !5, line: 15, type: !13) -!136 = !DILocation(line: 15, column: 8, scope: !131) -!137 = !DILocalVariable(name: ".anon", arg: 2, scope: !131, file: !5, line: 15, type: !134) -!138 = !DILocalVariable(name: "list", scope: !139, file: !5, line: 45, type: !33, align: 8) -!141 = !DILocation(line: 45, column: 11, scope: !139, inlinedAt: !136) -!142 = !DILocalVariable(name: "list", scope: !143, file: !5, line: 24, type: !33, align: 8) -!144 = !DILocation(line: 24, column: 11, scope: !143, inlinedAt: !145) -!145 = !DILocation(line: 45, column: 18, scope: !139, inlinedAt: !136) -!146 = !DILocation(line: 24, column: 43, scope: !143, inlinedAt: !145) -!147 = !DILocation(line: 226, column: 55, scope: !148, inlinedAt: !150) -!150 = !DILocation(line: 216, column: 9, scope: !151, inlinedAt: !152) -!151 = distinct !DISubprogram(name: "alloc_array", linkageName: "alloc_array", scope: !149, file: !149, line: 214, scopeLine: 214, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition -!152 = !DILocation(line: 649, column: 20, scope: !153, inlinedAt: !154) -!153 = distinct !DISubprogram(name: "alloc_array", linkageName: "alloc_array", scope: !73, file: !73, line: 647, scopeLine: 647, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition -!154 = !DILocation(line: 24, column: 23, scope: !143, inlinedAt: !145) -!155 = !DILocation(line: 226, column: 40, scope: !148, inlinedAt: !150) -!156 = !DILocation(line: 62, column: 7, scope: !157, inlinedAt: !158) -!157 = distinct !DISubprogram(name: "malloc_try", linkageName: "malloc_try", scope: !149, file: !149, line: 60, scopeLine: 60, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition -!158 = !DILocation(line: 226, column: 10, scope: !148, inlinedAt: !150) -!159 = !DILocation(line: 62, column: 20, scope: !157, inlinedAt: !158) -!160 = !DILocation(line: 28, column: 71, scope: !157, inlinedAt: !158) -!161 = !DILocation(line: 68, column: 10, scope: !157, inlinedAt: !158) -!162 = !DILocation(line: 226, column: 67, scope: !148, inlinedAt: !150) -!163 = !DILocalVariable(name: "i", scope: !164, file: !5, line: 25, type: !13, align: 4) -!164 = distinct !DILexicalBlock(scope: !143, file: !140, line: 25, column: 2) -!165 = !DILocation(line: 25, column: 11, scope: !164, inlinedAt: !145) -!166 = !DILocation(line: 25, column: 15, scope: !164, inlinedAt: !145) -!167 = !DILocation(line: 25, column: 18, scope: !164, inlinedAt: !145) -!168 = !DILocation(line: 25, column: 22, scope: !164, inlinedAt: !145) -!169 = !DILocalVariable(name: "arg", scope: !170, file: !5, line: 27, type: !41, align: 8) -!170 = distinct !DILexicalBlock(scope: !164, file: !140, line: 26, column: 2) -!171 = !DILocation(line: 27, column: 9, scope: !170, inlinedAt: !145) -!172 = !DILocation(line: 27, column: 15, scope: !170, inlinedAt: !145) -!173 = !DILocation(line: 27, column: 20, scope: !170, inlinedAt: !145) -!174 = !DILocalVariable(name: "len", scope: !170, file: !5, line: 28, type: !44, align: 8) -!175 = !DILocation(line: 28, column: 7, scope: !170, inlinedAt: !145) -!176 = !DILocation(line: 28, column: 13, scope: !170, inlinedAt: !145) -!177 = !DILocation(line: 29, column: 3, scope: !170, inlinedAt: !145) -!178 = !DILocation(line: 29, column: 8, scope: !170, inlinedAt: !145) -!179 = !DILocation(line: 29, column: 21, scope: !170, inlinedAt: !145) -!180 = !DILocalVariable(name: "len", scope: !181, file: !5, line: 5, type: !44, align: 8) -!181 = distinct !DISubprogram(name: "_strlen", linkageName: "_strlen", scope: !140, file: !140, line: 3, scopeLine: 3, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition -!182 = !DILocation(line: 5, column: 6, scope: !181, inlinedAt: !183) -!183 = !DILocation(line: 29, column: 26, scope: !170, inlinedAt: !145) -!184 = !DILocation(line: 5, column: 12, scope: !181, inlinedAt: !183) -!185 = !DILocation(line: 6, column: 2, scope: !181, inlinedAt: !183) -!186 = !DILocation(line: 6, column: 9, scope: !187, inlinedAt: !183) -!187 = distinct !DILexicalBlock(scope: !181, file: !140, line: 6, column: 2) -!188 = !DILocation(line: 6, column: 13, scope: !187, inlinedAt: !183) -!189 = !DILocation(line: 6, column: 19, scope: !187, inlinedAt: !183) -!190 = !DILocation(line: 7, column: 9, scope: !181, inlinedAt: !183) -!191 = !DILocation(line: 25, column: 28, scope: !164, inlinedAt: !145) -!192 = !DILocation(line: 31, column: 9, scope: !143, inlinedAt: !145) -!193 = !DILocation(line: 47, column: 12, scope: !139, inlinedAt: !136) -!194 = !DILocation(line: 47, column: 9, scope: !139, inlinedAt: !136) -!195 = !DILocation(line: 46, column: 13, scope: !196, inlinedAt: !136) -!196 = distinct !DILexicalBlock(scope: !139, file: !140, line: 46, column: 8) -!197 = !DILocation(line: 46, column: 8, scope: !196, inlinedAt: !136) \ No newline at end of file +!55 = !DILocation(line: 33, column: 70, scope: !56, inlinedAt: !57) +!56 = distinct !DISubprogram(name: "[DEFAULT INIT]", linkageName: "[DEFAULT INIT]", scope: !5, file: !5, line: 33, scopeLine: 33, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition +!57 = !DILocation(line: 18, column: 15, scope: !30) +!58 = !DILocation(line: 21, column: 8, scope: !30) +!59 = !DILocation(line: 21, column: 42, scope: !30) +!60 = !DILocation(line: 21, column: 3, scope: !30) +!61 = !DILocation(line: 23, column: 3, scope: !30) +!62 = !DILocation(line: 24, column: 10, scope: !30) +!63 = distinct !DISubprogram(name: "create_foo", linkageName: "test.create_foo", scope: !5, file: !5, line: 33, type: !64, scopeLine: 33, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition +!64 = !DISubroutineType(types: !65) +!65 = !{!49, !8, !44, !37} +!66 = !DILocalVariable(name: "attach", arg: 1, scope: !63, file: !5, line: 33, type: !8) +!67 = !DILocation(line: 33, column: 31, scope: !63) +!68 = !DILocalVariable(name: "flags", arg: 2, scope: !63, file: !5, line: 33, type: !44) +!69 = !DILocation(line: 33, column: 49, scope: !63) +!70 = !DILocalVariable(name: "name", arg: 3, scope: !63, file: !5, line: 33, type: !37) +!71 = !DILocation(line: 33, column: 63, scope: !63) +!72 = !DILocation(line: 564, column: 10, scope: !73, inlinedAt: !75) +!73 = distinct !DISubprogram(name: "new", linkageName: "new", scope: !74, file: !74, line: 561, scopeLine: 561, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition + +!75 = !DILocation(line: 34, column: 15, scope: !63) +!76 = distinct !DISubprogram(name: "test", linkageName: "test.test", scope: !5, file: !5, line: 41, type: !77, scopeLine: 41, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition +!77 = !DISubroutineType(types: !78) +!78 = !{!49, !79} +!79 = !DIDerivedType(tag: DW_TAG_typedef, name: "Color", scope: !5, file: !5, line: 79, baseType: !80, align: 16) +!80 = !DICompositeType(tag: DW_TAG_array_type, baseType: !81, size: 128, align: 32, flags: DIFlagVector, elements: !82) +!81 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float) +!82 = !{!83} +!83 = !DISubrange(count: 4, lowerBound: 0) +!84 = !DILocalVariable(name: "color", arg: 1, scope: !76, file: !5, line: 41, type: !79) +!85 = !DILocation(line: 41, column: 20, scope: !76) +!86 = !DILocation(line: 151, column: 20, scope: !87, inlinedAt: !89) +!87 = distinct !DISubprogram(name: "printn", linkageName: "printn", scope: !88, file: !88, line: 149, scopeLine: 149, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition +!88 = !DIFile(filename: +!89 = !DILocation(line: 42, column: 7, scope: !76) +!90 = !DILocalVariable(name: "len", scope: !91, file: !5, line: 133, type: !44, align: 8) +!91 = distinct !DISubprogram(name: "fprintn", linkageName: "fprintn", scope: !88, file: !88, line: 131, scopeLine: 131, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, +!92 = !DILocation(line: 133, column: 6, scope: !91, inlinedAt: !93) +!93 = !DILocation(line: 151, column: 2, scope: !87, inlinedAt: !89) +!94 = !DILocation(line: 106, column: 19, scope: !95, inlinedAt: !96) +!95 = distinct !DISubprogram(name: "fprint", linkageName: "fprint", scope: !88, file: !88, line: 92, scopeLine: 92, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition +!96 = !DILocation(line: 133, column: 12, scope: !91, inlinedAt: !93) +!97 = !DILocation(line: 106, column: 30, scope: !95, inlinedAt: !96) +!98 = !DILocation(line: 106, column: 11, scope: !95, inlinedAt: !96) +!99 = !DILocation(line: 134, column: 17, scope: !91, inlinedAt: !93) +!100 = !DILocation(line: 134, column: 2, scope: !91, inlinedAt: !93) +!101 = !DILocation(line: 139, column: 4, scope: !91, inlinedAt: !93) +!102 = !DILocation(line: 141, column: 9, scope: !91, inlinedAt: !93) +!103 = !DILocation(line: 45, column: 10, scope: !76) +!104 = distinct !DISubprogram(name: "test2", linkageName: "test.test2", scope: !5, file: !5, line: 48, type: !105, scopeLine: 48, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition +!105 = !DISubroutineType(types: !106) +!106 = !{!12} +!107 = !DILocalVariable(name: "scratch", scope: !108, file: !5, line: 110, type: !109, align: 8) +!108 = distinct !DISubprogram(name: "@scratch", linkageName: "@scratch", scope: !5, file: !5, line: 109, scopeLine: 109, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: +!109 = !DICompositeType(tag: DW_TAG_structure_type, name: "Arena_Cursor", scope: !5, file: !5, line: 88, size: 128, align: 64, elements: !110, identifier: "foo.Arena_Cursor") +!110 = !{!111, !116} +!111 = !DIDerivedType(tag: DW_TAG_member, name: "arena", scope: !109, file: !5, line: 89, baseType: !112, size: 64, align: 64) +!112 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "Arena*", baseType: !113, size: 64, align: 64, dwarfAddressSpace: 0) +!113 = !DICompositeType(tag: DW_TAG_structure_type, name: "Arena", scope: !5, file: !5, line: 84, size: 64, align: 64, elements: !114, identifier: "foo.Arena") +!114 = !{!115} +!115 = !DIDerivedType(tag: DW_TAG_member, name: "cursor", scope: !113, file: !5, line: 85, baseType: !44, size: 64, align: 64) +!116 = !DIDerivedType(tag: DW_TAG_member, name: "cursor", scope: !109, file: !5, line: 90, baseType: !44, size: 64, align: 64, offset: 64) +!117 = !DILocation(line: 110, column: 16, scope: !108, inlinedAt: !118) +!118 = !DILocation(line: 50, column: 3, scope: !104) +!119 = !DILocation(line: 110, column: 40, scope: !108, inlinedAt: !118) +!120 = !DILocation(line: 110, column: 26, scope: !108, inlinedAt: !118) +!121 = !DILocalVariable(name: "scratch", scope: !104, file: !5, line: 50, type: !112, align: 8) +!122 = !DILocation(line: 50, column: 21, scope: !104) +!123 = !DILocation(line: 112, column: 9, scope: !124, inlinedAt: !118) +!124 = distinct !DILexicalBlock(scope: !108, file: !5, line: 112, column: 3) +!125 = !DILocalVariable(name: "asdf", scope: !126, file: !5, line: 51, type: !12, align: 8) +!126 = distinct !DILexicalBlock(scope: !104, file: !5, line: 50, column: 30) +!127 = !DILocation(line: 51, column: 11, scope: !126) +!128 = !DILocation(line: 52, column: 12, scope: !126) +!129 = !DILocation(line: 111, column: 21, scope: !130, inlinedAt: !118) +!130 = distinct !DILexicalBlock(scope: !108, file: !5, line: 111, column: 9) +!131 = !DILocation(line: 111, column: 9, scope: !130, inlinedAt: !118) +!132 = distinct !DISubprogram(name: "_$main", linkageName: "main", scope: !5, file: !5, line: 15, type: !133, scopeLine: 15, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !4, retainedNodes: !19) +!133 = !DISubroutineType(types: !134) +!134 = !{!13, !13, !135} +!135 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "char**", baseType: !41, size: 64, align: 64 +!136 = !DILocalVariable(name: ".anon", arg: 1, scope: !132, file: !5, line: 15, type: !13) +!137 = !DILocation(line: 15, column: 8, scope: !132) +!138 = !DILocalVariable(name: ".anon", arg: 2, scope: !132, file: !5, line: 15, type: !135) +!139 = !DILocalVariable(name: "list", scope: !140, file: !5, line: 45, type: !33, align: 8) +!142 = !DILocation(line: 45, column: 11, scope: !140, inlinedAt: !137) +!143 = !DILocalVariable(name: "list", scope: !144, file: !5, line: 24, type: !33, align: 8) +!145 = !DILocation(line: 24, column: 11, scope: !144, inlinedAt: !146) +!146 = !DILocation(line: 45, column: 18, scope: !140, inlinedAt: !137) +!147 = !DILocation(line: 24, column: 43, scope: !144, inlinedAt: !146) +!148 = !DILocation(line: 226, column: 55, scope: !149, inlinedAt: !151) +151 = !DILocation(line: 216, column: 9, scope: !152, inlinedAt: !153) +!152 = distinct !DISubprogram(name: "alloc_array", linkageName: "alloc_array", scope: !150, file: !150, line: 214, scopeLine: 214, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition +!153 = !DILocation(line: 649, column: 20, scope: !154, inlinedAt: !155) +!154 = distinct !DISubprogram(name: "alloc_array", linkageName: "alloc_array", scope: !74, file: !74, line: 647, scopeLine: 647, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition +!156 = !DILocation(line: 226, column: 40, scope: !149, inlinedAt: !151) +!157 = !DILocation(line: 62, column: 7, scope: !158, inlinedAt: !159) +!158 = distinct !DISubprogram(name: "malloc_try", linkageName: "malloc_try", scope: !150, file: !150, line: 60, scopeLine: 60, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition +!160 = !DILocation(line: 62, column: 20, scope: !158, inlinedAt: !159) +!161 = !DILocation(line: 28, column: 71, scope: !162, inlinedAt: !163) +!162 = distinct !DISubprogram(name: "[DEFAULT INIT]", linkageName: "[DEFAULT INIT]", scope: !150, file: !150, line: 28, scopeLine: 28, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !4 +!163 = !DILocation(line: 68, column: 10, scope: !158, inlinedAt: !159) +!164 = !DILocation(line: 226, column: 67, scope: !149, inlinedAt: !151) +!165 = !DILocalVariable(name: "i", scope: !166, file: !5, line: 25, type: !13, align: 4) +!166 = distinct !DILexicalBlock(scope: !144, file: !141, line: 25, column: 2) +!167 = !DILocation(line: 25, column: 11, scope: !166, inlinedAt: !146) +!168 = !DILocation(line: 25, column: 15, scope: !166, inlinedAt: !146) +!169 = !DILocation(line: 25, column: 18, scope: !166, inlinedAt: !146) +!170 = !DILocation(line: 25, column: 22, scope: !166, inlinedAt: !146) +!171 = !DILocalVariable(name: "arg", scope: !172, file: !5, line: 27, type: !41, align: 8) +!172 = distinct !DILexicalBlock(scope: !166, file: !141, line: 26, column: 2) +!173 = !DILocation(line: 27, column: 9, scope: !172, inlinedAt: !146) +!174 = !DILocation(line: 27, column: 15, scope: !172, inlinedAt: !146) +!175 = !DILocation(line: 27, column: 20, scope: !172, inlinedAt: !146) +!176 = !DILocalVariable(name: "len", scope: !172, file: !5, line: 28, type: !44, align: 8) +!177 = !DILocation(line: 28, column: 7, scope: !172, inlinedAt: !146) +!178 = !DILocation(line: 28, column: 13, scope: !172, inlinedAt: !146) +!179 = !DILocation(line: 29, column: 3, scope: !172, inlinedAt: !146) +!180 = !DILocation(line: 29, column: 8, scope: !172, inlinedAt: !146) +!181 = !DILocation(line: 29, column: 21, scope: !172, inlinedAt: !146) +!182 = !DILocalVariable(name: "len", scope: !183, file: !5, line: 5, type: !44, align: 8) +!183 = distinct !DISubprogram(name: "_strlen", linkageName: "_strlen", scope: !141, file: !141, line: 3, scopeLine: 3, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition +!184 = !DILocation(line: 5, column: 6, scope: !183, inlinedAt: !185) +!185 = !DILocation(line: 29, column: 26, scope: !172, inlinedAt: !146) +!186 = !DILocation(line: 5, column: 12, scope: !183, inlinedAt: !185) +!187 = !DILocation(line: 6, column: 2, scope: !183, inlinedAt: !185) +!188 = !DILocation(line: 6, column: 9, scope: !189, inlinedAt: !185) +!189 = distinct !DILexicalBlock(scope: !183, file: !141, line: 6, column: 2) +!190 = !DILocation(line: 6, column: 13, scope: !189, inlinedAt: !185) +!191 = !DILocation(line: 6, column: 19, scope: !189, inlinedAt: !185) +!192 = !DILocation(line: 7, column: 9, scope: !183, inlinedAt: !185) +!193 = !DILocation(line: 25, column: 28, scope: !166, inlinedAt: !146) +!194 = !DILocation(line: 31, column: 9, scope: !144, inlinedAt: !146) +!195 = !DILocation(line: 47, column: 12, scope: !140, inlinedAt: !137) +!196 = !DILocation(line: 47, column: 9, scope: !140, inlinedAt: !137) +!197 = !DILocation(line: 46, column: 13, scope: !198, inlinedAt: !137) +!198 = distinct !DILexicalBlock(scope: !140, file: !141, line: 46, column: 8) +!199 = !DILocation(line: 46, column: 8, scope: !198, inlinedAt: !137) \ No newline at end of file