authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-06 14:32:20-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-06 14:32:20-05:00
logd2602b442e7cdea2e74584f9529917d7a53625fd
tree656d2949eae12721fd33479ae49fc5bf0bd76e4d
parentb1775ca168e0bcfba6753346c5226881da49c6c4
signature Commit is signed but in an unrecognized format.

require running std lib tests coherently

this should actually improve CI times a bit too See the description at the top of std/os/startup.zig (deleted in this commit) for a more detailed understanding of what this commit does.

11 files changed, 65 insertions(+), 55 deletions(-)

CMakeLists.txt-1
...@@ -587,7 +587,6 @@ set(ZIG_STD_FILES...@@ -587,7 +587,6 @@ set(ZIG_STD_FILES
587 "os/linux/vdso.zig"587 "os/linux/vdso.zig"
588 "os/linux/x86_64.zig"588 "os/linux/x86_64.zig"
589 "os/path.zig"589 "os/path.zig"
590 "os/startup.zig"
591 "os/time.zig"590 "os/time.zig"
592 "os/uefi.zig"591 "os/uefi.zig"
593 "os/windows/advapi32.zig"592 "os/windows/advapi32.zig"
src/codegen.cpp+13-5
...@@ -88,7 +88,7 @@ static const char *symbols_that_llvm_depends_on[] = {...@@ -88,7 +88,7 @@ static const char *symbols_that_llvm_depends_on[] = {
88};88};
8989
90CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out_type, BuildMode build_mode,90CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out_type, BuildMode build_mode,
91 Buf *zig_lib_dir)91 Buf *zig_lib_dir, Buf *override_std_dir)
92{92{
93 CodeGen *g = allocate<CodeGen>(1);93 CodeGen *g = allocate<CodeGen>(1);
9494
...@@ -96,8 +96,12 @@ CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out...@@ -96,8 +96,12 @@ CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out
9696
97 g->zig_lib_dir = zig_lib_dir;97 g->zig_lib_dir = zig_lib_dir;
9898
99 g->zig_std_dir = buf_alloc();99 if (override_std_dir == nullptr) {
100 os_path_join(zig_lib_dir, buf_create_from_str("std"), g->zig_std_dir);100 g->zig_std_dir = buf_alloc();
101 os_path_join(zig_lib_dir, buf_create_from_str("std"), g->zig_std_dir);
102 } else {
103 g->zig_std_dir = override_std_dir;
104 }
101105
102 g->zig_c_headers_dir = buf_alloc();106 g->zig_c_headers_dir = buf_alloc();
103 os_path_join(zig_lib_dir, buf_create_from_str("include"), g->zig_c_headers_dir);107 os_path_join(zig_lib_dir, buf_create_from_str("include"), g->zig_c_headers_dir);
...@@ -8356,8 +8360,12 @@ static void add_cache_pkg(CodeGen *g, CacheHash *ch, PackageTableEntry *pkg) {...@@ -8356,8 +8360,12 @@ static void add_cache_pkg(CodeGen *g, CacheHash *ch, PackageTableEntry *pkg) {
8356 if (!entry)8360 if (!entry)
8357 break;8361 break;
83588362
8359 cache_buf(ch, entry->key);8363 // TODO: I think we need a more sophisticated detection of
8360 add_cache_pkg(g, ch, entry->value);8364 // packages we have already seen
8365 if (entry->value != pkg) {
8366 cache_buf(ch, entry->key);
8367 add_cache_pkg(g, ch, entry->value);
8368 }
8361 }8369 }
8362}8370}
83638371
src/codegen.hpp+1-1
...@@ -15,7 +15,7 @@...@@ -15,7 +15,7 @@
15#include <stdio.h>15#include <stdio.h>
1616
17CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out_type, BuildMode build_mode,17CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out_type, BuildMode build_mode,
18 Buf *zig_lib_dir);18 Buf *zig_lib_dir, Buf *override_std_dir);
1919
20void codegen_set_clang_argv(CodeGen *codegen, const char **args, size_t len);20void codegen_set_clang_argv(CodeGen *codegen, const char **args, size_t len);
21void codegen_set_llvm_argv(CodeGen *codegen, const char **args, size_t len);21void codegen_set_llvm_argv(CodeGen *codegen, const char **args, size_t len);
src/link.cpp+1-1
...@@ -42,7 +42,7 @@ static Buf *build_a_raw(CodeGen *parent_gen, const char *aname, Buf *full_path)...@@ -42,7 +42,7 @@ static Buf *build_a_raw(CodeGen *parent_gen, const char *aname, Buf *full_path)
42 }42 }
4343
44 CodeGen *child_gen = codegen_create(full_path, child_target, child_out_type,44 CodeGen *child_gen = codegen_create(full_path, child_target, child_out_type,
45 parent_gen->build_mode, parent_gen->zig_lib_dir);45 parent_gen->build_mode, parent_gen->zig_lib_dir, parent_gen->zig_std_dir);
4646
47 child_gen->out_h_path = nullptr;47 child_gen->out_h_path = nullptr;
48 child_gen->verbose_tokenize = parent_gen->verbose_tokenize;48 child_gen->verbose_tokenize = parent_gen->verbose_tokenize;
src/main.cpp+9-3
...@@ -74,6 +74,7 @@ static int print_full_usage(const char *arg0) {...@@ -74,6 +74,7 @@ static int print_full_usage(const char *arg0) {
74 " -dirafter [dir] same as -isystem but do it last\n"74 " -dirafter [dir] same as -isystem but do it last\n"
75 " -isystem [dir] add additional search path for other .h files\n"75 " -isystem [dir] add additional search path for other .h files\n"
76 " -mllvm [arg] forward an arg to LLVM's option processing\n"76 " -mllvm [arg] forward an arg to LLVM's option processing\n"
77 " --override-std-dir [arg] use an alternate Zig standard library\n"
77 "\n"78 "\n"
78 "Link Options:\n"79 "Link Options:\n"
79 " --dynamic-linker [path] set the path to ld.so\n"80 " --dynamic-linker [path] set the path to ld.so\n"
...@@ -395,6 +396,7 @@ int main(int argc, char **argv) {...@@ -395,6 +396,7 @@ int main(int argc, char **argv) {
395 bool system_linker_hack = false;396 bool system_linker_hack = false;
396 TargetSubsystem subsystem = TargetSubsystemAuto;397 TargetSubsystem subsystem = TargetSubsystemAuto;
397 bool is_single_threaded = false;398 bool is_single_threaded = false;
399 Buf *override_std_dir = nullptr;
398400
399 if (argc >= 2 && strcmp(argv[1], "build") == 0) {401 if (argc >= 2 && strcmp(argv[1], "build") == 0) {
400 Buf zig_exe_path_buf = BUF_INIT;402 Buf zig_exe_path_buf = BUF_INIT;
...@@ -430,7 +432,8 @@ int main(int argc, char **argv) {...@@ -430,7 +432,8 @@ int main(int argc, char **argv) {
430 Buf *build_runner_path = buf_alloc();432 Buf *build_runner_path = buf_alloc();
431 os_path_join(get_zig_special_dir(), buf_create_from_str("build_runner.zig"), build_runner_path);433 os_path_join(get_zig_special_dir(), buf_create_from_str("build_runner.zig"), build_runner_path);
432434
433 CodeGen *g = codegen_create(build_runner_path, nullptr, OutTypeExe, BuildModeDebug, get_zig_lib_dir());435 CodeGen *g = codegen_create(build_runner_path, nullptr, OutTypeExe, BuildModeDebug, get_zig_lib_dir(),
436 override_std_dir);
434 g->enable_time_report = timing_info;437 g->enable_time_report = timing_info;
435 buf_init_from_str(&g->cache_dir, cache_dir ? cache_dir : default_zig_cache_name);438 buf_init_from_str(&g->cache_dir, cache_dir ? cache_dir : default_zig_cache_name);
436 codegen_set_out_name(g, buf_create_from_str("build"));439 codegen_set_out_name(g, buf_create_from_str("build"));
...@@ -645,6 +648,8 @@ int main(int argc, char **argv) {...@@ -645,6 +648,8 @@ int main(int argc, char **argv) {
645 clang_argv.append(argv[i]);648 clang_argv.append(argv[i]);
646649
647 llvm_argv.append(argv[i]);650 llvm_argv.append(argv[i]);
651 } else if (strcmp(arg, "--override-std-dir") == 0) {
652 override_std_dir = buf_create_from_str(argv[i]);
648 } else if (strcmp(arg, "--library-path") == 0 || strcmp(arg, "-L") == 0) {653 } else if (strcmp(arg, "--library-path") == 0 || strcmp(arg, "-L") == 0) {
649 lib_dirs.append(argv[i]);654 lib_dirs.append(argv[i]);
650 } else if (strcmp(arg, "--library") == 0) {655 } else if (strcmp(arg, "--library") == 0) {
...@@ -819,7 +824,7 @@ int main(int argc, char **argv) {...@@ -819,7 +824,7 @@ int main(int argc, char **argv) {
819824
820 switch (cmd) {825 switch (cmd) {
821 case CmdBuiltin: {826 case CmdBuiltin: {
822 CodeGen *g = codegen_create(nullptr, target, out_type, build_mode, get_zig_lib_dir());827 CodeGen *g = codegen_create(nullptr, target, out_type, build_mode, get_zig_lib_dir(), override_std_dir);
823 g->is_single_threaded = is_single_threaded;828 g->is_single_threaded = is_single_threaded;
824 Buf *builtin_source = codegen_generate_builtin_source(g);829 Buf *builtin_source = codegen_generate_builtin_source(g);
825 if (fwrite(buf_ptr(builtin_source), 1, buf_len(builtin_source), stdout) != buf_len(builtin_source)) {830 if (fwrite(buf_ptr(builtin_source), 1, buf_len(builtin_source), stdout) != buf_len(builtin_source)) {
...@@ -878,7 +883,8 @@ int main(int argc, char **argv) {...@@ -878,7 +883,8 @@ int main(int argc, char **argv) {
878 if (cmd == CmdRun && buf_out_name == nullptr) {883 if (cmd == CmdRun && buf_out_name == nullptr) {
879 buf_out_name = buf_create_from_str("run");884 buf_out_name = buf_create_from_str("run");
880 }885 }
881 CodeGen *g = codegen_create(zig_root_source_file, target, out_type, build_mode, get_zig_lib_dir());886 CodeGen *g = codegen_create(zig_root_source_file, target, out_type, build_mode, get_zig_lib_dir(),
887 override_std_dir);
882 g->subsystem = subsystem;888 g->subsystem = subsystem;
883889
884 if (disable_pic) {890 if (disable_pic) {
std/build.zig+10
...@@ -1686,6 +1686,7 @@ pub const TestStep = struct {...@@ -1686,6 +1686,7 @@ pub const TestStep = struct {
1686 no_rosegment: bool,1686 no_rosegment: bool,
1687 output_path: ?[]const u8,1687 output_path: ?[]const u8,
1688 system_linker_hack: bool,1688 system_linker_hack: bool,
1689 override_std_dir: ?[]const u8,
16891690
1690 pub fn init(builder: *Builder, root_src: []const u8) TestStep {1691 pub fn init(builder: *Builder, root_src: []const u8) TestStep {
1691 const step_name = builder.fmt("test {}", root_src);1692 const step_name = builder.fmt("test {}", root_src);
...@@ -1707,6 +1708,7 @@ pub const TestStep = struct {...@@ -1707,6 +1708,7 @@ pub const TestStep = struct {
1707 .no_rosegment = false,1708 .no_rosegment = false,
1708 .output_path = null,1709 .output_path = null,
1709 .system_linker_hack = false,1710 .system_linker_hack = false,
1711 .override_std_dir = null,
1710 };1712 };
1711 }1713 }
17121714
...@@ -1737,6 +1739,10 @@ pub const TestStep = struct {...@@ -1737,6 +1739,10 @@ pub const TestStep = struct {
1737 self.build_mode = mode;1739 self.build_mode = mode;
1738 }1740 }
17391741
1742 pub fn overrideStdDir(self: *TestStep, dir_path: []const u8) void {
1743 self.override_std_dir = dir_path;
1744 }
1745
1740 pub fn setOutputPath(self: *TestStep, file_path: []const u8) void {1746 pub fn setOutputPath(self: *TestStep, file_path: []const u8) void {
1741 self.output_path = file_path;1747 self.output_path = file_path;
17421748
...@@ -1914,6 +1920,10 @@ pub const TestStep = struct {...@@ -1914,6 +1920,10 @@ pub const TestStep = struct {
1914 if (self.system_linker_hack) {1920 if (self.system_linker_hack) {
1915 try zig_args.append("--system-linker-hack");1921 try zig_args.append("--system-linker-hack");
1916 }1922 }
1923 if (self.override_std_dir) |dir| {
1924 try zig_args.append("--override-std-dir");
1925 try zig_args.append(builder.pathFromRoot(dir));
1926 }
19171927
1918 try builder.spawnChild(zig_args.toSliceConst());1928 try builder.spawnChild(zig_args.toSliceConst());
1919 }1929 }
std/index.zig-1
...@@ -45,7 +45,6 @@ pub const unicode = @import("unicode.zig");...@@ -45,7 +45,6 @@ pub const unicode = @import("unicode.zig");
45pub const zig = @import("zig/index.zig");45pub const zig = @import("zig/index.zig");
4646
47pub const lazyInit = @import("lazy_init.zig").lazyInit;47pub const lazyInit = @import("lazy_init.zig").lazyInit;
48pub const startup = @import("os/startup.zig");
4948
50test "std" {49test "std" {
51 // run tests from these50 // run tests from these
std/os/index.zig+21-10
...@@ -8,8 +8,9 @@ const is_posix = switch (builtin.os) {...@@ -8,8 +8,9 @@ const is_posix = switch (builtin.os) {
8};8};
9const os = @This();9const os = @This();
1010
11// See the comment in startup.zig for why this does not use the `std` global above.11comptime {
12const startup = @import("std").startup;12 assert(@import("std") == std); // You have to run the std lib tests with --override-std-dir
13}
1314
14test "std.os" {15test "std.os" {
15 _ = @import("child_process.zig");16 _ = @import("child_process.zig");
...@@ -670,11 +671,14 @@ fn posixExecveErrnoToErr(err: usize) PosixExecveError {...@@ -670,11 +671,14 @@ fn posixExecveErrnoToErr(err: usize) PosixExecveError {
670 }671 }
671}672}
672673
674pub var linux_elf_aux_maybe: ?[*]std.elf.Auxv = null;
675pub var posix_environ_raw: [][*]u8 = undefined;
676
673/// See std.elf for the constants.677/// See std.elf for the constants.
674pub fn linuxGetAuxVal(index: usize) usize {678pub fn linuxGetAuxVal(index: usize) usize {
675 if (builtin.link_libc) {679 if (builtin.link_libc) {
676 return usize(std.c.getauxval(index));680 return usize(std.c.getauxval(index));
677 } else if (startup.linux_elf_aux_maybe) |auxv| {681 } else if (linux_elf_aux_maybe) |auxv| {
678 var i: usize = 0;682 var i: usize = 0;
679 while (auxv[i].a_type != std.elf.AT_NULL) : (i += 1) {683 while (auxv[i].a_type != std.elf.AT_NULL) : (i += 1) {
680 if (auxv[i].a_type == index)684 if (auxv[i].a_type == index)
...@@ -734,7 +738,7 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap {...@@ -734,7 +738,7 @@ pub fn getEnvMap(allocator: *Allocator) !BufMap {
734 try result.setMove(key, value);738 try result.setMove(key, value);
735 }739 }
736 } else {740 } else {
737 for (startup.posix_environ_raw) |ptr| {741 for (posix_environ_raw) |ptr| {
738 var line_i: usize = 0;742 var line_i: usize = 0;
739 while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {}743 while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {}
740 const key = ptr[0..line_i];744 const key = ptr[0..line_i];
...@@ -756,7 +760,7 @@ test "os.getEnvMap" {...@@ -756,7 +760,7 @@ test "os.getEnvMap" {
756760
757/// TODO make this go through libc when we have it761/// TODO make this go through libc when we have it
758pub fn getEnvPosix(key: []const u8) ?[]const u8 {762pub fn getEnvPosix(key: []const u8) ?[]const u8 {
759 for (startup.posix_environ_raw) |ptr| {763 for (posix_environ_raw) |ptr| {
760 var line_i: usize = 0;764 var line_i: usize = 0;
761 while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {}765 while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {}
762 const this_key = ptr[0..line_i];766 const this_key = ptr[0..line_i];
...@@ -1937,14 +1941,14 @@ pub const ArgIteratorPosix = struct {...@@ -1937,14 +1941,14 @@ pub const ArgIteratorPosix = struct {
1937 pub fn init() ArgIteratorPosix {1941 pub fn init() ArgIteratorPosix {
1938 return ArgIteratorPosix{1942 return ArgIteratorPosix{
1939 .index = 0,1943 .index = 0,
1940 .count = startup.posix_argv_raw.len,1944 .count = raw.len,
1941 };1945 };
1942 }1946 }
19431947
1944 pub fn next(self: *ArgIteratorPosix) ?[]const u8 {1948 pub fn next(self: *ArgIteratorPosix) ?[]const u8 {
1945 if (self.index == self.count) return null;1949 if (self.index == self.count) return null;
19461950
1947 const s = startup.posix_argv_raw[self.index];1951 const s = raw[self.index];
1948 self.index += 1;1952 self.index += 1;
1949 return cstr.toSlice(s);1953 return cstr.toSlice(s);
1950 }1954 }
...@@ -1955,6 +1959,10 @@ pub const ArgIteratorPosix = struct {...@@ -1955,6 +1959,10 @@ pub const ArgIteratorPosix = struct {
1955 self.index += 1;1959 self.index += 1;
1956 return true;1960 return true;
1957 }1961 }
1962
1963 /// This is marked as public but actually it's only meant to be used
1964 /// internally by zig's startup code.
1965 pub var raw: [][*]u8 = undefined;
1958};1966};
19591967
1960pub const ArgIteratorWindows = struct {1968pub const ArgIteratorWindows = struct {
...@@ -3000,6 +3008,9 @@ pub const SpawnThreadError = error{...@@ -3000,6 +3008,9 @@ pub const SpawnThreadError = error{
3000 Unexpected,3008 Unexpected,
3001};3009};
30023010
3011pub var linux_tls_phdr: ?*std.elf.Phdr = null;
3012pub var linux_tls_img_src: [*]const u8 = undefined; // defined if linux_tls_phdr is
3013
3003/// caller must call wait on the returned thread3014/// caller must call wait on the returned thread
3004/// fn startFn(@typeOf(context)) T3015/// fn startFn(@typeOf(context)) T
3005/// where T is u8, noreturn, void, or !void3016/// where T is u8, noreturn, void, or !void
...@@ -3109,7 +3120,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread...@@ -3109,7 +3120,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread
3109 }3120 }
3110 // Finally, the Thread Local Storage, if any.3121 // Finally, the Thread Local Storage, if any.
3111 if (!Thread.use_pthreads) {3122 if (!Thread.use_pthreads) {
3112 if (startup.linux_tls_phdr) |tls_phdr| {3123 if (linux_tls_phdr) |tls_phdr| {
3113 l = mem.alignForward(l, tls_phdr.p_align);3124 l = mem.alignForward(l, tls_phdr.p_align);
3114 tls_start_offset = l;3125 tls_start_offset = l;
3115 l += tls_phdr.p_memsz;3126 l += tls_phdr.p_memsz;
...@@ -3153,8 +3164,8 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread...@@ -3153,8 +3164,8 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread
3153 posix.CLONE_THREAD | posix.CLONE_SYSVSEM | posix.CLONE_PARENT_SETTID | posix.CLONE_CHILD_CLEARTID |3164 posix.CLONE_THREAD | posix.CLONE_SYSVSEM | posix.CLONE_PARENT_SETTID | posix.CLONE_CHILD_CLEARTID |
3154 posix.CLONE_DETACHED;3165 posix.CLONE_DETACHED;
3155 var newtls: usize = undefined;3166 var newtls: usize = undefined;
3156 if (startup.linux_tls_phdr) |tls_phdr| {3167 if (linux_tls_phdr) |tls_phdr| {
3157 @memcpy(@intToPtr([*]u8, mmap_addr + tls_start_offset), startup.linux_tls_img_src, tls_phdr.p_filesz);3168 @memcpy(@intToPtr([*]u8, mmap_addr + tls_start_offset), linux_tls_img_src, tls_phdr.p_filesz);
3158 thread_ptr.data.tls_end_addr = mmap_addr + mmap_len;3169 thread_ptr.data.tls_end_addr = mmap_addr + mmap_len;
3159 newtls = @ptrToInt(&thread_ptr.data.tls_end_addr);3170 newtls = @ptrToInt(&thread_ptr.data.tls_end_addr);
3160 flags |= posix.CLONE_SETTLS;3171 flags |= posix.CLONE_SETTLS;
std/os/startup.zig deleted-26
...@@ -1,26 +0,0 @@
1// This file contains global variables that are initialized on startup from
2// std/special/bootstrap.zig. There are a few things to be aware of here.
3//
4// First, when building an object or library, and no entry point is defined
5// (such as pub fn main), std/special/bootstrap.zig is not included in the
6// compilation. And so these global variables will remain set to the values
7// you see here.
8//
9// Second, when using `zig test` to test the standard library, note that
10// `zig test` is self-hosted. This means that it uses std/special/bootstrap.zig
11// and an @import("std") from the install directory, which is distinct from
12// the standard library files that we are directly testing with `zig test`.
13// This means that these global variables would not get set. So the workaround
14// here is that references to these globals from the standard library must
15// use `@import("std").startup` rather than
16// `@import("path/to/std/index.zig").startup` (and rather than the file path of
17// this file directly). We also put "std" as a reference to itself in the
18// standard library package so that this can work.
19
20const std = @import("../index.zig");
21
22pub var linux_tls_phdr: ?*std.elf.Phdr = null;
23pub var linux_tls_img_src: [*]const u8 = undefined; // defined when linux_tls_phdr is non-null
24pub var linux_elf_aux_maybe: ?[*]std.elf.Auxv = null;
25pub var posix_environ_raw: [][*]u8 = undefined;
26pub var posix_argv_raw: [][*]u8 = undefined;
std/special/bootstrap.zig+7-7
...@@ -64,7 +64,7 @@ fn posixCallMainAndExit() noreturn {...@@ -64,7 +64,7 @@ fn posixCallMainAndExit() noreturn {
64 if (builtin.os == builtin.Os.linux) {64 if (builtin.os == builtin.Os.linux) {
65 // Scan auxiliary vector.65 // Scan auxiliary vector.
66 const auxv = @ptrCast([*]std.elf.Auxv, envp.ptr + envp_count + 1);66 const auxv = @ptrCast([*]std.elf.Auxv, envp.ptr + envp_count + 1);
67 std.startup.linux_elf_aux_maybe = auxv;67 std.os.linux_elf_aux_maybe = auxv;
68 var i: usize = 0;68 var i: usize = 0;
69 var at_phdr: usize = 0;69 var at_phdr: usize = 0;
70 var at_phnum: usize = 0;70 var at_phnum: usize = 0;
...@@ -87,8 +87,8 @@ fn posixCallMainAndExit() noreturn {...@@ -87,8 +87,8 @@ fn posixCallMainAndExit() noreturn {
87// This is marked inline because for some reason LLVM in release mode fails to inline it,87// This is marked inline because for some reason LLVM in release mode fails to inline it,
88// and we want fewer call frames in stack traces.88// and we want fewer call frames in stack traces.
89inline fn callMainWithArgs(argc: usize, argv: [*][*]u8, envp: [][*]u8) u8 {89inline fn callMainWithArgs(argc: usize, argv: [*][*]u8, envp: [][*]u8) u8 {
90 std.startup.posix_argv_raw = argv[0..argc];90 std.os.ArgIteratorPosix.raw = argv[0..argc];
91 std.startup.posix_environ_raw = envp;91 std.os.posix_environ_raw = envp;
92 return callMain();92 return callMain();
93}93}
9494
...@@ -145,15 +145,15 @@ fn linuxInitializeThreadLocalStorage(at_phdr: usize, at_phnum: usize, at_phent:...@@ -145,15 +145,15 @@ fn linuxInitializeThreadLocalStorage(at_phdr: usize, at_phnum: usize, at_phent:
145 // TODO look for PT_DYNAMIC when we have https://github.com/ziglang/zig/issues/1917145 // TODO look for PT_DYNAMIC when we have https://github.com/ziglang/zig/issues/1917
146 switch (phdr.p_type) {146 switch (phdr.p_type) {
147 std.elf.PT_PHDR => base = at_phdr - phdr.p_vaddr,147 std.elf.PT_PHDR => base = at_phdr - phdr.p_vaddr,
148 std.elf.PT_TLS => std.startup.linux_tls_phdr = phdr,148 std.elf.PT_TLS => std.os.linux_tls_phdr = phdr,
149 else => continue,149 else => continue,
150 }150 }
151 }151 }
152 const tls_phdr = std.startup.linux_tls_phdr orelse return;152 const tls_phdr = std.os.linux_tls_phdr orelse return;
153 std.startup.linux_tls_img_src = @intToPtr([*]const u8, base + tls_phdr.p_vaddr);153 std.os.linux_tls_img_src = @intToPtr([*]const u8, base + tls_phdr.p_vaddr);
154 assert(main_thread_tls_bytes.len >= tls_phdr.p_memsz); // not enough preallocated Thread Local Storage154 assert(main_thread_tls_bytes.len >= tls_phdr.p_memsz); // not enough preallocated Thread Local Storage
155 assert(main_thread_tls_align >= tls_phdr.p_align); // preallocated Thread Local Storage not aligned enough155 assert(main_thread_tls_align >= tls_phdr.p_align); // preallocated Thread Local Storage not aligned enough
156 @memcpy(&main_thread_tls_bytes, std.startup.linux_tls_img_src, tls_phdr.p_filesz);156 @memcpy(&main_thread_tls_bytes, std.os.linux_tls_img_src, tls_phdr.p_filesz);
157 tls_end_addr = @ptrToInt(&main_thread_tls_bytes) + tls_phdr.p_memsz;157 tls_end_addr = @ptrToInt(&main_thread_tls_bytes) + tls_phdr.p_memsz;
158 linuxSetThreadArea(@ptrToInt(&tls_end_addr));158 linuxSetThreadArea(@ptrToInt(&tls_end_addr));
159}159}
test/tests.zig+3
...@@ -194,6 +194,9 @@ pub fn addPkgTests(b: *build.Builder, test_filter: ?[]const u8, root_src: []cons...@@ -194,6 +194,9 @@ pub fn addPkgTests(b: *build.Builder, test_filter: ?[]const u8, root_src: []cons
194 if (link_libc) {194 if (link_libc) {
195 these_tests.linkSystemLibrary("c");195 these_tests.linkSystemLibrary("c");
196 }196 }
197 if (mem.eql(u8, name, "std")) {
198 these_tests.overrideStdDir("std");
199 }
197 step.dependOn(&these_tests.step);200 step.dependOn(&these_tests.step);
198 }201 }
199 }202 }