diff options
Diffstat (limited to 'clang/lib/Driver/ToolChains/Fuchsia.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChains/Fuchsia.cpp | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/clang/lib/Driver/ToolChains/Fuchsia.cpp b/clang/lib/Driver/ToolChains/Fuchsia.cpp index 8e08601..25b7e4e 100644 --- a/clang/lib/Driver/ToolChains/Fuchsia.cpp +++ b/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.needsHwasanRt() && SanArgs.needsSharedRt()) + Dyld += "hwasan/"; if (SanArgs.needsTsanRt() && SanArgs.needsSharedRt()) Dyld += "tsan/"; Dyld += "ld.so.1"; @@ -210,23 +212,41 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple, .flag("+fsanitize=address") .flag("-fexceptions") .flag("+fno-exceptions")); + // HWASan has higher priority because we always want the instrumentated + // version. + Multilibs.push_back( + Multilib("hwasan", {}, {}, 4).flag("+fsanitize=hwaddress")); + // Use the hwasan+noexcept variant with HWASan and -fno-exceptions. + Multilibs.push_back(Multilib("hwasan+noexcept", {}, {}, 5) + .flag("+fsanitize=hwaddress") + .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) + Multilibs.push_back(Multilib("relative-vtables", {}, {}, 6) .flag("+fexperimental-relative-c++-abi-vtables")); - Multilibs.push_back(Multilib("relative-vtables+noexcept", {}, {}, 5) + Multilibs.push_back(Multilib("relative-vtables+noexcept", {}, {}, 7) .flag("+fexperimental-relative-c++-abi-vtables") .flag("-fexceptions") .flag("+fno-exceptions")); - Multilibs.push_back(Multilib("relative-vtables+asan", {}, {}, 6) + Multilibs.push_back(Multilib("relative-vtables+asan", {}, {}, 8) .flag("+fexperimental-relative-c++-abi-vtables") .flag("+fsanitize=address")); - Multilibs.push_back(Multilib("relative-vtables+asan+noexcept", {}, {}, 7) + Multilibs.push_back(Multilib("relative-vtables+asan+noexcept", {}, {}, 9) .flag("+fexperimental-relative-c++-abi-vtables") .flag("+fsanitize=address") .flag("-fexceptions") .flag("+fno-exceptions")); + Multilibs.push_back(Multilib("relative-vtables+hwasan", {}, {}, 10) + .flag("+fexperimental-relative-c++-abi-vtables") + .flag("+fsanitize=hwaddress")); + Multilibs.push_back(Multilib("relative-vtables+hwasan+noexcept", {}, {}, 11) + .flag("+fexperimental-relative-c++-abi-vtables") + .flag("+fsanitize=hwaddress") + .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) { @@ -239,6 +259,8 @@ 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(getSanitizerArgs().needsHwasanRt(), "fsanitize=hwaddress", + Flags); addMultilibFlag( Args.hasFlag(options::OPT_fexperimental_relative_cxx_abi_vtables, @@ -368,6 +390,7 @@ void Fuchsia::AddCXXStdlibLibArgs(const ArgList &Args, SanitizerMask Fuchsia::getSupportedSanitizers() const { SanitizerMask Res = ToolChain::getSupportedSanitizers(); Res |= SanitizerKind::Address; + Res |= SanitizerKind::HWAddress; Res |= SanitizerKind::PointerCompare; Res |= SanitizerKind::PointerSubtract; Res |= SanitizerKind::Fuzzer; |