Commit a926c91814
Changed files (3)
src/Cache.zig
@@ -16,7 +16,8 @@ const Allocator = std.mem.Allocator;
/// This protection is conditionally compiled depending on `want_debug_deadlock`.
var all_cache_digest_set: std.AutoHashMapUnmanaged(BinDigest, void) = .{};
var all_cache_digest_lock: std.Mutex = .{};
-const want_debug_deadlock = std.debug.runtime_safety;
+// TODO: Figure out how to make sure that `all_cache_digest_set` does not leak memory!
+pub const want_debug_deadlock = false;
const DebugBinDigest = if (want_debug_deadlock) BinDigest else void;
const null_debug_bin_digest = if (want_debug_deadlock) ([1]u8{0} ** bin_digest_len) else {};
src/DepTokenizer.zig
@@ -927,7 +927,7 @@ fn depTokenizer(input: []const u8, expect: []const u8) !void {
try out.writeAll("\n");
try printSection(out, "<<<< input", input);
try printSection(out, "==== expect", expect);
- try printSection(out, ">>>> got", got);
+ try printSection(out, ">>>> got", buffer.items);
try printRuler(out);
testing.expect(false);
build.zig
@@ -92,19 +92,6 @@ pub fn build(b: *Builder) !void {
if (enable_llvm) {
const cmake_cfg = if (static_llvm) null else findAndParseConfigH(b, config_h_path_option);
- const exe_cflags = [_][]const u8{
- "-std=c++14",
- "-D__STDC_CONSTANT_MACROS",
- "-D__STDC_FORMAT_MACROS",
- "-D__STDC_LIMIT_MACROS",
- "-D_GNU_SOURCE",
- "-fvisibility-inlines-hidden",
- "-fno-exceptions",
- "-fno-rtti",
- "-Werror=type-limits",
- "-Wno-missing-braces",
- "-Wno-comment",
- };
if (is_stage1) {
exe.addIncludeDir("src");
exe.addIncludeDir("deps/SoftFloat-3e/source/include");
@@ -133,88 +120,14 @@ pub fn build(b: *Builder) !void {
if (cfg.cmake_prefix_path.len > 0) {
b.addSearchPrefix(cfg.cmake_prefix_path);
}
- exe.addObjectFile(fs.path.join(b.allocator, &[_][]const u8{
- cfg.cmake_binary_dir,
- "zigcpp",
- b.fmt("{s}{s}{s}", .{ exe.target.libPrefix(), "zigcpp", exe.target.staticLibSuffix() }),
- }) catch unreachable);
- assert(cfg.lld_include_dir.len != 0);
- exe.addIncludeDir(cfg.lld_include_dir);
- addCMakeLibraryList(exe, cfg.clang_libraries);
- addCMakeLibraryList(exe, cfg.lld_libraries);
- addCMakeLibraryList(exe, cfg.llvm_libraries);
-
- const need_cpp_includes = tracy != null;
-
- // System -lc++ must be used because in this code path we are attempting to link
- // against system-provided LLVM, Clang, LLD.
- if (exe.target.getOsTag() == .linux) {
- // First we try to static link against gcc libstdc++. If that doesn't work,
- // we fall back to -lc++ and cross our fingers.
- addCxxKnownPath(b, cfg, exe, "libstdc++.a", "", need_cpp_includes) catch |err| switch (err) {
- error.RequiredLibraryNotFound => {
- exe.linkSystemLibrary("c++");
- },
- else => |e| return e,
- };
-
- exe.linkSystemLibrary("pthread");
- } else if (exe.target.isFreeBSD()) {
- try addCxxKnownPath(b, cfg, exe, "libc++.a", null, need_cpp_includes);
- exe.linkSystemLibrary("pthread");
- } else if (exe.target.getOsTag() == .openbsd) {
- try addCxxKnownPath(b, cfg, exe, "libc++.a", null, need_cpp_includes);
- try addCxxKnownPath(b, cfg, exe, "libc++abi.a", null, need_cpp_includes);
- } else if (exe.target.isDarwin()) {
- if (addCxxKnownPath(b, cfg, exe, "libgcc_eh.a", "", need_cpp_includes)) {
- // Compiler is GCC.
- try addCxxKnownPath(b, cfg, exe, "libstdc++.a", null, need_cpp_includes);
- exe.linkSystemLibrary("pthread");
- // TODO LLD cannot perform this link.
- // Set ZIG_SYSTEM_LINKER_HACK env var to use system linker ld instead.
- // See https://github.com/ziglang/zig/issues/1535
- } else |err| switch (err) {
- error.RequiredLibraryNotFound => {
- // System compiler, not gcc.
- exe.linkSystemLibrary("c++");
- },
- else => |e| return e,
- }
- }
- if (cfg.dia_guids_lib.len != 0) {
- exe.addObjectFile(cfg.dia_guids_lib);
- }
+ try addCmakeCfgOptionsToExe(b, cfg, tracy, exe);
+ try addCmakeCfgOptionsToExe(b, cfg, tracy, test_stage2);
} else {
// Here we are -Denable-llvm but no cmake integration.
- // Adds the Zig C++ sources which both stage1 and stage2 need.
- //
- // We need this because otherwise zig_clang_cc1_main.cpp ends up pulling
- // in a dependency on llvm::cfg::Update<llvm::BasicBlock*>::dump() which is
- // unavailable when LLVM is compiled in Release mode.
- const zig_cpp_cflags = exe_cflags ++ [_][]const u8{"-DNDEBUG=1"};
- exe.addCSourceFiles(&zig_cpp_sources, &zig_cpp_cflags);
-
- for (clang_libs) |lib_name| {
- exe.linkSystemLibrary(lib_name);
- }
-
- for (lld_libs) |lib_name| {
- exe.linkSystemLibrary(lib_name);
- }
-
- for (llvm_libs) |lib_name| {
- exe.linkSystemLibrary(lib_name);
- }
-
- // This means we rely on clang-or-zig-built LLVM, Clang, LLD libraries.
- exe.linkSystemLibrary("c++");
-
- if (target.getOs().tag == .windows) {
- exe.linkSystemLibrary("version");
- exe.linkSystemLibrary("uuid");
- }
+ try addStaticLlvmOptionsToExe(exe);
+ try addStaticLlvmOptionsToExe(test_stage2);
}
}
if (link_libc) {
@@ -360,6 +273,112 @@ pub fn build(b: *Builder) !void {
test_step.dependOn(docs_step);
}
+const exe_cflags = [_][]const u8{
+ "-std=c++14",
+ "-D__STDC_CONSTANT_MACROS",
+ "-D__STDC_FORMAT_MACROS",
+ "-D__STDC_LIMIT_MACROS",
+ "-D_GNU_SOURCE",
+ "-fvisibility-inlines-hidden",
+ "-fno-exceptions",
+ "-fno-rtti",
+ "-Werror=type-limits",
+ "-Wno-missing-braces",
+ "-Wno-comment",
+};
+
+fn addCmakeCfgOptionsToExe(
+ b: *Builder,
+ cfg: CMakeConfig,
+ tracy: ?[]const u8,
+ exe: *std.build.LibExeObjStep,
+) !void {
+ exe.addObjectFile(fs.path.join(b.allocator, &[_][]const u8{
+ cfg.cmake_binary_dir,
+ "zigcpp",
+ b.fmt("{s}{s}{s}", .{ exe.target.libPrefix(), "zigcpp", exe.target.staticLibSuffix() }),
+ }) catch unreachable);
+ assert(cfg.lld_include_dir.len != 0);
+ exe.addIncludeDir(cfg.lld_include_dir);
+ addCMakeLibraryList(exe, cfg.clang_libraries);
+ addCMakeLibraryList(exe, cfg.lld_libraries);
+ addCMakeLibraryList(exe, cfg.llvm_libraries);
+
+ const need_cpp_includes = tracy != null;
+
+ // System -lc++ must be used because in this code path we are attempting to link
+ // against system-provided LLVM, Clang, LLD.
+ if (exe.target.getOsTag() == .linux) {
+ // First we try to static link against gcc libstdc++. If that doesn't work,
+ // we fall back to -lc++ and cross our fingers.
+ addCxxKnownPath(b, cfg, exe, "libstdc++.a", "", need_cpp_includes) catch |err| switch (err) {
+ error.RequiredLibraryNotFound => {
+ exe.linkSystemLibrary("c++");
+ },
+ else => |e| return e,
+ };
+
+ exe.linkSystemLibrary("pthread");
+ } else if (exe.target.isFreeBSD()) {
+ try addCxxKnownPath(b, cfg, exe, "libc++.a", null, need_cpp_includes);
+ exe.linkSystemLibrary("pthread");
+ } else if (exe.target.getOsTag() == .openbsd) {
+ try addCxxKnownPath(b, cfg, exe, "libc++.a", null, need_cpp_includes);
+ try addCxxKnownPath(b, cfg, exe, "libc++abi.a", null, need_cpp_includes);
+ } else if (exe.target.isDarwin()) {
+ if (addCxxKnownPath(b, cfg, exe, "libgcc_eh.a", "", need_cpp_includes)) {
+ // Compiler is GCC.
+ try addCxxKnownPath(b, cfg, exe, "libstdc++.a", null, need_cpp_includes);
+ exe.linkSystemLibrary("pthread");
+ // TODO LLD cannot perform this link.
+ // Set ZIG_SYSTEM_LINKER_HACK env var to use system linker ld instead.
+ // See https://github.com/ziglang/zig/issues/1535
+ } else |err| switch (err) {
+ error.RequiredLibraryNotFound => {
+ // System compiler, not gcc.
+ exe.linkSystemLibrary("c++");
+ },
+ else => |e| return e,
+ }
+ }
+
+ if (cfg.dia_guids_lib.len != 0) {
+ exe.addObjectFile(cfg.dia_guids_lib);
+ }
+}
+
+fn addStaticLlvmOptionsToExe(
+ exe: *std.build.LibExeObjStep,
+) !void {
+ // Adds the Zig C++ sources which both stage1 and stage2 need.
+ //
+ // We need this because otherwise zig_clang_cc1_main.cpp ends up pulling
+ // in a dependency on llvm::cfg::Update<llvm::BasicBlock*>::dump() which is
+ // unavailable when LLVM is compiled in Release mode.
+ const zig_cpp_cflags = exe_cflags ++ [_][]const u8{"-DNDEBUG=1"};
+ exe.addCSourceFiles(&zig_cpp_sources, &zig_cpp_cflags);
+
+ for (clang_libs) |lib_name| {
+ exe.linkSystemLibrary(lib_name);
+ }
+
+ for (lld_libs) |lib_name| {
+ exe.linkSystemLibrary(lib_name);
+ }
+
+ for (llvm_libs) |lib_name| {
+ exe.linkSystemLibrary(lib_name);
+ }
+
+ // This means we rely on clang-or-zig-built LLVM, Clang, LLD libraries.
+ exe.linkSystemLibrary("c++");
+
+ if (exe.target.getOs().tag == .windows) {
+ exe.linkSystemLibrary("version");
+ exe.linkSystemLibrary("uuid");
+ }
+}
+
fn addCxxKnownPath(
b: *Builder,
ctx: CMakeConfig,