Files
sx/examples/expected/1202-ffi-cc-c-large-aggregate.ir
agra d178454841 P5.4 core: drive the whole build from sx default_pipeline (no auto-emit/link)
The compiler's post-IR role shrinks to: codegen -> invoke the build callback.
There is NO Zig auto-emit / auto-link anymore; emit + link are sx-called actions.

- emit_object() is now an ACTION (verify + emit via a host BuildHooks vtable),
  returning the object path. New query primitives build_output/build_target/
  build_frameworks/build_flags (data reads from the merged BuildConfig).
- library/modules/build.sx imports compiler.sx and defines default_pipeline:
  emit_object -> gather c_object_paths -> link(objs, output, libs, fws, flags,
  target). The std<->build import cycle is handled by the resolver.
- The compiler FORCE-LOWERS default_pipeline (well-known name) and AUTO-INVOKES
  it post-codegen when no on_build/set_post_link_callback override was
  registered (driver's final fallback: invokeByName default_pipeline).
- Prelude-less programs (e.g. asm tests) don't import build.sx, so the BUILD
  path auto-imports modules/build.sx (idempotent if already transitive) so
  default_pipeline is always available. JIT sx run is untouched (emits in-process).
- Removed the build cache short-circuits (incompatible with the always-run sx
  driver; a future cache can live in default_pipeline).

Benign 37-.ir churn (build.sx grew); zero behavior changes (verified diff is
.ir-only). 705/0 both gates.
2026-06-19 09:22:54 +03:00

1223 lines
32 KiB
Plaintext

@__sx_default_context = internal constant { { ptr, ptr, ptr }, ptr } { { ptr, ptr, ptr } { ptr null, ptr @__thunk_CAllocator_Allocator_alloc_bytes, ptr @__thunk_CAllocator_Allocator_dealloc_bytes }, ptr null }
declare i64 @write(i32, ptr, i64)
; Function Attrs: nounwind
declare void @out(ptr, 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
declare void @out.1(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @alloc_string(ptr, i64) #0
; Function Attrs: nounwind
declare ptr @int_to_string(ptr, i64) #0
; 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
declare ptr @concat(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @substr(ptr, ptr, i64, i64) #0
; Function Attrs: nounwind
declare i64 @cstring_len(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @from_cstring(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @to_cstring(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
declare ptr @build_format(ptr, ptr) #0
; Function Attrs: nounwind
declare void @out.2(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @mem_realloc(ptr, ptr, ptr, i64, i64, i64) #0
; Function Attrs: nounwind
define internal ptr @CAllocator.alloc_bytes(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_bytes(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_bytes(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @GPA.dealloc_bytes(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_bytes(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.dealloc_bytes(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @BufAlloc.init(ptr sret({ ptr, i64, i64 }), ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @BufAlloc.reset(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @BufAlloc.alloc_bytes(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @BufAlloc.dealloc_bytes(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_bytes(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.dealloc_bytes(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 ptr @read_file(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 i32 @system(ptr) #0
; Function Attrs: nounwind
declare void @run(ptr sret({ { i32, { ptr, i64 } }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @env(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @find_executable(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 i32 @connect(i32, ptr, i32) #0
; Function Attrs: nounwind
declare i32 @shutdown(i32, i32) #0
; Function Attrs: nounwind
declare i32 @socketpair(i32, i32, i32, ptr) #0
; Function Attrs: nounwind
declare i32 @fcntl(i32, i32, ...) #0
; Function Attrs: nounwind
declare i16 @htons(ptr, i64) #0
; Function Attrs: nounwind
declare ptr @__error() #0
; Function Attrs: nounwind
declare i32 @errno(ptr) #0
; Function Attrs: nounwind
declare i1 @is_wouldblock(ptr, i32) #0
; Function Attrs: nounwind
declare i1 @set_nonblocking(ptr, i32) #0
; Function Attrs: nounwind
declare i64 @accept_nb(ptr, i32) #0
; Function Attrs: nounwind
declare [2 x i64] @read_nb(ptr, i32, ptr, i64) #0
; Function Attrs: nounwind
declare [2 x i64] @write_nb(ptr, i32, ptr, i64) #0
; Function Attrs: nounwind
declare ptr @mem_realloc.3(ptr, ptr, ptr, i64, i64, i64) #0
; Function Attrs: nounwind
declare ptr @CAllocator.alloc_bytes.4(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @CAllocator.dealloc_bytes.5(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @GPA.init.6(ptr) #0
; Function Attrs: nounwind
declare ptr @GPA.alloc_bytes.7(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @GPA.dealloc_bytes.8(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @Arena.add_chunk.9(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.init.10(ptr sret({ ptr, i64, { ptr, ptr, ptr } }), ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.reset.11(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Arena.deinit.12(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @Arena.alloc_bytes.13(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Arena.dealloc_bytes.14(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @BufAlloc.init.15(ptr sret({ ptr, i64, i64 }), ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @BufAlloc.reset.16(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @BufAlloc.alloc_bytes.17(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @BufAlloc.dealloc_bytes.18(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.init.19(ptr sret({ { ptr, ptr, ptr }, i64, i64, i64 }), ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @TrackingAllocator.leak_count.20(ptr, ptr) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.report.21(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @TrackingAllocator.alloc_bytes.22(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @TrackingAllocator.dealloc_bytes.23(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @File.is_valid.24(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @File.close.25(ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.read.26(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.write.27(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.seek.28(ptr, ptr, i64, i64) #0
; Function Attrs: nounwind
declare i32 @mode_to_flags.29(ptr, i64) #0
; Function Attrs: nounwind
declare i64 @open_file.30(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare ptr @read_file.31(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @write_file.32(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @append_file.33(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @exists.34(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_file.35(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_dir.36(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir.37(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @set_mode.38(ptr, ptr, i32) #0
; Function Attrs: nounwind
declare i1 @move.39(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir_all.40(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @copy_file.41(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @basename.42(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @dirname.43(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 ptr @escape(ptr, ptr) #0
; Function Attrs: nounwind
declare void @c_object_paths(ptr sret({ ptr, i64, i64 })) #0
; Function Attrs: nounwind
declare void @link_libraries(ptr sret({ ptr, i64, i64 })) #0
; Function Attrs: nounwind
declare ptr @emit_object() #0
; Function Attrs: nounwind
declare ptr @build_output() #0
; Function Attrs: nounwind
declare ptr @build_target() #0
; Function Attrs: nounwind
declare void @build_frameworks(ptr sret({ ptr, i64, i64 })) #0
; Function Attrs: nounwind
declare void @build_flags(ptr sret({ ptr, i64, i64 })) #0
; Function Attrs: nounwind
declare void @link(ptr, ptr, ptr, 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_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_runtime_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 void @set_post_link_callback(i64, ptr) #0
; Function Attrs: nounwind
declare void @on_build(ptr) #0
; Function Attrs: nounwind
declare i1 @default_pipeline(ptr, {}) #0
; Function Attrs: nounwind
declare ptr @spaces.44(ptr, i32) #0
; Function Attrs: nounwind
declare ptr @to_string.45(ptr) #0
; Function Attrs: nounwind
declare void @print_current.46(ptr) #0
; Function Attrs: nounwind
declare void @print_interpreter_frames.47(ptr) #0
; Function Attrs: nounwind
declare void @run.48(ptr sret({ { i32, { ptr, i64 } }, i1 }), ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @env.49(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @find_executable.50(ptr, ptr) #0
; Function Attrs: nounwind
declare void @exit.51(ptr, i8, ptr) #0
; Function Attrs: nounwind
declare void @assert.52(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.53(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 i1 @File.is_valid.54(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @File.close.55(ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.read.56(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.write.57(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @File.seek.58(ptr, ptr, i64, i64) #0
; Function Attrs: nounwind
declare i32 @mode_to_flags.59(ptr, i64) #0
; Function Attrs: nounwind
declare i64 @open_file.60(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare ptr @read_file.61(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @write_file.62(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @append_file.63(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @exists.64(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_file.65(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @delete_dir.66(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir.67(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @set_mode.68(ptr, ptr, i32) #0
; Function Attrs: nounwind
declare i1 @move.69(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @create_dir_all.70(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @copy_file.71(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @basename.72(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @dirname.73(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 @log_emit(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @assert.74(ptr, i1) #0
; Function Attrs: nounwind
declare i32 @clock_gettime(i32, ptr) #0
; Function Attrs: nounwind
declare i64 @now_secs(ptr) #0
; Function Attrs: nounwind
declare i64 @mono_ms(ptr) #0
; Function Attrs: nounwind
declare i32 @kqueue() #0
; Function Attrs: nounwind
declare i32 @kevent(i32, ptr, i32, ptr, i32, ptr) #0
; Function Attrs: nounwind
declare void @kev_change(ptr sret({ i64, i16, i16, i32, i64, i64 }), ptr, i32, i16, i16, i64) #0
; Function Attrs: nounwind
declare i1 @kq_apply(ptr, i32, ptr) #0
; Function Attrs: nounwind
declare i32 @kq_wait(ptr, i32, ptr, i32, i64) #0
; Function Attrs: nounwind
declare i64 @now_secs.75(ptr) #0
; Function Attrs: nounwind
declare i64 @mono_ms.76(ptr) #0
; Function Attrs: nounwind
declare i64 @Loop.init(ptr) #0
; Function Attrs: nounwind
declare void @Loop.close(ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @Loop.add_read(ptr, ptr, i32, i64) #0
; Function Attrs: nounwind
declare void @Loop.del_read(ptr, ptr, i32) #0
; Function Attrs: nounwind
declare i32 @Loop.add_write(ptr, ptr, i32, i64) #0
; Function Attrs: nounwind
declare void @Loop.del_write(ptr, ptr, i32) #0
; Function Attrs: nounwind
declare i32 @Loop.add_wake(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Loop.wake(ptr, ptr) #0
; Function Attrs: nounwind
declare [2 x i64] @Loop.wait(ptr, ptr, ptr, i64) #0
; Function Attrs: nounwind
declare i64 @deadline_in(ptr, i64) #0
; Function Attrs: nounwind
declare i1 @expired(ptr, i64) #0
; Function Attrs: nounwind
declare i64 @remaining_ms(ptr, i64) #0
; Function Attrs: nounwind
declare ptr @find_header(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @ascii_ieq(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @reason_for(ptr, i64) #0
; Function Attrs: nounwind
declare void @run_handler_job(ptr, i64) #0
; Function Attrs: nounwind
declare [2 x i64] @serialize_bytes(ptr, ptr, i1, ptr) #0
; Function Attrs: nounwind
declare void @Server.init(ptr sret({ { { i64, i32, i64, i64, i64, i64, i64, i64, i64 }, { i32 }, i32, ptr, { ptr, ptr, ptr }, ptr, i64, ptr }, i32 }), ptr, ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Server.close(ptr, ptr) #0
; Function Attrs: nounwind
declare i64 @Server.free_slot(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Server.conn_close(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare i32 @Server.tick(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Server.run(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Server.accept_ready(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @Server.grow_read_buf(ptr, ptr, i64, i64) #0
; Function Attrs: nounwind
declare void @Server.read_more(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Server.serve_buffered(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare i1 @Server.try_serve_one(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Server.serialize_response(ptr, ptr, i64, ptr, i1) #0
; Function Attrs: nounwind
declare void @Server.drain_completions(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Server.write_more(ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Server.respond_error_close(ptr, ptr, i64, i64) #0
; Function Attrs: nounwind
declare i32 @pthread_create(ptr, ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_join(i64, ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_detach(i64) #0
; Function Attrs: nounwind
declare i32 @pthread_mutex_init(ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_mutex_lock(ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_mutex_unlock(ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_mutex_destroy(ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_cond_init(ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_cond_wait(ptr, ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_cond_signal(ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_cond_broadcast(ptr) #0
; Function Attrs: nounwind
declare i32 @pthread_cond_destroy(ptr) #0
; Function Attrs: nounwind
declare i1 @Mutex.setup(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Mutex.lock(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Mutex.unlock(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Mutex.destroy(ptr, ptr) #0
; Function Attrs: nounwind
declare i1 @Cond.setup(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Cond.wait(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @Cond.signal(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Cond.broadcast(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Cond.destroy(ptr, ptr) #0
; Function Attrs: nounwind
declare [2 x i64] @Thread.spawn(ptr, ptr, ptr) #0
; Function Attrs: nounwind
declare void @Thread.join(ptr, ptr) #0
; Function Attrs: nounwind
declare void @Thread.detach(ptr, ptr) #0
; Function Attrs: nounwind
declare [2 x i64] @Pool.create(ptr, i64, i64) #0
; Function Attrs: nounwind
declare i1 @Pool.submit(ptr, ptr, ptr, i64) #0
; Function Attrs: nounwind
declare void @Pool.shutdown(ptr, ptr) #0
; Function Attrs: nounwind
declare ptr @pool_worker(ptr) #0
; Function Attrs: nounwind
define internal i64 @accept_c(ptr %0) #0 {
entry:
%byval.load = load { i64, i64, i64, i64 }, ptr %0, align 8
%alloca = alloca { i64, i64, i64, i64 }, align 8
store { i64, i64, i64, i64 } %byval.load, ptr %alloca, align 8
%load = load { i64, i64, i64, i64 }, ptr %alloca, align 8
%sg = extractvalue { i64, i64, i64, i64 } %load, 0
%loadN = load { i64, i64, i64, i64 }, ptr %alloca, align 8
%sgN = extractvalue { i64, i64, i64, i64 } %loadN, 1
%add = add i64 %sg, %sgN
%loadN = load { i64, i64, i64, i64 }, ptr %alloca, align 8
%sgN = extractvalue { i64, i64, i64, i64 } %loadN, 2
%addN = add i64 %add, %sgN
%loadN = load { i64, i64, i64, i64 }, ptr %alloca, align 8
%sgN = extractvalue { i64, i64, i64, i64 } %loadN, 3
%addN = add i64 %addN, %sgN
ret i64 %addN
}
; Function Attrs: nounwind
define i32 @main() #0 {
entry:
%alloca = alloca { i64, i64, i64, i64 }, align 8
store { i64, i64, i64, i64 } { i64 1, i64 10, i64 100, i64 1000 }, ptr %alloca, align 8
%load = load { i64, i64, i64, i64 }, ptr %alloca, align 8
%byval.tmp = alloca { i64, i64, i64, i64 }, align 8
store { i64, i64, i64, i64 } %load, ptr %byval.tmp, align 8
%call = call i64 @accept_c(ptr %byval.tmp)
%icmp = icmp ne i64 %call, 1111
br i1 %icmp, label %if.then.0, label %if.merge.1
if.then.0: ; preds = %entry
ret i32 1
if.merge.1: ; preds = %entry
ret i32 0
}
; Function Attrs: nounwind
define internal ptr @__thunk_CAllocator_Allocator_alloc_bytes(ptr %0, ptr %1, i64 %2) #0 {
entry:
%call = call ptr @CAllocator.alloc_bytes(ptr %0, ptr %1, i64 %2)
ret ptr %call
}
; Function Attrs: nounwind
define internal void @__thunk_CAllocator_Allocator_dealloc_bytes(ptr %0, ptr %1, ptr %2) #0 {
entry:
call void @CAllocator.dealloc_bytes(ptr %0, ptr %1, ptr %2)
ret void
}
; Function Attrs: nounwind
define internal void @List__string.append(ptr %0, ptr %1, { ptr, i64 } %2, { ptr, ptr, ptr } %3) #0 {
entry:
%alloca = alloca ptr, align 8
%allocaN = alloca i64, align 8
%allocaN = alloca ptr, align 8
store ptr %1, ptr %alloca, align 8
%allocaN = alloca { ptr, i64 }, align 8
store { ptr, i64 } %2, ptr %allocaN, align 8
%allocaN = alloca { ptr, ptr, ptr }, align 8
store { ptr, ptr, ptr } %3, ptr %allocaN, align 8
%load = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %load, align 8
%sg = extractvalue { ptr, i64, i64 } %loadN, 1
%loadN = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %loadN, align 8
%sgN = extractvalue { ptr, i64, i64 } %loadN, 2
%icmp = icmp sge i64 %sg, %sgN
br i1 %icmp, label %if.then.2, label %if.merge.3
if.then.2: ; preds = %entry
%loadN = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %loadN, align 8
%sgN = extractvalue { ptr, i64, i64 } %loadN, 2
%icmpN = icmp eq i64 %sgN, 0
br i1 %icmpN, label %if.then.4, label %if.else.5
if.merge.3: ; preds = %if.merge.8, %entry
%loadN = load { ptr, i64 }, ptr %allocaN, align 8
%loadN = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %loadN, align 8
%sgN = extractvalue { ptr, i64, i64 } %loadN, 1
%loadN = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %loadN, align 8
%sgN = extractvalue { ptr, i64, i64 } %loadN, 0
%igp.ptr = getelementptr { ptr, i64 }, ptr %sgN, i64 %sgN
store { ptr, i64 } %loadN, ptr %igp.ptr, align 8
%loadN = load ptr, ptr %alloca, align 8
%gep = getelementptr inbounds nuw { ptr, i64, i64 }, ptr %loadN, i32 0, i32 1
%loadN = load i64, ptr %gep, align 8
%add = add i64 %loadN, 1
store i64 %add, ptr %gep, align 8
ret void
if.then.4: ; preds = %if.then.2
br label %if.merge.6
if.else.5: ; preds = %if.then.2
%loadN = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %loadN, align 8
%sgN = extractvalue { ptr, i64, i64 } %loadN, 2
%mul = mul i64 %sgN, 2
br label %if.merge.6
if.merge.6: ; preds = %if.else.5, %if.then.4
%bp = phi i64 [ 4, %if.then.4 ], [ %mul, %if.else.5 ]
store i64 %bp, ptr %allocaN, align 8
%loadN = load i64, ptr %allocaN, align 8
%mulN = mul i64 %loadN, 16
%loadN = load { ptr, ptr, ptr }, ptr %allocaN, align 8
%sgN = extractvalue { ptr, ptr, ptr } %loadN, 0
%sgN = extractvalue { ptr, ptr, ptr } %loadN, 1
%icall = call ptr %sgN(ptr %0, ptr %sgN, i64 %mulN)
store ptr %icall, ptr %allocaN, align 8
%loadN = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %loadN, align 8
%sgN = extractvalue { ptr, i64, i64 } %loadN, 1
%icmpN = icmp sgt i64 %sgN, 0
br i1 %icmpN, label %if.then.7, label %if.merge.8
if.then.7: ; preds = %if.merge.6
%loadN = load ptr, ptr %allocaN, align 8
%loadN = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %loadN, align 8
%sgN = extractvalue { ptr, i64, i64 } %loadN, 0
%loadN = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %loadN, align 8
%sgN = extractvalue { ptr, i64, i64 } %loadN, 1
%mulN = mul i64 %sgN, 16
%call = call ptr @memcpy(ptr %loadN, ptr %sgN, i64 %mulN)
%loadN = load ptr, ptr %alloca, align 8
%loadN = load { ptr, i64, i64 }, ptr %loadN, align 8
%sgN = extractvalue { ptr, i64, i64 } %loadN, 0
%loadN = load { ptr, ptr, ptr }, ptr %allocaN, align 8
%sgN = extractvalue { ptr, ptr, ptr } %loadN, 0
%sgN = extractvalue { ptr, ptr, ptr } %loadN, 2
call void %sgN(ptr %0, ptr %sgN, ptr %sgN)
br label %if.merge.8
if.merge.8: ; preds = %if.then.7, %if.merge.6
%loadN = load ptr, ptr %allocaN, align 8
%loadN = load ptr, ptr %alloca, align 8
%gepN = getelementptr inbounds nuw { ptr, i64, i64 }, ptr %loadN, i32 0, i32 0
store ptr %loadN, ptr %gepN, align 8
%loadN = load i64, ptr %allocaN, align 8
%loadN = load ptr, ptr %alloca, align 8
%gepN = getelementptr inbounds nuw { ptr, i64, i64 }, ptr %loadN, i32 0, i32 2
store i64 %loadN, ptr %gepN, align 8
br label %if.merge.3
}