aboutsummaryrefslogtreecommitdiff
path: root/std/special/bootstrap.zig
diff options
context:
space:
mode:
authorAndrea Orru <andrea@orru.io>2018-08-06 01:43:19 -0400
committerAndrea Orru <andrea@orru.io>2018-08-06 01:43:19 -0400
commitd2f5e57b68da0b16e5789ca19045ccbcb4ecfa8d (patch)
treee9fa3caec533a0d1e2b434868b2fde1f9240e5c8 /std/special/bootstrap.zig
parent06614b3fa09954464c2e2f32756cacedc178a282 (diff)
parent63a23e848a62d5f167f8d5478de9766cb24aa6eb (diff)
downloadzig-d2f5e57b68da0b16e5789ca19045ccbcb4ecfa8d.tar.gz
zig-d2f5e57b68da0b16e5789ca19045ccbcb4ecfa8d.zip
Merge branch 'master' into zen_stdlib
Diffstat (limited to 'std/special/bootstrap.zig')
-rw-r--r--std/special/bootstrap.zig45
1 files changed, 31 insertions, 14 deletions
diff --git a/std/special/bootstrap.zig b/std/special/bootstrap.zig
index d2b1af76a7..47b57c6c23 100644
--- a/std/special/bootstrap.zig
+++ b/std/special/bootstrap.zig
@@ -5,7 +5,7 @@ const root = @import("@root");
const std = @import("std");
const builtin = @import("builtin");
-var argc_ptr: &usize = undefined;
+var argc_ptr: [*]usize = undefined;
comptime {
const strong_linkage = builtin.GlobalLinkage.Strong;
@@ -21,10 +21,14 @@ comptime {
nakedcc fn _start() noreturn {
switch (builtin.arch) {
builtin.Arch.x86_64 => {
- argc_ptr = asm("lea (%%rsp), %[argc]": [argc] "=r" (-> &usize));
+ argc_ptr = asm ("lea (%%rsp), %[argc]"
+ : [argc] "=r" (-> [*]usize)
+ );
},
builtin.Arch.i386 => {
- argc_ptr = asm("lea (%%esp), %[argc]": [argc] "=r" (-> &usize));
+ argc_ptr = asm ("lea (%%esp), %[argc]"
+ : [argc] "=r" (-> [*]usize)
+ );
},
else => @compileError("unsupported arch"),
}
@@ -39,25 +43,38 @@ extern fn WinMainCRTStartup() noreturn {
std.os.windows.ExitProcess(callMain());
}
+// TODO https://github.com/ziglang/zig/issues/265
fn posixCallMainAndExit() noreturn {
- const argc = *argc_ptr;
- const argv = @ptrCast(&&u8, &argc_ptr[1]);
- const envp = @ptrCast(&?&u8, &argv[argc + 1]);
+ const argc = argc_ptr[0];
+ const argv = @ptrCast([*][*]u8, argc_ptr + 1);
+
+ const envp_optional = @ptrCast([*]?[*]u8, argv + argc + 1);
+ var envp_count: usize = 0;
+ while (envp_optional[envp_count]) |_| : (envp_count += 1) {}
+ const envp = @ptrCast([*][*]u8, envp_optional)[0..envp_count];
+ if (builtin.os == builtin.Os.linux) {
+ const auxv = @ptrCast([*]usize, envp.ptr + envp_count + 1);
+ var i: usize = 0;
+ while (auxv[i] != 0) : (i += 2) {
+ if (auxv[i] < std.os.linux_aux_raw.len) std.os.linux_aux_raw[auxv[i]] = auxv[i + 1];
+ }
+ std.debug.assert(std.os.linux_aux_raw[std.elf.AT_PAGESZ] == std.os.page_size);
+ }
+
std.os.posix.exit(callMainWithArgs(argc, argv, envp));
}
-fn callMainWithArgs(argc: usize, argv: &&u8, envp: &?&u8) u8 {
+fn callMainWithArgs(argc: usize, argv: [*][*]u8, envp: [][*]u8) u8 {
std.os.ArgIteratorPosix.raw = argv[0..argc];
-
- var env_count: usize = 0;
- while (envp[env_count] != null) : (env_count += 1) {}
- std.os.posix_environ_raw = @ptrCast(&&u8, envp)[0..env_count];
-
+ std.os.posix_environ_raw = envp;
return callMain();
}
-extern fn main(c_argc: i32, c_argv: &&u8, c_envp: &?&u8) i32 {
- return callMainWithArgs(usize(c_argc), c_argv, c_envp);
+extern fn main(c_argc: i32, c_argv: [*][*]u8, c_envp: [*]?[*]u8) i32 {
+ var env_count: usize = 0;
+ while (c_envp[env_count] != null) : (env_count += 1) {}
+ const envp = @ptrCast([*][*]u8, c_envp)[0..env_count];
+ return callMainWithArgs(@intCast(usize, c_argc), c_argv, envp);
}
fn callMain() u8 {