forked from OSchip/llvm-project
[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
This commit is contained in:
parent
c412979cde
commit
4fbc66cd6d
|
@ -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
|
||||
=====================================================
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -280,6 +280,8 @@ public:
|
|||
|
||||
/// 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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue