aboutsummaryrefslogtreecommitdiff
path: root/src/Compilation.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compilation.zig')
-rw-r--r--src/Compilation.zig39
1 files changed, 30 insertions, 9 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index f3059a25a5..c11a273a4d 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -21,6 +21,7 @@ const musl = @import("musl.zig");
const mingw = @import("mingw.zig");
const libunwind = @import("libunwind.zig");
const libcxx = @import("libcxx.zig");
+const wasi_libc = @import("wasi_libc.zig");
const fatal = @import("main.zig").fatal;
const Module = @import("Module.zig");
const Cache = @import("Cache.zig");
@@ -202,6 +203,8 @@ const Job = union(enum) {
/// needed when not linking libc and using LLVM for code generation because it generates
/// calls to, for example, memcpy and memset.
zig_libc: void,
+ /// WASI libc sysroot
+ wasi_libc_sysroot: void,
/// Use stage1 C++ code to compile zig code into an object file.
stage1_module: void,
@@ -276,6 +279,7 @@ pub const MiscTask = enum {
libcxx,
libcxxabi,
libtsan,
+ wasi_libc_sysroot,
compiler_rt,
libssp,
zig_libc,
@@ -769,8 +773,8 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
.Lib => is_dyn_lib,
.Exe => true,
};
- const needs_c_symbols = !options.skip_linker_dependencies and
- (is_exe_or_dyn_lib or (options.target.isWasm() and options.output_mode != .Obj));
+
+ const needs_c_symbols = !options.skip_linker_dependencies and is_exe_or_dyn_lib;
const comp: *Compilation = comp: {
// For allocations that have the same lifetime as Compilation. This arena is used only during this
@@ -1417,6 +1421,9 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
},
});
}
+ if (comp.wantBuildWasiLibcSysrootFromSource()) {
+ try comp.work_queue.write(&[_]Job{.{ .wasi_libc_sysroot = {} }});
+ }
if (comp.wantBuildMinGWFromSource()) {
const static_lib_jobs = [_]Job{
.{ .mingw_crt_file = .mingw32_lib },
@@ -1458,7 +1465,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
// Once it is capable this condition should be removed.
if (build_options.is_stage1) {
if (comp.bin_file.options.include_compiler_rt) {
- if (is_exe_or_dyn_lib or comp.getTarget().isWasm()) {
+ if (is_exe_or_dyn_lib) {
try comp.work_queue.writeItem(.{ .compiler_rt_lib = {} });
} else {
try comp.work_queue.writeItem(.{ .compiler_rt_obj = {} });
@@ -2142,6 +2149,16 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor
);
};
},
+ .wasi_libc_sysroot => {
+ wasi_libc.buildWasiLibcSysroot(self) catch |err| {
+ // TODO Surface more error details.
+ try self.setMiscFailure(
+ .wasi_libc_sysroot,
+ "unable to build WASI libc sysroot: {s}",
+ .{@errorName(err)},
+ );
+ };
+ },
.compiler_rt_lib => {
self.buildOutputFromZig(
"compiler_rt.zig",
@@ -2882,7 +2899,7 @@ pub fn addCCArgs(
try argv.append("-D_DEBUG");
try argv.append("-Og");
- if (comp.bin_file.options.link_libc) {
+ if (comp.bin_file.options.link_libc and target.os.tag != .wasi) {
try argv.append("-fstack-protector-strong");
try argv.append("--param");
try argv.append("ssp-buffer-size=4");
@@ -2894,7 +2911,7 @@ pub fn addCCArgs(
// See the comment in the BuildModeFastRelease case for why we pass -O2 rather
// than -O3 here.
try argv.append("-O2");
- if (comp.bin_file.options.link_libc) {
+ if (comp.bin_file.options.link_libc and target.os.tag != .wasi) {
try argv.append("-D_FORTIFY_SOURCE=2");
try argv.append("-fstack-protector-strong");
try argv.append("--param");
@@ -3248,7 +3265,8 @@ fn detectLibCFromLibCInstallation(arena: *Allocator, target: Target, lci: *const
pub fn get_libc_crt_file(comp: *Compilation, arena: *Allocator, basename: []const u8) ![]const u8 {
if (comp.wantBuildGLibCFromSource() or
comp.wantBuildMuslFromSource() or
- comp.wantBuildMinGWFromSource())
+ comp.wantBuildMinGWFromSource() or
+ comp.wantBuildWasiLibcSysrootFromSource())
{
return comp.crt_files.get(basename).?.full_object_path;
}
@@ -3288,6 +3306,10 @@ fn wantBuildMuslFromSource(comp: Compilation) bool {
!comp.getTarget().isWasm();
}
+fn wantBuildWasiLibcSysrootFromSource(comp: Compilation) bool {
+ return comp.wantBuildLibCFromSource() and comp.getTarget().isWasm();
+}
+
fn wantBuildMinGWFromSource(comp: Compilation) bool {
return comp.wantBuildLibCFromSource() and comp.getTarget().isMinGW();
}
@@ -3591,11 +3613,10 @@ fn buildOutputFromZig(
};
const root_name = src_basename[0 .. src_basename.len - std.fs.path.extension(src_basename).len];
const target = comp.getTarget();
- const fixed_output_mode = if (target.cpu.arch.isWasm()) .Obj else output_mode;
const bin_basename = try std.zig.binNameAlloc(comp.gpa, .{
.root_name = root_name,
.target = target,
- .output_mode = fixed_output_mode,
+ .output_mode = output_mode,
});
defer comp.gpa.free(bin_basename);
@@ -3610,7 +3631,7 @@ fn buildOutputFromZig(
.target = target,
.root_name = root_name,
.root_pkg = &root_pkg,
- .output_mode = fixed_output_mode,
+ .output_mode = output_mode,
.thread_pool = comp.thread_pool,
.libc_installation = comp.bin_file.options.libc_installation,
.emit_bin = emit_bin,