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