Merge pull request #8992 from ziglang/cc-wasm32-wasi-emulations

cc,wasi: include emulated libs in WASI libc and refactor WASI libc handling
This commit is contained in:
Jakub Konka 2021-06-09 09:52:15 +02:00 committed by GitHub
commit a6ae5a77da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 371 additions and 188 deletions

View File

@ -203,8 +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,
/// one of WASI libc static objects
wasi_libc_crt_file: wasi_libc.CRTFile,
/// Use stage1 C++ code to compile zig code into an object file.
stage1_module: void,
@ -279,7 +279,7 @@ pub const MiscTask = enum {
libcxx,
libcxxabi,
libtsan,
wasi_libc_sysroot,
wasi_libc_crt_file,
compiler_rt,
libssp,
zig_libc,
@ -646,6 +646,12 @@ pub const InitOptions = struct {
framework_dirs: []const []const u8 = &[0][]const u8{},
frameworks: []const []const u8 = &[0][]const u8{},
system_libs: []const []const u8 = &[0][]const u8{},
/// These correspond to the WASI libc emulated subcomponents including:
/// * process clocks
/// * getpid
/// * mman
/// * signal
wasi_emulated_libs: []const wasi_libc.CRTFile = &[0]wasi_libc.CRTFile{},
link_libc: bool = false,
link_libcpp: bool = false,
link_libunwind: bool = false,
@ -1286,6 +1292,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
.framework_dirs = options.framework_dirs,
.system_libs = system_libs,
.syslibroot = darwin_options.syslibroot,
.wasi_emulated_libs = options.wasi_emulated_libs,
.lib_dirs = options.lib_dirs,
.rpath_list = options.rpath_list,
.strip = strip,
@ -1426,8 +1433,19 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
},
});
}
if (comp.wantBuildWasiLibcSysrootFromSource()) {
try comp.work_queue.write(&[_]Job{.{ .wasi_libc_sysroot = {} }});
if (comp.wantBuildWasiLibcFromSource()) {
const wasi_emulated_libs = comp.bin_file.options.wasi_emulated_libs;
try comp.work_queue.ensureUnusedCapacity(wasi_emulated_libs.len + 2); // worst-case we need all components
for (wasi_emulated_libs) |crt_file| {
comp.work_queue.writeItemAssumeCapacity(.{
.wasi_libc_crt_file = crt_file,
});
}
// TODO add logic deciding which crt1 we want here.
comp.work_queue.writeAssumeCapacity(&[_]Job{
.{ .wasi_libc_crt_file = .crt1_o },
.{ .wasi_libc_crt_file = .libc_a },
});
}
if (comp.wantBuildMinGWFromSource()) {
const static_lib_jobs = [_]Job{
@ -2169,12 +2187,12 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor
);
};
},
.wasi_libc_sysroot => {
wasi_libc.buildWasiLibcSysroot(self) catch |err| {
.wasi_libc_crt_file => |crt_file| {
wasi_libc.buildCRTFile(self, crt_file) catch |err| {
// TODO Surface more error details.
try self.setMiscFailure(
.wasi_libc_sysroot,
"unable to build WASI libc sysroot: {s}",
.wasi_libc_crt_file,
"unable to build WASI libc CRT file: {s}",
.{@errorName(err)},
);
};
@ -3303,7 +3321,7 @@ pub fn get_libc_crt_file(comp: *Compilation, arena: *Allocator, basename: []cons
if (comp.wantBuildGLibCFromSource() or
comp.wantBuildMuslFromSource() or
comp.wantBuildMinGWFromSource() or
comp.wantBuildWasiLibcSysrootFromSource())
comp.wantBuildWasiLibcFromSource())
{
return comp.crt_files.get(basename).?.full_object_path;
}
@ -3343,8 +3361,9 @@ fn wantBuildMuslFromSource(comp: Compilation) bool {
!comp.getTarget().isWasm();
}
fn wantBuildWasiLibcSysrootFromSource(comp: Compilation) bool {
return comp.wantBuildLibCFromSource() and comp.getTarget().isWasm();
fn wantBuildWasiLibcFromSource(comp: Compilation) bool {
return comp.wantBuildLibCFromSource() and comp.getTarget().isWasm() and
comp.getTarget().os.tag == .wasi;
}
fn wantBuildMinGWFromSource(comp: Compilation) bool {

View File

@ -13,6 +13,7 @@ const Type = @import("type.zig").Type;
const Cache = @import("Cache.zig");
const build_options = @import("build_options");
const LibCInstallation = @import("libc_installation.zig").LibCInstallation;
const wasi_libc = @import("wasi_libc.zig");
pub const producer_string = if (std.builtin.is_test) "zig test" else "zig " ++ build_options.version;
@ -110,6 +111,7 @@ pub const Options = struct {
framework_dirs: []const []const u8,
frameworks: []const []const u8,
system_libs: std.StringArrayHashMapUnmanaged(void),
wasi_emulated_libs: []const wasi_libc.CRTFile,
lib_dirs: []const []const u8,
rpath_list: []const []const u8,

View File

@ -15,6 +15,7 @@ const codegen = @import("../codegen/wasm.zig");
const link = @import("../link.zig");
const trace = @import("../tracy.zig").trace;
const build_options = @import("build_options");
const wasi_libc = @import("../wasi_libc.zig");
const Cache = @import("../Cache.zig");
const TypedValue = @import("../TypedValue.zig");
@ -574,7 +575,6 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
null;
const target = self.base.options.target;
const link_in_crt = self.base.options.link_libc and self.base.options.output_mode == .Exe;
const id_symlink_basename = "lld.id";
@ -653,8 +653,6 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
try fs.cwd().copyFile(the_object_path, fs.cwd(), full_out_path, .{});
}
} else {
const is_obj = self.base.options.output_mode == .Obj;
// Create an LLD command line and invoke it.
var argv = std.ArrayList([]const u8).init(self.base.allocator);
defer argv.deinit();
@ -662,10 +660,6 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
// This is necessary because LLD does not behave properly as a library -
// it calls exit() and does not reset all global data between invocations.
try argv.appendSlice(&[_][]const u8{ comp.self_exe_path.?, "wasm-ld" });
if (is_obj) {
try argv.append("-r");
}
try argv.append("-error-limit=0");
if (self.base.options.lto) {
@ -697,16 +691,38 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
full_out_path,
});
if (link_in_crt) {
// TODO work out if we want standard crt, a reactor or a command
try argv.append(try comp.get_libc_crt_file(arena, "crt.o"));
}
if (target.os.tag == .wasi) {
if (self.base.options.link_libc and self.base.options.output_mode == .Exe) {
// TODO work out if we want standard crt, a reactor or a command
try argv.append(try comp.get_libc_crt_file(arena, "crt1.o"));
}
if (!is_obj and self.base.options.link_libc) {
try argv.append(try comp.get_libc_crt_file(arena, switch (self.base.options.link_mode) {
.Static => "libc.a",
.Dynamic => unreachable,
}));
const is_exe_or_dyn_lib = self.base.options.output_mode == .Exe or
(self.base.options.output_mode == .Lib and self.base.options.link_mode == .Dynamic);
if (is_exe_or_dyn_lib) {
const system_libs = self.base.options.system_libs.keys();
for (system_libs) |link_lib| {
if (mem.eql(u8, "wasi_snapshot_preview1", link_lib)) {
// Any referenced symbol from this lib, will be undefined until
// runtime as this lib is provided directly by the runtime.
continue;
}
try argv.append(try std.fmt.allocPrint(arena, "-l{s}", .{link_lib}));
}
const wasi_emulated_libs = self.base.options.wasi_emulated_libs;
for (wasi_emulated_libs) |crt_file| {
try argv.append(try comp.get_libc_crt_file(
arena,
wasi_libc.emulatedLibCRFileLibName(crt_file),
));
}
if (self.base.options.link_libc) {
try argv.append(try comp.get_libc_crt_file(arena, "libc.a"));
}
}
}
// Positional arguments to the linker such as object files.

View File

@ -15,6 +15,7 @@ const Package = @import("Package.zig");
const build_options = @import("build_options");
const introspect = @import("introspect.zig");
const LibCInstallation = @import("libc_installation.zig").LibCInstallation;
const wasi_libc = @import("wasi_libc.zig");
const translate_c = @import("translate_c.zig");
const Cache = @import("Cache.zig");
const target_util = @import("target.zig");
@ -616,6 +617,9 @@ fn buildOutputType(
var system_libs = std.ArrayList([]const u8).init(gpa);
defer system_libs.deinit();
var wasi_emulated_libs = std.ArrayList(wasi_libc.CRTFile).init(gpa);
defer wasi_emulated_libs.deinit();
var clang_argv = std.ArrayList([]const u8).init(gpa);
defer clang_argv.deinit();
@ -1586,6 +1590,13 @@ fn buildOutputType(
if (std.fs.path.isAbsolute(lib_name)) {
fatal("cannot use absolute path as a system library: {s}", .{lib_name});
}
if (target_info.target.os.tag == .wasi) {
if (wasi_libc.getEmulatedLibCRTFile(lib_name)) |crt_file| {
try wasi_emulated_libs.append(crt_file);
_ = system_libs.orderedRemove(i);
continue;
}
}
i += 1;
}
}
@ -1895,6 +1906,7 @@ fn buildOutputType(
.framework_dirs = framework_dirs.items,
.frameworks = frameworks.items,
.system_libs = system_libs.items,
.wasi_emulated_libs = wasi_emulated_libs.items,
.link_libc = link_libc,
.link_libcpp = link_libcpp,
.link_libunwind = link_libunwind,

View File

@ -1,4 +1,5 @@
const std = @import("std");
const mem = std.mem;
const path = std.fs.path;
const Allocator = std.mem.Allocator;
@ -7,7 +8,44 @@ const build_options = @import("build_options");
const target_util = @import("target.zig");
const musl = @import("musl.zig");
pub fn buildWasiLibcSysroot(comp: *Compilation) !void {
pub const CRTFile = enum {
crt1_o,
crt1_reactor_o,
crt1_command_o,
libc_a,
libwasi_emulated_process_clocks_a,
libwasi_emulated_getpid_a,
libwasi_emulated_mman_a,
libwasi_emulated_signal_a,
};
pub fn getEmulatedLibCRTFile(lib_name: []const u8) ?CRTFile {
if (mem.eql(u8, lib_name, "wasi-emulated-process-clocks")) {
return .libwasi_emulated_process_clocks_a;
}
if (mem.eql(u8, lib_name, "wasi-emulated-getpid")) {
return .libwasi_emulated_getpid_a;
}
if (mem.eql(u8, lib_name, "wasi-emulated-mman")) {
return .libwasi_emulated_mman_a;
}
if (mem.eql(u8, lib_name, "wasi-emulated-signal")) {
return .libwasi_emulated_signal_a;
}
return null;
}
pub fn emulatedLibCRFileLibName(crt_file: CRTFile) []const u8 {
return switch (crt_file) {
.libwasi_emulated_process_clocks_a => "libwasi-emulated-process-clocks.a",
.libwasi_emulated_getpid_a => "libwasi-emulated-getpid.a",
.libwasi_emulated_mman_a => "libwasi-emulated-mman.a",
.libwasi_emulated_signal_a => "libwasi-emulated-signal.a",
else => unreachable,
};
}
pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {
if (!build_options.have_llvm) {
return error.ZigCompilerNotBuiltWithLLVMExtensions;
}
@ -17,190 +55,190 @@ pub fn buildWasiLibcSysroot(comp: *Compilation) !void {
defer arena_allocator.deinit();
const arena = &arena_allocator.allocator;
{
// Compile crt sources.
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, false);
try args.appendSlice(&[_][]const u8{
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-bottom-half",
"headers",
"private",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-bottom-half",
"cloudlibc",
"src",
"include",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-bottom-half",
"cloudlibc",
"src",
}),
});
var comp_sources = std.ArrayList(Compilation.CSourceFile).init(arena);
for (crt_src_files) |file_path| {
try comp_sources.append(.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, file_path),
}),
.extra_flags = args.items,
switch (crt_file) {
.crt1_o => {
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, false);
try addLibcBottomHalfIncludes(comp, arena, &args);
return comp.build_crt_file("crt1", .Obj, &[1]Compilation.CSourceFile{
.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, crt1_src_file),
}),
.extra_flags = args.items,
},
});
}
try comp.build_crt_file("crt", .Obj, comp_sources.items);
}
},
.crt1_reactor_o => {
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, false);
try addLibcBottomHalfIncludes(comp, arena, &args);
return comp.build_crt_file("crt1-reactor", .Obj, &[1]Compilation.CSourceFile{
.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, crt1_reactor_src_file),
}),
.extra_flags = args.items,
},
});
},
.crt1_command_o => {
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, false);
try addLibcBottomHalfIncludes(comp, arena, &args);
return comp.build_crt_file("crt1-command", .Obj, &[1]Compilation.CSourceFile{
.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, crt1_command_src_file),
}),
.extra_flags = args.items,
},
});
},
.libc_a => {
var libc_sources = std.ArrayList(Compilation.CSourceFile).init(arena);
{
// Compile WASI libc (sysroot).
var comp_sources = std.ArrayList(Compilation.CSourceFile).init(arena);
{
// Compile dlmalloc.
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, true);
try args.appendSlice(&[_][]const u8{
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"dlmalloc",
"include",
}),
});
{
// Compile dlmalloc.
for (dlmalloc_src_files) |file_path| {
try libc_sources.append(.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, file_path),
}),
.extra_flags = args.items,
});
}
}
{
// Compile libc-bottom-half.
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, true);
try addLibcBottomHalfIncludes(comp, arena, &args);
for (libc_bottom_half_src_files) |file_path| {
try libc_sources.append(.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, file_path),
}),
.extra_flags = args.items,
});
}
}
{
// Compile libc-top-half.
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, true);
try addLibcTopHalfIncludes(comp, arena, &args);
for (libc_top_half_src_files) |file_path| {
try libc_sources.append(.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, file_path),
}),
.extra_flags = args.items,
});
}
}
try comp.build_crt_file("c", .Lib, libc_sources.items);
},
.libwasi_emulated_process_clocks_a => {
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, true);
try args.appendSlice(&[_][]const u8{
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"dlmalloc",
"include",
}),
});
try addLibcBottomHalfIncludes(comp, arena, &args);
for (dlmalloc_src_files) |file_path| {
try comp_sources.append(.{
var emu_clocks_sources = std.ArrayList(Compilation.CSourceFile).init(arena);
for (emulated_process_clocks_src_files) |file_path| {
try emu_clocks_sources.append(.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, file_path),
}),
.extra_flags = args.items,
});
}
}
{
// Compile libc-bottom-half.
try comp.build_crt_file("wasi-emulated-process-clocks", .Lib, emu_clocks_sources.items);
},
.libwasi_emulated_getpid_a => {
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, true);
try args.appendSlice(&[_][]const u8{
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-bottom-half",
"headers",
"private",
}),
try addLibcBottomHalfIncludes(comp, arena, &args);
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-bottom-half",
"cloudlibc",
"src",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-bottom-half",
"cloudlibc",
"src",
"include",
}),
});
for (libc_bottom_half_src_files) |file_path| {
try comp_sources.append(.{
var emu_getpid_sources = std.ArrayList(Compilation.CSourceFile).init(arena);
for (emulated_getpid_src_files) |file_path| {
try emu_getpid_sources.append(.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, file_path),
}),
.extra_flags = args.items,
});
}
}
{
// Compile libc-top-half.
try comp.build_crt_file("wasi-emulated-getpid", .Lib, emu_getpid_sources.items);
},
.libwasi_emulated_mman_a => {
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, true);
try args.appendSlice(&[_][]const u8{
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"musl",
"src",
"include",
}),
try addLibcBottomHalfIncludes(comp, arena, &args);
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"musl",
"src",
"internal",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"musl",
"arch",
"wasm32",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"musl",
"arch",
"generic",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"headers",
"private",
}),
});
for (libc_top_half_src_files) |file_path| {
try comp_sources.append(.{
var emu_mman_sources = std.ArrayList(Compilation.CSourceFile).init(arena);
for (emulated_mman_src_files) |file_path| {
try emu_mman_sources.append(.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, file_path),
}),
.extra_flags = args.items,
});
}
}
try comp.build_crt_file("wasi-emulated-mman", .Lib, emu_mman_sources.items);
},
.libwasi_emulated_signal_a => {
var emu_signal_sources = std.ArrayList(Compilation.CSourceFile).init(arena);
try comp.build_crt_file("c", .Lib, comp_sources.items);
{
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, true);
for (emulated_signal_bottom_half_src_files) |file_path| {
try emu_signal_sources.append(.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, file_path),
}),
.extra_flags = args.items,
});
}
}
{
var args = std.ArrayList([]const u8).init(arena);
try addCCArgs(comp, arena, &args, true);
try addLibcTopHalfIncludes(comp, arena, &args);
try args.append("-D_WASI_EMULATED_SIGNAL");
for (emulated_signal_top_half_src_files) |file_path| {
try emu_signal_sources.append(.{
.src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc", try sanitize(arena, file_path),
}),
.extra_flags = args.items,
});
}
}
try comp.build_crt_file("wasi-emulated-signal", .Lib, emu_signal_sources.items);
},
}
}
@ -251,6 +289,99 @@ fn addCCArgs(
});
}
fn addLibcBottomHalfIncludes(
comp: *Compilation,
arena: *Allocator,
args: *std.ArrayList([]const u8),
) error{OutOfMemory}!void {
try args.appendSlice(&[_][]const u8{
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-bottom-half",
"headers",
"private",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-bottom-half",
"cloudlibc",
"src",
"include",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-bottom-half",
"cloudlibc",
"src",
}),
});
}
fn addLibcTopHalfIncludes(
comp: *Compilation,
arena: *Allocator,
args: *std.ArrayList([]const u8),
) error{OutOfMemory}!void {
try args.appendSlice(&[_][]const u8{
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"musl",
"src",
"include",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"musl",
"src",
"internal",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"musl",
"arch",
"wasm32",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"musl",
"arch",
"generic",
}),
"-I",
try comp.zig_lib_directory.join(arena, &[_][]const u8{
"libc",
"wasi",
"libc-top-half",
"headers",
"private",
}),
});
}
const dlmalloc_src_files = [_][]const u8{
"wasi/dlmalloc/src/dlmalloc.c",
};
@ -1005,11 +1136,9 @@ const libc_top_half_src_files = [_][]const u8{
"wasi/libc-top-half/sources/arc4random.c",
};
const crt_src_files = &[_][]const u8{
"wasi/libc-bottom-half/crt/crt1.c",
"wasi/libc-bottom-half/crt/crt1-command.c",
"wasi/libc-bottom-half/crt/crt1-reactor.c",
};
const crt1_src_file = "wasi/libc-bottom-half/crt/crt1.c";
const crt1_command_src_file = "wasi/libc-bottom-half/crt/crt1-command.c";
const crt1_reactor_src_file = "wasi/libc-bottom-half/crt/crt1-reactor.c";
const emulated_process_clocks_src_files = &[_][]const u8{
"wasi/libc-bottom-half/clocks/clock.c",
@ -1025,6 +1154,11 @@ const emulated_mman_src_files = &[_][]const u8{
"wasi/libc-bottom-half/mman/mman.c",
};
const emulated_signal_src_files = &[_][]const u8{
const emulated_signal_bottom_half_src_files = &[_][]const u8{
"wasi/libc-bottom-half/signal/signal.c",
};
const emulated_signal_top_half_src_files = &[_][]const u8{
"wasi/libc-top-half/musl/src/signal/psignal.c",
"wasi/libc-top-half/musl/src/string/strsignal.c",
};