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