Skip to content

Commit

Permalink
[UBSan] Use shared library for UBSan on OS X (Clang part).
Browse files Browse the repository at this point in the history
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

llvm-svn: 233035
  • Loading branch information
vonosmas committed Mar 23, 2015
1 parent acf28be commit 498f3c3
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 39 deletions.
63 changes: 29 additions & 34 deletions clang/lib/Driver/ToolChains.cpp
Expand Up @@ -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.
Expand Down Expand Up @@ -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");
}
}

Expand Down
5 changes: 5 additions & 0 deletions clang/lib/Driver/ToolChains.h
Expand Up @@ -494,6 +494,11 @@ class LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin {
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 {
Expand Down
5 changes: 3 additions & 2 deletions clang/runtime/compiler-rt/Makefile
Expand Up @@ -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)
Expand All @@ -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 := \
Expand Down
10 changes: 7 additions & 3 deletions clang/test/Driver/darwin-sanitizer-ld.c
Expand Up @@ -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 \
Expand All @@ -52,12 +54,14 @@

// 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 \
// RUN: %s -o %t.so -fPIC -shared 2>&1 \
// 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

0 comments on commit 498f3c3

Please sign in to comment.