commit 4b7e04f75aef8da6d2f95977cee69cd9b3b440a5 (tree)
parent ae72a982242fbd46f389f933c18b036e919093bc
Author: Andrew Kelley <andrew@ziglang.org>
Date: Fri, 28 Jun 2019 02:00:56 -0400
rename std/special/bootstrap.zig to std/special/start.zig
Diffstat:
7 files changed, 155 insertions(+), 155 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
@@ -651,9 +651,9 @@ set(ZIG_STD_FILES
"rb.zig"
"segmented_list.zig"
"sort.zig"
- "special/bootstrap.zig"
- "special/bootstrap_lib.zig"
- "special/bootstrap_windows_tls.zig"
+ "special/start.zig"
+ "special/start_lib.zig"
+ "special/start_windows_tls.zig"
"special/build_runner.zig"
"special/c.zig"
"special/compiler_rt.zig"
diff --git a/src/all_types.hpp b/src/all_types.hpp
@@ -1759,7 +1759,7 @@ struct CodeGen {
ZigPackage *compile_var_package;
ZigType *compile_var_import;
ZigType *root_import;
- ZigType *bootstrap_import;
+ ZigType *start_import;
ZigType *test_runner_import;
struct {
diff --git a/src/codegen.cpp b/src/codegen.cpp
@@ -8524,8 +8524,8 @@ static ZigType *add_special_code(CodeGen *g, ZigPackage *package, const char *ba
return add_source_file(g, package, resolved_path, import_code, SourceKindPkgMain);
}
-static ZigPackage *create_bootstrap_pkg(CodeGen *g, ZigPackage *pkg_with_main) {
- ZigPackage *package = codegen_create_package(g, buf_ptr(g->zig_std_special_dir), "bootstrap.zig", "std.special");
+static ZigPackage *create_start_pkg(CodeGen *g, ZigPackage *pkg_with_main) {
+ ZigPackage *package = codegen_create_package(g, buf_ptr(g->zig_std_special_dir), "start.zig", "std.special");
package->package_table.put(buf_create_from_str("root"), pkg_with_main);
return package;
}
@@ -8651,12 +8651,12 @@ static void gen_root_source(CodeGen *g) {
!g->have_c_main && !g->have_winmain && !g->have_winmain_crt_startup &&
((g->have_pub_main && g->out_type == OutTypeObj) || g->out_type == OutTypeExe))
{
- g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g, g->root_package), "bootstrap.zig");
+ g->start_import = add_special_code(g, create_start_pkg(g, g->root_package), "start.zig");
}
if (g->zig_target->os == OsWindows && !g->have_dllmain_crt_startup &&
g->out_type == OutTypeLib && g->is_dynamic)
{
- g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g, g->root_package), "bootstrap_lib.zig");
+ g->start_import = add_special_code(g, create_start_pkg(g, g->root_package), "start_lib.zig");
}
if (!g->error_during_imports) {
@@ -8664,7 +8664,7 @@ static void gen_root_source(CodeGen *g) {
}
if (g->is_test_build) {
create_test_compile_var_and_add_test_runner(g);
- g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g, g->test_runner_package), "bootstrap.zig");
+ g->start_import = add_special_code(g, create_start_pkg(g, g->test_runner_package), "start.zig");
if (!g->error_during_imports) {
semantic_analyze(g);
diff --git a/std/special/bootstrap.zig b/std/special/bootstrap.zig
@@ -1,146 +0,0 @@
-// This file is included in the compilation unit when exporting an executable.
-
-const root = @import("root");
-const std = @import("std");
-const builtin = @import("builtin");
-const assert = std.debug.assert;
-
-var argc_ptr: [*]usize = undefined;
-
-const is_wasm = switch (builtin.arch) {
- .wasm32, .wasm64 => true,
- else => false,
-};
-
-comptime {
- if (builtin.link_libc) {
- @export("main", main, .Strong);
- } else if (builtin.os == .windows) {
- @export("WinMainCRTStartup", WinMainCRTStartup, .Strong);
- } else if (is_wasm and builtin.os == .freestanding) {
- @export("_start", wasm_freestanding_start, .Strong);
- } else {
- @export("_start", _start, .Strong);
- }
-}
-
-extern fn wasm_freestanding_start() void {
- _ = callMain();
-}
-
-nakedcc fn _start() noreturn {
- if (builtin.os == builtin.Os.wasi) {
- std.os.wasi.proc_exit(callMain());
- }
-
- switch (builtin.arch) {
- .x86_64 => {
- argc_ptr = asm ("lea (%%rsp), %[argc]"
- : [argc] "=r" (-> [*]usize)
- );
- },
- .i386 => {
- argc_ptr = asm ("lea (%%esp), %[argc]"
- : [argc] "=r" (-> [*]usize)
- );
- },
- .aarch64, .aarch64_be => {
- argc_ptr = asm ("mov %[argc], sp"
- : [argc] "=r" (-> [*]usize)
- );
- },
- else => @compileError("unsupported arch"),
- }
- // If LLVM inlines stack variables into _start, they will overwrite
- // the command line argument data.
- @noInlineCall(posixCallMainAndExit);
-}
-
-extern fn WinMainCRTStartup() noreturn {
- @setAlignStack(16);
- if (!builtin.single_threaded) {
- _ = @import("bootstrap_windows_tls.zig");
- }
- std.os.windows.kernel32.ExitProcess(callMain());
-}
-
-// TODO https://github.com/ziglang/zig/issues/265
-fn posixCallMainAndExit() noreturn {
- if (builtin.os == builtin.Os.freebsd) {
- @setAlignStack(16);
- }
- 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 == .linux) {
- // Find the beginning of the auxiliary vector
- const auxv = @ptrCast([*]std.elf.Auxv, envp.ptr + envp_count + 1);
- std.os.linux.elf_aux_maybe = auxv;
- // Initialize the TLS area
- std.os.linux.tls.initTLS();
-
- if (std.os.linux.tls.tls_image) |tls_img| {
- const tls_addr = std.os.linux.tls.allocateTLS(tls_img.alloc_size);
- const tp = std.os.linux.tls.copyTLS(tls_addr);
- std.os.linux.tls.setThreadPointer(tp);
- }
- }
-
- std.os.exit(callMainWithArgs(argc, argv, envp));
-}
-
-// This is marked inline because for some reason LLVM in release mode fails to inline it,
-// and we want fewer call frames in stack traces.
-inline fn callMainWithArgs(argc: usize, argv: [*][*]u8, envp: [][*]u8) u8 {
- std.os.argv = argv[0..argc];
- std.os.environ = envp;
- return callMain();
-}
-
-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);
-}
-
-// This is marked inline because for some reason LLVM in release mode fails to inline it,
-// and we want fewer call frames in stack traces.
-inline fn callMain() u8 {
- switch (@typeId(@typeOf(root.main).ReturnType)) {
- .NoReturn => {
- root.main();
- },
- .Void => {
- root.main();
- return 0;
- },
- .Int => {
- if (@typeOf(root.main).ReturnType.bit_count != 8) {
- @compileError("expected return type of main to be 'u8', 'noreturn', 'void', or '!void'");
- }
- return root.main();
- },
- .ErrorUnion => {
- root.main() catch |err| {
- std.debug.warn("error: {}\n", @errorName(err));
- if (builtin.os != builtin.Os.zen) {
- if (@errorReturnTrace()) |trace| {
- std.debug.dumpStackTrace(trace.*);
- }
- }
- return 1;
- };
- return 0;
- },
- else => @compileError("expected return type of main to be 'u8', 'noreturn', 'void', or '!void'"),
- }
-}
-
-const main_thread_tls_align = 32;
-var main_thread_tls_bytes: [64]u8 align(main_thread_tls_align) = [1]u8{0} ** 64;
diff --git a/std/special/start.zig b/std/special/start.zig
@@ -0,0 +1,146 @@
+// This file is included in the compilation unit when exporting an executable.
+
+const root = @import("root");
+const std = @import("std");
+const builtin = @import("builtin");
+const assert = std.debug.assert;
+
+var argc_ptr: [*]usize = undefined;
+
+const is_wasm = switch (builtin.arch) {
+ .wasm32, .wasm64 => true,
+ else => false,
+};
+
+comptime {
+ if (builtin.link_libc) {
+ @export("main", main, .Strong);
+ } else if (builtin.os == .windows) {
+ @export("WinMainCRTStartup", WinMainCRTStartup, .Strong);
+ } else if (is_wasm and builtin.os == .freestanding) {
+ @export("_start", wasm_freestanding_start, .Strong);
+ } else {
+ @export("_start", _start, .Strong);
+ }
+}
+
+extern fn wasm_freestanding_start() void {
+ _ = callMain();
+}
+
+nakedcc fn _start() noreturn {
+ if (builtin.os == builtin.Os.wasi) {
+ std.os.wasi.proc_exit(callMain());
+ }
+
+ switch (builtin.arch) {
+ .x86_64 => {
+ argc_ptr = asm ("lea (%%rsp), %[argc]"
+ : [argc] "=r" (-> [*]usize)
+ );
+ },
+ .i386 => {
+ argc_ptr = asm ("lea (%%esp), %[argc]"
+ : [argc] "=r" (-> [*]usize)
+ );
+ },
+ .aarch64, .aarch64_be => {
+ argc_ptr = asm ("mov %[argc], sp"
+ : [argc] "=r" (-> [*]usize)
+ );
+ },
+ else => @compileError("unsupported arch"),
+ }
+ // If LLVM inlines stack variables into _start, they will overwrite
+ // the command line argument data.
+ @noInlineCall(posixCallMainAndExit);
+}
+
+extern fn WinMainCRTStartup() noreturn {
+ @setAlignStack(16);
+ if (!builtin.single_threaded) {
+ _ = @import("start_windows_tls.zig");
+ }
+ std.os.windows.kernel32.ExitProcess(callMain());
+}
+
+// TODO https://github.com/ziglang/zig/issues/265
+fn posixCallMainAndExit() noreturn {
+ if (builtin.os == builtin.Os.freebsd) {
+ @setAlignStack(16);
+ }
+ 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 == .linux) {
+ // Find the beginning of the auxiliary vector
+ const auxv = @ptrCast([*]std.elf.Auxv, envp.ptr + envp_count + 1);
+ std.os.linux.elf_aux_maybe = auxv;
+ // Initialize the TLS area
+ std.os.linux.tls.initTLS();
+
+ if (std.os.linux.tls.tls_image) |tls_img| {
+ const tls_addr = std.os.linux.tls.allocateTLS(tls_img.alloc_size);
+ const tp = std.os.linux.tls.copyTLS(tls_addr);
+ std.os.linux.tls.setThreadPointer(tp);
+ }
+ }
+
+ std.os.exit(callMainWithArgs(argc, argv, envp));
+}
+
+// This is marked inline because for some reason LLVM in release mode fails to inline it,
+// and we want fewer call frames in stack traces.
+inline fn callMainWithArgs(argc: usize, argv: [*][*]u8, envp: [][*]u8) u8 {
+ std.os.argv = argv[0..argc];
+ std.os.environ = envp;
+ return callMain();
+}
+
+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);
+}
+
+// This is marked inline because for some reason LLVM in release mode fails to inline it,
+// and we want fewer call frames in stack traces.
+inline fn callMain() u8 {
+ switch (@typeId(@typeOf(root.main).ReturnType)) {
+ .NoReturn => {
+ root.main();
+ },
+ .Void => {
+ root.main();
+ return 0;
+ },
+ .Int => {
+ if (@typeOf(root.main).ReturnType.bit_count != 8) {
+ @compileError("expected return type of main to be 'u8', 'noreturn', 'void', or '!void'");
+ }
+ return root.main();
+ },
+ .ErrorUnion => {
+ root.main() catch |err| {
+ std.debug.warn("error: {}\n", @errorName(err));
+ if (builtin.os != builtin.Os.zen) {
+ if (@errorReturnTrace()) |trace| {
+ std.debug.dumpStackTrace(trace.*);
+ }
+ }
+ return 1;
+ };
+ return 0;
+ },
+ else => @compileError("expected return type of main to be 'u8', 'noreturn', 'void', or '!void'"),
+ }
+}
+
+const main_thread_tls_align = 32;
+var main_thread_tls_bytes: [64]u8 align(main_thread_tls_align) = [1]u8{0} ** 64;
diff --git a/std/special/bootstrap_lib.zig b/std/special/start_lib.zig
diff --git a/std/special/bootstrap_windows_tls.zig b/std/special/start_windows_tls.zig