diff options
author | Alexey Samsonov <vonosmas@gmail.com> | 2015-03-23 23:14:05 +0000 |
---|---|---|
committer | Alexey Samsonov <vonosmas@gmail.com> | 2015-03-23 23:14:05 +0000 |
commit | db7f9c7396adfc698e583b7ca61ecb1575a75d8f (patch) | |
tree | 8538b263519ee4046531c6715cf79c541359211f | |
parent | 6ad2072125e9fdac5a59db424b093087b1518323 (diff) |
[UBSan] Use shared library for UBSan on OS X (Clang part).
Summary:
UBSan is now used in the same way as ASan, and is supported on
OSX and on iOS simulator. At the moment ASan and UBSan can't be used
together due to PR21112, but I hope to resolve it soon by
embedding UBSan into ASan.
Test Plan: regression test suite.
Reviewers: zaks.anna, kubabrecka
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D8471
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233035 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Driver/ToolChains.cpp | 63 | ||||
-rw-r--r-- | lib/Driver/ToolChains.h | 5 | ||||
-rw-r--r-- | runtime/compiler-rt/Makefile | 5 | ||||
-rw-r--r-- | test/Driver/darwin-sanitizer-ld.c | 10 |
4 files changed, 44 insertions, 39 deletions
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 15a461e469..bc647d1ef0 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -324,6 +324,22 @@ void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs, } } +void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args, + ArgStringList &CmdArgs, + StringRef Sanitizer) const { + if (!Args.hasArg(options::OPT_dynamiclib) && + !Args.hasArg(options::OPT_bundle)) { + // Sanitizer runtime libraries requires C++. + AddCXXStdlibLibArgs(Args, CmdArgs); + } + assert(isTargetMacOS() || isTargetIOSSimulator()); + StringRef OS = isTargetMacOS() ? "osx" : "iossim"; + AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.") + Sanitizer + "_" + + OS + "_dynamic.dylib").str(), + /*AlwaysLink*/ true, /*IsEmbedded*/ false, + /*AddRPath*/ true); +} + void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, ArgStringList &CmdArgs) const { // Darwin only supports the compiler-rt based runtime libraries. @@ -368,47 +384,26 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, const SanitizerArgs &Sanitize = getSanitizerArgs(); - // Add Ubsan runtime library, if required. - if (Sanitize.needsUbsanRt()) { - // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds. - if (isTargetIOSBased()) { + if (Sanitize.needsAsanRt()) { + if (!isTargetMacOS() && !isTargetIOSSimulator()) { + // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds. getDriver().Diag(diag::err_drv_clang_unsupported_per_platform) - << "-fsanitize=undefined"; + << "-fsanitize=address"; } else { - assert(isTargetMacOS() && "unexpected non OS X target"); - AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ubsan_osx.a", true); - - // The Ubsan runtime library requires C++. - AddCXXStdlibLibArgs(Args, CmdArgs); + AddLinkSanitizerLibArgs(Args, CmdArgs, "asan"); } } - // Add ASAN runtime library, if required. Dynamic libraries and bundles - // should not be linked with the runtime library. - if (Sanitize.needsAsanRt()) { - // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds. - if (isTargetIPhoneOS()) { + if (Sanitize.needsUbsanRt()) { + if (!isTargetMacOS() && !isTargetIOSSimulator()) { + // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds. getDriver().Diag(diag::err_drv_clang_unsupported_per_platform) - << "-fsanitize=address"; + << "-fsanitize=undefined"; } else { - if (!Args.hasArg(options::OPT_dynamiclib) && - !Args.hasArg(options::OPT_bundle)) { - // The ASAN runtime library requires C++. - AddCXXStdlibLibArgs(Args, CmdArgs); - } - if (isTargetMacOS()) { - AddLinkRuntimeLib(Args, CmdArgs, - "libclang_rt.asan_osx_dynamic.dylib", - /*AlwaysLink*/ true, /*IsEmbedded*/ false, - /*AddRPath*/ true); - } else { - if (isTargetIOSSimulator()) { - AddLinkRuntimeLib(Args, CmdArgs, - "libclang_rt.asan_iossim_dynamic.dylib", - /*AlwaysLink*/ true, /*IsEmbedded*/ false, - /*AddRPath*/ true); - } - } + AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan"); + // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export + // all RTTI-related symbols that UBSan uses. + CmdArgs.push_back("-lc++abi"); } } diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 90893c305c..2bf707ef65 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -494,6 +494,11 @@ public: AddLinkARCArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override; /// } + +private: + void AddLinkSanitizerLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs, + StringRef Sanitizer) const; }; class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { diff --git a/runtime/compiler-rt/Makefile b/runtime/compiler-rt/Makefile index c310453b2b..997643857d 100644 --- a/runtime/compiler-rt/Makefile +++ b/runtime/compiler-rt/Makefile @@ -79,7 +79,7 @@ RuntimeLibrary.darwin.Configs := \ eprintf.a 10.4.a osx.a cc_kext.a \ asan_osx_dynamic.dylib \ profile_osx.a \ - ubsan_osx.a + ubsan_osx_dynamic.dylib IOS_SDK := $(shell xcrun --show-sdk-path -sdk iphoneos 2> /dev/null) IOSSIM_SDK := $(shell xcrun --show-sdk-path -sdk iphonesimulator 2> /dev/null) @@ -93,7 +93,8 @@ RuntimeLibrary.darwin.Configs += cc_kext_ios5.a endif ifneq ($(IOSSIM_SDK),) -RuntimeLibrary.darwin.Configs += asan_iossim_dynamic.dylib +RuntimeLibrary.darwin.Configs += asan_iossim_dynamic.dylib \ + ubsan_iossim_dynamic.dylib endif RuntimeLibrary.macho_embedded.Configs := \ diff --git a/test/Driver/darwin-sanitizer-ld.c b/test/Driver/darwin-sanitizer-ld.c index 500fec4b2f..fb318ebd41 100644 --- a/test/Driver/darwin-sanitizer-ld.c +++ b/test/Driver/darwin-sanitizer-ld.c @@ -35,8 +35,10 @@ // RUN: | FileCheck --check-prefix=CHECK-UBSAN %s // CHECK-UBSAN: "{{.*}}ld{{(.exe)?}}" -// CHECK-UBSAN: libclang_rt.ubsan_osx.a" // CHECK-UBSAN: stdc++ +// CHECK-UBSAN: libclang_rt.ubsan_osx_dynamic.dylib" +// CHECK-UBSAN: "-rpath" "@executable_path" +// CHECK-UBSAN: "-rpath" "{{.*}}lib{{.*}}darwin" // RUN: %clang -no-canonical-prefixes -### -target x86_64-darwin \ // RUN: -fsanitize=bounds -fsanitize-undefined-trap-on-error \ @@ -52,7 +54,9 @@ // CHECK-DYN-UBSAN: "{{.*}}ld{{(.exe)?}}" // CHECK-DYN-UBSAN: "-dylib" -// CHECK-DYN-UBSAN: libclang_rt.ubsan_osx.a +// CHECK-DYN-UBSAN: libclang_rt.ubsan_osx_dynamic.dylib" +// CHECK-DYN-UBSAN: "-rpath" "@executable_path" +// CHECK-DYN-UBSAN: "-rpath" "{{.*}}lib{{.*}}darwin" // RUN: %clang -no-canonical-prefixes -### -target x86_64-darwin \ // RUN: -fsanitize=bounds -fsanitize-undefined-trap-on-error \ @@ -60,4 +64,4 @@ // RUN: | FileCheck --check-prefix=CHECK-DYN-BOUNDS %s // CHECK-DYN-BOUNDS: "{{.*}}ld{{(.exe)?}}" -// CHECK-DYN-BOUNDS-NOT: libclang_rt.ubsan_osx.a +// CHECK-DYN-BOUNDS-NOT: ubsan_osx |