aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/Tools.cpp
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2013-01-20 13:12:12 +0000
committerAlexey Samsonov <samsonov@google.com>2013-01-20 13:12:12 +0000
commit4bdc60434c79126b75aee2bb391275f3bb746364 (patch)
treef2931c50070d8b6a1153aae4564d45f112c87acc /lib/Driver/Tools.cpp
parente6b9d802fb7b16d93474c4f1c179ab36202e8a8b (diff)
Add top-level Clang flag -f(no-)sanitize-address-zero-base-shadow that makes AddressSanitizer use bottom of the address space for the shadow memory. On Linux it can be used with -fPIE/-pie to improve performance.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172974 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Tools.cpp')
-rw-r--r--lib/Driver/Tools.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 3132e75000..0cc9ea2537 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -1444,7 +1444,8 @@ static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
}
SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args)
- : Kind(0), BlacklistFile(""), MsanTrackOrigins(false) {
+ : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
+ AsanZeroBaseShadow(false) {
for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
unsigned Add, Remove;
@@ -1493,11 +1494,18 @@ SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args)
}
// Parse -f(no-)sanitize-memory-track-origins options.
- if (Kind & Memory)
+ if (NeedsMsan)
MsanTrackOrigins =
Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
options::OPT_fno_sanitize_memory_track_origins,
/* Default */false);
+
+ // Parse -f(no-)sanitize-address-zero-base-shadow options.
+ if (NeedsAsan)
+ AsanZeroBaseShadow =
+ Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
+ options::OPT_fno_sanitize_address_zero_base_shadow,
+ /* Default */false);
}
/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
@@ -1517,6 +1525,13 @@ static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
} else {
if (!Args.hasArg(options::OPT_shared)) {
+ bool ZeroBaseShadow = Args.hasFlag(
+ options::OPT_fsanitize_address_zero_base_shadow,
+ options::OPT_fno_sanitize_address_zero_base_shadow, false);
+ if (ZeroBaseShadow && !Args.hasArg(options::OPT_pie)) {
+ TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
+ "-fsanitize-address-zero-base-shadow" << "-pie";
+ }
// LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
// resource directory.
SmallString<128> LibAsan(TC.getDriver().ResourceDir);