Compare commits
2 Commits
b0841afa35
...
a8096d9b70
Author | SHA1 | Date |
---|---|---|
|
a8096d9b70 | |
|
44f09b9a38 |
|
@ -135,3 +135,76 @@ void rvprof_region_begin(const char* name){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rvprof_region_end(const char* name){
|
||||||
|
if (!g_rvprof.initialized || g_rvprof.stack_ptr < 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
region_t* region = &g_rvprof.regions.data[g_rvprof.stack_ptr];
|
||||||
|
|
||||||
|
// make sure name matches
|
||||||
|
if (strcmp(region->name, name) !=0) return;
|
||||||
|
|
||||||
|
// end timing
|
||||||
|
uint64_t end_time_ns = rvprof_timing_get_current();
|
||||||
|
uint64_t end_cycles = rvprof_timing_get_cycles();
|
||||||
|
uint64_t elapsed_time = end_time_ns - region->start_time_ns;
|
||||||
|
uint64_t elapsed_cycles = (end_cycles > region->start_cycles) ? (end_cycles - region->start_cycles) : 0;
|
||||||
|
|
||||||
|
// update region statistics
|
||||||
|
if (region->function_id >= 0){
|
||||||
|
function_stats_t* stats = &g_rvprof.functions.data[region->function_id];
|
||||||
|
uint64_t exclusive_time = elapsed_time - region->child_time;
|
||||||
|
uint64_t exclusive_cycles = (elapsed_cycles > region->child_cycles) ? (elapsed_cycles - region->child_cycles) : 0; \
|
||||||
|
|
||||||
|
stats->total_inclusive_time += elapsed_time;
|
||||||
|
stats->total_exclusive_time += exclusive_time;
|
||||||
|
|
||||||
|
stats->total_inclusive_cycles += elapsed_cycles;
|
||||||
|
stats->total_exclusive_cycles += exclusive_cycles;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update parent statistics
|
||||||
|
if (g_rvprof.stack_ptr > 0) {
|
||||||
|
g_rvprof.regions.data[g_rvprof.stack_ptr-1].child_time += elapsed_time;
|
||||||
|
g_rvprof.regions.data[g_rvprof.stack_ptr-1].child_cycles += elapsed_cycles;
|
||||||
|
} else {
|
||||||
|
// this is the top-level region, updatre total program stats
|
||||||
|
if (elapsed_time > g_rvprof.total_program_time){
|
||||||
|
g_rvprof.total_program_time = elapsed_time;
|
||||||
|
g_rvprof.total_program_cycles = elapsed_cycles;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// region ended: decrease stack pointer
|
||||||
|
g_rvprof.stack_ptr--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rvprof_finalize(void){
|
||||||
|
if (!g_rvprof.initialized) return;
|
||||||
|
|
||||||
|
rvprof_output_generate_report();
|
||||||
|
if(g_rvprof.output_file){
|
||||||
|
fclose(g_rvprof.output_file);
|
||||||
|
g_rvprof.output_file = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
region_array_cleanup(&g_rvprof.regions);
|
||||||
|
function_stats_array_cleanup(&g_rvprof.functions);
|
||||||
|
stack_info_array_cleanup(&g_rvprof.stacks);
|
||||||
|
symbol_array_cleanup(&g_rvprof.symbols);
|
||||||
|
|
||||||
|
if (g_rvprof.config.output_filename) {
|
||||||
|
rvprof_free(g_rvprof.config.output_filename, strlen(g_rvprof.config.output_filename) + 1);
|
||||||
|
g_rvprof.config.output_filename = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_rvprof.config.program_name) {
|
||||||
|
rvprof_free(g_rvprof.config.program_name, strlen(g_rvprof.config.program_name) + 1);
|
||||||
|
g_rvprof.config.program_name = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_rvprof.initialized = 0;
|
||||||
|
g_rvprof.auto_initialized = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue