nativity/lib/std/start.nat
2023-12-18 17:35:44 +01:00

39 lines
1.1 KiB
Plaintext

const std = #import("std");
const builtin = #import("builtin");
comptime {
if (builtin.link_libc) {
_ = main;
} else {
_ = _start;
}
}
const _start = fn () noreturn export cc(.naked) {
#asm({
xor ebp, ebp;
mov rdi, rsp;
and rsp, 0xfffffffffffffff0;
call {start};
});
}
var argument_count: usize = 0;
var argument_values: [&]const [&:0]const u8 = undefined;
var environment_values: [&:null]const ?[&:null]const u8 = undefined;
const start = fn(argc_argv_address: usize) noreturn export {
var argument_address_iterator = argc_argv_address;
const argument_count_ptr: &usize = #cast(argument_address_iterator);
argument_count = argument_count_ptr.@;
argument_address_iterator += #size(usize);
argument_values = #cast(argument_address_iterator);
argument_address_iterator += #size(usize) * (argument_count + 1);
environment_values = #cast(argument_address_iterator);
const result = #import("main").main();
std.os.exit(exit_code = result);
}
const main = fn(argc: s32, argv: [&:null]?[&:null]u8, env: [&:null]?[&:null]u8) s32 export {
return #import("main").main();
}