Skip to content

Commit ced398f

Browse files
pratyaivitalybuka
authored andcommitted
[SanitizerCoverage] Add -fsanitize-coverage=inline-bool-flag
Reviewers: kcc, vitalybuka Reviewed By: vitalybuka Subscribers: cfe-commits, llvm-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D77637
1 parent 9c7bd94 commit ced398f

File tree

9 files changed

+93
-45
lines changed

9 files changed

+93
-45
lines changed

clang/docs/SanitizerCoverage.rst

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,28 @@ Users need to implement a single function to capture the counters at startup.
139139
// Capture this array in order to read/modify the counters.
140140
}
141141
142+
143+
Inline bool-flag
144+
================
145+
146+
**Experimental, may change or disappear in future**
147+
148+
With ``-fsanitize-coverage=inline-bool-flag`` the compiler will insert
149+
setting an inline boolean to true on every edge.
150+
This is similar to ``-fsanitize-coverage=inline-8bit-counter`` but instead of
151+
an increment of a counter, it just sets a boolean to true.
152+
153+
Users need to implement a single function to capture the flags at startup.
154+
155+
.. code-block:: c++
156+
157+
extern "C"
158+
void __sanitizer_cov_bool_flag_init(bool *start, bool *end) {
159+
// [start,end) is the array of boolean flags created for the current DSO.
160+
// Capture this array in order to read/modify the flags.
161+
}
162+
163+
142164
PC-Table
143165
========
144166

@@ -150,8 +172,8 @@ significant binary size overhead. For more information, see
150172
`Bug 34636 <https://bugs.llvm.org/show_bug.cgi?id=34636>`_.
151173

152174
With ``-fsanitize-coverage=pc-table`` the compiler will create a table of
153-
instrumented PCs. Requires either ``-fsanitize-coverage=inline-8bit-counters`` or
154-
``-fsanitize-coverage=trace-pc-guard``.
175+
instrumented PCs. Requires either ``-fsanitize-coverage=inline-8bit-counters``,
176+
or ``-fsanitize-coverage=inline-bool-flag``, or ``-fsanitize-coverage=trace-pc-guard``.
155177

156178
Users need to implement a single function to capture the PC table at startup:
157179

@@ -164,8 +186,9 @@ Users need to implement a single function to capture the PC table at startup:
164186
// pairs [PC,PCFlags] for every instrumented block in the current DSO.
165187
// Capture this array in order to read the PCs and their Flags.
166188
// The number of PCs and PCFlags for a given DSO is the same as the number
167-
// of 8-bit counters (-fsanitize-coverage=inline-8bit-counters) or
168-
// trace_pc_guard callbacks (-fsanitize-coverage=trace-pc-guard)
189+
// of 8-bit counters (-fsanitize-coverage=inline-8bit-counters), or
190+
// boolean flags (-fsanitize-coverage=inline=bool-flags), or trace_pc_guard
191+
// callbacks (-fsanitize-coverage=trace-pc-guard).
169192
// A PCFlags describes the basic block:
170193
// * bit0: 1 if the block is the function entry block, 0 otherwise.
171194
}

clang/include/clang/Basic/CodeGenOptions.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ CODEGENOPT(SanitizeCoverageTracePC, 1, 0) ///< Enable PC tracing
232232
CODEGENOPT(SanitizeCoverageTracePCGuard, 1, 0) ///< Enable PC tracing with guard
233233
///< in sanitizer coverage.
234234
CODEGENOPT(SanitizeCoverageInline8bitCounters, 1, 0) ///< Use inline 8bit counters.
235+
CODEGENOPT(SanitizeCoverageInlineBoolFlag, 1, 0) ///< Use inline bool flag.
235236
CODEGENOPT(SanitizeCoveragePCTable, 1, 0) ///< Create a PC Table.
236237
CODEGENOPT(SanitizeCoverageNoPrune, 1, 0) ///< Disable coverage pruning.
237238
CODEGENOPT(SanitizeCoverageStackDepth, 1, 0) ///< Enable max stack depth tracing

clang/include/clang/Driver/CC1Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,9 @@ def fsanitize_coverage_8bit_counters
355355
def fsanitize_coverage_inline_8bit_counters
356356
: Flag<["-"], "fsanitize-coverage-inline-8bit-counters">,
357357
HelpText<"Enable inline 8-bit counters in sanitizer coverage">;
358+
def fsanitize_coverage_inline_bool_flag
359+
: Flag<["-"], "fsanitize-coverage-inline-bool-flag">,
360+
HelpText<"Enable inline bool flag in sanitizer coverage">;
358361
def fsanitize_coverage_pc_table
359362
: Flag<["-"], "fsanitize-coverage-pc-table">,
360363
HelpText<"Create a table of coverage-instrumented PCs">;

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ def fdiagnostics_hotness_threshold_EQ : Joined<["-"], "fdiagnostics-hotness-thre
901901
def fdiagnostics_show_option : Flag<["-"], "fdiagnostics-show-option">, Group<f_Group>,
902902
HelpText<"Print option name with mappable diagnostics">;
903903
def fdiagnostics_show_note_include_stack : Flag<["-"], "fdiagnostics-show-note-include-stack">,
904-
Group<f_Group>, Flags<[CC1Option]>, HelpText<"Display include stacks for diagnostic notes">;
904+
Group<f_Group>, Flags<[CC1Option]>, HelpText<"Display include stacks for diagnostic notes">;
905905
def fdiagnostics_format_EQ : Joined<["-"], "fdiagnostics-format=">, Group<f_clang_Group>;
906906
def fdiagnostics_show_category_EQ : Joined<["-"], "fdiagnostics-show-category=">, Group<f_clang_Group>;
907907
def fdiagnostics_show_template_tree : Flag<["-"], "fdiagnostics-show-template-tree">,
@@ -1019,7 +1019,7 @@ def fno_sanitize_coverage
10191019
: CommaJoined<["-"], "fno-sanitize-coverage=">,
10201020
Group<f_clang_Group>, Flags<[CoreOption, DriverOption]>,
10211021
HelpText<"Disable specified features of coverage instrumentation for "
1022-
"Sanitizers">, Values<"func,bb,edge,indirect-calls,trace-bb,trace-cmp,trace-div,trace-gep,8bit-counters,trace-pc,trace-pc-guard,no-prune,inline-8bit-counters">;
1022+
"Sanitizers">, Values<"func,bb,edge,indirect-calls,trace-bb,trace-cmp,trace-div,trace-gep,8bit-counters,trace-pc,trace-pc-guard,no-prune,inline-8bit-counters,inline-bool-flag">;
10231023
def fsanitize_memory_track_origins_EQ : Joined<["-"], "fsanitize-memory-track-origins=">,
10241024
Group<f_clang_Group>,
10251025
HelpText<"Enable origins tracking in MemorySanitizer">;

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ getSancovOptsFromCGOpts(const CodeGenOptions &CGOpts) {
222222
Opts.TracePCGuard = CGOpts.SanitizeCoverageTracePCGuard;
223223
Opts.NoPrune = CGOpts.SanitizeCoverageNoPrune;
224224
Opts.Inline8bitCounters = CGOpts.SanitizeCoverageInline8bitCounters;
225+
Opts.InlineBoolFlag = CGOpts.SanitizeCoverageInlineBoolFlag;
225226
Opts.PCTable = CGOpts.SanitizeCoveragePCTable;
226227
Opts.StackDepth = CGOpts.SanitizeCoverageStackDepth;
227228
return Opts;

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,18 @@ enum CoverageFeature {
7777
CoverageBB = 1 << 1,
7878
CoverageEdge = 1 << 2,
7979
CoverageIndirCall = 1 << 3,
80-
CoverageTraceBB = 1 << 4, // Deprecated.
80+
CoverageTraceBB = 1 << 4, // Deprecated.
8181
CoverageTraceCmp = 1 << 5,
8282
CoverageTraceDiv = 1 << 6,
8383
CoverageTraceGep = 1 << 7,
84-
Coverage8bitCounters = 1 << 8, // Deprecated.
84+
Coverage8bitCounters = 1 << 8, // Deprecated.
8585
CoverageTracePC = 1 << 9,
8686
CoverageTracePCGuard = 1 << 10,
8787
CoverageNoPrune = 1 << 11,
8888
CoverageInline8bitCounters = 1 << 12,
8989
CoveragePCTable = 1 << 13,
9090
CoverageStackDepth = 1 << 14,
91+
CoverageInlineBoolFlag = 1 << 15,
9192
};
9293

9394
/// Parse a -fsanitize= or -fno-sanitize= argument's values, diagnosing any
@@ -723,8 +724,9 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
723724
<< "-fsanitize-coverage=trace-pc-guard";
724725

725726
int InsertionPointTypes = CoverageFunc | CoverageBB | CoverageEdge;
726-
int InstrumentationTypes =
727-
CoverageTracePC | CoverageTracePCGuard | CoverageInline8bitCounters;
727+
int InstrumentationTypes = CoverageTracePC | CoverageTracePCGuard |
728+
CoverageInline8bitCounters |
729+
CoverageInlineBoolFlag;
728730
if ((CoverageFeatures & InsertionPointTypes) &&
729731
!(CoverageFeatures & InstrumentationTypes)) {
730732
D.Diag(clang::diag::warn_drv_deprecated_arg)
@@ -735,7 +737,8 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
735737
// trace-pc w/o func/bb/edge implies edge.
736738
if (!(CoverageFeatures & InsertionPointTypes)) {
737739
if (CoverageFeatures &
738-
(CoverageTracePC | CoverageTracePCGuard | CoverageInline8bitCounters))
740+
(CoverageTracePC | CoverageTracePCGuard | CoverageInline8bitCounters |
741+
CoverageInlineBoolFlag))
739742
CoverageFeatures |= CoverageEdge;
740743

741744
if (CoverageFeatures & CoverageStackDepth)
@@ -907,21 +910,25 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
907910
// Do it even if Sanitizers.empty() since some forms of coverage don't require
908911
// sanitizers.
909912
std::pair<int, const char *> CoverageFlags[] = {
910-
std::make_pair(CoverageFunc, "-fsanitize-coverage-type=1"),
911-
std::make_pair(CoverageBB, "-fsanitize-coverage-type=2"),
912-
std::make_pair(CoverageEdge, "-fsanitize-coverage-type=3"),
913-
std::make_pair(CoverageIndirCall, "-fsanitize-coverage-indirect-calls"),
914-
std::make_pair(CoverageTraceBB, "-fsanitize-coverage-trace-bb"),
915-
std::make_pair(CoverageTraceCmp, "-fsanitize-coverage-trace-cmp"),
916-
std::make_pair(CoverageTraceDiv, "-fsanitize-coverage-trace-div"),
917-
std::make_pair(CoverageTraceGep, "-fsanitize-coverage-trace-gep"),
918-
std::make_pair(Coverage8bitCounters, "-fsanitize-coverage-8bit-counters"),
919-
std::make_pair(CoverageTracePC, "-fsanitize-coverage-trace-pc"),
920-
std::make_pair(CoverageTracePCGuard, "-fsanitize-coverage-trace-pc-guard"),
921-
std::make_pair(CoverageInline8bitCounters, "-fsanitize-coverage-inline-8bit-counters"),
922-
std::make_pair(CoveragePCTable, "-fsanitize-coverage-pc-table"),
923-
std::make_pair(CoverageNoPrune, "-fsanitize-coverage-no-prune"),
924-
std::make_pair(CoverageStackDepth, "-fsanitize-coverage-stack-depth")};
913+
std::make_pair(CoverageFunc, "-fsanitize-coverage-type=1"),
914+
std::make_pair(CoverageBB, "-fsanitize-coverage-type=2"),
915+
std::make_pair(CoverageEdge, "-fsanitize-coverage-type=3"),
916+
std::make_pair(CoverageIndirCall, "-fsanitize-coverage-indirect-calls"),
917+
std::make_pair(CoverageTraceBB, "-fsanitize-coverage-trace-bb"),
918+
std::make_pair(CoverageTraceCmp, "-fsanitize-coverage-trace-cmp"),
919+
std::make_pair(CoverageTraceDiv, "-fsanitize-coverage-trace-div"),
920+
std::make_pair(CoverageTraceGep, "-fsanitize-coverage-trace-gep"),
921+
std::make_pair(Coverage8bitCounters, "-fsanitize-coverage-8bit-counters"),
922+
std::make_pair(CoverageTracePC, "-fsanitize-coverage-trace-pc"),
923+
std::make_pair(CoverageTracePCGuard,
924+
"-fsanitize-coverage-trace-pc-guard"),
925+
std::make_pair(CoverageInline8bitCounters,
926+
"-fsanitize-coverage-inline-8bit-counters"),
927+
std::make_pair(CoverageInlineBoolFlag,
928+
"-fsanitize-coverage-inline-bool-flag"),
929+
std::make_pair(CoveragePCTable, "-fsanitize-coverage-pc-table"),
930+
std::make_pair(CoverageNoPrune, "-fsanitize-coverage-no-prune"),
931+
std::make_pair(CoverageStackDepth, "-fsanitize-coverage-stack-depth")};
925932
for (auto F : CoverageFlags) {
926933
if (CoverageFeatures & F.first)
927934
CmdArgs.push_back(F.second);
@@ -1105,22 +1112,23 @@ int parseCoverageFeatures(const Driver &D, const llvm::opt::Arg *A) {
11051112
for (int i = 0, n = A->getNumValues(); i != n; ++i) {
11061113
const char *Value = A->getValue(i);
11071114
int F = llvm::StringSwitch<int>(Value)
1108-
.Case("func", CoverageFunc)
1109-
.Case("bb", CoverageBB)
1110-
.Case("edge", CoverageEdge)
1111-
.Case("indirect-calls", CoverageIndirCall)
1112-
.Case("trace-bb", CoverageTraceBB)
1113-
.Case("trace-cmp", CoverageTraceCmp)
1114-
.Case("trace-div", CoverageTraceDiv)
1115-
.Case("trace-gep", CoverageTraceGep)
1116-
.Case("8bit-counters", Coverage8bitCounters)
1117-
.Case("trace-pc", CoverageTracePC)
1118-
.Case("trace-pc-guard", CoverageTracePCGuard)
1119-
.Case("no-prune", CoverageNoPrune)
1120-
.Case("inline-8bit-counters", CoverageInline8bitCounters)
1121-
.Case("pc-table", CoveragePCTable)
1122-
.Case("stack-depth", CoverageStackDepth)
1123-
.Default(0);
1115+
.Case("func", CoverageFunc)
1116+
.Case("bb", CoverageBB)
1117+
.Case("edge", CoverageEdge)
1118+
.Case("indirect-calls", CoverageIndirCall)
1119+
.Case("trace-bb", CoverageTraceBB)
1120+
.Case("trace-cmp", CoverageTraceCmp)
1121+
.Case("trace-div", CoverageTraceDiv)
1122+
.Case("trace-gep", CoverageTraceGep)
1123+
.Case("8bit-counters", Coverage8bitCounters)
1124+
.Case("trace-pc", CoverageTracePC)
1125+
.Case("trace-pc-guard", CoverageTracePCGuard)
1126+
.Case("no-prune", CoverageNoPrune)
1127+
.Case("inline-8bit-counters", CoverageInline8bitCounters)
1128+
.Case("inline-bool-flag", CoverageInlineBoolFlag)
1129+
.Case("pc-table", CoveragePCTable)
1130+
.Case("stack-depth", CoverageStackDepth)
1131+
.Default(0);
11241132
if (F == 0)
11251133
D.Diag(clang::diag::err_drv_unsupported_option_argument)
11261134
<< A->getOption().getName() << Value;

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
11761176
Opts.SanitizeCoverageNoPrune = Args.hasArg(OPT_fsanitize_coverage_no_prune);
11771177
Opts.SanitizeCoverageInline8bitCounters =
11781178
Args.hasArg(OPT_fsanitize_coverage_inline_8bit_counters);
1179+
Opts.SanitizeCoverageInlineBoolFlag =
1180+
Args.hasArg(OPT_fsanitize_coverage_inline_bool_flag);
11791181
Opts.SanitizeCoveragePCTable = Args.hasArg(OPT_fsanitize_coverage_pc_table);
11801182
Opts.SanitizeCoverageStackDepth =
11811183
Args.hasArg(OPT_fsanitize_coverage_stack_depth);

clang/test/Driver/autocomplete.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
// FNOSANICOVERALL-NEXT: func
5555
// FNOSANICOVERALL-NEXT: indirect-calls
5656
// FNOSANICOVERALL-NEXT: inline-8bit-counters
57+
// FNOSANICOVERALL-NEXT: inline-bool-flag
5758
// FNOSANICOVERALL-NEXT: no-prune
5859
// FNOSANICOVERALL-NEXT: trace-bb
5960
// FNOSANICOVERALL-NEXT: trace-cmp

clang/test/Driver/fsanitize-coverage.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,18 @@
105105
// CHECK_INLINE8BIT-NOT: warning
106106
// CHECK_INLINE8BIT: -fsanitize-coverage-inline-8bit-counters
107107

108-
// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=inline-8bit-counters,pc-table %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_PC_TABLE
109-
// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=trace-pc-guard,pc-table %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_PC_TABLE
110-
// CHECK_PC_TABLE: -fsanitize-coverage-pc-table
108+
// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=inline-8bit-counters,pc-table %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_PC_TABLE_FOR_INLINE8BIT
109+
// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=trace-pc-guard,pc-table %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_PC_TABLE_FOR_INLINE8BIT
110+
// CHECK_PC_TABLE_FOR_INLINE8BIT: -fsanitize-coverage-pc-table
111+
112+
// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=inline-bool-flag %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_INLINE_BOOL_FLAG
113+
// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=bb,inline-bool-flag %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_INLINE_BOOL_FLAG
114+
// CHECK_INLINE_BOOL_FLAG-NOT: warning
115+
// CHECK_INLINE_BOOL_FLAG: -fsanitize-coverage-inline-bool-flag
116+
117+
// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=inline-bool-flag,pc-table %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_PC_TABLE_FOR_INLINEBOOL
118+
// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=trace-pc-guard,pc-table %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_PC_TABLE_FOR_INLINEBOOL
119+
// CHECK_PC_TABLE_FOR_INLINEBOOL: -fsanitize-coverage-pc-table
111120

112121
// RUN: %clang_cl --target=i386-pc-win32 -fsanitize=address -fsanitize-coverage=func,trace-pc-guard -c -### -- %s 2>&1 | FileCheck %s -check-prefix=CLANG-CL-COVERAGE
113122
// CLANG-CL-COVERAGE-NOT: error:

0 commit comments

Comments
 (0)