From: Evgeniy Stepanov Date: Mon, 24 Dec 2012 08:42:34 +0000 (+0000) Subject: Support -fsanitize-memory-track-origins. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=34ef11be9d09ebf916ab02a521e37be6e9e102d3;p=clang Support -fsanitize-memory-track-origins. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171020 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 759864369c..6176f97ab8 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -398,6 +398,12 @@ def fsanitize_blacklist : Joined<["-"], "fsanitize-blacklist=">, def fno_sanitize_blacklist : Flag<["-"], "fno-sanitize-blacklist">, Group, HelpText<"Don't use blacklist file for sanitizers">; +def fsanitize_memory_track_origins : Flag<["-"], "fsanitize-memory-track-origins">, + Group, Flags<[CC1Option]>, + HelpText<"Enable origins tracking in MemorySanitizer">; +def fno_sanitize_memory_track_origins : Flag<["-"], "fno-sanitize-memory-track-origins">, + Group, + HelpText<"Disable origins tracking in MemorySanitizer">; def funsafe_math_optimizations : Flag<["-"], "funsafe-math-optimizations">, Group; def fno_unsafe_math_optimizations : Flag<["-"], "fno-unsafe-math-optimizations">, diff --git a/include/clang/Frontend/CodeGenOptions.def b/include/clang/Frontend/CodeGenOptions.def index f20485a6e9..7f1d7613cb 100644 --- a/include/clang/Frontend/CodeGenOptions.def +++ b/include/clang/Frontend/CodeGenOptions.def @@ -61,6 +61,8 @@ CODEGENOPT(InstrumentFunctions , 1, 0) ///< Set when -finstrument-functions is CODEGENOPT(InstrumentForProfiling , 1, 0) ///< Set when -pg is enabled. CODEGENOPT(LessPreciseFPMAD , 1, 0) ///< Enable less precise MAD instructions to ///< be generated. +CODEGENOPT(MemorySanitizerTrackOrigins , 1, 0) ///< Enable tracking origins in + ///< MemorySanitizer CODEGENOPT(MergeAllConstants , 1, 1) ///< Merge identical constants. CODEGENOPT(NoCommon , 1, 0) ///< Set when -fno-common or C++ is enabled. CODEGENOPT(NoDwarf2CFIAsm , 1, 0) ///< Set when -fno-dwarf2-cfi-asm is enabled. diff --git a/lib/CodeGen/BackendUtil.cpp b/lib/CodeGen/BackendUtil.cpp index ff593620fd..ea5bcb55f8 100644 --- a/lib/CodeGen/BackendUtil.cpp +++ b/lib/CodeGen/BackendUtil.cpp @@ -188,7 +188,10 @@ static void addAddressSanitizerPasses(const PassManagerBuilder &Builder, static void addMemorySanitizerPass(const PassManagerBuilder &Builder, PassManagerBase &PM) { - PM.add(createMemorySanitizerPass()); + const PassManagerBuilderWrapper &BuilderWrapper = + static_cast(Builder); + const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts(); + PM.add(createMemorySanitizerPass(CGOpts.MemorySanitizerTrackOrigins)); } static void addThreadSanitizerPass(const PassManagerBuilder &Builder, diff --git a/lib/Driver/SanitizerArgs.h b/lib/Driver/SanitizerArgs.h index debdaebc00..30a35b3f52 100644 --- a/lib/Driver/SanitizerArgs.h +++ b/lib/Driver/SanitizerArgs.h @@ -40,9 +40,10 @@ class SanitizerArgs { }; unsigned Kind; std::string BlacklistFile; + bool MsanTrackOrigins; public: - SanitizerArgs() : Kind(0), BlacklistFile("") {} + SanitizerArgs() : Kind(0), BlacklistFile(""), MsanTrackOrigins(false) {} /// Parses the sanitizer arguments from an argument list. SanitizerArgs(const Driver &D, const ArgList &Args); @@ -68,6 +69,9 @@ class SanitizerArgs { BlacklistOpt += BlacklistFile; CmdArgs.push_back(Args.MakeArgString(BlacklistOpt)); } + + if (MsanTrackOrigins) + CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-track-origins")); } private: diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index b6da7dd64b..24bdb12cc9 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1492,6 +1492,13 @@ SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args) { D.Diag(diag::err_drv_no_such_file) << BLPath; } } + + // Parse -f(no-)sanitize-memory-track-origins options. + if (Kind & Memory) + MsanTrackOrigins = + Args.hasFlag(options::OPT_fsanitize_memory_track_origins, + options::OPT_fno_sanitize_memory_track_origins, + /* Default */false); } /// If AddressSanitizer is enabled, add appropriate linker flags (Linux). diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index bba48949b9..96e2a75a5f 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -403,6 +403,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir); Opts.LinkBitcodeFile = Args.getLastArgValue(OPT_mlink_bitcode_file); Opts.SanitizerBlacklistFile = Args.getLastArgValue(OPT_fsanitize_blacklist); + Opts.MemorySanitizerTrackOrigins = + Args.hasArg(OPT_fsanitize_memory_track_origins); Opts.SSPBufferSize = Args.getLastArgIntValue(OPT_stack_protector_buffer_size, 8, Diags); Opts.StackRealignment = Args.hasArg(OPT_mstackrealign); diff --git a/test/Driver/fsanitize.c b/test/Driver/fsanitize.c index 06a688f940..da60b24883 100644 --- a/test/Driver/fsanitize.c +++ b/test/Driver/fsanitize.c @@ -18,13 +18,13 @@ // RUN: %clang -target x86_64-linux-gnu -fsanitize=address,thread -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANA-SANT // CHECK-SANA-SANT: '-fsanitize=address' not allowed with '-fsanitize=thread' -// RUN: %clang -target x86_64-linux-gnu -fsanitize=address,memory -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANA-SANM +// RUN: %clang -target x86_64-linux-gnu -fsanitize=address,memory -pie -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANA-SANM // CHECK-SANA-SANM: '-fsanitize=address' not allowed with '-fsanitize=memory' -// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread,memory -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANT-SANM +// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread,memory -pie -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANT-SANM // CHECK-SANT-SANM: '-fsanitize=thread' not allowed with '-fsanitize=memory' -// RUN: %clang -target x86_64-linux-gnu -fsanitize=memory,thread -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANM-SANT +// RUN: %clang -target x86_64-linux-gnu -fsanitize=memory,thread -pie -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANM-SANT // CHECK-SANM-SANT: '-fsanitize=thread' not allowed with '-fsanitize=memory' // RUN: %clang -target x86_64-linux-gnu -faddress-sanitizer -fthread-sanitizer -fno-rtti %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-TSAN @@ -33,9 +33,18 @@ // RUN: %clang -target x86_64-linux-gnu -fsanitize=init-order %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ONLY-EXTRA-ASAN // CHECK-ONLY-EXTRA-ASAN: argument '-fsanitize=init-order' only allowed with '-fsanitize=address' +// RUN: %clang -target x86_64-linux-gnu -fsanitize-memory-track-origins -pie %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ONLY-TRACK-ORIGINS +// CHECK-ONLY-TRACK-ORIGINS: warning: argument unused during compilation: '-fsanitize-memory-track-origins' + // RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize=alignment -fsanitize=vptr -fno-sanitize=vptr %s -### 2>&1 // OK +// RUN: %clang -target x86_64-linux-gnu -fsanitize=memory -pie %s -### 2>&1 +// OK + +// RUN: %clang -target x86_64-linux-gnu -fsanitize=memory -fsanitize-memory-track-origins -pie %s -### 2>&1 +// OK + // RUN: %clang -target x86_64-linux-gnu -fsanitize=vptr -fno-sanitize=vptr -fsanitize=undefined,address %s -### 2>&1 // OK