123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- //+build amd64
- package sys_valgrind
- import "core:intrinsics"
- Callgrind_Client_Request :: enum uintptr {
- Dump_Stats = 'C'<<24 | 'T'<<16,
- Zero_Stats,
- Toggle_Collect,
- Dump_Stats_At,
- Start_Instrumentation,
- Stop_Instrumentation,
- }
- @(require_results)
- callgrind_client_request_expr :: #force_inline proc "c" (default: uintptr, request: Callgrind_Client_Request, a0, a1, a2, a3, a4: uintptr) -> uintptr {
- return intrinsics.valgrind_client_request(default, uintptr(request), a0, a1, a2, a3, a4)
- }
- callgrind_client_request_stmt :: #force_inline proc "c" (request: Callgrind_Client_Request, a0, a1, a2, a3, a4: uintptr) {
- _ = intrinsics.valgrind_client_request(0, uintptr(request), a0, a1, a2, a3, a4)
- }
- // Dump current state of cost centres, and zero them afterwards.
- dump_stats :: proc "c" () {
- callgrind_client_request_stmt(.Dump_Stats, 0, 0, 0, 0, 0)
- }
- // Zero cost centres
- zero_stats :: proc "c" () {
- callgrind_client_request_stmt(.Zero_Stats, 0, 0, 0, 0, 0)
- }
- // Toggles collection state.
- // The collection state specifies whether the happening of events should be noted or
- // if they are to be ignored. Events are noted by increment of counters in a cost centre.
- toggle_collect :: proc "c" () {
- callgrind_client_request_stmt(.Toggle_Collect, 0, 0, 0, 0, 0)
- }
- // Dump current state of cost centres, and zero them afterwards.
- // The argument is appended to a string stating the reason which triggered
- // the dump. This string is written as a description field into the
- // profile data dump.
- dump_stats_at :: proc "c" (pos_str: rawptr) {
- callgrind_client_request_stmt(.Dump_Stats_At, uintptr(pos_str), 0, 0, 0, 0)
- }
- // Start full callgrind instrumentation if not already switched on.
- // When cache simulation is done, it will flush the simulated cache;
- // this will lead to an artificial cache warmup phase afterwards with
- // cache misses which would not have happened in reality.
- start_instrumentation :: proc "c" () {
- callgrind_client_request_stmt(.Start_Instrumentation, 0, 0, 0, 0, 0)
- }
- // Stop full callgrind instrumentation if not already switched off.
- // This flushes Valgrinds translation cache, and does no additional instrumentation
- // afterwards, which effectivly will run at the same speed as the "none" tool (ie. at minimal slowdown).
- // Use this to bypass Callgrind aggregation for uninteresting code parts.
- // To start Callgrind in this mode to ignore the setup phase, use the option "--instr-atstart=no".
- stop_instrumentation :: proc "c" () {
- callgrind_client_request_stmt(.Stop_Instrumentation, 0, 0, 0, 0, 0)
- }
|