mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Fixes to thread local pointer handling.
This commit is contained in:
committed by
Christoffer Lerno
parent
7cdb1ce9eb
commit
a20e74c401
@@ -304,90 +304,91 @@ entry:
|
||||
%retparam14 = alloca %"char[]", align 8
|
||||
%taddr15 = alloca %"char[]", align 8
|
||||
store ptr null, ptr %.cachedtype, 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)
|
||||
%0 = call ptr @llvm.threadlocal.address.p0(ptr @std.core.mem.allocator.thread_allocator)
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %allocator, ptr align 8 %0, i32 16, i1 false)
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %allocator1, ptr align 8 %allocator, i32 16, i1 false)
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %allocator2, ptr align 8 %allocator1, i32 16, i1 false)
|
||||
br label %if.exit
|
||||
|
||||
if.exit: ; preds = %entry
|
||||
%ptradd = getelementptr inbounds i8, ptr %allocator2, i64 8
|
||||
%0 = load i64, ptr %ptradd, align 8
|
||||
%1 = inttoptr i64 %0 to ptr
|
||||
%1 = load i64, ptr %ptradd, align 8
|
||||
%2 = inttoptr i64 %1 to ptr
|
||||
%type = load ptr, ptr %.cachedtype, align 8
|
||||
%2 = icmp eq ptr %1, %type
|
||||
br i1 %2, label %cache_hit, label %cache_miss
|
||||
%3 = icmp eq ptr %2, %type
|
||||
br i1 %3, label %cache_hit, label %cache_miss
|
||||
|
||||
cache_miss: ; preds = %if.exit
|
||||
%ptradd3 = getelementptr inbounds i8, ptr %1, i64 16
|
||||
%3 = load ptr, ptr %ptradd3, align 8
|
||||
%4 = call ptr @.dyn_search(ptr %3, ptr @"$sel.acquire")
|
||||
store ptr %4, ptr %.inlinecache, align 8
|
||||
store ptr %1, ptr %.cachedtype, align 8
|
||||
br label %5
|
||||
%ptradd3 = getelementptr inbounds i8, ptr %2, i64 16
|
||||
%4 = load ptr, ptr %ptradd3, align 8
|
||||
%5 = call ptr @.dyn_search(ptr %4, ptr @"$sel.acquire")
|
||||
store ptr %5, ptr %.inlinecache, align 8
|
||||
store ptr %2, ptr %.cachedtype, align 8
|
||||
br label %6
|
||||
|
||||
cache_hit: ; preds = %if.exit
|
||||
%cache_hit_fn = load ptr, ptr %.inlinecache, align 8
|
||||
br label %5
|
||||
br label %6
|
||||
|
||||
5: ; preds = %cache_hit, %cache_miss
|
||||
%fn_phi = phi ptr [ %cache_hit_fn, %cache_hit ], [ %4, %cache_miss ]
|
||||
%6 = icmp eq ptr %fn_phi, null
|
||||
br i1 %6, label %missing_function, label %match
|
||||
6: ; preds = %cache_hit, %cache_miss
|
||||
%fn_phi = phi ptr [ %cache_hit_fn, %cache_hit ], [ %5, %cache_miss ]
|
||||
%7 = icmp eq ptr %fn_phi, null
|
||||
br i1 %7, label %missing_function, label %match
|
||||
|
||||
missing_function: ; preds = %5
|
||||
missing_function: ; preds = %6
|
||||
store %"char[]" { ptr @.panic_msg, i64 44 }, ptr %taddr, align 8
|
||||
%7 = load [2 x i64], ptr %taddr, align 8
|
||||
%8 = load [2 x i64], ptr %taddr, align 8
|
||||
store %"char[]" { ptr @.file, i64 16 }, ptr %taddr4, align 8
|
||||
%8 = load [2 x i64], ptr %taddr4, align 8
|
||||
%9 = load [2 x i64], ptr %taddr4, align 8
|
||||
store %"char[]" { ptr @.func, i64 4 }, ptr %taddr5, align 8
|
||||
%9 = load [2 x i64], ptr %taddr5, align 8
|
||||
%10 = load ptr, ptr @std.core.builtin.panic, align 8
|
||||
call void %10([2 x i64] %7, [2 x i64] %8, [2 x i64] %9
|
||||
%10 = load [2 x i64], ptr %taddr5, align 8
|
||||
%11 = load ptr, ptr @std.core.builtin.panic, align 8
|
||||
call void %11([2 x i64] %8, [2 x i64] %9, [2 x i64] %10, i32 97) #4
|
||||
unreachable
|
||||
|
||||
match: ; preds = %5
|
||||
%11 = load ptr, ptr %allocator2, align 8
|
||||
%12 = call i64 %fn_phi(ptr %retparam, ptr %11, i64 12, i32 1, i64 0)
|
||||
%not_err = icmp eq i64 %12, 0
|
||||
%13 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
||||
br i1 %13, label %after_check, label %assign_optional
|
||||
match: ; preds = %6
|
||||
%12 = load ptr, ptr %allocator2, align 8
|
||||
%13 = call i64 %fn_phi(ptr %retparam, ptr %12, i64 12, i32 1, i64 0)
|
||||
%not_err = icmp eq i64 %13, 0
|
||||
%14 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
||||
br i1 %14, label %after_check, label %assign_optional
|
||||
|
||||
assign_optional: ; preds = %match
|
||||
store i64 %12, ptr %error_var, align 8
|
||||
store i64 %13, ptr %error_var, align 8
|
||||
br label %panic_block
|
||||
|
||||
after_check: ; preds = %match
|
||||
%14 = load ptr, ptr %retparam, align 8
|
||||
store ptr %14, ptr %taddr6, align 8
|
||||
%15 = load ptr, ptr %taddr6, align 8
|
||||
%16 = insertvalue %"char[]" undef, ptr %15, 0
|
||||
%17 = insertvalue %"char[]" %16, i64 12, 1
|
||||
%15 = load ptr, ptr %retparam, align 8
|
||||
store ptr %15, ptr %taddr6, align 8
|
||||
%16 = load ptr, ptr %taddr6, align 8
|
||||
%17 = insertvalue %"char[]" undef, ptr %16, 0
|
||||
%18 = insertvalue %"char[]" %17, i64 12, 1
|
||||
br label %noerr_block
|
||||
|
||||
panic_block: ; preds = %assign_optional
|
||||
%18 = insertvalue %any undef, ptr %error_var, 0
|
||||
%19 = insertvalue %any %18, i64 ptrtoint (ptr @"$ct.fault" to i64), 1
|
||||
%19 = insertvalue %any undef, ptr %error_var, 0
|
||||
%20 = insertvalue %any %19, i64 ptrtoint (ptr @"$ct.fault" to i64), 1
|
||||
store %"char[]" { ptr @.panic_msg.4, i64 36 }, ptr %taddr7, align 8
|
||||
%20 = load [2 x i64], ptr %taddr7, align 8
|
||||
%21 = load [2 x i64], ptr %taddr7, align 8
|
||||
store %"char[]" { ptr @.file, i64 16 }, ptr %taddr8, align 8
|
||||
%21 = load [2 x i64], ptr %taddr8, align 8
|
||||
%22 = load [2 x i64], ptr %taddr8, align 8
|
||||
store %"char[]" { ptr @.func, i64 4 }, ptr %taddr9, align 8
|
||||
%22 = load [2 x i64], ptr %taddr9, align 8
|
||||
store %any %19, ptr %varargslots, align 8
|
||||
%23 = insertvalue %"any[]" undef, ptr %varargslots, 0
|
||||
%"$$temp" = insertvalue %"any[]" %23, i64 1, 1
|
||||
%23 = load [2 x i64], ptr %taddr9, align 8
|
||||
store %any %20, ptr %varargslots, align 8
|
||||
%24 = insertvalue %"any[]" undef, ptr %varargslots, 0
|
||||
%"$$temp" = insertvalue %"any[]" %24, i64 1, 1
|
||||
store %"any[]" %"$$temp", ptr %taddr10, align 8
|
||||
%24 = load [2 x i64], ptr %taddr10, align 8
|
||||
call void @std.core.builtin.panicf([2 x i64] %20, [2 x i64] %21, [2 x i64] %22
|
||||
%25 = load [2 x i64], ptr %taddr10, align 8
|
||||
call void @std.core.builtin.panicf([2 x i64] %21, [2 x i64] %22, [2 x i64] %23, i32 261, [2 x i64] %25) #4
|
||||
unreachable
|
||||
|
||||
noerr_block: ; preds = %after_check
|
||||
store %"char[]" %17, ptr %buffer, align 8
|
||||
store %"char[]" %18, ptr %buffer, align 8
|
||||
store i64 0, ptr %buffer.f, align 8
|
||||
%optval = load i64, ptr %buffer.f, align 8
|
||||
%not_err11 = icmp eq i64 %optval, 0
|
||||
%25 = call i1 @llvm.expect.i1(i1 %not_err11, i1 true)
|
||||
br i1 %25, label %after_check13, label %assign_optional12
|
||||
%26 = call i1 @llvm.expect.i1(i1 %not_err11, i1 true)
|
||||
br i1 %26, label %after_check13, label %assign_optional12
|
||||
|
||||
assign_optional12: ; preds = %noerr_block
|
||||
store i64 %optval, ptr %buffer.f, align 8
|
||||
@@ -395,15 +396,15 @@ assign_optional12: ; preds = %noerr_block
|
||||
|
||||
after_check13: ; preds = %noerr_block
|
||||
store %"char[]" { ptr @.str.5, i64 13 }, ptr %taddr15, align 8
|
||||
%26 = load [2 x i64], ptr %taddr15, align 8
|
||||
%27 = load [2 x i64], ptr %buffer, align 8
|
||||
%28 = call i64 @test.fileReader(ptr %retparam14, [2 x i64] %26, [2 x i64] %27)
|
||||
%not_err16 = icmp eq i64 %28, 0
|
||||
%29 = call i1 @llvm.expect.i1(i1 %not_err16, i1 true)
|
||||
br i1 %29, label %after_check18, label %assign_optional17
|
||||
%27 = load [2 x i64], ptr %taddr15, align 8
|
||||
%28 = load [2 x i64], ptr %buffer, align 8
|
||||
%29 = call i64 @test.fileReader(ptr %retparam14, [2 x i64] %27, [2 x i64] %28)
|
||||
%not_err16 = icmp eq i64 %29, 0
|
||||
%30 = call i1 @llvm.expect.i1(i1 %not_err16, i1 true)
|
||||
br i1 %30, label %after_check18, label %assign_optional17
|
||||
|
||||
assign_optional17: ; preds = %after_check13
|
||||
store i64 %28, ptr %buffer.f, align 8
|
||||
store i64 %29, ptr %buffer.f, align 8
|
||||
br label %after_assign
|
||||
|
||||
after_check18: ; preds = %after_check13
|
||||
|
||||
Reference in New Issue
Block a user