Author: Marco Elver Date: 2021-05-27T18:24:21+02:00 New Revision: 4fbc66cd6d90d8d5169c43fcc1b1e26e8a98d3a9
URL: https://github.com/llvm/llvm-project/commit/4fbc66cd6d90d8d5169c43fcc1b1e26e8a98d3a9 DIFF: https://github.com/llvm/llvm-project/commit/4fbc66cd6d90d8d5169c43fcc1b1e26e8a98d3a9.diff LOG: [Clang] Enable __has_feature(coverage_sanitizer) Like other sanitizers, enable __has_feature(coverage_sanitizer) if clang has enabled at least one SanitizerCoverage instrumentation type. Because coverage instrumentation selection is not handled via normal -fsanitize= (and thus not in SanitizeSet), passing this information through to LangOptions required propagating the already parsed -fsanitize-coverage= options from CodeGenOptions through to LangOptions in FixupInvocation(). Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D103159 Added: clang/test/Lexer/has_feature_coverage_sanitizer.cpp Modified: clang/docs/SanitizerCoverage.rst clang/include/clang/Basic/Features.def clang/include/clang/Basic/LangOptions.h clang/lib/Frontend/CompilerInvocation.cpp Removed: ################################################################################ diff --git a/clang/docs/SanitizerCoverage.rst b/clang/docs/SanitizerCoverage.rst index b0bb9823eb043..ebd5d72127aaa 100644 --- a/clang/docs/SanitizerCoverage.rst +++ b/clang/docs/SanitizerCoverage.rst @@ -316,7 +316,9 @@ Disabling instrumentation with ``__attribute__((no_sanitize("coverage")))`` =========================================================================== It is possible to disable coverage instrumentation for select functions via the -function attribute ``__attribute__((no_sanitize("coverage")))``. +function attribute ``__attribute__((no_sanitize("coverage")))``. Because this +attribute may not be supported by other compilers, it is recommended to use it +together with ``__has_feature(coverage_sanitizer)``. Disabling instrumentation without source modification ===================================================== diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 4f7e2db7683d0..a7a5e06a937e0 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -49,6 +49,7 @@ FEATURE(memtag_sanitizer, LangOpts.Sanitize.has(SanitizerKind::MemTag)) FEATURE(xray_instrument, LangOpts.XRayInstrument) FEATURE(undefined_behavior_sanitizer, LangOpts.Sanitize.hasOneOf(SanitizerKind::Undefined)) +FEATURE(coverage_sanitizer, LangOpts.SanitizeCoverage) FEATURE(assume_nonnull, true) FEATURE(attribute_analyzer_noreturn, true) FEATURE(attribute_availability, true) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index f5975d89a299e..d618daf3d23c2 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -280,6 +280,8 @@ class LangOptions : public LangOptionsBase { /// Set of enabled sanitizers. SanitizerSet Sanitize; + /// Is at least one coverage instrumentation type enabled. + bool SanitizeCoverage = false; /// Paths to files specifying which objects /// (files, functions, variables) should not be instrumented. diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 809492a36d3fa..28cd8391e32e2 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -453,7 +453,7 @@ static bool FixupInvocation(CompilerInvocation &Invocation, CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents; CodeGenOpts.DisableFree = FrontendOpts.DisableFree; FrontendOpts.GenerateGlobalModuleIndex = FrontendOpts.UseGlobalModuleIndex; - + LangOpts.SanitizeCoverage = CodeGenOpts.hasSanitizeCoverage(); LangOpts.ForceEmitVTables = CodeGenOpts.ForceEmitVTables; LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening; LangOpts.CurrentModule = LangOpts.ModuleName; diff --git a/clang/test/Lexer/has_feature_coverage_sanitizer.cpp b/clang/test/Lexer/has_feature_coverage_sanitizer.cpp new file mode 100644 index 0000000000000..dfbe3973be043 --- /dev/null +++ b/clang/test/Lexer/has_feature_coverage_sanitizer.cpp @@ -0,0 +1,15 @@ +// RUN: %clang -E -fsanitize-coverage=indirect-calls %s -o - | FileCheck --check-prefix=CHECK-SANCOV %s +// RUN: %clang -E -fsanitize-coverage=inline-8bit-counters %s -o - | FileCheck --check-prefix=CHECK-SANCOV %s +// RUN: %clang -E -fsanitize-coverage=trace-cmp %s -o - | FileCheck --check-prefix=CHECK-SANCOV %s +// RUN: %clang -E -fsanitize-coverage=trace-pc %s -o - | FileCheck --check-prefix=CHECK-SANCOV %s +// RUN: %clang -E -fsanitize-coverage=trace-pc-guard %s -o - | FileCheck --check-prefix=CHECK-SANCOV %s +// RUN: %clang -E %s -o - | FileCheck --check-prefix=CHECK-NO-SANCOV %s + +#if __has_feature(coverage_sanitizer) +int SancovEnabled(); +#else +int SancovDisabled(); +#endif + +// CHECK-SANCOV: SancovEnabled +// CHECK-NO-SANCOV: SancovDisabled _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits