1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Callgrind ---*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- global.h ---*/ 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- (C) 2004, 2005 Josef Weidendorfer ---*/ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef CLG_GLOBAL 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_GLOBAL 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_basics.h" 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_vki.h" 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_debuginfo.h" 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_libcbase.h" 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_libcassert.h" 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_libcfile.h" 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_libcprint.h" 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_libcproc.h" 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_machine.h" 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_mallocfree.h" 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_options.h" 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_tooliface.h" 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_xarray.h" 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_clientstate.h" 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_machine.h" // VG_(fnptr_to_fnentry) 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "events.h" // defines CLG_ macro 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "costs.h" 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Calltree compile options --- */ 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Enable debug output */ 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_ENABLE_DEBUG 1 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Enable experimental features? */ 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_EXPERIMENTAL 0 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Syscall Timing in microseconds? 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * (define to 0 if you get compile errors) */ 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_MICROSYSTIME 0 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Set to 1 if you want full sanity checks for JCC */ 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define JCC_CHECK 0 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Command line options ---*/ 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DEFAULT_OUTFORMAT "callgrind.out.%p" 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DEFAULT_COMMANDNAME "callgrind.cmd" 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DEFAULT_RESULTNAME "callgrind.res" 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define DEFAULT_INFONAME "callgrind.info" 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _CommandLineOptions CommandLineOptions; 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _CommandLineOptions { 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Dump format options */ 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char* out_format; /* Format string for callgrind output file name */ 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool combine_dumps; /* Dump trace parts into same file? */ 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool compress_strings; 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool compress_events; 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool compress_pos; 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool mangle_names; 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool compress_mangled; 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool dump_line; 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool dump_instr; 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool dump_bb; 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool dump_bbs; /* Dump basic block information? */ 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Dump generation options */ 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong dump_every_bb; /* Dump every xxx BBs. */ 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Collection options */ 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool separate_threads; /* Separate threads in dump? */ 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int separate_callers; /* Separate dependent on how many callers? */ 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int separate_recursions; /* Max level of recursions to separate */ 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool skip_plt; /* Skip functions in PLT section? */ 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool skip_direct_recursion; /* Increment direct recursions the level? */ 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool collect_atstart; /* Start in collecting state ? */ 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool collect_jumps; /* Collect (cond.) jumps in functions ? */ 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool collect_alloc; /* Collect size of allocated memory */ 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool collect_systime; /* Collect time for system calls */ 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool collect_bus; /* Collect global bus events */ 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Instrument options */ 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool instrument_atstart; /* Instrument at start? */ 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool simulate_cache; /* Call into cache simulator ? */ 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool simulate_branch; /* Call into branch prediction simulator ? */ 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Call graph generation */ 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool pop_on_jump; /* Handle a jump between functions as ret+call */ 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if CLG_ENABLE_DEBUG 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int verbose; 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong verbose_start; 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Constants ---*/ 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* According to IA-32 Intel Architecture Software Developer's Manual: Vol 2 */ 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MAX_x86_INSTR_SIZE 16 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Minimum cache line size allowed */ 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MIN_LINE_SIZE 16 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Size of various buffers used for storing strings */ 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define FILENAME_LEN VKI_PATH_MAX 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define FN_NAME_LEN 4096 /* for C++ code :-) */ 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define OBJ_NAME_LEN 256 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define COSTS_LEN 512 /* at least 17x 64bit values */ 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define BUF_LEN 512 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define COMMIFY_BUF_LEN 128 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define RESULTS_BUF_LEN 256 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LINE_BUF_LEN 64 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Convenience macros */ 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Use this only when size of sprintf args are known to fit into 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * given buffer; for strings of unknown length, use WRITE_STR below 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define WRITE_SPRINTF(fd, zz_buf, fmt, args...) \ 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do { Int len = VG_(sprintf)(zz_buf, fmt, ## args); \ 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(write)(fd, (void*)zz_buf, len); \ 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } while (0) 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define WRITE_STR(fd, str) \ 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do { if (str) { Int len = VG_(strlen)(str); \ 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(write)(fd, (void*)str, len); } \ 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else VG_(write)(fd, "(null)", 6); \ 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } while (0) 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define WRITE_STR2(fd, str1, str2) \ 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do { if (str1) { Int len = VG_(strlen)(str1); \ 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(write)(fd, (void*)str1, len); } \ 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else VG_(write)(fd, "(null)", 6); \ 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (str2) { Int len = VG_(strlen)(str2); \ 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(write)(fd, (void*)str2, len); } \ 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else VG_(write)(fd, "(null)", 6); \ 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } while (0) 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define WRITE_STR3(fd, str1, str2, str3) \ 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do { if (str1) { Int len = VG_(strlen)(str1); \ 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(write)(fd, (void*)str1, len); } \ 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else VG_(write)(fd, "(null)", 6); \ 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (str2) { Int len = VG_(strlen)(str2); \ 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(write)(fd, (void*)str2, len); } \ 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else VG_(write)(fd, "(null)", 6); \ 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (str3) { Int len = VG_(strlen)(str3); \ 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(write)(fd, (void*)str3, len); } \ 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else VG_(write)(fd, "(null)", 6); \ 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } while (0) 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Statistics ---*/ 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _Statistics Statistics; 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _Statistics { 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong call_counter; 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong jcnd_counter; 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong jump_counter; 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong rec_call_counter; 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong ret_counter; 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong bb_executions; 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int context_counter; 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int bb_retranslations; 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int distinct_objs; 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int distinct_files; 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int distinct_fns; 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int distinct_contexts; 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int distinct_bbs; 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int distinct_jccs; 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int distinct_bbccs; 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int distinct_instrs; 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int distinct_skips; 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int bb_hash_resizes; 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int bbcc_hash_resizes; 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int jcc_hash_resizes; 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int cxt_hash_resizes; 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int fn_array_resizes; 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int call_stack_resizes; 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int fn_stack_resizes; 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int full_debug_BBs; 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int file_line_debug_BBs; 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int fn_name_debug_BBs; 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int no_debug_BBs; 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int bbcc_lru_misses; 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int jcc_lru_misses; 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int cxt_lru_misses; 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int bbcc_clones; 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Structure declarations ---*/ 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _Context Context; 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _CC CC; 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _BB BB; 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _Skipped Skipped; 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _BBCC BBCC; 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _jCC jCC; 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _fCC fCC; 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _fn_node fn_node; 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _file_node file_node; 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _obj_node obj_node; 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _fn_config fn_config; 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _call_entry call_entry; 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _thread_info thread_info; 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Costs of event sets. Aliases to arrays of 64-bit values */ 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef ULong* SimCost; /* All events the simulator can produce */ 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef ULong* UserCost; 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef ULong* FullCost; /* Simulator + User */ 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* JmpCall cost center 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * for subroutine call (from->bb->jmp_addr => to->bb->addr) 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Each BB has at most one CALL instruction. The list of JCC from 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * this call is a pointer to the list head (stored in BBCC), and 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * <next_from> in the JCC struct. 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * For fast lookup, JCCs are reachable with a hash table, keyed by 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the (from_bbcc,to) pair. <next_hash> is used for the JCC chain 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * of one hash table entry. 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Cost <sum> holds event counts for already returned executions. 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * <last> are the event counters at last enter of the subroutine. 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * <sum> is updated on returning from the subroutine by 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * adding the diff of <last> and current event counters to <sum>. 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * After updating, <last> is set to current event counters. Thus, 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * events are not counted twice for recursive calls (TODO: True?) 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define JmpNone (Ijk_Boring+30) 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define JmpCond (Ijk_Boring+31) 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _jCC { 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int jmpkind; /* JmpCall, JmpBoring, JmpCond */ 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jCC* next_hash; /* for hash entry chain */ 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jCC* next_from; /* next JCC from a BBCC */ 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC *from, *to; /* call arc from/to this BBCC */ 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt jmp; /* jump no. in source */ 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong call_counter; /* no wraparound with 64 bit */ 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FullCost cost; /* simulator + user counters */ 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Info for one instruction of a basic block. 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _InstrInfo InstrInfo; 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _InstrInfo { 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt instr_offset; 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt instr_size; 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt cost_offset; 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown EventSet* eventset; 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Info for a conditional jump in a basic block 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _CJmpInfo CJmpInfo; 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _CJmpInfo { 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt instr; /* instruction index in this basic block */ 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool skip; /* Cond.Jumps to next instruction should be ignored */ 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * An instrumented basic block (BB). 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * BBs are put into a resizable hash to allow for fast detection if a 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * BB is to be retranslated but cost info is already available. 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * The key for a BB is a (object, offset) tupel making it independent 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * from possibly multiple mappings of the same ELF object. 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * At the beginning of each instrumented BB, 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a call to setup_bbcc(), specifying a pointer to the 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * according BB structure, is added. 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * As cost of a BB has to be distinguished depending on the context, 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * multiple cost centers for one BB (struct BBCC) exist and the according 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * BBCC is set by setup_bbcc. 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _BB { 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown obj_node* obj; /* ELF object of BB */ 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PtrdiffT offset; /* offset of BB in ELF object file */ 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BB* next; /* chaining for a hash entry */ 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VgSectKind sect_kind; /* section of this BB, e.g. PLT */ 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt instr_count; 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* filled by CLG_(get_fn_node) if debug info is available */ 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fn_node* fn; /* debug info for this BB */ 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt line; 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool is_entry; /* True if this BB is a function entry */ 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC* bbcc_list; /* BBCCs for same BB (see next_bbcc in BBCC) */ 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC* last_bbcc; /* Temporary: Cached for faster access (LRU) */ 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* filled by CLG_(instrument) if not seen before */ 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt cjmp_count; /* number of conditional exits */ 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CJmpInfo* jmp; /* array of info for condition jumps, 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * allocated directly after this struct */ 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int jmpkind; /* remember jump kind of final exit */ 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool cjmp_inverted; /* condition of last cond.jump can be inverted by VEX */ 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt instr_len; 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt cost_count; 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown InstrInfo instr[0]; /* info on instruction sizes and costs */ 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Function context 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Basic blocks are always executed in the scope of a context. 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * A function context is a list of function nodes representing 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the call chain to the current context: I.e. fn[0] is the 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * function we are currently in, fn[1] has called fn[0], and so on. 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Recursion levels are used for fn[0]. 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * To get a unique number for a full execution context, use 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * rec_index = min(<fn->rec_separation>,<active>) - 1; 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * unique_no = <number> + rec_index 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * For each Context, recursion index and BB, there can be a BBCC. 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _Context { 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt size; // number of function dependencies 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt base_number; // for context compression & dump array 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Context* next; // entry chaining for hash 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UWord hash; // for faster lookup... 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fn_node* fn[0]; 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Info for a conditional jump in a basic block 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _JmpData JmpData; 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _JmpData { 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong ecounter; /* number of times the BB was left at this exit */ 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jCC* jcc_list; /* JCCs for Cond.Jumps from this exit */ 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Basic Block Cost Center 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * On demand, multiple BBCCs will be created for the same BB 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * dependend on command line options and: 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - current function (it's possible that a BB is executed in the 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * context of different functions, e.g. in manual assembler/PLT) 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - current thread ID 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - position where current function is called from 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - recursion level of current function 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * The cost centres for the instructions of a basic block are 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * stored in a contiguous array. 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * They are distinguishable by their tag field. 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _BBCC { 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BB* bb; /* BB for this cost center */ 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Context* cxt; /* execution context of this BBCC */ 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ThreadId tid; /* only for assertion check purpose */ 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt rec_index; /* Recursion index in rec->bbcc for this bbcc */ 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC** rec_array; /* Variable sized array of pointers to 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * recursion BBCCs. Shared. */ 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong ret_counter; /* how often returned from jccs of this bbcc; 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * used to check if a dump for this BBCC is needed */ 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC* next_bbcc; /* Chain of BBCCs for same BB */ 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC* lru_next_bbcc; /* BBCC executed next the last time */ 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jCC* lru_from_jcc; /* Temporary: Cached for faster access (LRU) */ 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jCC* lru_to_jcc; /* Temporary: Cached for faster access (LRU) */ 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FullCost skipped; /* cost for skipped functions called from 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * jmp_addr. Allocated lazy */ 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC* next; /* entry chain in hash */ 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong* cost; /* start of 64bit costs for this BBCC */ 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong ecounter_sum; /* execution counter for first instruction of BB */ 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown JmpData jmp[0]; 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* the <number> of fn_node, file_node and obj_node are for compressed dumping 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * and a index into the dump boolean table and fn_info_table 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _fn_node { 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char* name; 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt number; 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Context* last_cxt; /* LRU info */ 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Context* pure_cxt; /* the context with only the function itself */ 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown file_node* file; /* reverse mapping for 2nd hash */ 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fn_node* next; 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool dump_before :1; 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool dump_after :1; 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool zero_before :1; 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool toggle_collect :1; 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool skip :1; 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool pop_on_jump : 1; 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool is_malloc :1; 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool is_realloc :1; 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool is_free :1; 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int group; 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int separate_callers; 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int separate_recursions; 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if CLG_ENABLE_DEBUG 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int verbosity; /* Stores old verbosity level while in function */ 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Quite arbitrary fixed hash sizes */ 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define N_OBJ_ENTRIES 47 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define N_FILE_ENTRIES 53 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define N_FN_ENTRIES 87 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define N_BBCC2_ENTRIES 37 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _file_node { 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char* name; 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fn_node* fns[N_FN_ENTRIES]; 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt number; 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown obj_node* obj; 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown file_node* next; 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* If an object is dlopened multiple times, we hope that <name> is unique; 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * <start> and <offset> can change with each dlopen, and <start> is 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * zero when object is unmapped (possible at dump time). 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _obj_node { 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char* name; 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt last_slash_pos; 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr start; /* Start address of text segment mapping */ 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SizeT size; /* Length of mapping */ 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown PtrdiffT offset; /* Offset between symbol address and file offset */ 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown file_node* files[N_FILE_ENTRIES]; 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt number; 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown obj_node* next; 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* an entry in the callstack 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * <nonskipped> is 0 if the function called is not skipped (usual case). 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Otherwise, it is the last non-skipped BBCC. This one gets all 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the calls to non-skipped functions and all costs in skipped 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * instructions. 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _call_entry { 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jCC* jcc; /* jCC for this call */ 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FullCost enter_cost; /* cost event counters at entering frame */ 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr sp; /* stack pointer directly after call */ 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr ret_addr; /* address to which to return to 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * is 0 on a simulated call */ 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC* nonskipped; /* see above */ 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Context* cxt; /* context before call */ 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int fn_sp; /* function stack index before call */ 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Execution state of main thread or a running signal handler in 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a thread while interrupted by another signal handler. 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * As there's no scheduling among running signal handlers of one thread, 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * we only need a subset of a full thread state: 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - event counter 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - collect state 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - last BB, last jump kind, last nonskipped BB 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - callstack pointer for sanity checking and correct unwinding 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * after exit 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _exec_state exec_state; 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _exec_state { 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* the signum of the handler, 0 for main thread context 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int sig; 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* the old call stack pointer at entering the signal handler */ 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int orig_sp; 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FullCost cost; 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool collect; 518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Context* cxt; 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int jmps_passed; /* number of conditional jumps passed in last BB */ 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC* bbcc; /* last BB executed */ 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC* nonskipped; 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int call_stack_bottom; /* Index into fn_stack */ 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Global state structures */ 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _bb_hash bb_hash; 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _bb_hash { 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt size, entries; 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BB** table; 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _cxt_hash cxt_hash; 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _cxt_hash { 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt size, entries; 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Context** table; 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Thread specific state structures, i.e. parts of a thread state. 541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * There are variables for the current state of each part, 542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * on which a thread state is copied at thread switch. 543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _bbcc_hash bbcc_hash; 545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _bbcc_hash { 546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt size, entries; 547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBCC** table; 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _jcc_hash jcc_hash; 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _jcc_hash { 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt size, entries; 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jCC** table; 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jCC* spontaneous; 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _fn_array fn_array; 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _fn_array { 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt size; 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt* array; 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _call_stack call_stack; 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _call_stack { 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt size; 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int sp; 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown call_entry* entry; 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _fn_stack fn_stack; 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _fn_stack { 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt size; 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fn_node **bottom, **top; 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The maximum number of simultaneous running signal handlers per thread. 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * This is the number of execution states storable in a thread. 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MAX_SIGHANDLERS 10 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _exec_stack exec_stack; 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _exec_stack { 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int sp; /* > 0 if a handler is running */ 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exec_state* entry[MAX_SIGHANDLERS]; 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Thread State 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * This structure stores thread specific info while a thread is *not* 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * running. See function switch_thread() for save/restore on thread switch. 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * If --separate-threads=no, BBCCs and JCCs can be shared by all threads, i.e. 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * only structures of thread 1 are used. 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * This involves variables fn_info_table, bbcc_table and jcc_table. 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _thread_info { 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* state */ 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fn_stack fns; /* function stack */ 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown call_stack calls; /* context call arc stack */ 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exec_stack states; /* execution states interrupted by signals */ 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* dump statistics */ 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FullCost lastdump_cost; /* Cost at last dump */ 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown FullCost sighandler_cost; 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* thread specific data structure containers */ 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fn_array fn_active; 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown jcc_hash jccs; 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bbcc_hash bbccs; 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Structs used for dumping */ 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Address position inside of a BBCC: 616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * This includes 617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - the address offset from the BB start address 618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * - file/line from debug info for that address (can change inside a BB) 619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _AddrPos AddrPos; 621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _AddrPos { 622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr addr; 623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr bb_addr; 624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown file_node* file; 625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt line; 626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* a simulator cost entity that can be written out in one line */ 629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _AddrCost AddrCost; 630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _AddrCost { 631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown AddrPos p; 632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown SimCost cost; 633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A function in an execution context */ 636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _FnPos FnPos; 637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _FnPos { 638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown file_node* file; 639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fn_node* fn; 640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown obj_node* obj; 641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Context* cxt; 642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int rec_index; 643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt line; 644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Cache simulator interface ---*/ 648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct cachesim_if 651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*print_opts)(void); 653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool (*parse_opt)(Char* arg); 654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*post_clo_init)(void); 655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*clear)(void); 656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*getdesc)(Char* buf); 657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*printstat)(Int,Int,Int); 658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*add_icost)(SimCost, BBCC*, InstrInfo*, ULong); 659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*finish)(void); 660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*log_1I0D)(InstrInfo*) VG_REGPARM(1); 662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*log_2I0D)(InstrInfo*, InstrInfo*) VG_REGPARM(2); 663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*log_3I0D)(InstrInfo*, InstrInfo*, InstrInfo*) VG_REGPARM(3); 664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*log_1I1Dr)(InstrInfo*, Addr, Word) VG_REGPARM(3); 666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*log_1I1Dw)(InstrInfo*, Addr, Word) VG_REGPARM(3); 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*log_0I1Dr)(InstrInfo*, Addr, Word) VG_REGPARM(3); 669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*log_0I1Dw)(InstrInfo*, Addr, Word) VG_REGPARM(3); 670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown // function names of helpers (for debugging generated code) 672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char *log_1I0D_name, *log_2I0D_name, *log_3I0D_name; 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char *log_1I1Dr_name, *log_1I1Dw_name; 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char *log_0I1Dr_name, *log_0I1Dw_name; 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// set by setup_bbcc at start of every BB, and needed by log_* helpers 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Addr CLG_(bb_base); 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ULong* CLG_(cost_base); 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Event groups 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EG_USE 0 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EG_IR 1 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EG_DR 2 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EG_DW 3 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EG_BC 4 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EG_BI 5 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EG_BUS 6 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EG_ALLOC 7 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EG_SYS 8 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct event_sets { 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown EventSet *base, *full; 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern struct event_sets CLG_(sets); 696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define fullOffset(group) (CLG_(sets).full->offset[group]) 698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Functions ---*/ 702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from clo.c */ 705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(set_clo_defaults)(void); 707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(update_fn_config)(fn_node*); 708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool CLG_(process_cmd_line_option)(Char*); 709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_usage)(void); 710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_debug_usage)(void); 711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from sim.c */ 713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern struct cachesim_if CLG_(cachesim); 714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_eventsets)(void); 715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from main.c */ 717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool CLG_(get_debug_info)(Addr, Char filename[FILENAME_LEN], 718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Char fn_name[FN_NAME_LEN], UInt*, DebugInfo**); 719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(collectBlockInfo)(IRSB* bbIn, UInt*, UInt*, Bool*); 720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(set_instrument_state)(Char*,Bool); 721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(dump_profile)(Char* trigger,Bool only_current_thread); 722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(zero_all_cost)(Bool only_current_thread); 723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownInt CLG_(get_dump_counter)(void); 724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(fini)(Int exitcode); 725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from command.c */ 727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_command)(void); 728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(check_command)(void); 729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(finish_command)(void); 730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from bb.c */ 732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_bb_hash)(void); 733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbb_hash* CLG_(get_bb_hash)(void); 734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBB* CLG_(get_bb)(Addr addr, IRSB* bb_in, Bool *seen_before); 735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(delete_bb)(Addr addr); 736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic __inline__ Addr bb_addr(BB* bb) 738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { return bb->offset + bb->obj->offset; } 739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic __inline__ Addr bb_jmpaddr(BB* bb) 740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { UInt off = (bb->instr_count > 0) ? bb->instr[bb->instr_count-1].instr_offset : 0; 741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return off + bb->offset + bb->obj->offset; } 742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from fn.c */ 744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_fn_array)(fn_array*); 745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(copy_current_fn_array)(fn_array* dst); 746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfn_array* CLG_(get_current_fn_array)(void); 747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(set_current_fn_array)(fn_array*); 748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt* CLG_(get_fn_entry)(Int n); 749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_obj_table)(void); 751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownobj_node* CLG_(get_obj_node)(DebugInfo* si); 752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfile_node* CLG_(get_file_node)(obj_node*, Char* filename); 753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfn_node* CLG_(get_fn_node)(BB* bb); 754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from bbcc.c */ 756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_bbcc_hash)(bbcc_hash* bbccs); 757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(copy_current_bbcc_hash)(bbcc_hash* dst); 758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownbbcc_hash* CLG_(get_current_bbcc_hash)(void); 759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(set_current_bbcc_hash)(bbcc_hash*); 760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(forall_bbccs)(void (*func)(BBCC*)); 761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(zero_bbcc)(BBCC* bbcc); 762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBBCC* CLG_(get_bbcc)(BB* bb); 763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBBCC* CLG_(clone_bbcc)(BBCC* orig, Context* cxt, Int rec_index); 764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(setup_bbcc)(BB* bb) VG_REGPARM(1); 765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from jumps.c */ 768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_jcc_hash)(jcc_hash*); 769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(copy_current_jcc_hash)(jcc_hash* dst); 770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownjcc_hash* CLG_(get_current_jcc_hash)(void); 771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(set_current_jcc_hash)(jcc_hash*); 772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownjCC* CLG_(get_jcc)(BBCC* from, UInt, BBCC* to); 773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from callstack.c */ 775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_call_stack)(call_stack*); 776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(copy_current_call_stack)(call_stack* dst); 777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(set_current_call_stack)(call_stack*); 778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncall_entry* CLG_(get_call_entry)(Int n); 779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(push_call_stack)(BBCC* from, UInt jmp, BBCC* to, Addr sp, Bool skip); 781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(pop_call_stack)(void); 782f673d1bf8bfb172f0eccbe4d3a908b3c65b55b33Kenny RootInt CLG_(unwind_call_stack)(Addr sp, Int); 783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from context.c */ 785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_fn_stack)(fn_stack*); 786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(copy_current_fn_stack)(fn_stack*); 787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownfn_stack* CLG_(get_current_fn_stack)(void); 788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(set_current_fn_stack)(fn_stack*); 789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_cxt_table)(void); 791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncxt_hash* CLG_(get_cxt_hash)(void); 792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownContext* CLG_(get_cxt)(fn_node** fn); 793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(push_cxt)(fn_node* fn); 794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from threads.c */ 796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_threads)(void); 797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownthread_info** CLG_(get_threads)(void); 798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownthread_info* CLG_(get_current_thread)(void); 799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(switch_thread)(ThreadId tid); 800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(forall_threads)(void (*func)(thread_info*)); 801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(run_thread)(ThreadId tid); 802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_exec_state)(exec_state* es); 804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_exec_stack)(exec_stack*); 805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(copy_current_exec_stack)(exec_stack*); 806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(set_current_exec_stack)(exec_stack*); 807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(pre_signal)(ThreadId tid, Int sigNum, Bool alt_stack); 808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(post_signal)(ThreadId tid, Int sigNum); 809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(run_post_signal_on_call_stack_bottom)(void); 810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from dump.c */ 812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern FullCost CLG_(total_cost); 813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_dumps)(void); 814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownChar* CLG_(get_out_file)(void); 815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownChar* CLG_(get_out_directory)(void); 816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Exported global variables ---*/ 819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern CommandLineOptions CLG_(clo); 822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Statistics CLG_(stat); 823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern EventMapping* CLG_(dumpmap); 824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Function active counter array, indexed by function number */ 826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern UInt* CLG_(fn_active_array); 827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern Bool CLG_(instrument_state); 828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern call_stack CLG_(current_call_stack); 830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern fn_stack CLG_(current_fn_stack); 831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern exec_state CLG_(current_state); 832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern ThreadId CLG_(current_tid); 833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Debug output ---*/ 837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/ 838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if CLG_ENABLE_DEBUG 840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_DEBUGIF(x) \ 842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ( (CLG_(clo).verbose >x) && \ 843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (CLG_(stat).bb_executions >= CLG_(clo).verbose_start)) 844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_DEBUG(x,format,args...) \ 846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CLG_DEBUGIF(x) { \ 847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CLG_(print_bbno)(); \ 848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(printf)(format,##args); \ 849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_ASSERT(cond) \ 852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!(cond)) { \ 853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CLG_(print_context)(); \ 854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CLG_(print_bbno)(); \ 855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tl_assert(cond); \ 856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else 859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_DEBUGIF(x) if (0) 860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_DEBUG(x...) {} 861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_ASSERT(cond) tl_assert(cond); 862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* from debug.c */ 865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_bbno)(void); 866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_context)(void); 867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_jcc)(int s, jCC* jcc); 868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_bbcc)(int s, BBCC* bbcc); 869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_bbcc_fn)(BBCC* bbcc); 870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_execstate)(int s, exec_state* es); 871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_eventset)(int s, EventSet* es); 872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_cost)(int s, EventSet*, ULong* cost); 873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_bb)(int s, BB* bb); 874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_bbcc_cost)(int s, BBCC*); 875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_cxt)(int s, Context* cxt, int rec_index); 876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_short_jcc)(jCC* jcc); 877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_stackentry)(int s, int sp); 878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_addr)(Addr addr); 879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(print_addr_ln)(Addr addr); 880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid* CLG_(malloc)(HChar* cc, UWord s, char* f); 882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid* CLG_(free)(void* p, char* f); 883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0 884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_MALLOC(_cc,x) CLG_(malloc)((_cc),x,__FUNCTION__) 885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_FREE(p) CLG_(free)(p,__FUNCTION__) 886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else 887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_MALLOC(_cc,x) VG_(malloc)((_cc),x) 888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_FREE(p) VG_(free)(p) 889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* CLG_GLOBAL */ 892