diff options
| -rw-r--r-- | clang/include/clang/Basic/LangOptions.def | 1 | ||||
| -rw-r--r-- | clang/include/clang/Frontend/CodeGenOptions.h | 2 | ||||
| -rw-r--r-- | clang/lib/CodeGen/BackendUtil.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Lex/PPMacroExpansion.cpp | 1 | ||||
| -rw-r--r-- | clang/test/Lexer/has_feature_address_sanitizer.cpp | 11 | 
6 files changed, 17 insertions, 6 deletions
diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 1936be1fb67..c1b0fc9a7a8 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -121,6 +121,7 @@ LANGOPT(NoConstantCFStrings , 1, 0, "no constant CoreFoundation strings")  BENIGN_LANGOPT(InlineVisibilityHidden , 1, 0, "hidden default visibility for inline C++ methods")  BENIGN_LANGOPT(ParseUnknownAnytype, 1, 0, "__unknown_anytype")  BENIGN_LANGOPT(DebuggerSupport , 1, 0, "debugger support") +BENIGN_LANGOPT(AddressSanitizer , 1, 0, "AddressSanitizer enabled")  BENIGN_LANGOPT(SpellChecking , 1, 1, "spell-checking")  LANGOPT(SinglePrecisionConstants , 1, 0, "treating double-precision floating point constants as single precision constants") diff --git a/clang/include/clang/Frontend/CodeGenOptions.h b/clang/include/clang/Frontend/CodeGenOptions.h index 80720d4e366..9962ea8cf92 100644 --- a/clang/include/clang/Frontend/CodeGenOptions.h +++ b/clang/include/clang/Frontend/CodeGenOptions.h @@ -35,7 +35,6 @@ public:      Mixed = 2    }; -  unsigned AddressSanitizer  : 1; /// Enable AddressSanitizer.    unsigned AsmVerbose        : 1; /// -dA, -fverbose-asm.    unsigned ObjCAutoRefCountExceptions : 1; /// Whether ARC should be EH-safe.    unsigned CUDAIsDevice      : 1; /// Set when compiling for CUDA device. @@ -152,7 +151,6 @@ public:  public:    CodeGenOptions() { -    AddressSanitizer = 0;      AsmVerbose = 0;      CUDAIsDevice = 0;      CXAAtExit = 1; diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 0410cec7369..048011d1f4b 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -147,7 +147,7 @@ void EmitAssemblyHelper::CreatePasses() {                             addObjCARCOptPass);    } -  if (CodeGenOpts.AddressSanitizer) { +  if (LangOpts.AddressSanitizer) {      PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,                             addAddressSanitizerPass);    } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 34080908c0d..d4c83272b74 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -153,8 +153,6 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,      Res.push_back("-dwarf-debug-flags");      Res.push_back(Opts.DwarfDebugFlags);    } -  if (Opts.AddressSanitizer) -    Res.push_back("-faddress-sanitizer");    if (Opts.ObjCRuntimeHasARC)      Res.push_back("-fobjc-runtime-has-arc");    if (Opts.ObjCRuntimeHasTerminate) @@ -669,6 +667,8 @@ static void LangOptsToArgs(const LangOptions &Opts,      Res.push_back("-fpascal-strings");    if (Opts.CatchUndefined)      Res.push_back("-fcatch-undefined-behavior"); +  if (Opts.AddressSanitizer) +    Res.push_back("-faddress-sanitizer");    if (Opts.WritableStrings)      Res.push_back("-fwritable-strings");    if (Opts.ConstStrings) @@ -1069,7 +1069,6 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.UnrollLoops = Args.hasArg(OPT_funroll_loops) ||                       (Opts.OptimizationLevel > 1 && !Opts.OptimizeSize); -  Opts.AddressSanitizer = Args.hasArg(OPT_faddress_sanitizer);    Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);    Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions);    Opts.ObjCRuntimeHasARC = Args.hasArg(OPT_fobjc_runtime_has_arc); @@ -1812,6 +1811,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map);    Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);    Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support); +  Opts.AddressSanitizer = Args.hasArg(OPT_faddress_sanitizer);    Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);    Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name); diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 5ef91be219d..2e2dd71b087 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -583,6 +583,7 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {    const LangOptions &LangOpts = PP.getLangOptions();    return llvm::StringSwitch<bool>(II->getName()) +           .Case("address_sanitizer", LangOpts.AddressSanitizer)             .Case("attribute_analyzer_noreturn", true)             .Case("attribute_availability", true)             .Case("attribute_cf_returns_not_retained", true) diff --git a/clang/test/Lexer/has_feature_address_sanitizer.cpp b/clang/test/Lexer/has_feature_address_sanitizer.cpp new file mode 100644 index 00000000000..69acc39f0a8 --- /dev/null +++ b/clang/test/Lexer/has_feature_address_sanitizer.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -E -faddress-sanitizer %s -o - | FileCheck --check-prefix=CHECK-ASAN %s +// RUN: %clang_cc1 -E  %s -o - | FileCheck --check-prefix=CHECK-NO-ASAN %s + +#if __has_feature(address_sanitizer) +int AddressSanitizerEnabled(); +#else +int AddressSanitizerDisabled(); +#endif + +// CHECK-ASAN: AddressSanitizerEnabled +// CHECK-NO-ASAN: AddressSanitizerDisabled  | 

