1+ #pragma once
2+ #include < cstdint>
3+ #include < cstddef>
4+ #include < vector>
5+
6+ namespace rsl ::coverage {
7+
8+ struct PCTableEntry {
9+ std::uintptr_t pc;
10+ std::uintptr_t flags;
11+ [[nodiscard]] bool is_function_entry () const { return flags != 0 ; }
12+ };
13+
14+ // ? this isn't wrapped in a unique_ptr for more direct access
15+ // ? otherwise the hook might become recursive
16+ extern std::uint64_t * counters;
17+ extern PCTableEntry const * pc_table;
18+ extern std::size_t guard_count;
19+ std::vector<std::uintptr_t >& pc_tracker ();
20+ } // namespace rsl::coverage
21+
22+ extern " C" {
23+ // ? utilities from compiler-rt
24+ int __sanitizer_get_module_and_offset_for_pc (void * pc,
25+ char * module_name,
26+ std::uintptr_t module_name_len,
27+ void ** pc_offset);
28+
29+ void __sanitizer_symbolize_pc (std::uintptr_t pc,
30+ char const * fmt,
31+ char * out_buf,
32+ std::uintptr_t out_buf_size);
33+
34+ void __sanitizer_symbolize_global (std::uintptr_t data_addr,
35+ char const * fmt,
36+ char * out_buf,
37+ std::uintptr_t out_buf_size);
38+
39+ // ? -mllvm -sanitizer-coverage-gated-trace-callbacks
40+ extern uint64_t __sancov_should_track;
41+
42+ // ? -fsanitize-coverage=stack-depth
43+ // extern thread_local uintptr_t __sancov_lowest_stack;
44+ // void __sanitizer_cov_stack_depth();
45+
46+ // ? -fsanitize-coverage=trace-pc-guard
47+ void __sanitizer_cov_trace_pc_guard_init (uint32_t * start, uint32_t * end);
48+ void __sanitizer_cov_trace_pc_guard (uint32_t * guard);
49+
50+ // ? -fsanitize-coverage=inline-8bit-counters
51+ // void __sanitizer_cov_8bit_counters_init(uint8_t* start, uint8_t* end);
52+
53+ // ? -fsanitize-coverage=inline-bool-flag
54+ // void __sanitizer_cov_bool_flag_init(bool* start, bool* end);
55+
56+ // ? -fsanitize-coverage=pc-table
57+ // ? requires one of inline-8bit-counters, inline-bool-flag, trace-pc-guard
58+ void __sanitizer_cov_pcs_init (uintptr_t const * pcs_beg, uintptr_t const * pcs_end);
59+
60+ // ? -fsanitize-coverage=trace-pc
61+ void __sanitizer_cov_trace_pc (void * callee); // also available in GCC?
62+
63+ // ? -fsanitize-coverage=indirect-calls
64+ // void __sanitizer_cov_trace_pc_indir(uintptr_t callee);
65+
66+ // ? -fsanitize-coverage=trace-cmp
67+ // ? requires one of trace-pc, inline-8bit-counters, inline-bool-flag
68+ // void __sanitizer_cov_trace_cmp8(uint64_t Arg1, uint64_t Arg2);
69+ // void __sanitizer_cov_trace_const_cmp8(uint64_t Arg1, uint64_t Arg2);
70+ // void __sanitizer_cov_trace_cmp4(uint32_t Arg1, uint32_t Arg2);
71+ // void __sanitizer_cov_trace_const_cmp4(uint32_t Arg1, uint32_t Arg2);
72+ // void __sanitizer_cov_trace_cmp2(uint16_t Arg1, uint16_t Arg2);
73+ // void __sanitizer_cov_trace_const_cmp2(uint16_t Arg1, uint16_t Arg2);
74+ // void __sanitizer_cov_trace_cmp1(uint8_t Arg1, uint8_t Arg2);
75+ // void __sanitizer_cov_trace_const_cmp1(uint8_t Arg1, uint8_t Arg2);
76+ // void __sanitizer_cov_trace_switch(uint64_t Val, uint64_t* Cases);
77+
78+ // ? -fsanitize-coverage=trace-div
79+ // ? requires one of trace-pc, inline-8bit-counters, inline-bool-flag
80+ // void __sanitizer_cov_trace_div4(uint32_t Val);
81+ // void __sanitizer_cov_trace_div8(uint64_t Val);
82+
83+ // ? -fsanitize-coverage=trace-gep
84+ // ? requires one of trace-pc, inline-8bit-counters, inline-bool-flag
85+ // void __sanitizer_cov_trace_gep(uintptr_t Idx);
86+
87+ // ? -fsanitize-coverage=trace-loads
88+ // ? requires one of trace-pc, inline-8bit-counters, inline-bool-flag
89+ // void __sanitizer_cov_load1(uint8_t* addr);
90+ // void __sanitizer_cov_load2(uint16_t* addr);
91+ // void __sanitizer_cov_load4(uint32_t* addr);
92+ // void __sanitizer_cov_load8(uint64_t* addr);
93+ // void __sanitizer_cov_load16(__int128* addr);
94+
95+ // ? -fsanitize-coverage=trace-stores
96+ // ? requires one of trace-pc, inline-8bit-counters, inline-bool-flag
97+ // void __sanitizer_cov_store1(uint8_t* addr);
98+ // void __sanitizer_cov_store2(uint16_t* addr);
99+ // void __sanitizer_cov_store4(uint32_t* addr);
100+ // void __sanitizer_cov_store8(uint64_t* addr);
101+ // void __sanitizer_cov_store16(__int128* addr);
102+ } // extern "C"
0 commit comments