From 0563525b214f776c9ae43d4b2c97da45bdc513d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 5 Nov 2024 14:20:55 +0100 Subject: [PATCH] tsan: Synchronize CFLAGS with upstream. In particular: * -fms-extensions for MinGW * -fno-builtin * -fno-emulated-tls for Android 29+ * -fno-exceptions * -fomit-frame-pointer * -fvisibility=hidden --- src/libtsan.zig | 52 +++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/libtsan.zig b/src/libtsan.zig index d078fa2a38..38ae3dc4fc 100644 --- a/src/libtsan.zig +++ b/src/libtsan.zig @@ -93,11 +93,12 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo .sanitize_c = false, .sanitize_thread = false, .red_zone = comp.root_mod.red_zone, - .omit_frame_pointer = comp.root_mod.omit_frame_pointer, + .omit_frame_pointer = optimize_mode != .Debug and !target.os.tag.isDarwin(), .valgrind = false, .optimize_mode = optimize_mode, .structured_cfg = comp.root_mod.structured_cfg, .pic = true, + .no_builtin = true, }, .global = config, .cc_argv = &common_flags, @@ -123,10 +124,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo try cflags.append("-I"); try cflags.append(tsan_include_path); - try cflags.append("-nostdinc++"); - try cflags.append("-fvisibility-inlines-hidden"); - try cflags.append("-std=c++17"); - try cflags.append("-fno-rtti"); + try addCcArgs(target, &cflags); c_source_files.appendAssumeCapacity(.{ .src_path = try comp.zig_lib_directory.join(arena, &.{ "tsan", tsan_src }), @@ -147,10 +145,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo try cflags.append("-I"); try cflags.append(tsan_include_path); - try cflags.append("-nostdinc++"); - try cflags.append("-fvisibility-inlines-hidden"); - try cflags.append("-std=c++17"); - try cflags.append("-fno-rtti"); + try addCcArgs(target, &cflags); c_source_files.appendAssumeCapacity(.{ .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{ "tsan", tsan_src }), @@ -195,10 +190,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo try cflags.append("-I"); try cflags.append(tsan_include_path); - try cflags.append("-nostdinc++"); - try cflags.append("-fvisibility-inlines-hidden"); - try cflags.append("-std=c++17"); - try cflags.append("-fno-rtti"); + try addCcArgs(target, &cflags); c_source_files.appendAssumeCapacity(.{ .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{ @@ -222,10 +214,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo try cflags.append("-I"); try cflags.append(tsan_include_path); - try cflags.append("-nostdinc++"); - try cflags.append("-fvisibility-inlines-hidden"); - try cflags.append("-std=c++17"); - try cflags.append("-fno-rtti"); + try addCcArgs(target, &cflags); c_source_files.appendAssumeCapacity(.{ .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{ @@ -243,10 +232,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo try cflags.append("-I"); try cflags.append(tsan_include_path); - try cflags.append("-nostdinc++"); - try cflags.append("-fvisibility-inlines-hidden"); - try cflags.append("-std=c++17"); - try cflags.append("-fno-rtti"); + try addCcArgs(target, &cflags); c_source_files.appendAssumeCapacity(.{ .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{ @@ -272,10 +258,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo try cflags.append("-I"); try cflags.append(tsan_include_path); - try cflags.append("-nostdinc++"); - try cflags.append("-fvisibility-inlines-hidden"); - try cflags.append("-std=c++17"); - try cflags.append("-fno-rtti"); + try addCcArgs(target, &cflags); c_source_files.appendAssumeCapacity(.{ .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{ @@ -348,6 +331,25 @@ pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!vo comp.tsan_lib = crt_file; } +fn addCcArgs(target: std.Target, args: *std.ArrayList([]const u8)) error{OutOfMemory}!void { + try args.appendSlice(&[_][]const u8{ + "-nostdinc++", + "-fvisibility=hidden", + "-fvisibility-inlines-hidden", + "-std=c++17", + "-fno-rtti", + "-fno-exceptions", + }); + + if (target.abi.isAndroid() and target.os.version_range.linux.android >= 29) { + try args.append("-fno-emulated-tls"); + } + + if (target.isMinGW()) { + try args.append("-fms-extensions"); + } +} + const tsan_sources = [_][]const u8{ "tsan_debugging.cpp", "tsan_external.cpp",