@@ -151,6 +151,44 @@ class TracePcGuardController {
151
151
152
152
static TracePcGuardController pc_guard_controller;
153
153
154
+ // A basic default implementation of callbacks for
155
+ // -fsanitize-coverage=inline-8bit-counters,pc-table.
156
+ // Use TOOL_OPTIONS (UBSAN_OPTIONS, etc) to dump the coverage data:
157
+ // * cov_8bit_counters_out=PATH to dump the 8bit counters.
158
+ // * cov_pcs_out=PATH to dump the pc table.
159
+ //
160
+ // Most users will still need to define their own callbacks for greater
161
+ // flexibility.
162
+ namespace SingletonCounterCoverage {
163
+
164
+ static char *counters_start, *counters_end;
165
+
166
+ static void DumpCoverage () {
167
+ const char * file_path = common_flags ()->cov_8bit_counters_out ;
168
+ if (!file_path || !internal_strlen (file_path))
169
+ return ;
170
+ fd_t fd = OpenFile (file_path);
171
+ FileCloser file_closer (fd);
172
+ WriteToFile (fd, counters_start, counters_end - counters_start);
173
+ }
174
+
175
+ static void Cov8bitCountersInit (char * beg, char * end) {
176
+ counters_start = beg;
177
+ counters_end = end;
178
+ Atexit (DumpCoverage);
179
+ }
180
+
181
+ static void CovPcsInit (const uptr* pcs_beg, const uptr* pcs_end) {
182
+ const char * file_path = common_flags ()->cov_pcs_out ;
183
+ if (!file_path || !internal_strlen (file_path))
184
+ return ;
185
+ fd_t fd = OpenFile (file_path);
186
+ FileCloser file_closer (fd);
187
+ WriteToFile (fd, pcs_beg, (pcs_end - pcs_beg) * sizeof (uptr));
188
+ }
189
+
190
+ } // namespace SingletonCounterCoverage
191
+
154
192
} // namespace
155
193
} // namespace __sancov
156
194
@@ -191,7 +229,9 @@ SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_dump() {
191
229
SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_reset () {
192
230
__sancov::pc_guard_controller.Reset ();
193
231
}
194
- // Default empty implementations (weak). Users should redefine them.
232
+ // Default implementations (weak).
233
+ // Either empty or very simple.
234
+ // Most users should redefine them.
195
235
SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_trace_cmp, void ) {}
196
236
SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_trace_cmp1, void ) {}
197
237
SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_trace_cmp2, void ) {}
@@ -206,9 +246,15 @@ SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_div4, void) {}
206
246
SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_trace_div8, void ) {}
207
247
SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_trace_gep, void ) {}
208
248
SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_trace_pc_indir, void ) {}
209
- SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_8bit_counters_init, void ) {}
249
+ SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_8bit_counters_init,
250
+ char * start, char * end) {
251
+ __sancov::SingletonCounterCoverage::Cov8bitCountersInit (start, end);
252
+ }
210
253
SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_bool_flag_init, void ) {}
211
- SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_pcs_init, void ) {}
254
+ SANITIZER_INTERFACE_WEAK_DEF (void , __sanitizer_cov_pcs_init, const uptr* beg,
255
+ const uptr* end) {
256
+ __sancov::SingletonCounterCoverage::CovPcsInit (beg, end);
257
+ }
212
258
} // extern "C"
213
259
// Weak definition for code instrumented with -fsanitize-coverage=stack-depth
214
260
// and later linked with code containing a strong definition.
0 commit comments