diff options
| author | Petr Hosek <phosek@chromium.org> | 2017-08-03 23:02:22 +0000 |
|---|---|---|
| committer | Petr Hosek <phosek@chromium.org> | 2017-08-03 23:02:22 +0000 |
| commit | b31582b196d432eb29568661a5a052d315fa06ad (patch) | |
| tree | ed84bea2721986f410f1464937683ed54117c0f9 | |
| parent | 8623e8d864b151e8aa023f951d29ecb8aecbf078 (diff) | |
| download | bcm5719-llvm-b31582b196d432eb29568661a5a052d315fa06ad.tar.gz bcm5719-llvm-b31582b196d432eb29568661a5a052d315fa06ad.zip | |
Enable AddressSanitizer for Fuchsia targets
Patch by Roland McGrath
Differential Revision: https://reviews.llvm.org/D35922
llvm-svn: 309999
| -rw-r--r-- | clang/cmake/caches/Fuchsia-stage2.cmake | 1 | ||||
| -rw-r--r-- | clang/lib/Driver/SanitizerArgs.cpp | 9 | ||||
| -rw-r--r-- | clang/lib/Driver/ToolChains/Fuchsia.cpp | 23 | ||||
| -rw-r--r-- | clang/test/Driver/fuchsia.c | 26 |
4 files changed, 45 insertions, 14 deletions
diff --git a/clang/cmake/caches/Fuchsia-stage2.cmake b/clang/cmake/caches/Fuchsia-stage2.cmake index b0d554b9c4a..5ebfc978c21 100644 --- a/clang/cmake/caches/Fuchsia-stage2.cmake +++ b/clang/cmake/caches/Fuchsia-stage2.cmake @@ -50,6 +50,7 @@ foreach(target x86_64;aarch64) set(RUNTIMES_${target}-fuchsia_LIBCXX_USE_COMPILER_RT ON CACHE BOOL "") set(RUNTIMES_${target}-fuchsia_LIBCXX_ABI_VERSION 2 CACHE STRING "") set(RUNTIMES_${target}-fuchsia_LIBCXX_ENABLE_STATIC OFF CACHE BOOL "") + set(RUNTIMES_${target}-fuchsia_SANITIZER_USE_COMPILER_RT ON CACHE BOOL "") endforeach() # Setup toolchain. diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index 928cfb8e074..abfd888304c 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -171,7 +171,7 @@ bool SanitizerArgs::needsUbsanRt() const { return ((Sanitizers.Mask & NeedsUbsanRt & ~TrapSanitizers.Mask) || CoverageFeatures) && !Sanitizers.has(Address) && !Sanitizers.has(Memory) && - !Sanitizers.has(Thread) && !Sanitizers.has(DataFlow) && + !Sanitizers.has(Thread) && !Sanitizers.has(DataFlow) && !Sanitizers.has(Leak) && !CfiCrossDso; } @@ -557,8 +557,9 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, if (AllAddedKinds & Address) { AsanSharedRuntime = - Args.hasArg(options::OPT_shared_libasan) || TC.getTriple().isAndroid(); - NeedPIE |= TC.getTriple().isAndroid(); + Args.hasArg(options::OPT_shared_libasan) || + TC.getTriple().isAndroid() || TC.getTriple().isOSFuchsia(); + NeedPIE |= TC.getTriple().isAndroid() || TC.getTriple().isOSFuchsia(); if (Arg *A = Args.getLastArg(options::OPT_fsanitize_address_field_padding)) { StringRef S = A->getValue(); @@ -592,7 +593,7 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, // globals in ASan is disabled by default on ELF targets. // See https://sourceware.org/bugzilla/show_bug.cgi?id=19002 AsanGlobalsDeadStripping = - !TC.getTriple().isOSBinFormatELF() || + !TC.getTriple().isOSBinFormatELF() || TC.getTriple().isOSFuchsia() || Args.hasArg(options::OPT_fsanitize_address_globals_dead_stripping); } else { AsanUseAfterScope = false; diff --git a/clang/lib/Driver/ToolChains/Fuchsia.cpp b/clang/lib/Driver/ToolChains/Fuchsia.cpp index bcfd1db0401..a825c382711 100644 --- a/clang/lib/Driver/ToolChains/Fuchsia.cpp +++ b/clang/lib/Driver/ToolChains/Fuchsia.cpp @@ -14,6 +14,7 @@ #include "clang/Driver/Driver.h" #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Options.h" +#include "clang/Driver/SanitizerArgs.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/Path.h" @@ -68,22 +69,21 @@ void fuchsia::Linker::ConstructJob(Compilation &C, const JobAction &JA, else CmdArgs.push_back("--build-id"); - if (!Args.hasArg(options::OPT_static)) - CmdArgs.push_back("--eh-frame-hdr"); + CmdArgs.push_back("--eh-frame-hdr"); if (Args.hasArg(options::OPT_static)) CmdArgs.push_back("-Bstatic"); else if (Args.hasArg(options::OPT_shared)) CmdArgs.push_back("-shared"); - if (!Args.hasArg(options::OPT_static)) { - if (Args.hasArg(options::OPT_rdynamic)) - CmdArgs.push_back("-export-dynamic"); - - if (!Args.hasArg(options::OPT_shared)) { - CmdArgs.push_back("-dynamic-linker"); - CmdArgs.push_back(Args.MakeArgString(D.DyldPrefix + "ld.so.1")); - } + if (!Args.hasArg(options::OPT_shared)) { + std::string Dyld = D.DyldPrefix; + if (ToolChain.getSanitizerArgs().needsAsanRt() && + ToolChain.getSanitizerArgs().needsSharedAsanRt()) + Dyld += "asan/"; + Dyld += "ld.so.1"; + CmdArgs.push_back("-dynamic-linker"); + CmdArgs.push_back(Args.MakeArgString(Dyld)); } CmdArgs.push_back("-o"); @@ -100,6 +100,8 @@ void fuchsia::Linker::ConstructJob(Compilation &C, const JobAction &JA, ToolChain.AddFilePathLibArgs(Args, CmdArgs); + addSanitizerRuntimes(ToolChain, Args, CmdArgs); + AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { @@ -277,5 +279,6 @@ void Fuchsia::AddCXXStdlibLibArgs(const ArgList &Args, SanitizerMask Fuchsia::getSupportedSanitizers() const { SanitizerMask Res = ToolChain::getSupportedSanitizers(); Res |= SanitizerKind::SafeStack; + Res |= SanitizerKind::Address; return Res; } diff --git a/clang/test/Driver/fuchsia.c b/clang/test/Driver/fuchsia.c index 405086f3f07..73154fb4f15 100644 --- a/clang/test/Driver/fuchsia.c +++ b/clang/test/Driver/fuchsia.c @@ -44,3 +44,29 @@ // RUN: -fsanitize=safe-stack 2>&1 \ // RUN: | FileCheck %s -check-prefix=CHECK-SAFESTACK // CHECK-SAFESTACK: "-fsanitize=safe-stack" + +// RUN: %clang %s -### --target=x86_64-unknown-fuchsia \ +// RUN: -fsanitize=address 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK-ASAN-X86 +// CHECK-ASAN-X86: "-fsanitize=address" +// CHECK-ASAN-X86: "-fsanitize-address-globals-dead-stripping" +// CHECK-ASAN-X86: "-dynamic-linker" "asan/ld.so.1" +// CHECK-ASAN-X86: "{{.*[/\\]}}libclang_rt.asan-x86_64.so" +// CHECK-ASAN-X86: "{{.*[/\\]}}libclang_rt.asan-preinit-x86_64.a" + +// RUN: %clang %s -### --target=aarch64-fuchsia \ +// RUN: -fsanitize=address 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK-ASAN-AARCH64 +// CHECK-ASAN-AARCH64: "-fsanitize=address" +// CHECK-ASAN-AARCH64: "-fsanitize-address-globals-dead-stripping" +// CHECK-ASAN-AARCH64: "-dynamic-linker" "asan/ld.so.1" +// CHECK-ASAN-AARCH64: "{{.*[/\\]}}libclang_rt.asan-aarch64.so" +// CHECK-ASAN-AARCH64: "{{.*[/\\]}}libclang_rt.asan-preinit-aarch64.a" + +// RUN: %clang %s -### --target=x86_64-unknown-fuchsia \ +// RUN: -fsanitize=address -fPIC -shared 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK-ASAN-SHARED +// CHECK-ASAN-SHARED: "-fsanitize=address" +// CHECK-ASAN-SHARED: "-fsanitize-address-globals-dead-stripping" +// CHECK-ASAN-SHARED: "{{.*[/\\]}}libclang_rt.asan-x86_64.so" +// CHECK-ASAN-SHARED-NOT: "{{.*[/\\]}}libclang_rt.asan-preinit-x86_64.a" |

