An alloca built at its use site re-executes on every pass through that block, and LLVM reclaims allocas only at ret — so loop-body locals, nested-loop index slots, and emitter spill temps (ig.tmp, sret slots, ABI coercion temps, byval materialization) grew the stack per iteration and long loops segfaulted on stack exhaustion. New LLVMEmitter.buildEntryAlloca inserts after existing entry-block allocas and restores the builder position; every LLVMBuildAlloca site reachable during instruction emission now routes through it. Initialization stores stay at the use site (per-iteration re-init is unchanged), and entry slots become mem2reg-promotable. The 35 .ir snapshot diffs are pure alloca position moves (type multisets verified identical per file). Regression: examples/0047-basic-loop-local-stack-reuse.sx (segfaulted pre-fix on both the 1M-iteration body-local loop and the 3M-iteration nested loop).
1154 lines
45 KiB
Plaintext
1154 lines
45 KiB
Plaintext
|
|
@__SxFoo_state_ivar = internal global ptr null
|
|
@__SxFoo_class = internal global ptr null
|
|
@OS = internal global i64 6
|
|
@ARCH = internal global i64 4
|
|
@POINTER_SIZE = internal global i64 8
|
|
@__sx_default_context = internal global { { ptr, ptr, ptr }, ptr } { { ptr, ptr, ptr } { ptr null, ptr @__thunk_CAllocator_Allocator_alloc, ptr @__thunk_CAllocator_Allocator_dealloc }, ptr null }
|
|
@__sx_objc_cstr_dealloc = internal global [8 x i8] c"dealloc\00"
|
|
@str = private unnamed_addr constant [2 x i8] c"0\00", align 1
|
|
@str.1 = private unnamed_addr constant [15 x i8] c"result := \22\22; \00", align 1
|
|
@str.2 = private unnamed_addr constant [37 x i8] c"result = concat(result, substr(fmt, \00", align 1
|
|
@str.3 = private unnamed_addr constant [3 x i8] c", \00", align 1
|
|
@str.4 = private unnamed_addr constant [5 x i8] c")); \00", align 1
|
|
@str.5 = private unnamed_addr constant [44 x i8] c"result = concat(result, any_to_string(args[\00", align 1
|
|
@str.6 = private unnamed_addr constant [6 x i8] c"])); \00", align 1
|
|
@str.7 = private unnamed_addr constant [37 x i8] c"result = concat(result, substr(fmt, \00", align 1
|
|
@str.8 = private unnamed_addr constant [3 x i8] c", \00", align 1
|
|
@str.9 = private unnamed_addr constant [5 x i8] c")); \00", align 1
|
|
@str.10 = private unnamed_addr constant [37 x i8] c"result = concat(result, substr(fmt, \00", align 1
|
|
@str.11 = private unnamed_addr constant [3 x i8] c", \00", align 1
|
|
@str.12 = private unnamed_addr constant [5 x i8] c")); \00", align 1
|
|
@str.13 = private unnamed_addr constant [37 x i8] c"result = concat(result, substr(fmt, \00", align 1
|
|
@str.14 = private unnamed_addr constant [3 x i8] c", \00", align 1
|
|
@str.15 = private unnamed_addr constant [5 x i8] c")); \00", align 1
|
|
@str.16 = private unnamed_addr constant [6 x i8] c"SxFoo\00", align 1
|
|
@str.17 = private unnamed_addr constant [8 x i8] c"dealloc\00", align 1
|
|
@str.18 = private unnamed_addr constant [6 x i8] c"alloc\00", align 1
|
|
@str.19 = private unnamed_addr constant [8 x i8] c"release\00", align 1
|
|
@str.20 = private unnamed_addr constant [28 x i8] c"FAIL: SxFoo not registered\0A\00", align 1
|
|
@str.21 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
|
@str.22 = private unnamed_addr constant [28 x i8] c"FAIL: SxFoo not registered\0A\00", align 1
|
|
@str.23 = private unnamed_addr constant [27 x i8] c"FAIL: dealloc IMP missing\0A\00", align 1
|
|
@str.24 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
|
@str.25 = private unnamed_addr constant [27 x i8] c"FAIL: dealloc IMP missing\0A\00", align 1
|
|
@str.26 = private unnamed_addr constant [28 x i8] c"FAIL: +alloc returned null\0A\00", align 1
|
|
@str.27 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
|
@str.28 = private unnamed_addr constant [28 x i8] c"FAIL: +alloc returned null\0A\00", align 1
|
|
@str.29 = private unnamed_addr constant [36 x i8] c"FAIL: +alloc round 2 returned null\0A\00", align 1
|
|
@str.30 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
|
@str.31 = private unnamed_addr constant [36 x i8] c"FAIL: +alloc round 2 returned null\0A\00", align 1
|
|
@str.32 = private unnamed_addr constant [13 x i8] c"dealloc: ok\0A\00", align 1
|
|
@str.33 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
|
@str.34 = private unnamed_addr constant [13 x i8] c"dealloc: ok\0A\00", align 1
|
|
@OBJC_IVAR_NAME_ = private unnamed_addr constant [11 x i8] c"__sx_state\00"
|
|
@OBJC_IVAR_TYPE_ = private unnamed_addr constant [3 x i8] c"^v\00"
|
|
@OBJC_CLASS_NAME_ = private unnamed_addr constant [9 x i8] c"NSObject\00"
|
|
@OBJC_CLASS_NAME_.35 = private unnamed_addr constant [6 x i8] c"SxFoo\00"
|
|
@OBJC_METH_VAR_NAME_ = private unnamed_addr constant [5 x i8] c"bump\00"
|
|
@OBJC_METH_VAR_TYPE_ = private unnamed_addr constant [4 x i8] c"v@:\00"
|
|
@OBJC_METH_VAR_NAME_.36 = private unnamed_addr constant [8 x i8] c"dealloc\00"
|
|
@OBJC_METH_VAR_TYPE_.37 = private unnamed_addr constant [4 x i8] c"v@:\00"
|
|
@OBJC_METH_VAR_NAME_.38 = private unnamed_addr constant [6 x i8] c"alloc\00"
|
|
@OBJC_METH_VAR_TYPE_.39 = private unnamed_addr constant [4 x i8] c"@@:\00"
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @out(ptr) #0
|
|
|
|
declare ptr @malloc(i64)
|
|
|
|
declare void @free(ptr)
|
|
|
|
declare ptr @memcpy(ptr, ptr, i64)
|
|
|
|
declare ptr @memset(ptr, i32, i64)
|
|
|
|
; Function Attrs: nounwind
|
|
define internal ptr @CAllocator.alloc(ptr %0, ptr %1, i64 %2) #0 {
|
|
entry:
|
|
%alloca = alloca ptr, align 8
|
|
store ptr %1, ptr %alloca, align 8
|
|
%allocaN = alloca i64, align 8
|
|
store i64 %2, ptr %allocaN, align 8
|
|
%load = load i64, ptr %allocaN, align 8
|
|
%call = call ptr @malloc(i64 %load)
|
|
ret ptr %call
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal void @CAllocator.dealloc(ptr %0, ptr %1, ptr %2) #0 {
|
|
entry:
|
|
%alloca = alloca ptr, align 8
|
|
store ptr %1, ptr %alloca, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
store ptr %2, ptr %allocaN, align 8
|
|
%load = load ptr, ptr %allocaN, align 8
|
|
call void @free(ptr %load)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
declare i64 @GPA.init(ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @GPA.alloc(ptr, ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @GPA.dealloc(ptr, ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @Arena.add_chunk(ptr, ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @Arena.init(ptr sret({ ptr, i64, { ptr, ptr, ptr } }), ptr, ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @Arena.reset(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @Arena.deinit(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @Arena.alloc(ptr, ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @Arena.dealloc(ptr, ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BufAlloc.init(ptr, ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BufAlloc.reset(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BufAlloc.alloc(ptr, ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BufAlloc.dealloc(ptr, ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @TrackingAllocator.init(ptr sret({ { ptr, ptr, ptr }, i64, i64, i64 }), ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i64 @TrackingAllocator.leak_count(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @TrackingAllocator.report(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @TrackingAllocator.alloc(ptr, ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @TrackingAllocator.dealloc(ptr, ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @cstring(ptr %0, i64 %1) #0 {
|
|
entry:
|
|
%alloca = alloca i64, align 8
|
|
store i64 %1, ptr %alloca, align 8
|
|
%load = load i64, ptr %alloca, align 8
|
|
%add = add i64 %load, 1
|
|
%loadN = load { { ptr, ptr, ptr }, ptr }, ptr %0, align 8
|
|
%sg = extractvalue { { ptr, ptr, ptr }, ptr } %loadN, 0
|
|
%sgN = extractvalue { ptr, ptr, ptr } %sg, 0
|
|
%sgN = extractvalue { ptr, ptr, ptr } %sg, 1
|
|
%icall = call ptr %sgN(ptr %0, ptr %sgN, i64 %add)
|
|
%allocaN = alloca ptr, align 8
|
|
store ptr %icall, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %alloca, align 8
|
|
%addN = add i64 %loadN, 1
|
|
%2 = call ptr @memset(ptr %loadN, i32 0, i64 %addN)
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } undef, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%gep = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 0
|
|
%pti = ptrtoint ptr %loadN to i64
|
|
store i64 %pti, ptr %gep, align 8
|
|
%loadN = load i64, ptr %alloca, align 8
|
|
%gepN = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 1
|
|
store i64 %loadN, ptr %gepN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
ret { ptr, i64 } %loadN
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @int_to_string(ptr %0, i64 %1) #0 {
|
|
entry:
|
|
%alloca = alloca i64, align 8
|
|
%allocaN = alloca i1, align 1
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
%allocaN = alloca i64, align 8
|
|
%allocaN = alloca i64, align 8
|
|
%allocaN = alloca i64, align 8
|
|
store i64 %1, ptr %alloca, align 8
|
|
%load = load i64, ptr %alloca, align 8
|
|
%icmp = icmp eq i64 %load, 0
|
|
br i1 %icmp, label %if.then.16, label %if.merge.17
|
|
|
|
if.then.16: ; preds = %entry
|
|
ret { ptr, i64 } { ptr @str, i64 1 }
|
|
|
|
if.merge.17: ; preds = %entry
|
|
%loadN = load i64, ptr %alloca, align 8
|
|
%icmpN = icmp slt i64 %loadN, 0
|
|
store i1 %icmpN, ptr %allocaN, align 1
|
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
|
store i64 19, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %alloca, align 8
|
|
store i64 %loadN, ptr %allocaN, align 8
|
|
br label %while.hdr.18
|
|
|
|
while.hdr.18: ; preds = %if.merge.22, %if.merge.17
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%icmpN = icmp ne i64 %loadN, 0
|
|
br i1 %icmpN, label %while.body.19, label %while.exit.20
|
|
|
|
while.body.19: ; preds = %while.hdr.18
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%srem = srem i64 %loadN, 10
|
|
store i64 %srem, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%icmpN = icmp slt i64 %loadN, 0
|
|
br i1 %icmpN, label %if.then.21, label %if.merge.22
|
|
|
|
while.exit.20: ; preds = %while.hdr.18
|
|
%loadN = load i1, ptr %allocaN, align 1
|
|
br i1 %loadN, label %if.then.23, label %if.merge.24
|
|
|
|
if.then.21: ; preds = %while.body.19
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%sub = sub i64 0, %loadN
|
|
store i64 %sub, ptr %allocaN, align 8
|
|
br label %if.merge.22
|
|
|
|
if.merge.22: ; preds = %if.then.21, %while.body.19
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%add = add i64 %loadN, 48
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
|
%igp.ptr = getelementptr i8, ptr %igp.data, i64 %loadN
|
|
%trunc = trunc i64 %add to i8
|
|
store i8 %trunc, ptr %igp.ptr, align 1
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%sdiv = sdiv i64 %loadN, 10
|
|
store i64 %sdiv, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%subN = sub i64 %loadN, 1
|
|
store i64 %subN, ptr %allocaN, align 8
|
|
br label %while.hdr.18
|
|
|
|
if.then.23: ; preds = %while.exit.20
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%igp.data24 = extractvalue { ptr, i64 } %loadN, 0
|
|
%igp.ptr25 = getelementptr i8, ptr %igp.data24, i64 %loadN
|
|
store i8 45, ptr %igp.ptr25, align 1
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%subN = sub i64 %loadN, 1
|
|
store i64 %subN, ptr %allocaN, align 8
|
|
br label %if.merge.24
|
|
|
|
if.merge.24: ; preds = %if.then.23, %while.exit.20
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%subN = sub i64 19, %loadN
|
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
|
ret { ptr, i64 } %callN
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @uint_to_string(ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @bool_to_string(ptr, i1) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @float_to_string(ptr, double) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @hex_group(ptr, ptr, i64, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare [4 x i64] @decompose_u16x4(ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @int_to_hex_string(ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @concat(ptr %0, { ptr, i64 } %1, { ptr, i64 } %2) #0 {
|
|
entry:
|
|
%alloca = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } %1, ptr %alloca, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } %2, ptr %allocaN, align 8
|
|
%load = load { ptr, i64 }, ptr %alloca, align 8
|
|
%len = extractvalue { ptr, i64 } %load, 1
|
|
%allocaN = alloca i64, align 8
|
|
store i64 %len, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
|
%allocaN = alloca i64, align 8
|
|
store i64 %lenN, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%add = add i64 %loadN, %loadN
|
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 %add)
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%dptr = extractvalue { ptr, i64 } %loadN, 0
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%dptrN = extractvalue { ptr, i64 } %loadN, 0
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%callN = call ptr @memcpy(ptr %dptr, ptr %dptrN, i64 %loadN)
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
|
%igp.ptr = getelementptr i8, ptr %igp.data, i64 %loadN
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%dptrN = extractvalue { ptr, i64 } %loadN, 0
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%callN = call ptr @memcpy(ptr %igp.ptr, ptr %dptrN, i64 %loadN)
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
ret { ptr, i64 } %loadN
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @substr(ptr %0, { ptr, i64 } %1, i64 %2, i64 %3) #0 {
|
|
entry:
|
|
%alloca = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } %1, ptr %alloca, align 8
|
|
%allocaN = alloca i64, align 8
|
|
store i64 %2, ptr %allocaN, align 8
|
|
%allocaN = alloca i64, align 8
|
|
store i64 %3, ptr %allocaN, align 8
|
|
%load = load i64, ptr %allocaN, align 8
|
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 %load)
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%dptr = extractvalue { ptr, i64 } %loadN, 0
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%igp.data = extractvalue { ptr, i64 } %loadN, 0
|
|
%igp.ptr = getelementptr i8, ptr %igp.data, i64 %loadN
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%callN = call ptr @memcpy(ptr %dptr, ptr %igp.ptr, i64 %loadN)
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
ret { ptr, i64 } %loadN
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @xml_escape(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @path_join(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @any_to_string(ptr, [2 x i64]) #0
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @build_format(ptr %0, { ptr, i64 } %1) #0 {
|
|
entry:
|
|
%alloca = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } %1, ptr %alloca, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.1, i64 14 }, ptr %allocaN, align 8
|
|
%allocaN = alloca i64, align 8
|
|
store i64 0, ptr %allocaN, align 8
|
|
%allocaN = alloca i64, align 8
|
|
store i64 0, ptr %allocaN, align 8
|
|
%allocaN = alloca i64, align 8
|
|
store i64 0, ptr %allocaN, align 8
|
|
br label %while.hdr.2
|
|
|
|
while.hdr.2: ; preds = %if.merge.7, %entry
|
|
%load = load i64, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%len = extractvalue { ptr, i64 } %loadN, 1
|
|
%icmp = icmp slt i64 %load, %len
|
|
br i1 %icmp, label %while.body.3, label %while.exit.4
|
|
|
|
while.body.3: ; preds = %while.hdr.2
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%ig.data = extractvalue { ptr, i64 } %loadN, 0
|
|
%ig.ptr = getelementptr i8, ptr %ig.data, i64 %loadN
|
|
%ig.val = load i8, ptr %ig.ptr, align 1
|
|
%cmp.ext = zext i8 %ig.val to i64
|
|
%icmpN = icmp eq i64 %cmp.ext, 123
|
|
br i1 %icmpN, label %if.then.5, label %if.else.6
|
|
|
|
while.exit.4: ; preds = %while.hdr.2
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
|
%icmpN = icmp slt i64 %loadN, %lenN
|
|
br i1 %icmpN, label %if.then.37, label %if.merge.38
|
|
|
|
if.then.5: ; preds = %while.body.3
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%add = add i64 %loadN, 1
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
|
%icmpN = icmp slt i64 %add, %lenN
|
|
br i1 %icmpN, label %if.then.8, label %if.else.9
|
|
|
|
if.else.6: ; preds = %while.body.3
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%ig.data19 = extractvalue { ptr, i64 } %loadN, 0
|
|
%ig.ptr20 = getelementptr i8, ptr %ig.data19, i64 %loadN
|
|
%ig.val21 = load i8, ptr %ig.ptr20, align 1
|
|
%cmp.ext22 = zext i8 %ig.val21 to i64
|
|
%icmpN = icmp eq i64 %cmp.ext22, 125
|
|
br i1 %icmpN, label %if.then.28, label %if.else.29
|
|
|
|
if.merge.7: ; preds = %if.merge.30, %if.merge.10
|
|
br label %while.hdr.2
|
|
|
|
if.then.8: ; preds = %if.then.5
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
%ig.data27 = extractvalue { ptr, i64 } %loadN, 0
|
|
%ig.ptr28 = getelementptr i8, ptr %ig.data27, i64 %addN
|
|
%ig.val29 = load i8, ptr %ig.ptr28, align 1
|
|
%cmp.ext30 = zext i8 %ig.val29 to i64
|
|
%icmpN = icmp eq i64 %cmp.ext30, 125
|
|
br i1 %icmpN, label %if.then.11, label %if.else.12
|
|
|
|
if.else.9: ; preds = %if.then.5
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.10
|
|
|
|
if.merge.10: ; preds = %if.merge.13, %if.else.9
|
|
br label %if.merge.7
|
|
|
|
if.then.11: ; preds = %if.then.8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%icmpN = icmp sgt i64 %loadN, %loadN
|
|
br i1 %icmpN, label %if.then.14, label %if.merge.15
|
|
|
|
if.else.12: ; preds = %if.then.8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
%ig.data40 = extractvalue { ptr, i64 } %loadN, 0
|
|
%ig.ptr41 = getelementptr i8, ptr %ig.data40, i64 %addN
|
|
%ig.val42 = load i8, ptr %ig.ptr41, align 1
|
|
%cmp.ext43 = zext i8 %ig.val42 to i64
|
|
%icmpN = icmp eq i64 %cmp.ext43, 123
|
|
br i1 %icmpN, label %if.then.25, label %if.else.26
|
|
|
|
if.merge.13: ; preds = %if.merge.27, %if.merge.15
|
|
br label %if.merge.10
|
|
|
|
if.then.14: ; preds = %if.then.11
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%call = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.2, i64 36 })
|
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.3, i64 2 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%sub = sub i64 %loadN, %loadN
|
|
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %sub)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.4, i64 4 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
br label %if.merge.15
|
|
|
|
if.merge.15: ; preds = %if.then.14, %if.then.11
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.5, i64 43 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.6, i64 5 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 2
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
store i64 %loadN, ptr %allocaN, align 8
|
|
br label %if.merge.13
|
|
|
|
if.then.25: ; preds = %if.else.12
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.7, i64 36 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.8, i64 2 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%subN = sub i64 %loadN, %loadN
|
|
%addN = add i64 %subN, 1
|
|
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %addN)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.9, i64 4 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 2
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
store i64 %loadN, ptr %allocaN, align 8
|
|
br label %if.merge.27
|
|
|
|
if.else.26: ; preds = %if.else.12
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.27
|
|
|
|
if.merge.27: ; preds = %if.else.26, %if.then.25
|
|
br label %if.merge.13
|
|
|
|
if.then.28: ; preds = %if.else.6
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
|
%icmpN = icmp slt i64 %addN, %lenN
|
|
br i1 %icmpN, label %if.then.31, label %if.else.32
|
|
|
|
if.else.29: ; preds = %if.else.6
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.30
|
|
|
|
if.merge.30: ; preds = %if.merge.33, %if.else.29
|
|
br label %if.merge.7
|
|
|
|
if.then.31: ; preds = %if.then.28
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
%ig.data104 = extractvalue { ptr, i64 } %loadN, 0
|
|
%ig.ptr105 = getelementptr i8, ptr %ig.data104, i64 %addN
|
|
%ig.val106 = load i8, ptr %ig.ptr105, align 1
|
|
%cmp.ext107 = zext i8 %ig.val106 to i64
|
|
%icmpN = icmp eq i64 %cmp.ext107, 125
|
|
br i1 %icmpN, label %if.then.34, label %if.else.35
|
|
|
|
if.else.32: ; preds = %if.then.28
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.33
|
|
|
|
if.merge.33: ; preds = %if.merge.36, %if.else.32
|
|
br label %if.merge.30
|
|
|
|
if.then.34: ; preds = %if.then.31
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.10, i64 36 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.11, i64 2 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%subN = sub i64 %loadN, %loadN
|
|
%addN = add i64 %subN, 1
|
|
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %addN)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.12, i64 4 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 2
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
store i64 %loadN, ptr %allocaN, align 8
|
|
br label %if.merge.36
|
|
|
|
if.else.35: ; preds = %if.then.31
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.36
|
|
|
|
if.merge.36: ; preds = %if.else.35, %if.then.34
|
|
br label %if.merge.33
|
|
|
|
if.then.37: ; preds = %while.exit.4
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.13, i64 36 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %loadN)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.14, i64 2 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%lenN = extractvalue { ptr, i64 } %loadN, 1
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%subN = sub i64 %lenN, %loadN
|
|
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %subN)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 4 })
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
br label %if.merge.38
|
|
|
|
if.merge.38: ; preds = %if.then.37, %while.exit.4
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
ret { ptr, i64 } %loadN
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.add_link_flag(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.add_framework(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_output_path(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_wasm_shell(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.add_asset_dir(i64, ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i64 @BuildOptions.asset_dir_count(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.asset_dir_src_at(i64, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.asset_dir_dest_at(i64, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_post_link_callback(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_post_link_module(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.binary_path(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_bundle_path(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_bundle_id(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_codesign_identity(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_provisioning_profile(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.bundle_path(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.bundle_id(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.codesign_identity(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.provisioning_profile(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.target_triple(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i1 @BuildOptions.is_macos(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i1 @BuildOptions.is_ios(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i1 @BuildOptions.is_ios_device(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i1 @BuildOptions.is_ios_simulator(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i1 @BuildOptions.is_android(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i64 @BuildOptions.framework_count(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.framework_at(i64, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i64 @BuildOptions.framework_path_count(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.framework_path_at(i64, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_manifest_path(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @BuildOptions.set_keystore_path(i64, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.manifest_path(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.keystore_path(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i64 @BuildOptions.jni_main_count(i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.jni_main_foreign_path_at(i64, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @BuildOptions.jni_main_java_source_at(i64, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i64 @build_options() #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @objc_getClass(ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @objc_lookUpClass(ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @sel_registerName(ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @class_createInstance(ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @object_getClass(ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @object_getIvar(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @object_setIvar(ptr, ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @objc_msgSend(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @objc_allocateClassPair(ptr, ptr, i64) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i1 @class_addMethod(ptr, ptr, ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare i1 @class_addProtocol(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @objc_getProtocol(ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @objc_registerClassPair(ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @NSLog(ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @objc_autoreleasePoolPush() #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @objc_autoreleasePoolPop(ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @autoreleasepool(ptr, [2 x i64]) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @class_getInstanceVariable(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @class_getMethodImplementation(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
define internal void @SxFoo.bump(ptr %0, ptr %1) #0 {
|
|
entry:
|
|
%alloca = alloca ptr, align 8
|
|
store ptr %1, ptr %alloca, align 8
|
|
%load = load ptr, ptr %alloca, align 8
|
|
%loadN = load ptr, ptr @__SxFoo_state_ivar, align 8
|
|
%call = call ptr @object_getIvar(ptr %load, ptr %loadN)
|
|
%gep = getelementptr inbounds { { ptr, ptr, ptr }, i32 }, ptr %call, i32 0, i32 1
|
|
%loadN = load i32, ptr %gep, align 4
|
|
%add = add i32 %loadN, 1
|
|
store i32 %add, ptr %gep, align 4
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define i32 @main() #0 {
|
|
entry:
|
|
call void @__sx_objc_defined_class_init()
|
|
%alloca = alloca ptr, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
%call = call ptr @objc_getClass(ptr @str.16)
|
|
store ptr %call, ptr %alloca, align 8
|
|
%load = load ptr, ptr %alloca, align 8
|
|
%icmp = icmp eq ptr %load, null
|
|
br i1 %icmp, label %if.then.0, label %if.merge.1
|
|
|
|
if.then.0: ; preds = %entry
|
|
call void @print__ct_s354c93d7643e1bdf__pack(ptr @__sx_default_context)
|
|
ret i32 1
|
|
|
|
if.merge.1: ; preds = %entry
|
|
%callN = call ptr @sel_registerName(ptr @str.17)
|
|
store ptr %callN, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %alloca, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%callN = call ptr @class_getMethodImplementation(ptr %loadN, ptr %loadN)
|
|
store ptr %callN, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%icmpN = icmp eq ptr %loadN, null
|
|
br i1 %icmpN, label %if.then.39, label %if.merge.40
|
|
|
|
if.then.39: ; preds = %if.merge.1
|
|
call void @print__ct_sfe783e2b27a4beff__pack(ptr @__sx_default_context)
|
|
ret i32 1
|
|
|
|
if.merge.40: ; preds = %if.merge.1
|
|
%callN = call ptr @sel_registerName(ptr @str.18)
|
|
store ptr %callN, ptr %allocaN, align 8
|
|
store ptr @objc_msgSend, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %alloca, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%icall = call ptr %loadN(ptr %loadN, ptr %loadN)
|
|
store ptr %icall, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%icmpN = icmp eq ptr %loadN, null
|
|
br i1 %icmpN, label %if.then.41, label %if.merge.42
|
|
|
|
if.then.41: ; preds = %if.merge.40
|
|
call void @print__ct_scaebdbbd10c81716__pack(ptr @__sx_default_context)
|
|
ret i32 1
|
|
|
|
if.merge.42: ; preds = %if.merge.40
|
|
%callN = call ptr @sel_registerName(ptr @str.19)
|
|
store ptr %callN, ptr %allocaN, align 8
|
|
store ptr @objc_msgSend, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
call void %loadN(ptr %loadN, ptr %loadN)
|
|
%loadN = load ptr, ptr %alloca, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%icallN = call ptr %loadN(ptr %loadN, ptr %loadN)
|
|
store ptr %icallN, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%icmpN = icmp eq ptr %loadN, null
|
|
br i1 %icmpN, label %if.then.43, label %if.merge.44
|
|
|
|
if.then.43: ; preds = %if.merge.42
|
|
call void @print__ct_s7c1052877b8cc801__pack(ptr @__sx_default_context)
|
|
ret i32 1
|
|
|
|
if.merge.44: ; preds = %if.merge.42
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
call void %loadN(ptr %loadN, ptr %loadN)
|
|
call void @print__ct_sed4e79fbcbd67966__pack(ptr @__sx_default_context)
|
|
ret i32 0
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal ptr @__thunk_CAllocator_Allocator_alloc(ptr %0, ptr %1, i64 %2) #0 {
|
|
entry:
|
|
%call = call ptr @CAllocator.alloc(ptr %0, ptr %1, i64 %2)
|
|
ret ptr %call
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal void @__thunk_CAllocator_Allocator_dealloc(ptr %0, ptr %1, ptr %2) #0 {
|
|
entry:
|
|
call void @CAllocator.dealloc(ptr %0, ptr %1, ptr %2)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal void @print__ct_s354c93d7643e1bdf__pack(ptr %0) #0 {
|
|
entry:
|
|
%alloca = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.20, i64 27 }, ptr %alloca, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
%gep = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 0
|
|
store ptr null, ptr %gep, align 8
|
|
%gepN = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 1
|
|
store i64 0, ptr %gepN, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.21, i64 0 }, ptr %allocaN, align 8
|
|
%load = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%call = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 0, i64 27)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %load, { ptr, i64 } %call)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%str.ptr = extractvalue { ptr, i64 } %loadN, 0
|
|
%str.len = extractvalue { ptr, i64 } %loadN, 1
|
|
%1 = call i64 @write(i32 1, ptr %str.ptr, i64 %str.len)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @__insert_0(ptr %0) #0 {
|
|
entry:
|
|
%call = call { ptr, i64 } @build_format(ptr %0, { ptr, i64 } { ptr @str.22, i64 27 })
|
|
ret { ptr, i64 } %call
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal void @print__ct_sfe783e2b27a4beff__pack(ptr %0) #0 {
|
|
entry:
|
|
%alloca = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.23, i64 26 }, ptr %alloca, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
%gep = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 0
|
|
store ptr null, ptr %gep, align 8
|
|
%gepN = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 1
|
|
store i64 0, ptr %gepN, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.24, i64 0 }, ptr %allocaN, align 8
|
|
%load = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%call = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 0, i64 26)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %load, { ptr, i64 } %call)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%str.ptr = extractvalue { ptr, i64 } %loadN, 0
|
|
%str.len = extractvalue { ptr, i64 } %loadN, 1
|
|
%1 = call i64 @write(i32 1, ptr %str.ptr, i64 %str.len)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @__insert_1(ptr %0) #0 {
|
|
entry:
|
|
%call = call { ptr, i64 } @build_format(ptr %0, { ptr, i64 } { ptr @str.25, i64 26 })
|
|
ret { ptr, i64 } %call
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal void @print__ct_scaebdbbd10c81716__pack(ptr %0) #0 {
|
|
entry:
|
|
%alloca = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.26, i64 27 }, ptr %alloca, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
%gep = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 0
|
|
store ptr null, ptr %gep, align 8
|
|
%gepN = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 1
|
|
store i64 0, ptr %gepN, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.27, i64 0 }, ptr %allocaN, align 8
|
|
%load = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%call = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 0, i64 27)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %load, { ptr, i64 } %call)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%str.ptr = extractvalue { ptr, i64 } %loadN, 0
|
|
%str.len = extractvalue { ptr, i64 } %loadN, 1
|
|
%1 = call i64 @write(i32 1, ptr %str.ptr, i64 %str.len)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @__insert_2(ptr %0) #0 {
|
|
entry:
|
|
%call = call { ptr, i64 } @build_format(ptr %0, { ptr, i64 } { ptr @str.28, i64 27 })
|
|
ret { ptr, i64 } %call
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal void @print__ct_s7c1052877b8cc801__pack(ptr %0) #0 {
|
|
entry:
|
|
%alloca = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.29, i64 35 }, ptr %alloca, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
%gep = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 0
|
|
store ptr null, ptr %gep, align 8
|
|
%gepN = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 1
|
|
store i64 0, ptr %gepN, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.30, i64 0 }, ptr %allocaN, align 8
|
|
%load = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%call = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 0, i64 35)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %load, { ptr, i64 } %call)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%str.ptr = extractvalue { ptr, i64 } %loadN, 0
|
|
%str.len = extractvalue { ptr, i64 } %loadN, 1
|
|
%1 = call i64 @write(i32 1, ptr %str.ptr, i64 %str.len)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @__insert_3(ptr %0) #0 {
|
|
entry:
|
|
%call = call { ptr, i64 } @build_format(ptr %0, { ptr, i64 } { ptr @str.31, i64 35 })
|
|
ret { ptr, i64 } %call
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal void @print__ct_sed4e79fbcbd67966__pack(ptr %0) #0 {
|
|
entry:
|
|
%alloca = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.32, i64 12 }, ptr %alloca, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
%gep = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 0
|
|
store ptr null, ptr %gep, align 8
|
|
%gepN = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 1
|
|
store i64 0, ptr %gepN, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.33, i64 0 }, ptr %allocaN, align 8
|
|
%load = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %alloca, align 8
|
|
%call = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 0, i64 12)
|
|
%callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } %load, { ptr, i64 } %call)
|
|
store { ptr, i64 } %callN, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%str.ptr = extractvalue { ptr, i64 } %loadN, 0
|
|
%str.len = extractvalue { ptr, i64 } %loadN, 1
|
|
%1 = call i64 @write(i32 1, ptr %str.ptr, i64 %str.len)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define internal { ptr, i64 } @__insert_4(ptr %0) #0 {
|
|
entry:
|
|
%call = call { ptr, i64 } @build_format(ptr %0, { ptr, i64 } { ptr @str.34, i64 12 })
|
|
ret { ptr, i64 } %call
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define ptr @__SxFoo_alloc_imp(ptr %0, ptr %1) #0 {
|
|
entry:
|
|
%call = call ptr @class_createInstance(ptr %0, i64 0)
|
|
%load = load { { ptr, ptr, ptr }, ptr }, ptr @__sx_default_context, align 8
|
|
%sg = extractvalue { { ptr, ptr, ptr }, ptr } %load, 0
|
|
%sgN = extractvalue { ptr, ptr, ptr } %sg, 0
|
|
%sgN = extractvalue { ptr, ptr, ptr } %sg, 1
|
|
%icall = call ptr %sgN(ptr @__sx_default_context, ptr %sgN, i64 32)
|
|
%callN = call ptr @memset(ptr %icall, i32 0, i64 32)
|
|
%gep = getelementptr inbounds { { ptr, ptr, ptr }, i32 }, ptr %icall, i32 0, i32 0
|
|
store { ptr, ptr, ptr } %sg, ptr %gep, align 8
|
|
%loadN = load ptr, ptr @__SxFoo_state_ivar, align 8
|
|
call void @object_setIvar(ptr %call, ptr %loadN, ptr %icall)
|
|
ret ptr %call
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define void @__SxFoo_dealloc_imp(ptr %0, ptr %1) #0 {
|
|
entry:
|
|
%load = load ptr, ptr @__SxFoo_state_ivar, align 8
|
|
%call = call ptr @object_getIvar(ptr %0, ptr %load)
|
|
%gep = getelementptr inbounds { { ptr, ptr, ptr }, i32 }, ptr %call, i32 0, i32 0
|
|
%loadN = load { ptr, ptr, ptr }, ptr %gep, align 8
|
|
%sg = extractvalue { ptr, ptr, ptr } %loadN, 0
|
|
%sgN = extractvalue { ptr, ptr, ptr } %loadN, 2
|
|
call void %sgN(ptr @__sx_default_context, ptr %sg, ptr %call)
|
|
call void @object_setIvar(ptr %0, ptr %load, ptr null)
|
|
%alloca = alloca { ptr, ptr }, align 8
|
|
%gepN = getelementptr inbounds { ptr, ptr }, ptr %alloca, i32 0, i32 0
|
|
store ptr %0, ptr %gepN, align 8
|
|
%loadN = load ptr, ptr @__SxFoo_class, align 8
|
|
%gepN = getelementptr inbounds { ptr, ptr }, ptr %alloca, i32 0, i32 1
|
|
store ptr %loadN, ptr %gepN, align 8
|
|
%callN = call ptr @sel_registerName(ptr @__sx_objc_cstr_dealloc)
|
|
call void @objc_msgSendSuper2(ptr %alloca, ptr %callN)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @objc_msgSendSuper2(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
define void @__SxFoo_bump_imp(ptr %0, ptr %1) #0 {
|
|
entry:
|
|
call void @SxFoo.bump(ptr @__sx_default_context, ptr %0)
|
|
ret void
|
|
}
|
|
|
|
declare i64 @write(i32, ptr, i64)
|
|
|
|
declare i8 @class_addIvar(ptr, ptr, i64, i8, ptr)
|
|
|
|
define internal void @__sx_objc_defined_class_init() {
|
|
entry:
|
|
%super_cls = call ptr @objc_getClass(ptr @OBJC_CLASS_NAME_)
|
|
%cls = call ptr @objc_allocateClassPair(ptr %super_cls, ptr @OBJC_CLASS_NAME_.35, i64 0)
|
|
%0 = call i8 @class_addIvar(ptr %cls, ptr @OBJC_IVAR_NAME_, i64 8, i8 3, ptr @OBJC_IVAR_TYPE_)
|
|
%metacls = call ptr @object_getClass(ptr %cls)
|
|
%sel = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_)
|
|
%1 = call i1 @class_addMethod(ptr %cls, ptr %sel, ptr @__SxFoo_bump_imp, ptr @OBJC_METH_VAR_TYPE_)
|
|
call void @objc_registerClassPair(ptr %cls)
|
|
store ptr %cls, ptr @__SxFoo_class, align 8
|
|
%sel_dealloc = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_.36)
|
|
%2 = call i1 @class_addMethod(ptr %cls, ptr %sel_dealloc, ptr @__SxFoo_dealloc_imp, ptr @OBJC_METH_VAR_TYPE_.37)
|
|
%sel_alloc = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_.38)
|
|
%3 = call i1 @class_addMethod(ptr %metacls, ptr %sel_alloc, ptr @__SxFoo_alloc_imp, ptr @OBJC_METH_VAR_TYPE_.39)
|
|
%iv = call ptr @class_getInstanceVariable(ptr %cls, ptr @OBJC_IVAR_NAME_)
|
|
store ptr %iv, ptr @__SxFoo_state_ivar, align 8
|
|
ret void
|
|
}
|