diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Driver/ToolChains/Fuchsia.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Driver/ToolChains/Fuchsia.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/contrib/llvm-project/clang/lib/Driver/ToolChains/Fuchsia.cpp b/contrib/llvm-project/clang/lib/Driver/ToolChains/Fuchsia.cpp index 94e025e3055a..8e086010a984 100644 --- a/contrib/llvm-project/clang/lib/Driver/ToolChains/Fuchsia.cpp +++ b/contrib/llvm-project/clang/lib/Driver/ToolChains/Fuchsia.cpp @@ -95,6 +95,8 @@ void fuchsia::Linker::ConstructJob(Compilation &C, const JobAction &JA, std::string Dyld = D.DyldPrefix; if (SanArgs.needsAsanRt() && SanArgs.needsSharedRt()) Dyld += "asan/"; + if (SanArgs.needsTsanRt() && SanArgs.needsSharedRt()) + Dyld += "tsan/"; Dyld += "ld.so.1"; CmdArgs.push_back("-dynamic-linker"); CmdArgs.push_back(Args.MakeArgString(Dyld)); @@ -165,7 +167,7 @@ void fuchsia::Linker::ConstructJob(Compilation &C, const JobAction &JA, } C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(), - Exec, CmdArgs, Inputs)); + Exec, CmdArgs, Inputs, Output)); } /// Fuchsia - Fuchsia tool chain which can call as(1) and ld(1) directly. @@ -208,6 +210,23 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple, .flag("+fsanitize=address") .flag("-fexceptions") .flag("+fno-exceptions")); + // Use the relative vtables ABI. + // TODO: Remove these multilibs once relative vtables are enabled by default + // for Fuchsia. + Multilibs.push_back(Multilib("relative-vtables", {}, {}, 4) + .flag("+fexperimental-relative-c++-abi-vtables")); + Multilibs.push_back(Multilib("relative-vtables+noexcept", {}, {}, 5) + .flag("+fexperimental-relative-c++-abi-vtables") + .flag("-fexceptions") + .flag("+fno-exceptions")); + Multilibs.push_back(Multilib("relative-vtables+asan", {}, {}, 6) + .flag("+fexperimental-relative-c++-abi-vtables") + .flag("+fsanitize=address")); + Multilibs.push_back(Multilib("relative-vtables+asan+noexcept", {}, {}, 7) + .flag("+fexperimental-relative-c++-abi-vtables") + .flag("+fsanitize=address") + .flag("-fexceptions") + .flag("+fno-exceptions")); Multilibs.FilterOut([&](const Multilib &M) { std::vector<std::string> RD = FilePaths(M); return std::all_of(RD.begin(), RD.end(), [&](std::string P) { @@ -220,6 +239,13 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple, Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, true), "fexceptions", Flags); addMultilibFlag(getSanitizerArgs().needsAsanRt(), "fsanitize=address", Flags); + + addMultilibFlag( + Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables, + options::OPT_fno_experimental_relative_cxx_abi_vtables, + /*default=*/false), + "fexperimental-relative-c++-abi-vtables", Flags); + Multilibs.setFilePathsCallback(FilePaths); if (Multilibs.select(Flags, SelectedMultilib)) @@ -349,6 +375,7 @@ SanitizerMask Fuchsia::getSupportedSanitizers() const { Res |= SanitizerKind::Leak; Res |= SanitizerKind::SafeStack; Res |= SanitizerKind::Scudo; + Res |= SanitizerKind::Thread; return Res; } |