Closes the optional-through-Any gap that test 178 pinned. Stdlib (`library/modules/std.sx`): - New `optional_to_string :: (o: $T) -> string` returns `"null"` when the optional is None, otherwise recurses through `any_to_string` on the unwrapped inner value. Per-shape monomorphisation re-emits this for each concrete `?T`. - `any_to_string` grows a `case optional:` arm that dispatches through `cast(type) val` (same shape as `case struct:` etc.). The cast picks up the dynamic optional type from the Any tag. Compiler (`src/ir/lower.zig`): - `resolveTypeCategoryTags` recognises "optional" as a dynamic category, scanning the TypeTable for `info == .optional`. The type-switch dispatch then routes any ?T tag into the optional arm. IR snapshots regenerated where the optional addition shifted constant pool / string numbering: 142, ffi-objc-call-06, ffi-objc-dsl-07. 218/218 (test 178 included). The variadic auto-unwrap in `packVariadicCallArgs` stays in place — direct `print(opt)` calls still flow through it. The new arm closes the gap for struct fields, slice elements, and any other path that boxes an optional before stringifying.
956 lines
38 KiB
Plaintext
956 lines
38 KiB
Plaintext
|
|
@OS = internal global i64 0
|
|
@ARCH = internal global i64 0
|
|
@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
|
|
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
|
|
%allocaN = alloca i1, align 1
|
|
store i1 %icmpN, ptr %allocaN, align 1
|
|
%loadN = load i1, ptr %allocaN, align 1
|
|
br i1 %loadN, label %if.then.16, label %if.else.17
|
|
|
|
if.then.16: ; preds = %if.merge.15
|
|
%loadN = load i64, ptr %alloca, align 8
|
|
%sub = sub i64 0, %loadN
|
|
br label %if.merge.18
|
|
|
|
if.else.17: ; preds = %if.merge.15
|
|
%loadN = load i64, ptr %alloca, align 8
|
|
br label %if.merge.18
|
|
|
|
if.merge.18: ; preds = %if.else.17, %if.then.16
|
|
%bp = phi i64 [ %sub, %if.then.16 ], [ %loadN, %if.else.17 ]
|
|
%allocaN = alloca i64, align 8
|
|
store i64 %bp, ptr %allocaN, align 8
|
|
%call = call { ptr, i64 } @cstring(ptr %0, i64 20)
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } %call, ptr %allocaN, align 8
|
|
%allocaN = alloca i64, align 8
|
|
store i64 19, ptr %allocaN, align 8
|
|
br label %while.hdr.19
|
|
|
|
while.hdr.19: ; preds = %while.body.20, %if.merge.18
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%icmpN = icmp sgt i64 %loadN, 0
|
|
br i1 %icmpN, label %while.body.20, label %while.exit.21
|
|
|
|
while.body.20: ; preds = %while.hdr.19
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%srem = srem i64 %loadN, 10
|
|
%add = add i64 %srem, 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.19
|
|
|
|
while.exit.21: ; preds = %while.hdr.19
|
|
%loadN = load i1, ptr %allocaN, align 1
|
|
br i1 %loadN, label %if.then.22, label %if.merge.23
|
|
|
|
if.then.22: ; preds = %while.exit.21
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%igp.data21 = extractvalue { ptr, i64 } %loadN, 0
|
|
%igp.ptr22 = getelementptr i8, ptr %igp.data21, i64 %loadN
|
|
store i8 45, ptr %igp.ptr22, 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.23
|
|
|
|
if.merge.23: ; preds = %if.then.22, %while.exit.21
|
|
%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 20, %loadN
|
|
%subN = sub i64 %subN, 1
|
|
%callN = call { ptr, i64 } @substr(ptr %0, { ptr, i64 } %loadN, i64 %addN, i64 %subN)
|
|
ret { ptr, i64 } %callN
|
|
}
|
|
|
|
; 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 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.36, label %if.merge.37
|
|
|
|
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.27, label %if.else.28
|
|
|
|
if.merge.5: ; preds = %if.merge.29, %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.24, label %if.else.25
|
|
|
|
if.merge.11: ; preds = %if.merge.26, %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.24: ; 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.26
|
|
|
|
if.else.25: ; 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.26
|
|
|
|
if.merge.26: ; preds = %if.else.25, %if.then.24
|
|
br label %if.merge.11
|
|
|
|
if.then.27: ; 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.30, label %if.else.31
|
|
|
|
if.else.28: ; 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.29
|
|
|
|
if.merge.29: ; preds = %if.merge.32, %if.else.28
|
|
br label %if.merge.5
|
|
|
|
if.then.30: ; preds = %if.then.27
|
|
%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.33, label %if.else.34
|
|
|
|
if.else.31: ; preds = %if.then.27
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.32
|
|
|
|
if.merge.32: ; preds = %if.merge.35, %if.else.31
|
|
br label %if.merge.29
|
|
|
|
if.then.33: ; preds = %if.then.30
|
|
%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.35
|
|
|
|
if.else.34: ; preds = %if.then.30
|
|
%loadN = load i64, ptr %allocaN, align 8
|
|
%addN = add i64 %loadN, 1
|
|
store i64 %addN, ptr %allocaN, align 8
|
|
br label %if.merge.35
|
|
|
|
if.merge.35: ; preds = %if.else.34, %if.then.33
|
|
br label %if.merge.32
|
|
|
|
if.then.36: ; 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.37
|
|
|
|
if.merge.37: ; preds = %if.then.36, %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 @ns_string(ptr, ptr) #0
|
|
|
|
; Function Attrs: nounwind
|
|
declare ptr @c_string(ptr, 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)
|
|
%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.32, i64 18 }, ptr %allocaN, align 8
|
|
%allocaN = alloca { ptr, i64 }, align 8
|
|
store { ptr, i64 } { ptr @str.33, i64 0 }, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
|
|
%callN = call { ptr, i64 } @substr(ptr @__sx_default_context, { ptr, i64 } %loadN, i64 0, i64 18)
|
|
%callN = call { ptr, i64 } @concat(ptr @__sx_default_context, { ptr, i64 } %loadN, { ptr, i64 } %callN)
|
|
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
|
|
%0 = call i64 @write(i32 1, ptr %str.ptr, i64 %str.len)
|
|
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 { 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
|
|
}
|