Files
sx/examples/expected/1314-ffi-objc-class-dealloc-roundtrip.ir
agra 8908e78943 lang: array-typed '::' consts as immutable globals (PLAN-CONST-AGG step 1)
K : [4]s64 : .[...] and the untyped A :: .[1, 2, 3] register as
is_const globals: one storage, reads GEP it, dead-global elimination
drops unused ones, source-aware reads come free via selectGlobalAuthor.

- registerConstArrayGlobal (scanDecls pass 2): typed via the annotation
  (array-ness + dimension/count checked), untyped via element-type
  unification — all ints s64; ANY float promotes the element type to
  f64 with ints converting exactly; bool/string homogeneous; a
  non-numeric mix or non-inferable element asks for an annotation.
- constExprValue converts int elements into float destinations exactly
  (the int+float promotion rule, element-wise).
- emitGlobals marks is_const globals LLVMSetGlobalConstant — also flips
  the comptime-backed #run globals and __sx_default_context to
  'constant' (37 pinned IR snapshots regenerated; runtime unchanged).
- Element shapes: nested arrays, struct elements, strings, bools.
  Non-constant elements / dim mismatch / mixed types diagnose loudly.

Examples: 0177 (feature matrix incl. @K reads through *[4]s64 — needs
the 0117 fix), 1159/1160/1161 (diagnostics), 0837 repointed to values.
2026-06-11 12:26:26 +03:00

1952 lines
65 KiB
Plaintext

@__SxFoo_state_ivar = internal global ptr null
@__SxFoo_class = internal global ptr null
@__sx_default_context = internal constant { { 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 constant [8 x i8] c"dealloc\00"
@str = private unnamed_addr constant [2 x i8] c"0\00", align 1
@str.162 = private unnamed_addr constant [15 x i8] c"result := \22\22; \00", align 1
@str.163 = private unnamed_addr constant [37 x i8] c"result = concat(result, substr(fmt, \00", align 1
@str.164 = private unnamed_addr constant [3 x i8] c", \00", align 1
@str.165 = private unnamed_addr constant [5 x i8] c")); \00", align 1
@str.166 = private unnamed_addr constant [44 x i8] c"result = concat(result, any_to_string(args[\00", align 1
@str.167 = private unnamed_addr constant [6 x i8] c"])); \00", align 1
@str.168 = private unnamed_addr constant [37 x i8] c"result = concat(result, substr(fmt, \00", align 1
@str.169 = private unnamed_addr constant [3 x i8] c", \00", align 1
@str.170 = private unnamed_addr constant [5 x i8] c")); \00", align 1
@str.171 = private unnamed_addr constant [37 x i8] c"result = concat(result, substr(fmt, \00", align 1
@str.172 = private unnamed_addr constant [3 x i8] c", \00", align 1
@str.173 = private unnamed_addr constant [5 x i8] c")); \00", align 1
@str.174 = private unnamed_addr constant [37 x i8] c"result = concat(result, substr(fmt, \00", align 1
@str.175 = private unnamed_addr constant [3 x i8] c", \00", align 1
@str.176 = private unnamed_addr constant [5 x i8] c")); \00", align 1
@str.177 = private unnamed_addr constant [6 x i8] c"SxFoo\00", align 1
@str.178 = private unnamed_addr constant [8 x i8] c"dealloc\00", align 1
@str.179 = private unnamed_addr constant [6 x i8] c"alloc\00", align 1
@str.180 = private unnamed_addr constant [8 x i8] c"release\00", align 1
@str.181 = private unnamed_addr constant [28 x i8] c"FAIL: SxFoo not registered\0A\00", align 1
@str.182 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
@str.183 = private unnamed_addr constant [28 x i8] c"FAIL: SxFoo not registered\0A\00", align 1
@str.184 = private unnamed_addr constant [27 x i8] c"FAIL: dealloc IMP missing\0A\00", align 1
@str.185 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
@str.186 = private unnamed_addr constant [27 x i8] c"FAIL: dealloc IMP missing\0A\00", align 1
@str.187 = private unnamed_addr constant [28 x i8] c"FAIL: +alloc returned null\0A\00", align 1
@str.188 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
@str.189 = private unnamed_addr constant [28 x i8] c"FAIL: +alloc returned null\0A\00", align 1
@str.190 = private unnamed_addr constant [36 x i8] c"FAIL: +alloc round 2 returned null\0A\00", align 1
@str.191 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
@str.192 = private unnamed_addr constant [36 x i8] c"FAIL: +alloc round 2 returned null\0A\00", align 1
@str.193 = private unnamed_addr constant [13 x i8] c"dealloc: ok\0A\00", align 1
@str.194 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1
@str.195 = 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_.196 = 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_.197 = private unnamed_addr constant [8 x i8] c"dealloc\00"
@OBJC_METH_VAR_TYPE_.198 = private unnamed_addr constant [4 x i8] c"v@:\00"
@OBJC_METH_VAR_NAME_.199 = private unnamed_addr constant [6 x i8] c"alloc\00"
@OBJC_METH_VAR_TYPE_.200 = 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 @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.162, 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.163, 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.164, 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.165, 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.166, 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.167, 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.168, 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.169, 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.170, 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.171, 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.172, 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.173, 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.174, 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.175, 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.176, 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 ptr @CAllocator.alloc.1(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @CAllocator.dealloc.2(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @GPA.init.3(ptr) #0
; Function Attrs: nounwind
declare ptr @GPA.alloc.4(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @GPA.dealloc.5(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @Arena.add_chunk.6(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.init.7(ptr sret({ ptr, i64, { ptr, ptr, ptr } }), ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.reset.8(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Arena.deinit.9(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @Arena.alloc.10(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.dealloc.11(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @BufAlloc.init.12(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @BufAlloc.reset.13(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @BufAlloc.alloc.14(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @BufAlloc.dealloc.15(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.init.16(ptr sret({ { ptr, ptr, ptr }, i64, i64, i64 }), ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @TrackingAllocator.leak_count.17(ptr, ptr) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.report.18(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @TrackingAllocator.alloc.19(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.dealloc.20(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @escape(ptr, ptr) #0
declare i64 @write(i32, ptr, i64)
; Function Attrs: nounwind
declare void @log_emit(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @open(ptr, i32, ...) #0
; Function Attrs: nounwind
declare i32 @close(i32) #0
; Function Attrs: nounwind
declare i64 @read(i32, ptr, i64) #0
; Function Attrs: nounwind
declare i64 @lseek(i32, i64, i32) #0
; Function Attrs: nounwind
declare i32 @unlink(ptr) #0
; Function Attrs: nounwind
declare i32 @rmdir(ptr) #0
; Function Attrs: nounwind
declare i32 @mkdir(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @access(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @chmod(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @rename(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @File.is_valid(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @File.close(ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.read(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.write(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.seek(ptr, ptr, i64, i64) #0
; Function Attrs: nounwind
declare i32 @mode_to_flags(ptr, i64) #0
; Function Attrs: nounwind
declare i64 @open_file(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @read_file(ptr sret({ { ptr, i64 }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @write_file(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @append_file(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @exists(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_file(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_dir(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @set_mode(ptr, ptr, i32) #0
; Function Attrs: nounwind
declare i1 @move(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir_all(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @copy_file(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @basename(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @dirname(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @spaces(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @sx_trace_len() #0
; Function Attrs: nounwind
declare i32 @sx_trace_truncated() #0
; Function Attrs: nounwind
declare i64 @sx_trace_frame_at(i32) #0
; Function Attrs: nounwind
declare ptr @to_string(ptr) #0
; Function Attrs: nounwind
declare void @print_current(ptr) #0
; Function Attrs: nounwind
declare void @print_interpreter_frames(ptr) #0
; Function Attrs: nounwind
declare ptr @popen(ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @pclose(ptr) #0
; Function Attrs: nounwind
declare i64 @fread(ptr, i64, i64, ptr) #0
; Function Attrs: nounwind
declare i32 @feof(ptr) #0
; Function Attrs: nounwind
declare ptr @getenv(ptr) #0
; Function Attrs: nounwind
declare i64 @strlen(ptr) #0
; Function Attrs: nounwind
declare i32 @system(ptr) #0
; Function Attrs: nounwind
declare void @run(ptr sret({ { i32, { ptr, i64 } }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @env(ptr sret({ { ptr, i64 }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @find_executable(ptr sret({ { ptr, i64 }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @_exit(i32) #0
; Function Attrs: nounwind
declare void @exit(ptr, i8, ptr) #0
; Function Attrs: nounwind
declare void @assert(ptr, i1, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @socket(i32, i32, i32) #0
; Function Attrs: nounwind
declare i32 @setsockopt(i32, i32, i32, ptr, i32) #0
; Function Attrs: nounwind
declare i32 @bind(i32, ptr, i32) #0
; Function Attrs: nounwind
declare i32 @listen(i32, i32) #0
; Function Attrs: nounwind
declare i32 @accept(i32, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @read.21(i32, ptr, i64) #0
; Function Attrs: nounwind
declare i32 @close.22(i32) #0
; Function Attrs: nounwind
declare i16 @htons(ptr, i64) #0
; Function Attrs: nounwind
declare ptr @CAllocator.alloc.23(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @CAllocator.dealloc.24(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @GPA.init.25(ptr) #0
; Function Attrs: nounwind
declare ptr @GPA.alloc.26(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @GPA.dealloc.27(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @Arena.add_chunk.28(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.init.29(ptr sret({ ptr, i64, { ptr, ptr, ptr } }), ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.reset.30(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Arena.deinit.31(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @Arena.alloc.32(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.dealloc.33(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @BufAlloc.init.34(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @BufAlloc.reset.35(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @BufAlloc.alloc.36(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @BufAlloc.dealloc.37(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.init.38(ptr sret({ { ptr, ptr, ptr }, i64, i64, i64 }), ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @TrackingAllocator.leak_count.39(ptr, ptr) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.report.40(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @TrackingAllocator.alloc.41(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.dealloc.42(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @open.43(ptr, i32, ...) #0
; Function Attrs: nounwind
declare i32 @close.44(i32) #0
; Function Attrs: nounwind
declare i64 @read.45(i32, ptr, i64) #0
; Function Attrs: nounwind
declare i64 @lseek.46(i32, i64, i32) #0
; Function Attrs: nounwind
declare i32 @unlink.47(ptr) #0
; Function Attrs: nounwind
declare i32 @rmdir.48(ptr) #0
; Function Attrs: nounwind
declare i32 @mkdir.49(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @access.50(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @chmod.51(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @rename.52(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @File.is_valid.53(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @File.close.54(ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.read.55(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.write.56(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.seek.57(ptr, ptr, i64, i64) #0
; Function Attrs: nounwind
declare i32 @mode_to_flags.58(ptr, i64) #0
; Function Attrs: nounwind
declare i64 @open_file.59(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @read_file.60(ptr sret({ { ptr, i64 }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @write_file.61(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @append_file.62(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @exists.63(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_file.64(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_dir.65(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir.66(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @set_mode.67(ptr, ptr, i32) #0
; Function Attrs: nounwind
declare i1 @move.68(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir_all.69(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @copy_file.70(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @basename.71(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @dirname.72(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Array.add(ptr, ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @Array.deinit(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @Object.put(ptr, ptr, ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @Object.deinit(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @Sink.put_byte(ptr, ptr, i8) #0
; Function Attrs: nounwind
declare i32 @Sink.put(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @Sink.flush(ptr, ptr) #0
; Function Attrs: nounwind
declare i8 @hex_digit(ptr, i64) #0
; Function Attrs: nounwind
declare i32 @write_u_escape(ptr, i8, ptr) #0
; Function Attrs: nounwind
declare i32 @write_string(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @write_int(ptr, i64, ptr) #0
; Function Attrs: nounwind
declare i32 @write_value(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @write_array(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @write_object(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare [2 x i64] @write_to_buffer(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @write_to_file(ptr, ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare [2 x i64] @hex_value(ptr, i8) #0
; Function Attrs: nounwind
declare i64 @encode_utf8(ptr, i64, ptr) #0
; Function Attrs: nounwind
declare void @Parser.skip_ws(ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @Parser.expect_lit(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare [2 x i64] @Parser.read_hex4(ptr, ptr, i64, i64) #0
; Function Attrs: nounwind
declare [2 x i64] @Parser.decode_into(ptr, ptr, i64, i64, ptr) #0
; Function Attrs: nounwind
declare void @Parser.parse_string(ptr sret({ { ptr, i64 }, i32 }), ptr, ptr) #0
; Function Attrs: nounwind
declare [2 x i64] @Parser.parse_number(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Parser.parse_array(ptr sret({ { i64, [24 x i8] }, i32 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @Parser.parse_object(ptr sret({ { i64, [24 x i8] }, i32 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @Parser.parse_value(ptr sret({ { i64, [24 x i8] }, i32 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @parse(ptr sret({ { i64, [24 x i8] }, i32 }), ptr, ptr, ptr) #0
; 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 @spaces.73(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @sx_trace_len.74() #0
; Function Attrs: nounwind
declare i32 @sx_trace_truncated.75() #0
; Function Attrs: nounwind
declare i64 @sx_trace_frame_at.76(i32) #0
; Function Attrs: nounwind
declare ptr @to_string.77(ptr) #0
; Function Attrs: nounwind
declare void @print_current.78(ptr) #0
; Function Attrs: nounwind
declare void @print_interpreter_frames.79(ptr) #0
; Function Attrs: nounwind
declare ptr @popen.80(ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @pclose.81(ptr) #0
; Function Attrs: nounwind
declare i64 @fread.82(ptr, i64, i64, ptr) #0
; Function Attrs: nounwind
declare i32 @feof.83(ptr) #0
; Function Attrs: nounwind
declare ptr @getenv.84(ptr) #0
; Function Attrs: nounwind
declare i64 @strlen.85(ptr) #0
; Function Attrs: nounwind
declare i32 @system.86(ptr) #0
; Function Attrs: nounwind
declare void @run.87(ptr sret({ { i32, { ptr, i64 } }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @env.88(ptr sret({ { ptr, i64 }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @find_executable.89(ptr sret({ { ptr, i64 }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @_exit.90(i32) #0
; Function Attrs: nounwind
declare void @exit.91(ptr, i8, ptr) #0
; Function Attrs: nounwind
declare void @assert.92(ptr, i1, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @_NSGetArgv() #0
; Function Attrs: nounwind
declare ptr @_NSGetArgc() #0
; Function Attrs: nounwind
declare void @exit_ok(ptr) #0
; Function Attrs: nounwind
declare void @exit_usage(ptr) #0
; Function Attrs: nounwind
declare i64 @os_argc(ptr) #0
; Function Attrs: nounwind
declare ptr @os_args(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @Parsed.is_set(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @Parsed.value_of(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @is_long_flag(ptr, ptr) #0
; Function Attrs: nounwind
declare void @parse.93(ptr sret({ { { ptr, i64 }, { ptr, i64 }, i64, i1, { ptr, i64 }, { ptr, i64 }, [16 x { i1, { ptr, i64 } }] }, i32 }), ptr, ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @open.94(ptr, i32, ...) #0
; Function Attrs: nounwind
declare i32 @close.95(i32) #0
; Function Attrs: nounwind
declare i64 @read.96(i32, ptr, i64) #0
; Function Attrs: nounwind
declare i64 @lseek.97(i32, i64, i32) #0
; Function Attrs: nounwind
declare i32 @unlink.98(ptr) #0
; Function Attrs: nounwind
declare i32 @rmdir.99(ptr) #0
; Function Attrs: nounwind
declare i32 @mkdir.100(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @access.101(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @chmod.102(ptr, i32) #0
; Function Attrs: nounwind
declare i32 @rename.103(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @File.is_valid.104(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @File.close.105(ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.read.106(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.write.107(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.seek.108(ptr, ptr, i64, i64) #0
; Function Attrs: nounwind
declare i32 @mode_to_flags.109(ptr, i64) #0
; Function Attrs: nounwind
declare i64 @open_file.110(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @read_file.111(ptr sret({ { ptr, i64 }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @write_file.112(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @append_file.113(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @exists.114(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_file.115(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_dir.116(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir.117(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @set_mode.118(ptr, ptr, i32) #0
; Function Attrs: nounwind
declare i1 @move.119(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir_all.120(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @copy_file.121(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @basename.122(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @dirname.123(ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @rotr(ptr, i64, i64) #0
; Function Attrs: nounwind
declare i64 @big_sigma0(ptr, i64) #0
; Function Attrs: nounwind
declare i64 @big_sigma1(ptr, i64) #0
; Function Attrs: nounwind
declare i64 @small_sigma0(ptr, i64) #0
; Function Attrs: nounwind
declare i64 @small_sigma1(ptr, i64) #0
; Function Attrs: nounwind
declare void @Sha256.process_block(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Sha256.update(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare [64 x i8] @Sha256.final(ptr, ptr) #0
; Function Attrs: nounwind
declare i8 @nibble_hex(ptr, i64) #0
; Function Attrs: nounwind
declare void @init(ptr sret({ [8 x i64], [64 x i8], i64, i64 }), ptr) #0
; Function Attrs: nounwind
declare [64 x i8] @sha256_hex(ptr, ptr) #0
; Function Attrs: nounwind
declare void @sha256_file(ptr sret({ [64 x i8], i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare void @assert.124(ptr, i1) #0
; Function Attrs: nounwind
declare void @BuildOptions.add_link_flag.125(i64, ptr) #0
; Function Attrs: nounwind
declare void @BuildOptions.add_framework.126(i64, ptr) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_output_path.127(i64, ptr) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_wasm_shell.128(i64, ptr) #0
; Function Attrs: nounwind
declare void @BuildOptions.add_asset_dir.129(i64, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @BuildOptions.asset_dir_count.130(i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.asset_dir_src_at.131(i64, i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.asset_dir_dest_at.132(i64, i64) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_post_link_callback.133(i64, ptr) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_post_link_module.134(i64, ptr) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.binary_path.135(i64) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_bundle_path.136(i64, ptr) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_bundle_id.137(i64, ptr) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_codesign_identity.138(i64, ptr) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_provisioning_profile.139(i64, ptr) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.bundle_path.140(i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.bundle_id.141(i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.codesign_identity.142(i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.provisioning_profile.143(i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.target_triple.144(i64) #0
; Function Attrs: nounwind
declare i1 @BuildOptions.is_macos.145(i64) #0
; Function Attrs: nounwind
declare i1 @BuildOptions.is_ios.146(i64) #0
; Function Attrs: nounwind
declare i1 @BuildOptions.is_ios_device.147(i64) #0
; Function Attrs: nounwind
declare i1 @BuildOptions.is_ios_simulator.148(i64) #0
; Function Attrs: nounwind
declare i1 @BuildOptions.is_android.149(i64) #0
; Function Attrs: nounwind
declare i64 @BuildOptions.framework_count.150(i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.framework_at.151(i64, i64) #0
; Function Attrs: nounwind
declare i64 @BuildOptions.framework_path_count.152(i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.framework_path_at.153(i64, i64) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_manifest_path.154(i64, ptr) #0
; Function Attrs: nounwind
declare void @BuildOptions.set_keystore_path.155(i64, ptr) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.manifest_path.156(i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.keystore_path.157(i64) #0
; Function Attrs: nounwind
declare i64 @BuildOptions.jni_main_count.158(i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.jni_main_foreign_path_at.159(i64, i64) #0
; Function Attrs: nounwind
declare ptr @BuildOptions.jni_main_java_source_at.160(i64, i64) #0
; Function Attrs: nounwind
declare i64 @build_options.161() #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.177)
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.178)
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.179)
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.180)
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.181, 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.182, 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.183, 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.184, 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.185, 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.186, 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.187, 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.188, 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.189, 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.190, 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.191, 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.192, 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.193, 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.194, 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.195, 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 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_.196, 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_.197)
%2 = call i1 @class_addMethod(ptr %cls, ptr %sel_dealloc, ptr @__SxFoo_dealloc_imp, ptr @OBJC_METH_VAR_TYPE_.198)
%sel_alloc = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_.199)
%3 = call i1 @class_addMethod(ptr %metacls, ptr %sel_alloc, ptr @__SxFoo_alloc_imp, ptr @OBJC_METH_VAR_TYPE_.200)
%iv = call ptr @class_getInstanceVariable(ptr %cls, ptr @OBJC_IVAR_NAME_)
store ptr %iv, ptr @__SxFoo_state_ivar, align 8
ret void
}