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).
963 lines
38 KiB
Plaintext
963 lines
38 KiB
Plaintext
|
|
@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 }
|
|
@OBJC_SELECTOR_REFERENCES_length = internal global ptr null
|
|
@OBJC_SELECTOR_REFERENCES_addObject_ = internal global ptr null
|
|
@OBJC_SELECTOR_REFERENCES_combine_and_ = internal global ptr null
|
|
@OBJC_SELECTOR_REFERENCES_insert_after_index_ = internal global ptr null
|
|
@OBJC_SELECTOR_REFERENCES_add_observer_for_event_ = internal global ptr null
|
|
@OBJC_SELECTOR_REFERENCES_initWithFrame_options_ = internal global ptr null
|
|
@OBJC_SELECTOR_REFERENCES_actualSelectorName = internal global ptr null
|
|
@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 [9 x i8] c"NSObject\00", align 1
|
|
@str.17 = private unnamed_addr constant [16 x i8] c"SxManglingProbe\00", align 1
|
|
@str.18 = private unnamed_addr constant [7 x i8] c"length\00", align 1
|
|
@str.19 = private unnamed_addr constant [4 x i8] c"i@:\00", align 1
|
|
@str.20 = private unnamed_addr constant [11 x i8] c"addObject:\00", align 1
|
|
@str.21 = private unnamed_addr constant [5 x i8] c"i@:i\00", align 1
|
|
@str.22 = private unnamed_addr constant [13 x i8] c"combine:and:\00", align 1
|
|
@str.23 = private unnamed_addr constant [6 x i8] c"i@:ii\00", align 1
|
|
@str.24 = private unnamed_addr constant [20 x i8] c"insert:after:index:\00", align 1
|
|
@str.25 = private unnamed_addr constant [7 x i8] c"i@:iii\00", align 1
|
|
@str.26 = private unnamed_addr constant [24 x i8] c"add:observer:for:event:\00", align 1
|
|
@str.27 = private unnamed_addr constant [8 x i8] c"i@:iiii\00", align 1
|
|
@str.28 = private unnamed_addr constant [23 x i8] c"initWithFrame:options:\00", align 1
|
|
@str.29 = private unnamed_addr constant [6 x i8] c"i@:ii\00", align 1
|
|
@str.30 = private unnamed_addr constant [19 x i8] c"actualSelectorName\00", align 1
|
|
@str.31 = private unnamed_addr constant [4 x i8] c"i@:\00", align 1
|
|
@str.32 = private unnamed_addr constant [19 x i8] c"mangling table OK\0A\00", align 1
|
|
@str.33 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
|
|
@str.34 = private unnamed_addr constant [19 x i8] c"mangling table OK\0A\00", align 1
|
|
@OBJC_METH_VAR_NAME_ = private unnamed_addr constant [7 x i8] c"length\00"
|
|
@OBJC_METH_VAR_NAME_.35 = private unnamed_addr constant [11 x i8] c"addObject:\00"
|
|
@OBJC_METH_VAR_NAME_.36 = private unnamed_addr constant [13 x i8] c"combine:and:\00"
|
|
@OBJC_METH_VAR_NAME_.37 = private unnamed_addr constant [20 x i8] c"insert:after:index:\00"
|
|
@OBJC_METH_VAR_NAME_.38 = private unnamed_addr constant [24 x i8] c"add:observer:for:event:\00"
|
|
@OBJC_METH_VAR_NAME_.39 = private unnamed_addr constant [23 x i8] c"initWithFrame:options:\00"
|
|
@OBJC_METH_VAR_NAME_.40 = private unnamed_addr constant [19 x i8] c"actualSelectorName\00"
|
|
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__sx_objc_selector_init, ptr null }]
|
|
|
|
; 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.14, label %if.merge.15
|
|
|
|
if.then.14: ; preds = %entry
|
|
ret { ptr, i64 } { ptr @str, i64 1 }
|
|
|
|
if.merge.15: ; 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.16
|
|
|
|
while.hdr.16: ; preds = %if.merge.20, %if.merge.15
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%icmpN = icmp ne i64 %loadN, 0
|
|
br i1 %icmpN, label %while.body.17, label %while.exit.18
|
|
|
|
while.body.17: ; preds = %while.hdr.16
|
|
%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.19, label %if.merge.20
|
|
|
|
while.exit.18: ; preds = %while.hdr.16
|
|
%loadN = load i1, ptr %allocaN, align 1
|
|
br i1 %loadN, label %if.then.21, label %if.merge.22
|
|
|
|
if.then.19: ; preds = %while.body.17
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%sub = sub i64 0, %loadN
|
|
store i64 %sub, ptr %allocaN, align 8
|
|
br label %if.merge.20
|
|
|
|
if.merge.20: ; preds = %if.then.19, %while.body.17
|
|
%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.16
|
|
|
|
if.then.21: ; preds = %while.exit.18
|
|
%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.22
|
|
|
|
if.merge.22: ; preds = %if.then.21, %while.exit.18
|
|
%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.0
|
|
|
|
while.hdr.0: ; preds = %if.merge.5, %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.1, label %while.exit.2
|
|
|
|
while.body.1: ; preds = %while.hdr.0
|
|
%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.3, label %if.else.4
|
|
|
|
while.exit.2: ; preds = %while.hdr.0
|
|
%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.35, label %if.merge.36
|
|
|
|
if.then.3: ; preds = %while.body.1
|
|
%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.6, label %if.else.7
|
|
|
|
if.else.4: ; preds = %while.body.1
|
|
%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.26, label %if.else.27
|
|
|
|
if.merge.5: ; preds = %if.merge.28, %if.merge.8
|
|
br label %while.hdr.0
|
|
|
|
if.then.6: ; preds = %if.then.3
|
|
%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.9, label %if.else.10
|
|
|
|
if.else.7: ; preds = %if.then.3
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.8
|
|
|
|
if.merge.8: ; preds = %if.merge.11, %if.else.7
|
|
br label %if.merge.5
|
|
|
|
if.then.9: ; preds = %if.then.6
|
|
%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.12, label %if.merge.13
|
|
|
|
if.else.10: ; preds = %if.then.6
|
|
%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.23, label %if.else.24
|
|
|
|
if.merge.11: ; preds = %if.merge.25, %if.merge.13
|
|
br label %if.merge.8
|
|
|
|
if.then.12: ; preds = %if.then.9
|
|
%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.13
|
|
|
|
if.merge.13: ; preds = %if.then.12, %if.then.9
|
|
%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.11
|
|
|
|
if.then.23: ; preds = %if.else.10
|
|
%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.25
|
|
|
|
if.else.24: ; preds = %if.else.10
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.25
|
|
|
|
if.merge.25: ; preds = %if.else.24, %if.then.23
|
|
br label %if.merge.11
|
|
|
|
if.then.26: ; preds = %if.else.4
|
|
%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.29, label %if.else.30
|
|
|
|
if.else.27: ; preds = %if.else.4
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.28
|
|
|
|
if.merge.28: ; preds = %if.merge.31, %if.else.27
|
|
br label %if.merge.5
|
|
|
|
if.then.29: ; preds = %if.then.26
|
|
%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.32, label %if.else.33
|
|
|
|
if.else.30: ; preds = %if.then.26
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.31
|
|
|
|
if.merge.31: ; preds = %if.merge.34, %if.else.30
|
|
br label %if.merge.28
|
|
|
|
if.then.32: ; preds = %if.then.29
|
|
%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.34
|
|
|
|
if.else.33: ; preds = %if.then.29
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.34
|
|
|
|
if.merge.34: ; preds = %if.else.33, %if.then.32
|
|
br label %if.merge.31
|
|
|
|
if.then.35: ; preds = %while.exit.2
|
|
%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.36
|
|
|
|
if.merge.36: ; preds = %if.then.35, %while.exit.2
|
|
%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
|
|
define internal i32 @universal_imp(ptr %0, ptr %1, i32 %2, i32 %3, i32 %4, i32 %5) #0 {
|
|
entry:
|
|
%alloca = alloca ptr, align 8
|
|
store ptr %0, ptr %alloca, align 8
|
|
%allocaN = alloca ptr, align 8
|
|
store ptr %1, ptr %allocaN, align 8
|
|
%allocaN = alloca i32, align 4
|
|
store i32 %2, ptr %allocaN, align 4
|
|
%allocaN = alloca i32, align 4
|
|
store i32 %3, ptr %allocaN, align 4
|
|
%allocaN = alloca i32, align 4
|
|
store i32 %4, ptr %allocaN, align 4
|
|
%allocaN = alloca i32, align 4
|
|
store i32 %5, ptr %allocaN, align 4
|
|
%load = load i32, ptr %allocaN, align 4
|
|
%loadN = load i32, ptr %allocaN, align 4
|
|
%add = add i32 %load, %loadN
|
|
%loadN = load i32, ptr %allocaN, align 4
|
|
%addN = add i32 %add, %loadN
|
|
%loadN = load i32, ptr %allocaN, align 4
|
|
%addN = add i32 %addN, %loadN
|
|
ret i32 %addN
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define i32 @main() #0 {
|
|
entry:
|
|
call void @__sx_objc_selector_init()
|
|
%call = call ptr @objc_getClass(ptr @str.16)
|
|
%alloca = alloca ptr, align 8
|
|
store ptr %call, ptr %alloca, align 8
|
|
%load = load ptr, ptr %alloca, align 8
|
|
%callN = call ptr @objc_allocateClassPair(ptr %load, ptr @str.17, i64 0)
|
|
%allocaN = alloca ptr, align 8
|
|
store ptr %callN, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%callN = call ptr @sel_registerName(ptr @str.18)
|
|
%callN = call i1 @class_addMethod(ptr %loadN, ptr %callN, ptr @universal_imp, ptr @str.19)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%callN = call ptr @sel_registerName(ptr @str.20)
|
|
%callN = call i1 @class_addMethod(ptr %loadN, ptr %callN, ptr @universal_imp, ptr @str.21)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%callN = call ptr @sel_registerName(ptr @str.22)
|
|
%callN = call i1 @class_addMethod(ptr %loadN, ptr %callN, ptr @universal_imp, ptr @str.23)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%callN = call ptr @sel_registerName(ptr @str.24)
|
|
%callN = call i1 @class_addMethod(ptr %loadN, ptr %callN, ptr @universal_imp, ptr @str.25)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%callN = call ptr @sel_registerName(ptr @str.26)
|
|
%callN = call i1 @class_addMethod(ptr %loadN, ptr %callN, ptr @universal_imp, ptr @str.27)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%callN = call ptr @sel_registerName(ptr @str.28)
|
|
%callN = call i1 @class_addMethod(ptr %loadN, ptr %callN, ptr @universal_imp, ptr @str.29)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%callN = call ptr @sel_registerName(ptr @str.30)
|
|
%callN = call i1 @class_addMethod(ptr %loadN, ptr %callN, ptr @universal_imp, ptr @str.31)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
call void @objc_registerClassPair(ptr %loadN)
|
|
%allocaN = alloca ptr, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%callN = call ptr @class_createInstance(ptr %loadN, i64 0)
|
|
store ptr %callN, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr @OBJC_SELECTOR_REFERENCES_length, align 8
|
|
%objc.msg = call i32 @objc_msgSend(ptr %loadN, ptr %loadN)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr @OBJC_SELECTOR_REFERENCES_addObject_, align 8
|
|
%objc.msg32 = call i32 @objc_msgSend(ptr %loadN, ptr %loadN, i32 1)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr @OBJC_SELECTOR_REFERENCES_combine_and_, align 8
|
|
%objc.msg35 = call i32 @objc_msgSend(ptr %loadN, ptr %loadN, i32 1, i32 2)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr @OBJC_SELECTOR_REFERENCES_insert_after_index_, align 8
|
|
%objc.msg38 = call i32 @objc_msgSend(ptr %loadN, ptr %loadN, i32 1, i32 2, i32 3)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr @OBJC_SELECTOR_REFERENCES_add_observer_for_event_, align 8
|
|
%objc.msg41 = call i32 @objc_msgSend(ptr %loadN, ptr %loadN, i32 1, i32 2, i32 3, i32 4)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr @OBJC_SELECTOR_REFERENCES_initWithFrame_options_, align 8
|
|
%objc.msg44 = call i32 @objc_msgSend(ptr %loadN, ptr %loadN, i32 1, i32 2)
|
|
%loadN = load ptr, ptr %allocaN, align 8
|
|
%loadN = load ptr, ptr @OBJC_SELECTOR_REFERENCES_actualSelectorName, align 8
|
|
%objc.msg47 = call i32 @objc_msgSend(ptr %loadN, ptr %loadN)
|
|
call void @print__ct_s4c1a58a7c89bfbba__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_s4c1a58a7c89bfbba__pack(ptr %0) #0 {
|
|
entry:
|
|
%alloca = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.32, i64 18 }, 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 18)
|
|
%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.34, i64 18 })
|
|
ret { ptr, i64 } %call
|
|
}
|
|
|
|
declare i64 @write(i32, ptr, i64)
|
|
|
|
define internal void @__sx_objc_selector_init() {
|
|
entry:
|
|
%sel = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_)
|
|
store ptr %sel, ptr @OBJC_SELECTOR_REFERENCES_length, align 8
|
|
%selN = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_.35)
|
|
store ptr %selN, ptr @OBJC_SELECTOR_REFERENCES_addObject_, align 8
|
|
%selN = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_.36)
|
|
store ptr %selN, ptr @OBJC_SELECTOR_REFERENCES_combine_and_, align 8
|
|
%selN = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_.37)
|
|
store ptr %selN, ptr @OBJC_SELECTOR_REFERENCES_insert_after_index_, align 8
|
|
%selN = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_.38)
|
|
store ptr %selN, ptr @OBJC_SELECTOR_REFERENCES_add_observer_for_event_, align 8
|
|
%selN = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_.39)
|
|
store ptr %selN, ptr @OBJC_SELECTOR_REFERENCES_initWithFrame_options_, align 8
|
|
%selN = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_.40)
|
|
store ptr %selN, ptr @OBJC_SELECTOR_REFERENCES_actualSelectorName, align 8
|
|
ret void
|
|
}
|