mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
compiler: improve error reporting
The functions `Compilation.create` and `Compilation.update` previously returned inferred error sets, which had built up a lot of crap over time. This meant that certain error conditions -- particularly certain filesystem errors -- were not being reported properly (at best the CLI would just print the error name). This was also a problem in sub-compilations, where at times only the error name -- which might just be something like `LinkFailed` -- would be visible. This commit makes the error handling here more disciplined by introducing concrete error sets to these functions (and a few more as a consequence). These error sets are small: errors in `update` are almost all reported via compile errors, and errors in `create` are reported through a new `Compilation.CreateDiagnostic` type, a tagged union of possible error cases. This allows for better error reporting. Sub-compilations also report errors more correctly in several cases, leading to more informative errors in the case of compiler bugs. Also fixes some race conditions in library building by replacing calls to `setMiscFailure` with calls to `lockAndSetMiscFailure`. Compilation of libraries such as libc happens on the thread pool, so the logic must synchronize its access to shared `Compilation` state.
This commit is contained in:
parent
3d25a9c1e0
commit
1440519239
16 changed files with 646 additions and 344 deletions
|
|
@ -19,7 +19,7 @@ pub fn detect(
|
||||||
is_native_abi: bool,
|
is_native_abi: bool,
|
||||||
link_libc: bool,
|
link_libc: bool,
|
||||||
libc_installation: ?*const LibCInstallation,
|
libc_installation: ?*const LibCInstallation,
|
||||||
) !LibCDirs {
|
) LibCInstallation.FindError!LibCDirs {
|
||||||
if (!link_libc) {
|
if (!link_libc) {
|
||||||
return .{
|
return .{
|
||||||
.libc_include_dir_list = &[0][]u8{},
|
.libc_include_dir_list = &[0][]u8{},
|
||||||
|
|
@ -114,7 +114,7 @@ fn detectFromInstallation(arena: Allocator, target: *const std.Target, lci: *con
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (target.os.tag == .haiku) {
|
if (target.os.tag == .haiku) {
|
||||||
const include_dir_path = lci.include_dir orelse return error.LibCInstallationNotAvailable;
|
const include_dir_path = lci.include_dir.?;
|
||||||
const os_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_path, "os" });
|
const os_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_path, "os" });
|
||||||
list.appendAssumeCapacity(os_dir);
|
list.appendAssumeCapacity(os_dir);
|
||||||
// Errors.h
|
// Errors.h
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -92,6 +92,20 @@ pub const ResolvedTarget = struct {
|
||||||
llvm_cpu_features: ?[*:0]const u8 = null,
|
llvm_cpu_features: ?[*:0]const u8 = null,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const CreateError = error{
|
||||||
|
OutOfMemory,
|
||||||
|
ValgrindUnsupportedOnTarget,
|
||||||
|
TargetRequiresSingleThreaded,
|
||||||
|
BackendRequiresSingleThreaded,
|
||||||
|
TargetRequiresPic,
|
||||||
|
PieRequiresPic,
|
||||||
|
DynamicLinkingRequiresPic,
|
||||||
|
TargetHasNoRedZone,
|
||||||
|
StackCheckUnsupportedByTarget,
|
||||||
|
StackProtectorUnsupportedByTarget,
|
||||||
|
StackProtectorUnavailableWithoutLibC,
|
||||||
|
};
|
||||||
|
|
||||||
/// At least one of `parent` and `resolved_target` must be non-null.
|
/// At least one of `parent` and `resolved_target` must be non-null.
|
||||||
pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {
|
pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {
|
||||||
if (options.inherited.sanitize_thread == true) assert(options.global.any_sanitize_thread);
|
if (options.inherited.sanitize_thread == true) assert(options.global.any_sanitize_thread);
|
||||||
|
|
|
||||||
|
|
@ -5726,6 +5726,7 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr
|
||||||
.global = comp.config,
|
.global = comp.config,
|
||||||
.parent = parent_mod,
|
.parent = parent_mod,
|
||||||
}) catch |err| switch (err) {
|
}) catch |err| switch (err) {
|
||||||
|
error.OutOfMemory => |e| return e,
|
||||||
// None of these are possible because we are creating a package with
|
// None of these are possible because we are creating a package with
|
||||||
// the exact same configuration as the parent package, which already
|
// the exact same configuration as the parent package, which already
|
||||||
// passed these checks.
|
// passed these checks.
|
||||||
|
|
@ -5739,8 +5740,6 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr
|
||||||
error.StackCheckUnsupportedByTarget => unreachable,
|
error.StackCheckUnsupportedByTarget => unreachable,
|
||||||
error.StackProtectorUnsupportedByTarget => unreachable,
|
error.StackProtectorUnsupportedByTarget => unreachable,
|
||||||
error.StackProtectorUnavailableWithoutLibC => unreachable,
|
error.StackProtectorUnavailableWithoutLibC => unreachable,
|
||||||
|
|
||||||
else => |e| return e,
|
|
||||||
};
|
};
|
||||||
const c_import_file_path: Compilation.Path = try c_import_mod.root.join(gpa, comp.dirs, "cimport.zig");
|
const c_import_file_path: Compilation.Path = try c_import_mod.root.join(gpa, comp.dirs, "cimport.zig");
|
||||||
errdefer c_import_file_path.deinit(gpa);
|
errdefer c_import_file_path.deinit(gpa);
|
||||||
|
|
|
||||||
45
src/Zcu.zig
45
src/Zcu.zig
|
|
@ -1038,7 +1038,9 @@ pub const File = struct {
|
||||||
stat: Cache.File.Stat,
|
stat: Cache.File.Stat,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn getSource(file: *File, zcu: *const Zcu) !Source {
|
pub const GetSourceError = error{ OutOfMemory, FileTooBig } || std.fs.File.OpenError || std.fs.File.ReadError;
|
||||||
|
|
||||||
|
pub fn getSource(file: *File, zcu: *const Zcu) GetSourceError!Source {
|
||||||
const gpa = zcu.gpa;
|
const gpa = zcu.gpa;
|
||||||
|
|
||||||
if (file.source) |source| return .{
|
if (file.source) |source| return .{
|
||||||
|
|
@ -1062,7 +1064,7 @@ pub const File = struct {
|
||||||
|
|
||||||
var file_reader = f.reader(&.{});
|
var file_reader = f.reader(&.{});
|
||||||
file_reader.size = stat.size;
|
file_reader.size = stat.size;
|
||||||
try file_reader.interface.readSliceAll(source);
|
file_reader.interface.readSliceAll(source) catch return file_reader.err.?;
|
||||||
|
|
||||||
// Here we do not modify stat fields because this function is the one
|
// Here we do not modify stat fields because this function is the one
|
||||||
// used for error reporting. We need to keep the stat fields stale so that
|
// used for error reporting. We need to keep the stat fields stale so that
|
||||||
|
|
@ -1081,7 +1083,7 @@ pub const File = struct {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getTree(file: *File, zcu: *const Zcu) !*const Ast {
|
pub fn getTree(file: *File, zcu: *const Zcu) GetSourceError!*const Ast {
|
||||||
if (file.tree) |*tree| return tree;
|
if (file.tree) |*tree| return tree;
|
||||||
|
|
||||||
const source = try file.getSource(zcu);
|
const source = try file.getSource(zcu);
|
||||||
|
|
@ -1127,7 +1129,7 @@ pub const File = struct {
|
||||||
file: *File,
|
file: *File,
|
||||||
zcu: *const Zcu,
|
zcu: *const Zcu,
|
||||||
eb: *std.zig.ErrorBundle.Wip,
|
eb: *std.zig.ErrorBundle.Wip,
|
||||||
) !std.zig.ErrorBundle.SourceLocationIndex {
|
) Allocator.Error!std.zig.ErrorBundle.SourceLocationIndex {
|
||||||
return eb.addSourceLocation(.{
|
return eb.addSourceLocation(.{
|
||||||
.src_path = try eb.printString("{f}", .{file.path.fmt(zcu.comp)}),
|
.src_path = try eb.printString("{f}", .{file.path.fmt(zcu.comp)}),
|
||||||
.span_start = 0,
|
.span_start = 0,
|
||||||
|
|
@ -1138,17 +1140,17 @@ pub const File = struct {
|
||||||
.source_line = 0,
|
.source_line = 0,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
/// Asserts that the tree has already been loaded with `getTree`.
|
||||||
pub fn errorBundleTokenSrc(
|
pub fn errorBundleTokenSrc(
|
||||||
file: *File,
|
file: *File,
|
||||||
tok: Ast.TokenIndex,
|
tok: Ast.TokenIndex,
|
||||||
zcu: *const Zcu,
|
zcu: *const Zcu,
|
||||||
eb: *std.zig.ErrorBundle.Wip,
|
eb: *std.zig.ErrorBundle.Wip,
|
||||||
) !std.zig.ErrorBundle.SourceLocationIndex {
|
) Allocator.Error!std.zig.ErrorBundle.SourceLocationIndex {
|
||||||
const source = try file.getSource(zcu);
|
const tree = &file.tree.?;
|
||||||
const tree = try file.getTree(zcu);
|
|
||||||
const start = tree.tokenStart(tok);
|
const start = tree.tokenStart(tok);
|
||||||
const end = start + tree.tokenSlice(tok).len;
|
const end = start + tree.tokenSlice(tok).len;
|
||||||
const loc = std.zig.findLineColumn(source.bytes, start);
|
const loc = std.zig.findLineColumn(file.source.?, start);
|
||||||
return eb.addSourceLocation(.{
|
return eb.addSourceLocation(.{
|
||||||
.src_path = try eb.printString("{f}", .{file.path.fmt(zcu.comp)}),
|
.src_path = try eb.printString("{f}", .{file.path.fmt(zcu.comp)}),
|
||||||
.span_start = start,
|
.span_start = start,
|
||||||
|
|
@ -2665,8 +2667,9 @@ pub const LazySrcLoc = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Used to sort error messages, so that they're printed in a consistent order.
|
/// Used to sort error messages, so that they're printed in a consistent order.
|
||||||
/// If an error is returned, that error makes sorting impossible.
|
/// If an error is returned, a file could not be read in order to resolve a source location.
|
||||||
pub fn lessThan(lhs_lazy: LazySrcLoc, rhs_lazy: LazySrcLoc, zcu: *Zcu) !bool {
|
/// In that case, `bad_file_out` is populated, and sorting is impossible.
|
||||||
|
pub fn lessThan(lhs_lazy: LazySrcLoc, rhs_lazy: LazySrcLoc, zcu: *Zcu, bad_file_out: **Zcu.File) File.GetSourceError!bool {
|
||||||
const lhs_src = lhs_lazy.upgradeOrLost(zcu) orelse {
|
const lhs_src = lhs_lazy.upgradeOrLost(zcu) orelse {
|
||||||
// LHS source location lost, so should never be referenced. Just sort it to the end.
|
// LHS source location lost, so should never be referenced. Just sort it to the end.
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -2684,8 +2687,14 @@ pub const LazySrcLoc = struct {
|
||||||
return std.mem.order(u8, lhs_path.sub_path, rhs_path.sub_path).compare(.lt);
|
return std.mem.order(u8, lhs_path.sub_path, rhs_path.sub_path).compare(.lt);
|
||||||
}
|
}
|
||||||
|
|
||||||
const lhs_span = try lhs_src.span(zcu);
|
const lhs_span = lhs_src.span(zcu) catch |err| {
|
||||||
const rhs_span = try rhs_src.span(zcu);
|
bad_file_out.* = lhs_src.file_scope;
|
||||||
|
return err;
|
||||||
|
};
|
||||||
|
const rhs_span = rhs_src.span(zcu) catch |err| {
|
||||||
|
bad_file_out.* = rhs_src.file_scope;
|
||||||
|
return err;
|
||||||
|
};
|
||||||
return lhs_span.main < rhs_span.main;
|
return lhs_span.main < rhs_span.main;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -4584,7 +4593,7 @@ pub fn codegenFailTypeMsg(zcu: *Zcu, ty_index: InternPool.Index, msg: *ErrorMsg)
|
||||||
pub fn addFileInMultipleModulesError(
|
pub fn addFileInMultipleModulesError(
|
||||||
zcu: *Zcu,
|
zcu: *Zcu,
|
||||||
eb: *std.zig.ErrorBundle.Wip,
|
eb: *std.zig.ErrorBundle.Wip,
|
||||||
) !void {
|
) Allocator.Error!void {
|
||||||
const gpa = zcu.gpa;
|
const gpa = zcu.gpa;
|
||||||
|
|
||||||
const info = zcu.multi_module_err.?;
|
const info = zcu.multi_module_err.?;
|
||||||
|
|
@ -4631,7 +4640,7 @@ fn explainWhyFileIsInModule(
|
||||||
file: File.Index,
|
file: File.Index,
|
||||||
in_module: *Package.Module,
|
in_module: *Package.Module,
|
||||||
ref: File.Reference,
|
ref: File.Reference,
|
||||||
) !void {
|
) Allocator.Error!void {
|
||||||
const gpa = zcu.gpa;
|
const gpa = zcu.gpa;
|
||||||
|
|
||||||
// error: file is the root of module 'foo'
|
// error: file is the root of module 'foo'
|
||||||
|
|
@ -4666,7 +4675,13 @@ fn explainWhyFileIsInModule(
|
||||||
const thing: []const u8 = if (is_first) "file" else "which";
|
const thing: []const u8 = if (is_first) "file" else "which";
|
||||||
is_first = false;
|
is_first = false;
|
||||||
|
|
||||||
const import_src = try zcu.fileByIndex(import.importer).errorBundleTokenSrc(import.tok, zcu, eb);
|
const importer_file = zcu.fileByIndex(import.importer);
|
||||||
|
// `errorBundleTokenSrc` expects the tree to be loaded
|
||||||
|
_ = importer_file.getTree(zcu) catch |err| {
|
||||||
|
try Compilation.unableToLoadZcuFile(zcu, eb, importer_file, err);
|
||||||
|
return; // stop the explanation early
|
||||||
|
};
|
||||||
|
const import_src = try importer_file.errorBundleTokenSrc(import.tok, zcu, eb);
|
||||||
|
|
||||||
const importer_ref = zcu.alive_files.get(import.importer).?;
|
const importer_ref = zcu.alive_files.get(import.importer).?;
|
||||||
const importer_root: ?*Package.Module = switch (importer_ref) {
|
const importer_root: ?*Package.Module = switch (importer_ref) {
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ fn libcPath(comp: *Compilation, arena: Allocator, sub_path: []const u8) ![]const
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
||||||
/// setMiscFailure and returning error.SubCompilationFailed. see libcxx.zig for example.
|
/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
|
||||||
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
||||||
if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
||||||
|
|
||||||
|
|
@ -414,7 +414,7 @@ fn wordDirective(target: *const std.Target) []const u8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
||||||
/// setMiscFailure and returning error.SubCompilationFailed. see libcxx.zig for example.
|
/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
|
||||||
pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anyerror!void {
|
pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anyerror!void {
|
||||||
// See also glibc.zig which this code is based on.
|
// See also glibc.zig which this code is based on.
|
||||||
|
|
||||||
|
|
@ -1065,7 +1065,10 @@ fn buildSharedLib(
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const sub_compilation = try Compilation.create(comp.gpa, arena, .{
|
const misc_task: Compilation.MiscTask = .@"freebsd libc shared object";
|
||||||
|
|
||||||
|
var sub_create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const sub_compilation = Compilation.create(comp.gpa, arena, &sub_create_diag, .{
|
||||||
.dirs = comp.dirs.withoutLocalCache(),
|
.dirs = comp.dirs.withoutLocalCache(),
|
||||||
.thread_pool = comp.thread_pool,
|
.thread_pool = comp.thread_pool,
|
||||||
.self_exe_path = comp.self_exe_path,
|
.self_exe_path = comp.self_exe_path,
|
||||||
|
|
@ -1090,8 +1093,14 @@ fn buildSharedLib(
|
||||||
.soname = soname,
|
.soname = soname,
|
||||||
.c_source_files = &c_source_files,
|
.c_source_files = &c_source_files,
|
||||||
.skip_linker_dependencies = true,
|
.skip_linker_dependencies = true,
|
||||||
});
|
}) catch |err| switch (err) {
|
||||||
|
error.CreateFail => {
|
||||||
|
comp.lockAndSetMiscFailure(misc_task, "sub-compilation of {t} failed: {f}", .{ misc_task, sub_create_diag });
|
||||||
|
return error.AlreadyReported;
|
||||||
|
},
|
||||||
|
else => |e| return e,
|
||||||
|
};
|
||||||
defer sub_compilation.destroy();
|
defer sub_compilation.destroy();
|
||||||
|
|
||||||
try comp.updateSubCompilation(sub_compilation, .@"freebsd libc shared object", prog_node);
|
try comp.updateSubCompilation(sub_compilation, misc_task, prog_node);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,7 @@ pub const CrtFile = enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
||||||
/// setMiscFailure and returning error.SubCompilationFailed. see libcxx.zig for example.
|
/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
|
||||||
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
||||||
if (!build_options.have_llvm) {
|
if (!build_options.have_llvm) {
|
||||||
return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
||||||
|
|
@ -656,7 +656,7 @@ fn wordDirective(target: *const std.Target) []const u8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
||||||
/// setMiscFailure and returning error.SubCompilationFailed. see libcxx.zig for example.
|
/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
|
||||||
pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anyerror!void {
|
pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anyerror!void {
|
||||||
const tracy = trace(@src());
|
const tracy = trace(@src());
|
||||||
defer tracy.end();
|
defer tracy.end();
|
||||||
|
|
@ -1223,7 +1223,10 @@ fn buildSharedLib(
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const sub_compilation = try Compilation.create(comp.gpa, arena, .{
|
const misc_task: Compilation.MiscTask = .@"glibc shared object";
|
||||||
|
|
||||||
|
var sub_create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const sub_compilation = Compilation.create(comp.gpa, arena, &sub_create_diag, .{
|
||||||
.dirs = comp.dirs.withoutLocalCache(),
|
.dirs = comp.dirs.withoutLocalCache(),
|
||||||
.thread_pool = comp.thread_pool,
|
.thread_pool = comp.thread_pool,
|
||||||
.self_exe_path = comp.self_exe_path,
|
.self_exe_path = comp.self_exe_path,
|
||||||
|
|
@ -1248,10 +1251,16 @@ fn buildSharedLib(
|
||||||
.soname = soname,
|
.soname = soname,
|
||||||
.c_source_files = &c_source_files,
|
.c_source_files = &c_source_files,
|
||||||
.skip_linker_dependencies = true,
|
.skip_linker_dependencies = true,
|
||||||
});
|
}) catch |err| switch (err) {
|
||||||
|
error.CreateFail => {
|
||||||
|
comp.lockAndSetMiscFailure(misc_task, "sub-compilation of {t} failed: {f}", .{ misc_task, sub_create_diag });
|
||||||
|
return error.AlreadyReported;
|
||||||
|
},
|
||||||
|
else => |e| return e,
|
||||||
|
};
|
||||||
defer sub_compilation.destroy();
|
defer sub_compilation.destroy();
|
||||||
|
|
||||||
try comp.updateSubCompilation(sub_compilation, .@"glibc shared object", prog_node);
|
try comp.updateSubCompilation(sub_compilation, misc_task, prog_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn needsCrt0(output_mode: std.builtin.OutputMode) ?CrtFile {
|
pub fn needsCrt0(output_mode: std.builtin.OutputMode) ?CrtFile {
|
||||||
|
|
|
||||||
|
|
@ -102,7 +102,7 @@ const libcxx_thread_files = [_][]const u8{
|
||||||
|
|
||||||
pub const BuildError = error{
|
pub const BuildError = error{
|
||||||
OutOfMemory,
|
OutOfMemory,
|
||||||
SubCompilationFailed,
|
AlreadyReported,
|
||||||
ZigCompilerNotBuiltWithLLVMExtensions,
|
ZigCompilerNotBuiltWithLLVMExtensions,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -144,12 +144,12 @@ pub fn buildLibCxx(comp: *Compilation, prog_node: std.Progress.Node) BuildError!
|
||||||
.lto = comp.config.lto,
|
.lto = comp.config.lto,
|
||||||
.any_sanitize_thread = comp.config.any_sanitize_thread,
|
.any_sanitize_thread = comp.config.any_sanitize_thread,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(
|
||||||
.libcxx,
|
.libcxx,
|
||||||
"unable to build libc++: resolving configuration failed: {s}",
|
"unable to build libc++: resolving configuration failed: {s}",
|
||||||
.{@errorName(err)},
|
.{@errorName(err)},
|
||||||
);
|
);
|
||||||
return error.SubCompilationFailed;
|
return error.AlreadyReported;
|
||||||
};
|
};
|
||||||
|
|
||||||
const root_mod = Module.create(arena, .{
|
const root_mod = Module.create(arena, .{
|
||||||
|
|
@ -177,12 +177,12 @@ pub fn buildLibCxx(comp: *Compilation, prog_node: std.Progress.Node) BuildError!
|
||||||
.cc_argv = &.{},
|
.cc_argv = &.{},
|
||||||
.parent = null,
|
.parent = null,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(
|
||||||
.libcxx,
|
.libcxx,
|
||||||
"unable to build libc++: creating module failed: {s}",
|
"unable to build libc++: creating module failed: {s}",
|
||||||
.{@errorName(err)},
|
.{@errorName(err)},
|
||||||
);
|
);
|
||||||
return error.SubCompilationFailed;
|
return error.AlreadyReported;
|
||||||
};
|
};
|
||||||
|
|
||||||
const libcxx_files = if (comp.config.any_non_single_threaded)
|
const libcxx_files = if (comp.config.any_non_single_threaded)
|
||||||
|
|
@ -255,7 +255,10 @@ pub fn buildLibCxx(comp: *Compilation, prog_node: std.Progress.Node) BuildError!
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const sub_compilation = Compilation.create(comp.gpa, arena, .{
|
const misc_task: Compilation.MiscTask = .libcxx;
|
||||||
|
|
||||||
|
var sub_create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const sub_compilation = Compilation.create(comp.gpa, arena, &sub_create_diag, .{
|
||||||
.dirs = comp.dirs.withoutLocalCache(),
|
.dirs = comp.dirs.withoutLocalCache(),
|
||||||
.self_exe_path = comp.self_exe_path,
|
.self_exe_path = comp.self_exe_path,
|
||||||
.cache_mode = .whole,
|
.cache_mode = .whole,
|
||||||
|
|
@ -276,24 +279,19 @@ pub fn buildLibCxx(comp: *Compilation, prog_node: std.Progress.Node) BuildError!
|
||||||
.clang_passthrough_mode = comp.clang_passthrough_mode,
|
.clang_passthrough_mode = comp.clang_passthrough_mode,
|
||||||
.skip_linker_dependencies = true,
|
.skip_linker_dependencies = true,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
switch (err) {
|
||||||
.libcxx,
|
else => comp.lockAndSetMiscFailure(misc_task, "unable to build libc++: create compilation failed: {t}", .{err}),
|
||||||
"unable to build libc++: create compilation failed: {s}",
|
error.CreateFail => comp.lockAndSetMiscFailure(misc_task, "unable to build libc++: create compilation failed: {f}", .{sub_create_diag}),
|
||||||
.{@errorName(err)},
|
}
|
||||||
);
|
return error.AlreadyReported;
|
||||||
return error.SubCompilationFailed;
|
|
||||||
};
|
};
|
||||||
defer sub_compilation.destroy();
|
defer sub_compilation.destroy();
|
||||||
|
|
||||||
comp.updateSubCompilation(sub_compilation, .libcxx, prog_node) catch |err| switch (err) {
|
comp.updateSubCompilation(sub_compilation, misc_task, prog_node) catch |err| switch (err) {
|
||||||
error.SubCompilationFailed => return error.SubCompilationFailed,
|
error.AlreadyReported => return error.AlreadyReported,
|
||||||
else => |e| {
|
else => |e| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(misc_task, "unable to build libc++: compilation failed: {t}", .{e});
|
||||||
.libcxx,
|
return error.AlreadyReported;
|
||||||
"unable to build libc++: compilation failed: {s}",
|
|
||||||
.{@errorName(e)},
|
|
||||||
);
|
|
||||||
return error.SubCompilationFailed;
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -345,12 +343,12 @@ pub fn buildLibCxxAbi(comp: *Compilation, prog_node: std.Progress.Node) BuildErr
|
||||||
.lto = comp.config.lto,
|
.lto = comp.config.lto,
|
||||||
.any_sanitize_thread = comp.config.any_sanitize_thread,
|
.any_sanitize_thread = comp.config.any_sanitize_thread,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(
|
||||||
.libcxxabi,
|
.libcxxabi,
|
||||||
"unable to build libc++abi: resolving configuration failed: {s}",
|
"unable to build libc++abi: resolving configuration failed: {s}",
|
||||||
.{@errorName(err)},
|
.{@errorName(err)},
|
||||||
);
|
);
|
||||||
return error.SubCompilationFailed;
|
return error.AlreadyReported;
|
||||||
};
|
};
|
||||||
|
|
||||||
const root_mod = Module.create(arena, .{
|
const root_mod = Module.create(arena, .{
|
||||||
|
|
@ -379,12 +377,12 @@ pub fn buildLibCxxAbi(comp: *Compilation, prog_node: std.Progress.Node) BuildErr
|
||||||
.cc_argv = &.{},
|
.cc_argv = &.{},
|
||||||
.parent = null,
|
.parent = null,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(
|
||||||
.libcxxabi,
|
.libcxxabi,
|
||||||
"unable to build libc++abi: creating module failed: {s}",
|
"unable to build libc++abi: creating module failed: {s}",
|
||||||
.{@errorName(err)},
|
.{@errorName(err)},
|
||||||
);
|
);
|
||||||
return error.SubCompilationFailed;
|
return error.AlreadyReported;
|
||||||
};
|
};
|
||||||
|
|
||||||
var c_source_files = try std.ArrayList(Compilation.CSourceFile).initCapacity(arena, libcxxabi_files.len);
|
var c_source_files = try std.ArrayList(Compilation.CSourceFile).initCapacity(arena, libcxxabi_files.len);
|
||||||
|
|
@ -446,7 +444,10 @@ pub fn buildLibCxxAbi(comp: *Compilation, prog_node: std.Progress.Node) BuildErr
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const sub_compilation = Compilation.create(comp.gpa, arena, .{
|
const misc_task: Compilation.MiscTask = .libcxxabi;
|
||||||
|
|
||||||
|
var sub_create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const sub_compilation = Compilation.create(comp.gpa, arena, &sub_create_diag, .{
|
||||||
.dirs = comp.dirs.withoutLocalCache(),
|
.dirs = comp.dirs.withoutLocalCache(),
|
||||||
.self_exe_path = comp.self_exe_path,
|
.self_exe_path = comp.self_exe_path,
|
||||||
.cache_mode = .whole,
|
.cache_mode = .whole,
|
||||||
|
|
@ -467,24 +468,23 @@ pub fn buildLibCxxAbi(comp: *Compilation, prog_node: std.Progress.Node) BuildErr
|
||||||
.clang_passthrough_mode = comp.clang_passthrough_mode,
|
.clang_passthrough_mode = comp.clang_passthrough_mode,
|
||||||
.skip_linker_dependencies = true,
|
.skip_linker_dependencies = true,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
switch (err) {
|
||||||
.libcxxabi,
|
else => comp.lockAndSetMiscFailure(misc_task, "unable to build libc++abi: create compilation failed: {t}", .{err}),
|
||||||
"unable to build libc++abi: create compilation failed: {s}",
|
error.CreateFail => comp.lockAndSetMiscFailure(misc_task, "unable to build libc++abi: create compilation failed: {f}", .{sub_create_diag}),
|
||||||
.{@errorName(err)},
|
}
|
||||||
);
|
return error.AlreadyReported;
|
||||||
return error.SubCompilationFailed;
|
|
||||||
};
|
};
|
||||||
defer sub_compilation.destroy();
|
defer sub_compilation.destroy();
|
||||||
|
|
||||||
comp.updateSubCompilation(sub_compilation, .libcxxabi, prog_node) catch |err| switch (err) {
|
comp.updateSubCompilation(sub_compilation, misc_task, prog_node) catch |err| switch (err) {
|
||||||
error.SubCompilationFailed => return error.SubCompilationFailed,
|
error.AlreadyReported => return error.AlreadyReported,
|
||||||
else => |e| {
|
else => |e| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(
|
||||||
.libcxxabi,
|
.libcxxabi,
|
||||||
"unable to build libc++abi: compilation failed: {s}",
|
"unable to build libc++abi: compilation failed: {s}",
|
||||||
.{@errorName(e)},
|
.{@errorName(e)},
|
||||||
);
|
);
|
||||||
return error.SubCompilationFailed;
|
return error.AlreadyReported;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ const Module = @import("../Package/Module.zig");
|
||||||
|
|
||||||
pub const BuildError = error{
|
pub const BuildError = error{
|
||||||
OutOfMemory,
|
OutOfMemory,
|
||||||
SubCompilationFailed,
|
AlreadyReported,
|
||||||
ZigCompilerNotBuiltWithLLVMExtensions,
|
ZigCompilerNotBuiltWithLLVMExtensions,
|
||||||
TSANUnsupportedCPUArchitecture,
|
TSANUnsupportedCPUArchitecture,
|
||||||
};
|
};
|
||||||
|
|
@ -66,12 +66,12 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo
|
||||||
// LLVM disables LTO for its libtsan.
|
// LLVM disables LTO for its libtsan.
|
||||||
.lto = .none,
|
.lto = .none,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(
|
||||||
.libtsan,
|
.libtsan,
|
||||||
"unable to build thread sanitizer runtime: resolving configuration failed: {s}",
|
"unable to build thread sanitizer runtime: resolving configuration failed: {s}",
|
||||||
.{@errorName(err)},
|
.{@errorName(err)},
|
||||||
);
|
);
|
||||||
return error.SubCompilationFailed;
|
return error.AlreadyReported;
|
||||||
};
|
};
|
||||||
|
|
||||||
const common_flags = [_][]const u8{
|
const common_flags = [_][]const u8{
|
||||||
|
|
@ -105,12 +105,12 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo
|
||||||
.cc_argv = &common_flags,
|
.cc_argv = &common_flags,
|
||||||
.parent = null,
|
.parent = null,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(
|
||||||
.libtsan,
|
.libtsan,
|
||||||
"unable to build thread sanitizer runtime: creating module failed: {s}",
|
"unable to build thread sanitizer runtime: creating module failed: {s}",
|
||||||
.{@errorName(err)},
|
.{@errorName(err)},
|
||||||
);
|
);
|
||||||
return error.SubCompilationFailed;
|
return error.AlreadyReported;
|
||||||
};
|
};
|
||||||
|
|
||||||
var c_source_files = std.ArrayList(Compilation.CSourceFile).init(arena);
|
var c_source_files = std.ArrayList(Compilation.CSourceFile).init(arena);
|
||||||
|
|
@ -273,7 +273,11 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo
|
||||||
null;
|
null;
|
||||||
// Workaround for https://github.com/llvm/llvm-project/issues/97627
|
// Workaround for https://github.com/llvm/llvm-project/issues/97627
|
||||||
const headerpad_size: ?u32 = if (target.os.tag.isDarwin()) 32 else null;
|
const headerpad_size: ?u32 = if (target.os.tag.isDarwin()) 32 else null;
|
||||||
const sub_compilation = Compilation.create(comp.gpa, arena, .{
|
|
||||||
|
const misc_task: Compilation.MiscTask = .libtsan;
|
||||||
|
|
||||||
|
var sub_create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const sub_compilation = Compilation.create(comp.gpa, arena, &sub_create_diag, .{
|
||||||
.dirs = comp.dirs.withoutLocalCache(),
|
.dirs = comp.dirs.withoutLocalCache(),
|
||||||
.thread_pool = comp.thread_pool,
|
.thread_pool = comp.thread_pool,
|
||||||
.self_exe_path = comp.self_exe_path,
|
.self_exe_path = comp.self_exe_path,
|
||||||
|
|
@ -297,24 +301,19 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo
|
||||||
.install_name = install_name,
|
.install_name = install_name,
|
||||||
.headerpad_size = headerpad_size,
|
.headerpad_size = headerpad_size,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
switch (err) {
|
||||||
.libtsan,
|
else => comp.lockAndSetMiscFailure(misc_task, "unable to build {t}: create compilation failed: {t}", .{ misc_task, err }),
|
||||||
"unable to build thread sanitizer runtime: create compilation failed: {s}",
|
error.CreateFail => comp.lockAndSetMiscFailure(misc_task, "unable to build {t}: create compilation failed: {f}", .{ misc_task, sub_create_diag }),
|
||||||
.{@errorName(err)},
|
}
|
||||||
);
|
return error.AlreadyReported;
|
||||||
return error.SubCompilationFailed;
|
|
||||||
};
|
};
|
||||||
defer sub_compilation.destroy();
|
defer sub_compilation.destroy();
|
||||||
|
|
||||||
comp.updateSubCompilation(sub_compilation, .libtsan, prog_node) catch |err| switch (err) {
|
comp.updateSubCompilation(sub_compilation, misc_task, prog_node) catch |err| switch (err) {
|
||||||
error.SubCompilationFailed => return error.SubCompilationFailed,
|
error.AlreadyReported => return error.AlreadyReported,
|
||||||
else => |e| {
|
else => |e| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(misc_task, "unable to build {t}: compilation failed: {s}", .{ misc_task, @errorName(e) });
|
||||||
.libtsan,
|
return error.AlreadyReported;
|
||||||
"unable to build thread sanitizer runtime: compilation failed: {s}",
|
|
||||||
.{@errorName(e)},
|
|
||||||
);
|
|
||||||
return error.SubCompilationFailed;
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ const trace = @import("../tracy.zig").trace;
|
||||||
|
|
||||||
pub const BuildError = error{
|
pub const BuildError = error{
|
||||||
OutOfMemory,
|
OutOfMemory,
|
||||||
SubCompilationFailed,
|
AlreadyReported,
|
||||||
ZigCompilerNotBuiltWithLLVMExtensions,
|
ZigCompilerNotBuiltWithLLVMExtensions,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -42,12 +42,12 @@ pub fn buildStaticLib(comp: *Compilation, prog_node: std.Progress.Node) BuildErr
|
||||||
.any_unwind_tables = unwind_tables != .none,
|
.any_unwind_tables = unwind_tables != .none,
|
||||||
.lto = comp.config.lto,
|
.lto = comp.config.lto,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(
|
||||||
.libunwind,
|
.libunwind,
|
||||||
"unable to build libunwind: resolving configuration failed: {s}",
|
"unable to build libunwind: resolving configuration failed: {s}",
|
||||||
.{@errorName(err)},
|
.{@errorName(err)},
|
||||||
);
|
);
|
||||||
return error.SubCompilationFailed;
|
return error.AlreadyReported;
|
||||||
};
|
};
|
||||||
const root_mod = Module.create(arena, .{
|
const root_mod = Module.create(arena, .{
|
||||||
.paths = .{
|
.paths = .{
|
||||||
|
|
@ -76,12 +76,12 @@ pub fn buildStaticLib(comp: *Compilation, prog_node: std.Progress.Node) BuildErr
|
||||||
.cc_argv = &.{},
|
.cc_argv = &.{},
|
||||||
.parent = null,
|
.parent = null,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(
|
||||||
.libunwind,
|
.libunwind,
|
||||||
"unable to build libunwind: creating module failed: {s}",
|
"unable to build libunwind: creating module failed: {s}",
|
||||||
.{@errorName(err)},
|
.{@errorName(err)},
|
||||||
);
|
);
|
||||||
return error.SubCompilationFailed;
|
return error.AlreadyReported;
|
||||||
};
|
};
|
||||||
|
|
||||||
const root_name = "unwind";
|
const root_name = "unwind";
|
||||||
|
|
@ -139,7 +139,11 @@ pub fn buildStaticLib(comp: *Compilation, prog_node: std.Progress.Node) BuildErr
|
||||||
.owner = root_mod,
|
.owner = root_mod,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
const sub_compilation = Compilation.create(comp.gpa, arena, .{
|
|
||||||
|
const misc_task: Compilation.MiscTask = .libunwind;
|
||||||
|
|
||||||
|
var sub_create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const sub_compilation = Compilation.create(comp.gpa, arena, &sub_create_diag, .{
|
||||||
.dirs = comp.dirs.withoutLocalCache(),
|
.dirs = comp.dirs.withoutLocalCache(),
|
||||||
.self_exe_path = comp.self_exe_path,
|
.self_exe_path = comp.self_exe_path,
|
||||||
.config = config,
|
.config = config,
|
||||||
|
|
@ -162,24 +166,19 @@ pub fn buildStaticLib(comp: *Compilation, prog_node: std.Progress.Node) BuildErr
|
||||||
.clang_passthrough_mode = comp.clang_passthrough_mode,
|
.clang_passthrough_mode = comp.clang_passthrough_mode,
|
||||||
.skip_linker_dependencies = true,
|
.skip_linker_dependencies = true,
|
||||||
}) catch |err| {
|
}) catch |err| {
|
||||||
comp.setMiscFailure(
|
switch (err) {
|
||||||
.libunwind,
|
else => comp.lockAndSetMiscFailure(misc_task, "unable to build {t}: create compilation failed: {t}", .{ misc_task, err }),
|
||||||
"unable to build libunwind: create compilation failed: {s}",
|
error.CreateFail => comp.lockAndSetMiscFailure(misc_task, "unable to build {t}: create compilation failed: {f}", .{ misc_task, sub_create_diag }),
|
||||||
.{@errorName(err)},
|
}
|
||||||
);
|
return error.AlreadyReported;
|
||||||
return error.SubCompilationFailed;
|
|
||||||
};
|
};
|
||||||
defer sub_compilation.destroy();
|
defer sub_compilation.destroy();
|
||||||
|
|
||||||
comp.updateSubCompilation(sub_compilation, .libunwind, prog_node) catch |err| switch (err) {
|
comp.updateSubCompilation(sub_compilation, misc_task, prog_node) catch |err| switch (err) {
|
||||||
error.SubCompilationFailed => return error.SubCompilationFailed,
|
error.AlreadyReported => return error.AlreadyReported,
|
||||||
else => |e| {
|
else => |e| {
|
||||||
comp.setMiscFailure(
|
comp.lockAndSetMiscFailure(misc_task, "unable to build {t}: compilation failed: {s}", .{ misc_task, @errorName(e) });
|
||||||
.libunwind,
|
return error.AlreadyReported;
|
||||||
"unable to build libunwind: compilation failed: {s}",
|
|
||||||
.{@errorName(e)},
|
|
||||||
);
|
|
||||||
return error.SubCompilationFailed;
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ pub const CrtFile = enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
||||||
/// setMiscFailure and returning error.SubCompilationFailed. see libcxx.zig for example.
|
/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
|
||||||
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
||||||
if (!build_options.have_llvm) {
|
if (!build_options.have_llvm) {
|
||||||
return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ pub const CrtFile = enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
||||||
/// setMiscFailure and returning error.SubCompilationFailed. see libcxx.zig for example.
|
/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
|
||||||
pub fn buildCrtFile(comp: *Compilation, in_crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
pub fn buildCrtFile(comp: *Compilation, in_crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
||||||
if (!build_options.have_llvm) {
|
if (!build_options.have_llvm) {
|
||||||
return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
||||||
|
|
@ -243,7 +243,10 @@ pub fn buildCrtFile(comp: *Compilation, in_crt_file: CrtFile, prog_node: std.Pro
|
||||||
.parent = null,
|
.parent = null,
|
||||||
});
|
});
|
||||||
|
|
||||||
const sub_compilation = try Compilation.create(comp.gpa, arena, .{
|
const misc_task: Compilation.MiscTask = .@"musl libc.so";
|
||||||
|
|
||||||
|
var sub_create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const sub_compilation = Compilation.create(comp.gpa, arena, &sub_create_diag, .{
|
||||||
.dirs = comp.dirs.withoutLocalCache(),
|
.dirs = comp.dirs.withoutLocalCache(),
|
||||||
.self_exe_path = comp.self_exe_path,
|
.self_exe_path = comp.self_exe_path,
|
||||||
.cache_mode = .whole,
|
.cache_mode = .whole,
|
||||||
|
|
@ -268,10 +271,16 @@ pub fn buildCrtFile(comp: *Compilation, in_crt_file: CrtFile, prog_node: std.Pro
|
||||||
},
|
},
|
||||||
.skip_linker_dependencies = true,
|
.skip_linker_dependencies = true,
|
||||||
.soname = "libc.so",
|
.soname = "libc.so",
|
||||||
});
|
}) catch |err| switch (err) {
|
||||||
|
error.CreateFail => {
|
||||||
|
comp.lockAndSetMiscFailure(misc_task, "sub-compilation of {t} failed: {f}", .{ misc_task, sub_create_diag });
|
||||||
|
return error.AlreadyReported;
|
||||||
|
},
|
||||||
|
else => |e| return e,
|
||||||
|
};
|
||||||
defer sub_compilation.destroy();
|
defer sub_compilation.destroy();
|
||||||
|
|
||||||
try comp.updateSubCompilation(sub_compilation, .@"musl libc.so", prog_node);
|
try comp.updateSubCompilation(sub_compilation, misc_task, prog_node);
|
||||||
|
|
||||||
const basename = try comp.gpa.dupe(u8, "libc.so");
|
const basename = try comp.gpa.dupe(u8, "libc.so");
|
||||||
errdefer comp.gpa.free(basename);
|
errdefer comp.gpa.free(basename);
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ fn csuPath(comp: *Compilation, arena: Allocator, sub_path: []const u8) ![]const
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
||||||
/// setMiscFailure and returning error.SubCompilationFailed. see libcxx.zig for example.
|
/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
|
||||||
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
||||||
if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
||||||
|
|
||||||
|
|
@ -360,7 +360,7 @@ fn wordDirective(target: *const std.Target) []const u8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
||||||
/// setMiscFailure and returning error.SubCompilationFailed. see libcxx.zig for example.
|
/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
|
||||||
pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anyerror!void {
|
pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anyerror!void {
|
||||||
// See also glibc.zig which this code is based on.
|
// See also glibc.zig which this code is based on.
|
||||||
|
|
||||||
|
|
@ -729,7 +729,10 @@ fn buildSharedLib(
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const sub_compilation = try Compilation.create(comp.gpa, arena, .{
|
const misc_task: Compilation.MiscTask = .@"netbsd libc shared object";
|
||||||
|
|
||||||
|
var sub_create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const sub_compilation = Compilation.create(comp.gpa, arena, &sub_create_diag, .{
|
||||||
.dirs = comp.dirs.withoutLocalCache(),
|
.dirs = comp.dirs.withoutLocalCache(),
|
||||||
.thread_pool = comp.thread_pool,
|
.thread_pool = comp.thread_pool,
|
||||||
.self_exe_path = comp.self_exe_path,
|
.self_exe_path = comp.self_exe_path,
|
||||||
|
|
@ -753,8 +756,14 @@ fn buildSharedLib(
|
||||||
.soname = soname,
|
.soname = soname,
|
||||||
.c_source_files = &c_source_files,
|
.c_source_files = &c_source_files,
|
||||||
.skip_linker_dependencies = true,
|
.skip_linker_dependencies = true,
|
||||||
});
|
}) catch |err| switch (err) {
|
||||||
|
error.CreateFail => {
|
||||||
|
comp.lockAndSetMiscFailure(misc_task, "sub-compilation of {t} failed: {f}", .{ misc_task, sub_create_diag });
|
||||||
|
return error.AlreadyReported;
|
||||||
|
},
|
||||||
|
else => |e| return e,
|
||||||
|
};
|
||||||
defer sub_compilation.destroy();
|
defer sub_compilation.destroy();
|
||||||
|
|
||||||
try comp.updateSubCompilation(sub_compilation, .@"netbsd libc shared object", prog_node);
|
try comp.updateSubCompilation(sub_compilation, misc_task, prog_node);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ pub fn execModelCrtFileFullName(wasi_exec_model: std.builtin.WasiExecModel) []co
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
/// TODO replace anyerror with explicit error set, recording user-friendly errors with
|
||||||
/// setMiscFailure and returning error.SubCompilationFailed. see libcxx.zig for example.
|
/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
|
||||||
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
|
||||||
if (!build_options.have_llvm) {
|
if (!build_options.have_llvm) {
|
||||||
return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
return error.ZigCompilerNotBuiltWithLLVMExtensions;
|
||||||
|
|
|
||||||
|
|
@ -509,6 +509,8 @@ pub const File = struct {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const OpenError = @typeInfo(@typeInfo(@TypeOf(open)).@"fn".return_type.?).error_union.error_set;
|
||||||
|
|
||||||
/// Attempts incremental linking, if the file already exists. If
|
/// Attempts incremental linking, if the file already exists. If
|
||||||
/// incremental linking fails, falls back to truncating the file and
|
/// incremental linking fails, falls back to truncating the file and
|
||||||
/// rewriting it. A malicious file is detected as incremental link failure
|
/// rewriting it. A malicious file is detected as incremental link failure
|
||||||
|
|
|
||||||
106
src/main.zig
106
src/main.zig
|
|
@ -3395,7 +3395,8 @@ fn buildOutputType(
|
||||||
var file_system_inputs: std.ArrayListUnmanaged(u8) = .empty;
|
var file_system_inputs: std.ArrayListUnmanaged(u8) = .empty;
|
||||||
defer file_system_inputs.deinit(gpa);
|
defer file_system_inputs.deinit(gpa);
|
||||||
|
|
||||||
const comp = Compilation.create(gpa, arena, .{
|
var create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const comp = Compilation.create(gpa, arena, &create_diag, .{
|
||||||
.dirs = dirs,
|
.dirs = dirs,
|
||||||
.thread_pool = &thread_pool,
|
.thread_pool = &thread_pool,
|
||||||
.self_exe_path = switch (native_os) {
|
.self_exe_path = switch (native_os) {
|
||||||
|
|
@ -3521,47 +3522,45 @@ fn buildOutputType(
|
||||||
.file_system_inputs = &file_system_inputs,
|
.file_system_inputs = &file_system_inputs,
|
||||||
.debug_compiler_runtime_libs = debug_compiler_runtime_libs,
|
.debug_compiler_runtime_libs = debug_compiler_runtime_libs,
|
||||||
}) catch |err| switch (err) {
|
}) catch |err| switch (err) {
|
||||||
error.LibCUnavailable => {
|
error.CreateFail => switch (create_diag) {
|
||||||
const triple_name = try target.zigTriple(arena);
|
.cross_libc_unavailable => {
|
||||||
std.log.err("unable to find or provide libc for target '{s}'", .{triple_name});
|
// We can emit a more informative error for this.
|
||||||
|
const triple_name = try target.zigTriple(arena);
|
||||||
|
std.log.err("unable to provide libc for target '{s}'", .{triple_name});
|
||||||
|
|
||||||
for (std.zig.target.available_libcs) |t| {
|
for (std.zig.target.available_libcs) |t| {
|
||||||
if (t.arch == target.cpu.arch and t.os == target.os.tag) {
|
if (t.arch == target.cpu.arch and t.os == target.os.tag) {
|
||||||
// If there's a `glibc_min`, there's also an `os_ver`.
|
// If there's a `glibc_min`, there's also an `os_ver`.
|
||||||
if (t.glibc_min) |glibc_min| {
|
if (t.glibc_min) |glibc_min| {
|
||||||
std.log.info("zig can provide libc for related target {s}-{s}.{f}-{s}.{d}.{d}", .{
|
std.log.info("zig can provide libc for related target {s}-{s}.{f}-{s}.{d}.{d}", .{
|
||||||
@tagName(t.arch),
|
@tagName(t.arch),
|
||||||
@tagName(t.os),
|
@tagName(t.os),
|
||||||
t.os_ver.?,
|
t.os_ver.?,
|
||||||
@tagName(t.abi),
|
@tagName(t.abi),
|
||||||
glibc_min.major,
|
glibc_min.major,
|
||||||
glibc_min.minor,
|
glibc_min.minor,
|
||||||
});
|
});
|
||||||
} else if (t.os_ver) |os_ver| {
|
} else if (t.os_ver) |os_ver| {
|
||||||
std.log.info("zig can provide libc for related target {s}-{s}.{f}-{s}", .{
|
std.log.info("zig can provide libc for related target {s}-{s}.{f}-{s}", .{
|
||||||
@tagName(t.arch),
|
@tagName(t.arch),
|
||||||
@tagName(t.os),
|
@tagName(t.os),
|
||||||
os_ver,
|
os_ver,
|
||||||
@tagName(t.abi),
|
@tagName(t.abi),
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
std.log.info("zig can provide libc for related target {s}-{s}-{s}", .{
|
std.log.info("zig can provide libc for related target {s}-{s}-{s}", .{
|
||||||
@tagName(t.arch),
|
@tagName(t.arch),
|
||||||
@tagName(t.os),
|
@tagName(t.os),
|
||||||
@tagName(t.abi),
|
@tagName(t.abi),
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
process.exit(1);
|
||||||
process.exit(1);
|
},
|
||||||
|
else => fatal("{f}", .{create_diag}),
|
||||||
},
|
},
|
||||||
error.ExportTableAndImportTableConflict => {
|
else => fatal("failed to create compilation: {s}", .{@errorName(err)}),
|
||||||
fatal("--import-table and --export-table may not be used together", .{});
|
|
||||||
},
|
|
||||||
error.IllegalZigImport => {
|
|
||||||
fatal("this compiler implementation does not support importing the root source file of a provided module", .{});
|
|
||||||
},
|
|
||||||
else => fatal("unable to create compilation: {s}", .{@errorName(err)}),
|
|
||||||
};
|
};
|
||||||
var comp_destroyed = false;
|
var comp_destroyed = false;
|
||||||
defer if (!comp_destroyed) comp.destroy();
|
defer if (!comp_destroyed) comp.destroy();
|
||||||
|
|
@ -3627,7 +3626,7 @@ fn buildOutputType(
|
||||||
}
|
}
|
||||||
|
|
||||||
updateModule(comp, color, root_prog_node) catch |err| switch (err) {
|
updateModule(comp, color, root_prog_node) catch |err| switch (err) {
|
||||||
error.SemanticAnalyzeFail => {
|
error.CompileErrorsReported => {
|
||||||
assert(listen == .none);
|
assert(listen == .none);
|
||||||
saveState(comp, incremental);
|
saveState(comp, incremental);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
|
@ -4521,7 +4520,12 @@ fn runOrTestHotSwap(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn updateModule(comp: *Compilation, color: Color, prog_node: std.Progress.Node) !void {
|
const UpdateModuleError = Compilation.UpdateError || error{
|
||||||
|
/// The update caused compile errors. The error bundle has already been
|
||||||
|
/// reported to the user by being rendered to stderr.
|
||||||
|
CompileErrorsReported,
|
||||||
|
};
|
||||||
|
fn updateModule(comp: *Compilation, color: Color, prog_node: std.Progress.Node) UpdateModuleError!void {
|
||||||
try comp.update(prog_node);
|
try comp.update(prog_node);
|
||||||
|
|
||||||
var errors = try comp.getAllErrorsAlloc();
|
var errors = try comp.getAllErrorsAlloc();
|
||||||
|
|
@ -4529,7 +4533,7 @@ fn updateModule(comp: *Compilation, color: Color, prog_node: std.Progress.Node)
|
||||||
|
|
||||||
if (errors.errorMessageCount() > 0) {
|
if (errors.errorMessageCount() > 0) {
|
||||||
errors.renderToStdErr(color.renderOptions());
|
errors.renderToStdErr(color.renderOptions());
|
||||||
return error.SemanticAnalyzeFail;
|
return error.CompileErrorsReported;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5373,7 +5377,8 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
|
||||||
|
|
||||||
try root_mod.deps.put(arena, "@build", build_mod);
|
try root_mod.deps.put(arena, "@build", build_mod);
|
||||||
|
|
||||||
const comp = Compilation.create(gpa, arena, .{
|
var create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const comp = Compilation.create(gpa, arena, &create_diag, .{
|
||||||
.libc_installation = libc_installation,
|
.libc_installation = libc_installation,
|
||||||
.dirs = dirs,
|
.dirs = dirs,
|
||||||
.root_name = "build",
|
.root_name = "build",
|
||||||
|
|
@ -5395,13 +5400,14 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
|
||||||
.cache_mode = .whole,
|
.cache_mode = .whole,
|
||||||
.reference_trace = reference_trace,
|
.reference_trace = reference_trace,
|
||||||
.debug_compile_errors = debug_compile_errors,
|
.debug_compile_errors = debug_compile_errors,
|
||||||
}) catch |err| {
|
}) catch |err| switch (err) {
|
||||||
fatal("unable to create compilation: {s}", .{@errorName(err)});
|
error.CreateFail => fatal("failed to create compilation: {f}", .{create_diag}),
|
||||||
|
else => fatal("failed to create compilation: {s}", .{@errorName(err)}),
|
||||||
};
|
};
|
||||||
defer comp.destroy();
|
defer comp.destroy();
|
||||||
|
|
||||||
updateModule(comp, color, root_prog_node) catch |err| switch (err) {
|
updateModule(comp, color, root_prog_node) catch |err| switch (err) {
|
||||||
error.SemanticAnalyzeFail => process.exit(2),
|
error.CompileErrorsReported => process.exit(2),
|
||||||
else => |e| return e,
|
else => |e| return e,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -5614,7 +5620,8 @@ fn jitCmd(
|
||||||
try root_mod.deps.put(arena, "aro", aro_mod);
|
try root_mod.deps.put(arena, "aro", aro_mod);
|
||||||
}
|
}
|
||||||
|
|
||||||
const comp = Compilation.create(gpa, arena, .{
|
var create_diag: Compilation.CreateDiagnostic = undefined;
|
||||||
|
const comp = Compilation.create(gpa, arena, &create_diag, .{
|
||||||
.dirs = dirs,
|
.dirs = dirs,
|
||||||
.root_name = options.cmd_name,
|
.root_name = options.cmd_name,
|
||||||
.config = config,
|
.config = config,
|
||||||
|
|
@ -5624,8 +5631,9 @@ fn jitCmd(
|
||||||
.self_exe_path = self_exe_path,
|
.self_exe_path = self_exe_path,
|
||||||
.thread_pool = &thread_pool,
|
.thread_pool = &thread_pool,
|
||||||
.cache_mode = .whole,
|
.cache_mode = .whole,
|
||||||
}) catch |err| {
|
}) catch |err| switch (err) {
|
||||||
fatal("unable to create compilation: {s}", .{@errorName(err)});
|
error.CreateFail => fatal("failed to create compilation: {f}", .{create_diag}),
|
||||||
|
else => fatal("failed to create compilation: {s}", .{@errorName(err)}),
|
||||||
};
|
};
|
||||||
defer comp.destroy();
|
defer comp.destroy();
|
||||||
|
|
||||||
|
|
@ -5646,7 +5654,7 @@ fn jitCmd(
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
updateModule(comp, color, root_prog_node) catch |err| switch (err) {
|
updateModule(comp, color, root_prog_node) catch |err| switch (err) {
|
||||||
error.SemanticAnalyzeFail => process.exit(2),
|
error.CompileErrorsReported => process.exit(2),
|
||||||
else => |e| return e,
|
else => |e| return e,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue