Refactor and unify linker visibility and fix issues with weak stdlib.

This commit is contained in:
Christoffer Lerno
2024-10-11 21:45:44 +02:00
parent 1b471283c9
commit cba25710fe
18 changed files with 257 additions and 141 deletions

View File

@@ -20,22 +20,21 @@ fn void main() {
/* #expect: test.ll
@.taddr = private global i32 3, align 4
@.taddr = private unnamed_addr global i32 3, align 4
@test.foo = local_unnamed_addr global ptr @.taddr, align 8
@test.a = global i32 0, align 4
@test.c = local_unnamed_addr global i32 0, align 4
@test.d = local_unnamed_addr global i32 0, align 4
@test.abc = local_unnamed_addr global [3 x i32] zeroinitializer, align 4
@test.b = local_unnamed_addr global ptr getelementptr
@test.bf = local_unnamed_addr global ptr getelementptr
@test.b = local_unnamed_addr global ptr getelementptr (i8, ptr @test.a, i64 28), align 8
@test.bf = local_unnamed_addr global ptr getelementptr (i8, ptr @test.abc, i64 16), align 8
@test.bf2 = local_unnamed_addr global ptr getelementptr inbounds (i8, ptr @test.abc, i64 8), align 8
@test.bf3 = local_unnamed_addr global ptr getelementptr
@.taddr.9 = private global i32 42, align 4
@.taddr.10 = private global i8 99, align 1
@.taddr.11 = private global %"char[]" { ptr @.str, i64 3 }, align 8
@test.bf3 = local_unnamed_addr global ptr getelementptr (i8, ptr @test.abc, i64 16), align 8
@.taddr.9 = private unnamed_addr global i32 42, align 4
@.taddr.10 = private unnamed_addr global i8 99, align 1
@.taddr.11 = private unnamed_addr global %"char[]" { ptr @.str, i64 3 }, align 8
@main.x = internal unnamed_addr global [3 x %any] [%any { ptr @.taddr.9, i64 ptrtoint (ptr @"$ct.int" to i64) }, %any { ptr @.taddr.10, i64 ptrtoint (ptr @"$ct.char" to i64) }, %any { ptr @.taddr.11, i64 ptrtoint (ptr @"$ct.String" to i64) }], align 16
; Function Attrs:
define void @test.main() #0 {
entry:
%bf34 = alloca ptr, align 8

View File

@@ -266,39 +266,51 @@ noerr_block22: ; preds = %after_check20
assign_optional25: ; preds = %noerr_block22
store i64 %14, ptr %error_var23, align 8
br label %guard_block27
after_check26: ; preds = %noerr_block22
br label %noerr_block28
guard_block27: ; preds = %assign_optional25
br label %voiderr36
noerr_block28: ; preds = %after_check26
%16 = call i64 @std.io.File.flush(ptr %10)
%not_err30 = icmp eq i64 %16, 0
%17 = call i1 @llvm.expect.i1(i1 %not_err30, i1 true)
br i1 %17, label %after_check32, label %assign_optional31
assign_optional31: ; preds = %noerr_block28
store i64 %16, ptr %error_var29, align 8
br label %guard_block33
after_check32: ; preds = %noerr_block28
br label %noerr_block34
guard_block33: ; preds = %assign_optional31
br label %voiderr36
noerr_block34: ; preds = %after_check32
%18 = load i64, ptr %len14, align 8
%add35 = add i64 %18, 1
br label %voiderr36
voiderr36: ; preds = %noerr_block34, %guard_block33, %guard_block27, %guard_block21
%19 = call ptr @std.io.stdout()
%20 = call i64 @std.io.File.write(ptr %retparam40, ptr %19, ptr @.str.11, i64 6)
%not_err41 = icmp eq i64 %20, 0
%21 = call i1 @llvm.expect.i1(i1 %not_err41, i1 true)
br i1 %21, label %after_check43, label %assign_optional42
assign_optional42: ; preds = %voiderr36
store i64 %20, ptr %error_var38, align 8
br label %guard_block44
after_check43: ; preds = %voiderr36
br label %noerr_block45
guard_block44: ; preds = %assign_optional42
br label %voiderr59
noerr_block45: ; preds = %after_check43
%22 = load i64, ptr %retparam40, align 8
store i64 %22, ptr %len37, align 8
@@ -306,42 +318,55 @@ noerr_block45: ; preds = %after_check43
%not_err47 = icmp eq i64 %23, 0
%24 = call i1 @llvm.expect.i1(i1 %not_err47, i1 true)
br i1 %24, label %after_check49, label %assign_optional48
assign_optional48: ; preds = %noerr_block45
store i64 %23, ptr %error_var46, align 8
br label %guard_block50
after_check49: ; preds = %noerr_block45
br label %noerr_block51
guard_block50: ; preds = %assign_optional48
br label %voiderr59
noerr_block51: ; preds = %after_check49
%25 = call i64 @std.io.File.flush(ptr %19)
%not_err53 = icmp eq i64 %25, 0
%26 = call i1 @llvm.expect.i1(i1 %not_err53, i1 true)
br i1 %26, label %after_check55, label %assign_optional54
assign_optional54: ; preds = %noerr_block51
store i64 %25, ptr %error_var52, align 8
br label %guard_block56
after_check55: ; preds = %noerr_block51
br label %noerr_block57
guard_block56: ; preds = %assign_optional54
br label %voiderr59
noerr_block57: ; preds = %after_check55
%27 = load i64, ptr %len37, align 8
%add58 = add i64 %27, 1
br label %voiderr59
voiderr59: ; preds = %noerr_block57, %guard_block56, %guard_block50, %guard_block44
%28 = call ptr @std.io.stdout()
%29 = call i64 @std.io.File.write(ptr %retparam63, ptr %28, ptr @.str.12, i64 6)
%not_err64 = icmp eq i64 %29, 0
%30 = call i1 @llvm.expect.i1(i1 %not_err64, i1 true)
br i1 %30, label %after_check66, label %assign_optional65
assign_optional65: ; preds = %voiderr59
store i64 %29, ptr %error_var61, align 8
br label %guard_block67
after_check66: ; preds = %voiderr59
br label %noerr_block68
guard_block67: ; preds = %assign_optional65
br label %voiderr82
noerr_block68: ; preds = %after_check66
%31 = load i64, ptr %retparam63, align 8
store i64 %31, ptr %len60, align 8
@@ -349,42 +374,55 @@ noerr_block68: ; preds = %after_check66
%not_err70 = icmp eq i64 %32, 0
%33 = call i1 @llvm.expect.i1(i1 %not_err70, i1 true)
br i1 %33, label %after_check72, label %assign_optional71
assign_optional71: ; preds = %noerr_block68
store i64 %32, ptr %error_var69, align 8
br label %guard_block73
after_check72: ; preds = %noerr_block68
br label %noerr_block74
guard_block73: ; preds = %assign_optional71
br label %voiderr82
noerr_block74: ; preds = %after_check72
%34 = call i64 @std.io.File.flush(ptr %28)
%not_err76 = icmp eq i64 %34, 0
%35 = call i1 @llvm.expect.i1(i1 %not_err76, i1 true)
br i1 %35, label %after_check78, label %assign_optional77
assign_optional77: ; preds = %noerr_block74
store i64 %34, ptr %error_var75, align 8
br label %guard_block79
after_check78: ; preds = %noerr_block74
br label %noerr_block80
guard_block79: ; preds = %assign_optional77
br label %voiderr82
noerr_block80: ; preds = %after_check78
%36 = load i64, ptr %len60, align 8
%add81 = add i64 %36, 1
br label %voiderr82
voiderr82: ; preds = %noerr_block80, %guard_block79, %guard_block73, %guard_block67
%37 = call ptr @std.io.stdout()
%38 = call i64 @std.io.File.write(ptr %retparam86, ptr %37, ptr @.str.13, i64 5)
%not_err87 = icmp eq i64 %38, 0
%39 = call i1 @llvm.expect.i1(i1 %not_err87, i1 true)
br i1 %39, label %after_check89, label %assign_optional88
assign_optional88: ; preds = %voiderr82
store i64 %38, ptr %error_var84, align 8
br label %guard_block90
after_check89: ; preds = %voiderr82
br label %noerr_block91
guard_block90: ; preds = %assign_optional88
br label %voiderr105
noerr_block91: ; preds = %after_check89
%40 = load i64, ptr %retparam86, align 8
store i64 %40, ptr %len83, align 8
@@ -392,42 +430,55 @@ noerr_block91: ; preds = %after_check89
%not_err93 = icmp eq i64 %41, 0
%42 = call i1 @llvm.expect.i1(i1 %not_err93, i1 true)
br i1 %42, label %after_check95, label %assign_optional94
assign_optional94: ; preds = %noerr_block91
store i64 %41, ptr %error_var92, align 8
br label %guard_block96
after_check95: ; preds = %noerr_block91
br label %noerr_block97
guard_block96: ; preds = %assign_optional94
br label %voiderr105
noerr_block97: ; preds = %after_check95
%43 = call i64 @std.io.File.flush(ptr %37)
%not_err99 = icmp eq i64 %43, 0
%44 = call i1 @llvm.expect.i1(i1 %not_err99, i1 true)
br i1 %44, label %after_check101, label %assign_optional100
assign_optional100: ; preds = %noerr_block97
store i64 %43, ptr %error_var98, align 8
br label %guard_block102
after_check101: ; preds = %noerr_block97
br label %noerr_block103
guard_block102: ; preds = %assign_optional100
br label %voiderr105
noerr_block103: ; preds = %after_check101
%45 = load i64, ptr %len83, align 8
%add104 = add i64 %45, 1
br label %voiderr105
voiderr105: ; preds = %noerr_block103, %guard_block102, %guard_block96, %guard_block90
%46 = call ptr @std.io.stdout()
%47 = call i64 @std.io.File.write(ptr %retparam109, ptr %46, ptr @.str.14, i64 4)
%not_err110 = icmp eq i64 %47, 0
%48 = call i1 @llvm.expect.i1(i1 %not_err110, i1 true)
br i1 %48, label %after_check112, label %assign_optional111
assign_optional111: ; preds = %voiderr105
store i64 %47, ptr %error_var107, align 8
br label %guard_block113
after_check112: ; preds = %voiderr105
br label %noerr_block114
guard_block113: ; preds = %assign_optional111
br label %voiderr128
noerr_block114: ; preds = %after_check112
%49 = load i64, ptr %retparam109, align 8
store i64 %49, ptr %len106, align 8
@@ -435,42 +486,55 @@ noerr_block114: ; preds = %after_check112
%not_err116 = icmp eq i64 %50, 0
%51 = call i1 @llvm.expect.i1(i1 %not_err116, i1 true)
br i1 %51, label %after_check118, label %assign_optional117
assign_optional117: ; preds = %noerr_block114
store i64 %50, ptr %error_var115, align 8
br label %guard_block119
after_check118: ; preds = %noerr_block114
br label %noerr_block120
guard_block119: ; preds = %assign_optional117
br label %voiderr128
noerr_block120: ; preds = %after_check118
%52 = call i64 @std.io.File.flush(ptr %46)
%not_err122 = icmp eq i64 %52, 0
%53 = call i1 @llvm.expect.i1(i1 %not_err122, i1 true)
br i1 %53, label %after_check124, label %assign_optional123
assign_optional123: ; preds = %noerr_block120
store i64 %52, ptr %error_var121, align 8
br label %guard_block125
after_check124: ; preds = %noerr_block120
br label %noerr_block126
guard_block125: ; preds = %assign_optional123
br label %voiderr128
noerr_block126: ; preds = %after_check124
%54 = load i64, ptr %len106, align 8
%add127 = add i64 %54, 1
br label %voiderr128
voiderr128: ; preds = %noerr_block126, %guard_block125, %guard_block119, %guard_block113
%55 = call ptr @std.io.stdout()
%56 = call i64 @std.io.File.write(ptr %retparam132, ptr %55, ptr @.str.15, i64 3)
%not_err133 = icmp eq i64 %56, 0
%57 = call i1 @llvm.expect.i1(i1 %not_err133, i1 true)
br i1 %57, label %after_check135, label %assign_optional134
assign_optional134: ; preds = %voiderr128
store i64 %56, ptr %error_var130, align 8
br label %guard_block136
after_check135: ; preds = %voiderr128
br label %noerr_block137
guard_block136: ; preds = %assign_optional134
br label %voiderr151
noerr_block137: ; preds = %after_check135
%58 = load i64, ptr %retparam132, align 8
store i64 %58, ptr %len129, align 8
@@ -478,29 +542,38 @@ noerr_block137: ; preds = %after_check135
%not_err139 = icmp eq i64 %59, 0
%60 = call i1 @llvm.expect.i1(i1 %not_err139, i1 true)
br i1 %60, label %after_check141, label %assign_optional140
assign_optional140: ; preds = %noerr_block137
store i64 %59, ptr %error_var138, align 8
br label %guard_block142
after_check141: ; preds = %noerr_block137
br label %noerr_block143
guard_block142: ; preds = %assign_optional140
br label %voiderr151
noerr_block143: ; preds = %after_check141
%61 = call i64 @std.io.File.flush(ptr %55)
%not_err145 = icmp eq i64 %61, 0
%62 = call i1 @llvm.expect.i1(i1 %not_err145, i1 true)
br i1 %62, label %after_check147, label %assign_optional146
assign_optional146: ; preds = %noerr_block143
store i64 %61, ptr %error_var144, align 8
br label %guard_block148
after_check147: ; preds = %noerr_block143
br label %noerr_block149
guard_block148: ; preds = %assign_optional146
br label %voiderr151
noerr_block149: ; preds = %after_check147
%63 = load i64, ptr %len129, align 8
%add150 = add i64 %63, 1
br label %voiderr151
voiderr151: ; preds = %noerr_block149, %guard_block148, %guard_block142, %guard_block136
store %"char[]" { ptr @.str.17, i64 3 }, ptr %taddr, align 8
%64 = insertvalue %any undef, ptr %taddr, 0
@@ -619,6 +692,7 @@ voiderr151: ; preds = %noerr_block149, %gu
%122 = call i64 @std.io.printfn(ptr %retparam231, ptr @.str.47, i64 6, ptr %varargslots227, i64 2)
ret void
}
; Function Attrs: nounwind uwtable
define void @test.main() #0 {
entry:
@@ -761,6 +835,7 @@ entry:
call void @test.test(i32 10)
ret void
}
; Function Attrs: nounwind uwtable
define i32 @main(i32 %0, ptr %1) #0 {
entry:
@@ -768,17 +843,12 @@ entry:
ret i32 0
}
; Function Attrs:
declare ptr @std.io.stdout() #0
declare extern_weak ptr @std.io.stdout() #0
; Function Attrs:
declare i64 @std.io.File.write(ptr, ptr, ptr, i64) #0
declare extern_weak i64 @std.io.File.write(ptr, ptr, ptr, i64) #0
; Function Attrs:
declare i64 @std.io.File.write_byte(ptr, i8 zeroext) #0
declare extern_weak i64 @std.io.File.write_byte(ptr, i8 zeroext) #0
; Function Attrs:
declare i64 @std.io.File.flush(ptr) #0
declare extern_weak i64 @std.io.File.flush(ptr) #0
; Function Attrs:
declare i64 @std.io.printfn(ptr, ptr, i64, ptr, i64) #0
declare extern_weak i64 @std.io.printfn(ptr, ptr, i64, ptr, i64) #0

View File

@@ -85,7 +85,7 @@ entry:
ret i32 0, !dbg !50
}
declare i64 @std.io.printfn(ptr, ptr, i64, ptr, i64) #0
declare extern_weak i64 @std.io.printfn(ptr, ptr, i64, ptr, i64) #0
declare i1 @llvm.expect.i1(i1, i1)

View File

@@ -548,16 +548,11 @@ expr_block.exit28: ; preds = %loop.exit26
declare { i32, ptr } @attach.to_scope() #0
declare ptr @std.core.mem.calloc(i64) #0
declare ptr @std.io.stdout() #0
declare i64 @std.io.fprintf(ptr, i64, ptr, ptr, i64, ptr byval(%"any[]") align 8) #0
declare i64 @std.io.File.write_byte(ptr, i8 zeroext) #0
declare i64 @std.io.File.flush(ptr) #0
declare extern_weak ptr @std.core.mem.calloc(i64) #0
declare extern_weak ptr @std.io.stdout() #0
declare extern_weak i64 @std.io.fprintf(ptr, i64, ptr, ptr, i64, ptr byval(%"any[]") align 8) #0
declare extern_weak i64 @std.io.File.write_byte(ptr, i8 zeroext) #0
declare extern_weak i64 @std.io.File.flush(ptr) #0
declare { ptr, i64 } @arena_scratch_begin(ptr, i64) #0
declare void @arena_scratch_end(ptr, i64) #0

View File

@@ -41,16 +41,20 @@ fn void main()
%.introspect = type { i8, i64, ptr, i64, i64, i64, [0 x i64] }
%any = type { ptr, i64 }
$.dyn_search = comdat any
$"$ct.inherit.Test" = comdat any
$"$sel.tesT" = comdat any
$"$sel.hello" = comdat any
@"$ct.inherit.Test" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8
@"$sel.tesT" = linkonce_odr constant [5 x i8] c"tesT\00", comdat, align 1
@.panic_msg = internal constant [42 x i8] c"No method 'tesT' could be found on target\00", align 1
@.func = internal constant [5 x i8] c"main\00", align 1
@std.core.builtin.panic = external global ptr, align 8
@std.core.builtin.panic = extern_weak global ptr, align 8
@"$ct.dyn.inherit.Test.tesT" = global { ptr, ptr, ptr } { ptr @inherit.Test.tesT, ptr @"$sel.tesT", ptr null }, align 8
@"$ct.dyn.inherit.Test.hello" = global { ptr, ptr, ptr } { ptr @inherit.Test.hello, ptr @"$sel.hello", ptr null }, align 8
@"$sel.hello" = linkonce_odr constant [6 x i8] c"hello\00", comdat, align 1
@@ -61,13 +65,11 @@ entry:
ret void
}
; Function Attrs:
define void @inherit.Test.hello(ptr %0) #0 {
entry:
ret void
}
; Function Attrs:
define void @inherit.main() #0 {
entry:
%z = alloca %any, align 8
@@ -88,6 +90,7 @@ entry:
%type = load ptr, ptr %.cachedtype, align 8
%5 = icmp eq ptr %4, %type
br i1 %5, label %cache_hit, label %cache_miss
cache_miss: ; preds = %entry
%ptradd1 = getelementptr inbounds i8, ptr %4, i64 16
%6 = load ptr, ptr %ptradd1, align 8
@@ -95,17 +98,21 @@ cache_miss: ; preds = %entry
store ptr %7, ptr %.inlinecache, align 8
store ptr %4, ptr %.cachedtype, align 8
br label %8
cache_hit: ; preds = %entry
%cache_hit_fn = load ptr, ptr %.inlinecache, align 8
br label %8
8: ; preds = %cache_hit, %cache_miss
%fn_phi = phi ptr [ %cache_hit_fn, %cache_hit ], [ %7, %cache_miss ]
%9 = icmp eq ptr %fn_phi, null
br i1 %9, label %missing_function, label %match
missing_function: ; preds = %8
%10 = load ptr, ptr @std.core.builtin.panic, align 8
call void %10(ptr @.panic_msg, i64 41, ptr @.file
unreachable
match: ; preds = %8
%11 = load ptr, ptr %z, align 8
call void %fn_phi(ptr %11)
@@ -117,6 +124,7 @@ match: ; preds = %8
%type5 = load ptr, ptr %.cachedtype4, align 8
%15 = icmp eq ptr %14, %type5
br i1 %15, label %cache_hit8, label %cache_miss6
cache_miss6: ; preds = %match
%ptradd7 = getelementptr inbounds i8, ptr %14, i64 16
%16 = load ptr, ptr %ptradd7, align 8
@@ -124,17 +132,21 @@ cache_miss6: ; preds = %match
store ptr %17, ptr %.inlinecache3, align 8
store ptr %14, ptr %.cachedtype4, align 8
br label %18
cache_hit8: ; preds = %match
%cache_hit_fn9 = load ptr, ptr %.inlinecache3, align 8
br label %18
18: ; preds = %cache_hit8, %cache_miss6
%fn_phi10 = phi ptr [ %cache_hit_fn9, %cache_hit8 ], [ %17, %cache_miss6 ]
%19 = icmp eq ptr %fn_phi10, null
br i1 %19, label %missing_function11, label %match12
missing_function11: ; preds = %18
%20 = load ptr, ptr @std.core.builtin.panic, align 8
call void %20(ptr @.panic_msg, i64 41, ptr @.file
unreachable
match12: ; preds = %18
%21 = load ptr, ptr %w, align 8
call void %fn_phi10(ptr %21)
@@ -149,47 +161,59 @@ entry:
define weak_odr ptr @.dyn_search(ptr %0, ptr %1) unnamed_addr comdat {
entry:
br label %check
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
%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
%9 = load ptr, ptr %8, align 8
br label %check
}
define internal void @.c3_dynamic_register() align 8 {
entry:
br label %dtable_check
dtable_check: ; preds = %dtable_next, %entry
%dtable_ref = phi ptr [ getelementptr inbounds
%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
dtable_next: ; preds = %dtable_check
%next_dtable_ref = getelementptr inbounds
br label %dtable_check
dtable_found: ; preds = %dtable_check
store ptr @"$ct.dyn.inherit.Test.tesT", ptr %dtable_ref, align 8
br label %dtable_check1
dtable_check1: ; preds = %dtable_next4, %dtable_found
%dtable_ref2 = phi ptr [ getelementptr inbounds
%dtable_ptr3 = load ptr, ptr %dtable_ref2, align 8
%1 = icmp eq ptr %dtable_ptr3, null
br i1 %1, label %dtable_found6, label %dtable_next4
dtable_next4: ; preds = %dtable_check1
%next_dtable_ref5 = getelementptr inbounds
br label %dtable_check1
dtable_found6: ; preds = %dtable_check1
store ptr @"$ct.dyn.inherit.Test.hello", ptr %dtable_ref2, align 8
ret void

View File

@@ -41,27 +41,25 @@ fn void main()
%.introspect = type { i8, i64, ptr, i64, i64, i64, [0 x i64] }
%any = type { ptr, i64 }
@"$ct.inherit.Test" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8
@"$sel.tesT" = linkonce_odr constant [5 x i8] c"tesT\00", align 1
@.panic_msg = internal constant [42 x i8] c"No method 'tesT' could be found on target\00", align 1
@.func = internal constant [5 x i8] c"main\00", align 1
@std.core.builtin.panic = external global ptr, align 8
@std.core.builtin.panic = extern_weak global ptr, align 8
@"$sel.hello" = linkonce_odr constant [6 x i8] c"hello\00", align 1
@"$c3_dynamic" = internal global [2 x { ptr, ptr, i64 }] [{ ptr, ptr, i64 } { ptr @inherit.Test.tesT, ptr @"$sel.tesT", i64 ptrtoint (ptr @"$ct.inherit.Test" to i64) }, { ptr, ptr, i64 } { ptr @inherit.Test.hello, ptr @"$sel.hello", i64 ptrtoint (ptr @"$ct.inherit.Test" to i64) }], section "__DATA,__c3_dynamic", align 8
; Function Attrs:
define void @inherit.Test.tesT(ptr %0) #0 {
entry:
ret void
}
; Function Attrs:
define void @inherit.Test.hello(ptr %0) #0 {
entry:
ret void
}
; Function Attrs:
define void @inherit.main() #0 {
entry:
%z = alloca %any, align 8
@@ -82,6 +80,7 @@ entry:
%type = load ptr, ptr %.cachedtype, align 8
%5 = icmp eq ptr %4, %type
br i1 %5, label %cache_hit, label %cache_miss
cache_miss: ; preds = %entry
%ptradd1 = getelementptr inbounds i8, ptr %4, i64 16
%6 = load ptr, ptr %ptradd1, align 8
@@ -89,17 +88,21 @@ cache_miss: ; preds = %entry
store ptr %7, ptr %.inlinecache, align 8
store ptr %4, ptr %.cachedtype, align 8
br label %8
cache_hit: ; preds = %entry
%cache_hit_fn = load ptr, ptr %.inlinecache, align 8
br label %8
8: ; preds = %cache_hit, %cache_miss
%fn_phi = phi ptr [ %cache_hit_fn, %cache_hit ], [ %7, %cache_miss ]
%9 = icmp eq ptr %fn_phi, null
br i1 %9, label %missing_function, label %match
missing_function: ; preds = %8
%10 = load ptr, ptr @std.core.builtin.panic, align 8
call void %10(ptr @.panic_msg, i64 41,
unreachable
match: ; preds = %8
%11 = load ptr, ptr %z, align 8
call void %fn_phi(ptr %11)
@@ -111,6 +114,7 @@ match: ; preds = %8
%type5 = load ptr, ptr %.cachedtype4, align 8
%15 = icmp eq ptr %14, %type5
br i1 %15, label %cache_hit8, label %cache_miss6
cache_miss6: ; preds = %match
%ptradd7 = getelementptr inbounds i8, ptr %14, i64 16
%16 = load ptr, ptr %ptradd7, align 8
@@ -118,17 +122,21 @@ cache_miss6: ; preds = %match
store ptr %17, ptr %.inlinecache3, align 8
store ptr %14, ptr %.cachedtype4, align 8
br label %18
cache_hit8: ; preds = %match
%cache_hit_fn9 = load ptr, ptr %.inlinecache3, align 8
br label %18
18: ; preds = %cache_hit8, %cache_miss6
%fn_phi10 = phi ptr [ %cache_hit_fn9, %cache_hit8 ], [ %17, %cache_miss6 ]
%19 = icmp eq ptr %fn_phi10, null
br i1 %19, label %missing_function11, label %match12
missing_function11: ; preds = %18
%20 = load ptr, ptr @std.core.builtin.panic, align 8
call void %20(ptr @.panic_msg, i64 41
unreachable
match12: ; preds = %18
%21 = load ptr, ptr %w, align 8
call void %fn_phi10(ptr %21)
@@ -142,20 +150,25 @@ entry:
define weak_odr ptr @.dyn_search(ptr %0, ptr %1) unnamed_addr {
entry:
br label %check
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
%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
%9 = load ptr, ptr %8, align 8

View File

@@ -40,24 +40,23 @@ fn void main()
@.panic_msg = internal constant [42 x i8] c"No method 'tesT' could be found on target\00", align 1
@.file = internal constant [30 x i8] c"overlapping_function_linux.c3\00", align 1
@.func = internal constant [5 x i8] c"main\00", align 1
@std.core.builtin.panic = external global ptr, align 8
@std.core.builtin.panic = extern_weak global ptr, align 8
@"$ct.dyn.overlap.Test.tesT" = global { ptr, ptr, ptr } { ptr @overlap.Test.tesT, ptr @"$sel.tesT", ptr null }, align 8
@"$ct.dyn.overlap.Test.foo" = global { ptr, ptr, ptr } { ptr @overlap.Test.foo, ptr @"$sel.foo", ptr null }, align 8
@"$sel.foo" = linkonce_odr constant [4 x i8] c"foo\00", comdat, align 1
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @.c3_dynamic_register, ptr null }]
; Function Attrs: nounwind uwtable
define void @overlap.Test.tesT(ptr %0) #0 {
entry:
ret void
}
; Function Attrs:
define void @overlap.Test.foo(ptr %0) #0 {
entry:
ret void
}
; Function Attrs:
define void @overlap.main() #0 {
entry:
%z = alloca %any, align 8
@@ -78,6 +77,7 @@ entry:
%type = load ptr, ptr %.cachedtype, align 8
%5 = icmp eq ptr %4, %type
br i1 %5, label %cache_hit, label %cache_miss
cache_miss: ; preds = %entry
%ptradd1 = getelementptr inbounds i8, ptr %4, i64 16
%6 = load ptr, ptr %ptradd1, align 8
@@ -85,17 +85,21 @@ cache_miss: ; preds = %entry
store ptr %7, ptr %.inlinecache, align 8
store ptr %4, ptr %.cachedtype, align 8
br label %8
cache_hit: ; preds = %entry
%cache_hit_fn = load ptr, ptr %.inlinecache, align 8
br label %8
8: ; preds = %cache_hit, %cache_miss
%fn_phi = phi ptr [ %cache_hit_fn, %cache_hit ], [ %7, %cache_miss ]
%9 = icmp eq ptr %fn_phi, null
br i1 %9, label %missing_function, label %match
missing_function: ; preds = %8
%10 = load ptr, ptr @std.core.builtin.panic, align 8
call void %10(ptr @.panic_msg, i64 41, ptr @.file
unreachable
match: ; preds = %8
%11 = load ptr, ptr %z, align 8
call void %fn_phi(ptr %11)
@@ -107,6 +111,7 @@ match: ; preds = %8
%type5 = load ptr, ptr %.cachedtype4, align 8
%15 = icmp eq ptr %14, %type5
br i1 %15, label %cache_hit8, label %cache_miss6
cache_miss6: ; preds = %match
%ptradd7 = getelementptr inbounds i8, ptr %14, i64 16
%16 = load ptr, ptr %ptradd7, align 8
@@ -114,24 +119,27 @@ cache_miss6: ; preds = %match
store ptr %17, ptr %.inlinecache3, align 8
store ptr %14, ptr %.cachedtype4, align 8
br label %18
cache_hit8: ; preds = %match
%cache_hit_fn9 = load ptr, ptr %.inlinecache3, align 8
br label %18
18: ; preds = %cache_hit8, %cache_miss6
%fn_phi10 = phi ptr [ %cache_hit_fn9, %cache_hit8 ], [ %17, %cache_miss6 ]
%19 = icmp eq ptr %fn_phi10, null
br i1 %19, label %missing_function11, label %match12
missing_function11: ; preds = %18
%20 = load ptr, ptr @std.core.builtin.panic, align 8
call void %20(ptr @.panic_msg, i64 41, ptr @.file
unreachable
match12: ; preds = %18
%21 = load ptr, ptr %w, align 8
call void %fn_phi10(ptr %21)
ret void
}
; Function Attrs:
define i32 @main(i32 %0, ptr %1) #0 {
entry:
call void @overlap.main()
@@ -142,47 +150,59 @@ entry:
define weak_odr ptr @.dyn_search(ptr %0, ptr %1) unnamed_addr comdat {
entry:
br label %check
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
%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
%9 = load ptr, ptr %8, align 8
br label %check
}
define internal void @.c3_dynamic_register() align 8 {
entry:
br label %dtable_check
dtable_check: ; preds = %dtable_next, %entry
%dtable_ref = phi ptr [ getelementptr inbounds
%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
dtable_next: ; preds = %dtable_check
%next_dtable_ref = getelementptr inbounds
br label %dtable_check
dtable_found: ; preds = %dtable_check
store ptr @"$ct.dyn.overlap.Test.tesT", ptr %dtable_ref, align 8
br label %dtable_check1
dtable_check1: ; preds = %dtable_next4, %dtable_found
%dtable_ref2 = phi ptr [ getelementptr inbounds
%dtable_ptr3 = load ptr, ptr %dtable_ref2, align 8
%1 = icmp eq ptr %dtable_ptr3, null
br i1 %1, label %dtable_found6, label %dtable_next4
dtable_next4: ; preds = %dtable_check1
%next_dtable_ref5 = getelementptr inbounds
br label %dtable_check1
dtable_found6: ; preds = %dtable_check1
store ptr @"$ct.dyn.overlap.Test.foo", ptr %dtable_ref2, align 8
ret void

View File

@@ -40,7 +40,7 @@ fn void main()
@.panic_msg = internal constant [42 x i8] c"No method 'tesT' could be found on target\00", align 1
@.file = internal constant [30 x i8] c"overlapping_function_macos.c3\00", align 1
@.func = internal constant [5 x i8] c"main\00", align 1
@std.core.builtin.panic = external global ptr, align 8
@std.core.builtin.panic = extern_weak global ptr, align 8
@"$sel.foo" = linkonce_odr constant [4 x i8] c"foo\00", align 1
@"$c3_dynamic" = internal global [2 x { ptr, ptr, i64 }] [{ ptr, ptr, i64 } { ptr @overlap.Test.tesT, ptr @"$sel.tesT", i64 ptrtoint (ptr @"$ct.overlap.Test" to i64) }, { ptr, ptr, i64 } { ptr @overlap.Test.foo, ptr @"$sel.foo", i64 ptrtoint (ptr @"$ct.overlap.Test" to i64) }], section "__DATA,__c3_dynamic", align 8
@@ -50,13 +50,11 @@ entry:
ret void
}
; Function Attrs:
define void @overlap.Test.foo(ptr %0) #0 {
entry:
ret void
}
; Function Attrs:
define void @overlap.main() #0 {
entry:
%z = alloca %any, align 8

View File

@@ -19,10 +19,9 @@ fn void test(int x)
/* #expect: test.ll
@test.zfok = local_unnamed_addr global i32 0, align 4
@.taddr = private global [2 x i32] [i32 0, i32 1], align 4
@.taddr = private unnamed_addr global [2 x i32] [i32 0, i32 1], align 4
@test.zw = local_unnamed_addr global %"int[]" { ptr @.taddr, i64 2 }, align 8
; Function Attrs:
define void @test.test(i32 %0) #0 {
entry:
%zonk = alloca i32, align 4

View File

@@ -56,7 +56,7 @@ fn int main()
@subarrays.arrbar = local_unnamed_addr global %"Bar[]" { ptr @.__const_slice, i64 2 }, align 8
@.__const_slice.3 = private unnamed_addr global [2 x i32] [i32 1, i32 2], align 4
@subarrays.xd = local_unnamed_addr global %"int[]" { ptr @.__const_slice.3, i64 2 }, align 8
@.taddr = private global [2 x i32] [i32 3, i32 4], align 4
@.taddr = private unnamed_addr global [2 x i32] [i32 3, i32 4], align 4
@subarrays.fofeo = local_unnamed_addr global ptr @.taddr, align 8
@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
@.__const = private unnamed_addr constant [3 x i32] [i32 1, i32 2, i32 3], align 4

View File

@@ -66,13 +66,12 @@ fn void test6(int a)
/* #expect: simple_jump.ll
@jumptable = private constant [3 x ptr] [ptr blockaddress(@simple_jump.test1, %switch.case1), ptr blockaddress(@simple_jump.test1, %switch.case), ptr blockaddress(@simple_jump.test1, %switch.case1)], align 4
@jumptable.1 = private constant [2 x ptr] [ptr blockaddress(@simple_jump.test2, %switch.case), ptr blockaddress(@simple_jump.test2, %switch.case1)], align 4
@jumptable.2 = private constant [3 x ptr] [ptr blockaddress(@simple_jump.test3, %switch.case), ptr blockaddress(@simple_jump.test3, %switch.exit), ptr blockaddress(@simple_jump.test3, %switch.case1)], align 4
@jumptable.3 = private constant [1 x ptr] [ptr blockaddress(@simple_jump.test4, %switch.case)], align 4
@jumptable.4 = private constant [4 x ptr] [ptr blockaddress(@simple_jump.test5, %switch.case), ptr blockaddress(@simple_jump.test5, %switch.default), ptr blockaddress(@simple_jump.test5, %switch.default), ptr blockaddress(@simple_jump.test5, %switch.case1)], align 4
@jumptable.5 = private constant [5 x ptr] [ptr blockaddress(@simple_jump.test6, %switch.case), ptr blockaddress(@simple_jump.test6, %switch.default), ptr blockaddress(@simple_jump.test6, %switch.default), ptr blockaddress(@simple_jump.test6, %switch.case1), ptr blockaddress(@simple_jump.test6, %switch.case2)], align 4
@jumptable = private unnamed_addr constant [3 x ptr] [ptr blockaddress(@simple_jump.test1, %switch.case1), ptr blockaddress(@simple_jump.test1, %switch.case), ptr blockaddress(@simple_jump.test1, %switch.case1)], align 4
@jumptable.1 = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@simple_jump.test2, %switch.case), ptr blockaddress(@simple_jump.test2, %switch.case1)], align 4
@jumptable.2 = private unnamed_addr constant [3 x ptr] [ptr blockaddress(@simple_jump.test3, %switch.case), ptr blockaddress(@simple_jump.test3, %switch.exit), ptr blockaddress(@simple_jump.test3, %switch.case1)], align 4
@jumptable.3 = private unnamed_addr constant [1 x ptr] [ptr blockaddress(@simple_jump.test4, %switch.case)], align 4
@jumptable.4 = private unnamed_addr constant [4 x ptr] [ptr blockaddress(@simple_jump.test5, %switch.case), ptr blockaddress(@simple_jump.test5, %switch.default), ptr blockaddress(@simple_jump.test5, %switch.default), ptr blockaddress(@simple_jump.test5, %switch.case1)], align 4
@jumptable.5 = private unnamed_addr constant [5 x ptr] [ptr blockaddress(@simple_jump.test6, %switch.case), ptr blockaddress(@simple_jump.test6, %switch.default), ptr blockaddress(@simple_jump.test6, %switch.default), ptr blockaddress(@simple_jump.test6, %switch.case1), ptr blockaddress(@simple_jump.test6, %switch.case2)], align 4
after_check12: ; preds = %noerr_block8
br label %noerr_block14

View File

@@ -709,7 +709,7 @@ fn void test()
@.str.5 = private unnamed_addr constant [3 x i8] c"*/\00", align 1
@"lexer_test.Comment$end" = linkonce constant [2 x %"char[]"] [%"char[]" { ptr @.str.4, i64 1 }, %"char[]" { ptr @.str.5, i64 2 }], align 8
@"$ct.std.io.ByteReader" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 24, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
@std.core.mem.allocator.thread_allocator = external thread_local global %any, align 8
@std.core.mem.allocator.thread_allocator = extern_weak thread_local global %any, align 8
; Function Attrs:
define zeroext i8 @lexer_test.is_ident_char(i64 %0, i8 zeroext %1) #0 {