global.h revision f247f49736f40794490ecfb9294ad2e5354b814c
1a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--------------------------------------------------------------------*/ 2f247f49736f40794490ecfb9294ad2e5354b814cweidendo/*--- Callgrind data structures, functions. global.h ---*/ 3a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--------------------------------------------------------------------*/ 4a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 5f247f49736f40794490ecfb9294ad2e5354b814cweidendo/* 6f247f49736f40794490ecfb9294ad2e5354b814cweidendo This file is part of Valgrind, a dynamic binary instrumentation 7f247f49736f40794490ecfb9294ad2e5354b814cweidendo framework. 8f247f49736f40794490ecfb9294ad2e5354b814cweidendo 9f247f49736f40794490ecfb9294ad2e5354b814cweidendo Copyright (C) 2004-2014 Josef Weidendorfer 10f247f49736f40794490ecfb9294ad2e5354b814cweidendo josef.weidendorfer@gmx.de 11f247f49736f40794490ecfb9294ad2e5354b814cweidendo 12f247f49736f40794490ecfb9294ad2e5354b814cweidendo This program is free software; you can redistribute it and/or 13f247f49736f40794490ecfb9294ad2e5354b814cweidendo modify it under the terms of the GNU General Public License as 14f247f49736f40794490ecfb9294ad2e5354b814cweidendo published by the Free Software Foundation; either version 2 of the 15f247f49736f40794490ecfb9294ad2e5354b814cweidendo License, or (at your option) any later version. 16f247f49736f40794490ecfb9294ad2e5354b814cweidendo 17f247f49736f40794490ecfb9294ad2e5354b814cweidendo This program is distributed in the hope that it will be useful, but 18f247f49736f40794490ecfb9294ad2e5354b814cweidendo WITHOUT ANY WARRANTY; without even the implied warranty of 19f247f49736f40794490ecfb9294ad2e5354b814cweidendo MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20f247f49736f40794490ecfb9294ad2e5354b814cweidendo General Public License for more details. 21f247f49736f40794490ecfb9294ad2e5354b814cweidendo 22f247f49736f40794490ecfb9294ad2e5354b814cweidendo You should have received a copy of the GNU General Public License 23f247f49736f40794490ecfb9294ad2e5354b814cweidendo along with this program; if not, write to the Free Software 24f247f49736f40794490ecfb9294ad2e5354b814cweidendo Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 25f247f49736f40794490ecfb9294ad2e5354b814cweidendo 02111-1307, USA. 26f247f49736f40794490ecfb9294ad2e5354b814cweidendo 27f247f49736f40794490ecfb9294ad2e5354b814cweidendo The GNU General Public License is contained in the file COPYING. 28f247f49736f40794490ecfb9294ad2e5354b814cweidendo*/ 29f247f49736f40794490ecfb9294ad2e5354b814cweidendo 30a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#ifndef CLG_GLOBAL 31a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_GLOBAL 32a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 33a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_basics.h" 344cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj#include "pub_tool_vki.h" 35a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_debuginfo.h" 36a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_libcbase.h" 37a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_libcassert.h" 38a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_libcfile.h" 39a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_libcprint.h" 40a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_libcproc.h" 41a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_machine.h" 42a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_mallocfree.h" 43a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_options.h" 44a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_tooliface.h" 4514c7cc5a5fbe9526329f058116f921988efe679esewardj#include "pub_tool_xarray.h" 46a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_clientstate.h" 47a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "pub_tool_machine.h" // VG_(fnptr_to_fnentry) 48a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 49a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "events.h" // defines CLG_ macro 50a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "costs.h" 51a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 52a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 53a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 54f247f49736f40794490ecfb9294ad2e5354b814cweidendo/*--- Callgrind compile options --- */ 55a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 56a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 57a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Enable debug output */ 58a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_ENABLE_DEBUG 1 59a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 60a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Enable experimental features? */ 61a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_EXPERIMENTAL 0 62a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 63a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Syscall Timing in microseconds? 64a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * (define to 0 if you get compile errors) */ 65a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_MICROSYSTIME 0 66a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 67a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 68a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 69a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 70a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Command line options ---*/ 71a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 72a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 73cbf4e19974ee274e908e1d1f907d2bd3649a27d5weidendo#define DEFAULT_OUTFORMAT "callgrind.out.%p" 74a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 75a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _CommandLineOptions CommandLineOptions; 76a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _CommandLineOptions { 77a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 78a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* Dump format options */ 7925f6c57962b259a52e3e617eb96fa14d6fdbe364florian const HChar* out_format; /* Format string for callgrind output file name */ 8025f6c57962b259a52e3e617eb96fa14d6fdbe364florian Bool combine_dumps; /* Dump trace parts into same file? */ 81a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool compress_strings; 82a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool compress_events; 83a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool compress_pos; 84a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool mangle_names; 85a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool compress_mangled; 86a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool dump_line; 87a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool dump_instr; 88a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool dump_bb; 89a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool dump_bbs; /* Dump basic block information? */ 90a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 91a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* Dump generation options */ 929e326b7c9e06d22a868557b8606fc765a2cd6277weidendo ULong dump_every_bb; /* Dump every xxx BBs. */ 93a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 94a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* Collection options */ 95a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool separate_threads; /* Separate threads in dump? */ 96a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int separate_callers; /* Separate dependent on how many callers? */ 97a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int separate_recursions; /* Max level of recursions to separate */ 98a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool skip_plt; /* Skip functions in PLT section? */ 99a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool skip_direct_recursion; /* Increment direct recursions the level? */ 100a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 101a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool collect_atstart; /* Start in collecting state ? */ 102a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool collect_jumps; /* Collect (cond.) jumps in functions ? */ 103a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 104a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool collect_alloc; /* Collect size of allocated memory */ 105a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool collect_systime; /* Collect time for system calls */ 106a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 107aeb8622e80e51a04e769b00d07b5eef74baca2c3weidendo Bool collect_bus; /* Collect global bus events */ 108aeb8622e80e51a04e769b00d07b5eef74baca2c3weidendo 109a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* Instrument options */ 110a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool instrument_atstart; /* Instrument at start? */ 111a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool simulate_cache; /* Call into cache simulator ? */ 112320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo Bool simulate_branch; /* Call into branch prediction simulator ? */ 113a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 114a762b0f082d37b630c72d1d6388b34f76c851c76weidendo /* Call graph generation */ 115a762b0f082d37b630c72d1d6388b34f76c851c76weidendo Bool pop_on_jump; /* Handle a jump between functions as ret+call */ 116a762b0f082d37b630c72d1d6388b34f76c851c76weidendo 117a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 118a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int verbose; 119a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong verbose_start; 120a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 121a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 122a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 123a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 124a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Constants ---*/ 125a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 126a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 127a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Minimum cache line size allowed */ 128a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define MIN_LINE_SIZE 16 129a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 130a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Size of various buffers used for storing strings */ 131bb515c379fb2a1659f748dc6f0ff64cb5f4af7c8weidendo#define FILENAME_LEN VKI_PATH_MAX 132a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define FN_NAME_LEN 4096 /* for C++ code :-) */ 133a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define OBJ_NAME_LEN 256 1340ecd49e1da934c40c18eb7d4fa044682e4b01084weidendo#define COSTS_LEN 512 /* at least 17x 64bit values */ 135a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define BUF_LEN 512 136f3bea49ed9c422cadc086472dc339d65255eabc0sewardj#define RESULTS_BUF_LEN 256 137a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 138a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 1395bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo/* Convenience macros */ 1405bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo 1415bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo/* Use this only when size of sprintf args are known to fit into 1425bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo * given buffer; for strings of unknown length, use WRITE_STR below 1435bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo */ 1445bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo#define WRITE_SPRINTF(fd, zz_buf, fmt, args...) \ 1455bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo do { Int len = VG_(sprintf)(zz_buf, fmt, ## args); \ 1465bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo VG_(write)(fd, (void*)zz_buf, len); \ 1475bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo } while (0) 1485bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo 1495bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo#define WRITE_STR(fd, str) \ 1505bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo do { if (str) { Int len = VG_(strlen)(str); \ 1515bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo VG_(write)(fd, (void*)str, len); } \ 1525bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo else VG_(write)(fd, "(null)", 6); \ 1535bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo } while (0) 1545bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo 1555bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo#define WRITE_STR2(fd, str1, str2) \ 1565bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo do { if (str1) { Int len = VG_(strlen)(str1); \ 1575bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo VG_(write)(fd, (void*)str1, len); } \ 1585bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo else VG_(write)(fd, "(null)", 6); \ 1595bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo if (str2) { Int len = VG_(strlen)(str2); \ 1605bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo VG_(write)(fd, (void*)str2, len); } \ 1615bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo else VG_(write)(fd, "(null)", 6); \ 1625bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo } while (0) 1635bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo 1645bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo#define WRITE_STR3(fd, str1, str2, str3) \ 1655bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo do { if (str1) { Int len = VG_(strlen)(str1); \ 1665bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo VG_(write)(fd, (void*)str1, len); } \ 1675bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo else VG_(write)(fd, "(null)", 6); \ 1685bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo if (str2) { Int len = VG_(strlen)(str2); \ 1695bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo VG_(write)(fd, (void*)str2, len); } \ 1705bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo else VG_(write)(fd, "(null)", 6); \ 1715bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo if (str3) { Int len = VG_(strlen)(str3); \ 1725bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo VG_(write)(fd, (void*)str3, len); } \ 1735bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo else VG_(write)(fd, "(null)", 6); \ 1745bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo } while (0) 1755bd7eca3f79dafd6560cdcdf804bcebdf5aaeff5weidendo 176a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 177a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 178a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Statistics ---*/ 179a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 180a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 181a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _Statistics Statistics; 182a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _Statistics { 183a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong call_counter; 184a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong jcnd_counter; 185a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong jump_counter; 186a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong rec_call_counter; 187a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong ret_counter; 188a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong bb_executions; 189a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 190a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int context_counter; 191a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bb_retranslations; 192a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 193a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_objs; 194a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_files; 195a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_fns; 196a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_contexts; 197a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_bbs; 198a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_jccs; 199a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_bbccs; 200a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_instrs; 201a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_skips; 202a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 203a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bb_hash_resizes; 204a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bbcc_hash_resizes; 205a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int jcc_hash_resizes; 206a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int cxt_hash_resizes; 207a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int fn_array_resizes; 208a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int call_stack_resizes; 209a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int fn_stack_resizes; 210a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 211a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int full_debug_BBs; 212a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int file_line_debug_BBs; 213a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int fn_name_debug_BBs; 214a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int no_debug_BBs; 215a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bbcc_lru_misses; 216a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int jcc_lru_misses; 217a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int cxt_lru_misses; 218a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bbcc_clones; 219a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 220a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 221a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 222a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 223a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Structure declarations ---*/ 224a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 225a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 226a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _Context Context; 227a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _CC CC; 228a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _BB BB; 229a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _BBCC BBCC; 230a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _jCC jCC; 231a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fCC fCC; 232a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fn_node fn_node; 233a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _file_node file_node; 234a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _obj_node obj_node; 235a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fn_config fn_config; 236a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _call_entry call_entry; 237a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _thread_info thread_info; 238a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 239a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Costs of event sets. Aliases to arrays of 64-bit values */ 240a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef ULong* SimCost; /* All events the simulator can produce */ 241a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef ULong* UserCost; 242a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef ULong* FullCost; /* Simulator + User */ 243a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 244a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 24528a23c05ce81a384283eb6d92d39ace2ff7283caweidendo/* The types of control flow changes that can happen between 24628a23c05ce81a384283eb6d92d39ace2ff7283caweidendo * execution of two BBs in a thread. 24728a23c05ce81a384283eb6d92d39ace2ff7283caweidendo */ 24828a23c05ce81a384283eb6d92d39ace2ff7283caweidendotypedef enum { 24928a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_None = 0, /* no explicit change by a guest instruction */ 25028a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_Jump, /* regular jump */ 25128a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_Call, 25228a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_Return, 25328a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_CondJump /* conditional jump taken (only used as jCC type) */ 25428a23c05ce81a384283eb6d92d39ace2ff7283caweidendo} ClgJumpKind; 25528a23c05ce81a384283eb6d92d39ace2ff7283caweidendo 25628a23c05ce81a384283eb6d92d39ace2ff7283caweidendo 257a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* JmpCall cost center 258a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * for subroutine call (from->bb->jmp_addr => to->bb->addr) 259a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 260a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Each BB has at most one CALL instruction. The list of JCC from 261a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * this call is a pointer to the list head (stored in BBCC), and 262a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <next_from> in the JCC struct. 263a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 264a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * For fast lookup, JCCs are reachable with a hash table, keyed by 265a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * the (from_bbcc,to) pair. <next_hash> is used for the JCC chain 266a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * of one hash table entry. 267a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 268a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Cost <sum> holds event counts for already returned executions. 269a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <last> are the event counters at last enter of the subroutine. 270a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <sum> is updated on returning from the subroutine by 271a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * adding the diff of <last> and current event counters to <sum>. 272a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 273a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * After updating, <last> is set to current event counters. Thus, 274a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * events are not counted twice for recursive calls (TODO: True?) 275a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 276a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 277a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _jCC { 27828a23c05ce81a384283eb6d92d39ace2ff7283caweidendo ClgJumpKind jmpkind; /* jk_Call, jk_Jump, jk_CondJump */ 279a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* next_hash; /* for hash entry chain */ 280a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* next_from; /* next JCC from a BBCC */ 281a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC *from, *to; /* call arc from/to this BBCC */ 282a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt jmp; /* jump no. in source */ 283a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 284a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong call_counter; /* no wraparound with 64 bit */ 285a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 286a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost cost; /* simulator + user counters */ 287a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 288a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 289a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 290a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 291a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Info for one instruction of a basic block. 292a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 293a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _InstrInfo InstrInfo; 294a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _InstrInfo { 295a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt instr_offset; 296a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt instr_size; 297a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt cost_offset; 298a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo EventSet* eventset; 299a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 300a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 301a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 30228a23c05ce81a384283eb6d92d39ace2ff7283caweidendo 303a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 30428a23c05ce81a384283eb6d92d39ace2ff7283caweidendo * Info for a side exit in a BB 305a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 306a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _CJmpInfo CJmpInfo; 307a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _CJmpInfo { 30828a23c05ce81a384283eb6d92d39ace2ff7283caweidendo UInt instr; /* instruction index for BB.instr array */ 30928a23c05ce81a384283eb6d92d39ace2ff7283caweidendo ClgJumpKind jmpkind; /* jump kind when leaving BB at this side exit */ 310a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 311a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 312a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 313a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/** 314a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * An instrumented basic block (BB). 315a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 316a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * BBs are put into a resizable hash to allow for fast detection if a 317a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * BB is to be retranslated but cost info is already available. 318a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * The key for a BB is a (object, offset) tupel making it independent 319a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * from possibly multiple mappings of the same ELF object. 320a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 321a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * At the beginning of each instrumented BB, 322a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * a call to setup_bbcc(), specifying a pointer to the 323a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * according BB structure, is added. 324a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 325a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * As cost of a BB has to be distinguished depending on the context, 326a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * multiple cost centers for one BB (struct BBCC) exist and the according 327a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * BBCC is set by setup_bbcc. 328a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 329a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _BB { 330a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo obj_node* obj; /* ELF object of BB */ 331c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT offset; /* offset of BB in ELF object file */ 332a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BB* next; /* chaining for a hash entry */ 333a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 334a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo VgSectKind sect_kind; /* section of this BB, e.g. PLT */ 335a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt instr_count; 336a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 337a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* filled by CLG_(get_fn_node) if debug info is available */ 338a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* fn; /* debug info for this BB */ 339a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt line; 340a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool is_entry; /* True if this BB is a function entry */ 341a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 342a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* bbcc_list; /* BBCCs for same BB (see next_bbcc in BBCC) */ 343a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* last_bbcc; /* Temporary: Cached for faster access (LRU) */ 344a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 345a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* filled by CLG_(instrument) if not seen before */ 34628a23c05ce81a384283eb6d92d39ace2ff7283caweidendo UInt cjmp_count; /* number of side exits */ 347a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CJmpInfo* jmp; /* array of info for condition jumps, 348a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * allocated directly after this struct */ 34928a23c05ce81a384283eb6d92d39ace2ff7283caweidendo Bool cjmp_inverted; /* is last side exit actually fall through? */ 350a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 351a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt instr_len; 352a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt cost_count; 353a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo InstrInfo instr[0]; /* info on instruction sizes and costs */ 354a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 355a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 356a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 357a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 358a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/** 359a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Function context 360a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 361a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Basic blocks are always executed in the scope of a context. 362a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * A function context is a list of function nodes representing 363a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * the call chain to the current context: I.e. fn[0] is the 364a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * function we are currently in, fn[1] has called fn[0], and so on. 365a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Recursion levels are used for fn[0]. 366a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 367a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * To get a unique number for a full execution context, use 368a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * rec_index = min(<fn->rec_separation>,<active>) - 1; 369a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * unique_no = <number> + rec_index 370a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 371a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * For each Context, recursion index and BB, there can be a BBCC. 372a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 373a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _Context { 374a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size; // number of function dependencies 375a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt base_number; // for context compression & dump array 376a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* next; // entry chaining for hash 377a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UWord hash; // for faster lookup... 378a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* fn[0]; 379a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 380a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 381a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 382a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 38328a23c05ce81a384283eb6d92d39ace2ff7283caweidendo * Cost info for a side exits from a BB 384a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 385a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _JmpData JmpData; 386a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _JmpData { 387a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong ecounter; /* number of times the BB was left at this exit */ 38828a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jCC* jcc_list; /* JCCs used for this exit */ 389a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 390a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 391a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 392a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 393a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Basic Block Cost Center 394a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 395a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * On demand, multiple BBCCs will be created for the same BB 396a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * dependend on command line options and: 397a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - current function (it's possible that a BB is executed in the 398a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * context of different functions, e.g. in manual assembler/PLT) 399a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - current thread ID 400a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - position where current function is called from 401a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - recursion level of current function 402a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 403a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * The cost centres for the instructions of a basic block are 404a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * stored in a contiguous array. 405a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * They are distinguishable by their tag field. 406a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 407a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _BBCC { 408a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BB* bb; /* BB for this cost center */ 409a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 410a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* cxt; /* execution context of this BBCC */ 411a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ThreadId tid; /* only for assertion check purpose */ 412a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt rec_index; /* Recursion index in rec->bbcc for this bbcc */ 413a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC** rec_array; /* Variable sized array of pointers to 414a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * recursion BBCCs. Shared. */ 415a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong ret_counter; /* how often returned from jccs of this bbcc; 416a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * used to check if a dump for this BBCC is needed */ 417a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 418a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* next_bbcc; /* Chain of BBCCs for same BB */ 419a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* lru_next_bbcc; /* BBCC executed next the last time */ 420a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 421a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* lru_from_jcc; /* Temporary: Cached for faster access (LRU) */ 422a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* lru_to_jcc; /* Temporary: Cached for faster access (LRU) */ 423a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost skipped; /* cost for skipped functions called from 424a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * jmp_addr. Allocated lazy */ 425a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 426a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* next; /* entry chain in hash */ 427a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong* cost; /* start of 64bit costs for this BBCC */ 428a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong ecounter_sum; /* execution counter for first instruction of BB */ 429a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo JmpData jmp[0]; 430a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 431a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 432a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 433a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* the <number> of fn_node, file_node and obj_node are for compressed dumping 434a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * and a index into the dump boolean table and fn_info_table 435a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 436a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 437a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _fn_node { 43819f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* name; 439a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt number; 440a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* last_cxt; /* LRU info */ 441a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* pure_cxt; /* the context with only the function itself */ 442a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* file; /* reverse mapping for 2nd hash */ 443a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* next; 444a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 445a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool dump_before :1; 446a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool dump_after :1; 447a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool zero_before :1; 448a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool toggle_collect :1; 449a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool skip :1; 450a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool pop_on_jump : 1; 451a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 452a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool is_malloc :1; 453a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool is_realloc :1; 454a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool is_free :1; 455a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 456a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int group; 457a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int separate_callers; 458a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int separate_recursions; 459a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 460a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int verbosity; /* Stores old verbosity level while in function */ 461a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 462a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 463a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 464a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Quite arbitrary fixed hash sizes */ 465a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 466a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define N_OBJ_ENTRIES 47 467a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define N_FILE_ENTRIES 53 468a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define N_FN_ENTRIES 87 469a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 470a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _file_node { 47119f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* name; 472a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* fns[N_FN_ENTRIES]; 473a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt number; 474a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo obj_node* obj; 475a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* next; 476a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 477a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 478a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* If an object is dlopened multiple times, we hope that <name> is unique; 479a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <start> and <offset> can change with each dlopen, and <start> is 480a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * zero when object is unmapped (possible at dump time). 481a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 482a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _obj_node { 48325f6c57962b259a52e3e617eb96fa14d6fdbe364florian const HChar* name; 484a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt last_slash_pos; 485a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 486a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr start; /* Start address of text segment mapping */ 487a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo SizeT size; /* Length of mapping */ 488c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT offset; /* Offset between symbol address and file offset */ 489a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 490a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* files[N_FILE_ENTRIES]; 491a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt number; 492a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo obj_node* next; 493a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 494a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 495a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* an entry in the callstack 496a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 497a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <nonskipped> is 0 if the function called is not skipped (usual case). 498a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Otherwise, it is the last non-skipped BBCC. This one gets all 499a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * the calls to non-skipped functions and all costs in skipped 500a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * instructions. 501a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 502a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _call_entry { 503a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* jcc; /* jCC for this call */ 504a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost enter_cost; /* cost event counters at entering frame */ 505a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr sp; /* stack pointer directly after call */ 506a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr ret_addr; /* address to which to return to 507a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * is 0 on a simulated call */ 508a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* nonskipped; /* see above */ 509a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* cxt; /* context before call */ 510a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int fn_sp; /* function stack index before call */ 511a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 512a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 513a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 514a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 515a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Execution state of main thread or a running signal handler in 516a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * a thread while interrupted by another signal handler. 517a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * As there's no scheduling among running signal handlers of one thread, 518a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * we only need a subset of a full thread state: 519a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - event counter 520a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - collect state 521a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - last BB, last jump kind, last nonskipped BB 522a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - callstack pointer for sanity checking and correct unwinding 523a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * after exit 524a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 525a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _exec_state exec_state; 526a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _exec_state { 527a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 528a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* the signum of the handler, 0 for main thread context 529a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 530a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int sig; 531a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 532a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* the old call stack pointer at entering the signal handler */ 533a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int orig_sp; 534a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 535a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost cost; 536a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool collect; 537a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* cxt; 538a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 539d7341d8948ba0082488ea478ec7a6ba15949895bweidendo /* number of conditional jumps passed in last BB */ 540d7341d8948ba0082488ea478ec7a6ba15949895bweidendo Int jmps_passed; 541a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* bbcc; /* last BB executed */ 542a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* nonskipped; 543a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 544a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int call_stack_bottom; /* Index into fn_stack */ 545a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 546a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 547a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Global state structures */ 548a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _bb_hash bb_hash; 549a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _bb_hash { 550a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size, entries; 551a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BB** table; 552a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 553a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 554a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _cxt_hash cxt_hash; 555a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _cxt_hash { 556a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size, entries; 557a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context** table; 558a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 559a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 560a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Thread specific state structures, i.e. parts of a thread state. 561a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * There are variables for the current state of each part, 562a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * on which a thread state is copied at thread switch. 563a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 564a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _bbcc_hash bbcc_hash; 565a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _bbcc_hash { 566a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size, entries; 567a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC** table; 568a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 569a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 570a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _jcc_hash jcc_hash; 571a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _jcc_hash { 572a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size, entries; 573a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC** table; 574a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* spontaneous; 575a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 576a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 577a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fn_array fn_array; 578a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _fn_array { 579a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size; 580a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt* array; 581a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 582a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 583a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _call_stack call_stack; 584a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _call_stack { 585a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size; 586a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int sp; 587a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo call_entry* entry; 588a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 589a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 590a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fn_stack fn_stack; 591a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _fn_stack { 592a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size; 593a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node **bottom, **top; 594a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 595a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 596a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* The maximum number of simultaneous running signal handlers per thread. 597a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * This is the number of execution states storable in a thread. 598a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 599a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define MAX_SIGHANDLERS 10 600a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 601a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _exec_stack exec_stack; 602a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _exec_stack { 603a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int sp; /* > 0 if a handler is running */ 604a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo exec_state* entry[MAX_SIGHANDLERS]; 605a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 606a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 607a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Thread State 608a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 609a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * This structure stores thread specific info while a thread is *not* 610a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * running. See function switch_thread() for save/restore on thread switch. 611a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 612a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * If --separate-threads=no, BBCCs and JCCs can be shared by all threads, i.e. 613a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * only structures of thread 1 are used. 614a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * This involves variables fn_info_table, bbcc_table and jcc_table. 615a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 616a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _thread_info { 617a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 618a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* state */ 619a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_stack fns; /* function stack */ 620a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo call_stack calls; /* context call arc stack */ 621a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo exec_stack states; /* execution states interrupted by signals */ 622a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 623a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* dump statistics */ 624a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost lastdump_cost; /* Cost at last dump */ 625a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost sighandler_cost; 626a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 627a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* thread specific data structure containers */ 628a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_array fn_active; 629a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jcc_hash jccs; 630a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo bbcc_hash bbccs; 631a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 632a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 633a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Structs used for dumping */ 634a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 635a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Address position inside of a BBCC: 636a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * This includes 637a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - the address offset from the BB start address 638a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - file/line from debug info for that address (can change inside a BB) 639a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 640a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _AddrPos AddrPos; 641a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _AddrPos { 642a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr addr; 643a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr bb_addr; 644a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* file; 645a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt line; 646a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 647a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 648a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* a simulator cost entity that can be written out in one line */ 649a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _AddrCost AddrCost; 650a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _AddrCost { 651a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo AddrPos p; 652a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo SimCost cost; 653a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 654a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 655a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* A function in an execution context */ 656a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _FnPos FnPos; 657a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _FnPos { 658a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* file; 659a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* fn; 660a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo obj_node* obj; 661a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* cxt; 662a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo int rec_index; 663a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt line; 664a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 665a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 666a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 667a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Cache simulator interface ---*/ 668a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 669a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 670a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct cachesim_if 671a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 672a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*print_opts)(void); 67319f91bbaedb4caef8a60ce94b0f507193cc0bc10florian Bool (*parse_opt)(const HChar* arg); 674a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*post_clo_init)(void); 675a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*clear)(void); 676dbb3584f591710a15a437918c0fc27e300993566florian void (*getdesc)(HChar* buf); 677320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo void (*printstat)(Int,Int,Int); 678a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*add_icost)(SimCost, BBCC*, InstrInfo*, ULong); 679a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*finish)(void); 680a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 681a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*log_1I0D)(InstrInfo*) VG_REGPARM(1); 6820a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_2I0D)(InstrInfo*, InstrInfo*) VG_REGPARM(2); 6830a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_3I0D)(InstrInfo*, InstrInfo*, InstrInfo*) VG_REGPARM(3); 684a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 6850a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_1I1Dr)(InstrInfo*, Addr, Word) VG_REGPARM(3); 6860a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_1I1Dw)(InstrInfo*, Addr, Word) VG_REGPARM(3); 687a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 6880a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_0I1Dr)(InstrInfo*, Addr, Word) VG_REGPARM(3); 6890a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_0I1Dw)(InstrInfo*, Addr, Word) VG_REGPARM(3); 690a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 691a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo // function names of helpers (for debugging generated code) 69225f6c57962b259a52e3e617eb96fa14d6fdbe364florian const HChar *log_1I0D_name, *log_2I0D_name, *log_3I0D_name; 69325f6c57962b259a52e3e617eb96fa14d6fdbe364florian const HChar *log_1I1Dr_name, *log_1I1Dw_name; 69425f6c57962b259a52e3e617eb96fa14d6fdbe364florian const HChar *log_0I1Dr_name, *log_0I1Dw_name; 695a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 696a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 6975bba5258a193d980fb116a8b04f96dc16d96aacfweidendo// Event groups 6985bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define EG_USE 0 6995bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define EG_IR 1 7005bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define EG_DR 2 7015bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define EG_DW 3 702320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_BC 4 703320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_BI 5 704320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_BUS 6 705320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_ALLOC 7 706320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_SYS 8 7075bba5258a193d980fb116a8b04f96dc16d96aacfweidendo 7085bba5258a193d980fb116a8b04f96dc16d96aacfweidendostruct event_sets { 7095bba5258a193d980fb116a8b04f96dc16d96aacfweidendo EventSet *base, *full; 7105bba5258a193d980fb116a8b04f96dc16d96aacfweidendo}; 7115bba5258a193d980fb116a8b04f96dc16d96aacfweidendo 7125bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define fullOffset(group) (CLG_(sets).full->offset[group]) 7135bba5258a193d980fb116a8b04f96dc16d96aacfweidendo 714a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 715a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 716a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Functions ---*/ 717a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 718a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 719a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from clo.c */ 720a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 721a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_clo_defaults)(void); 722a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(update_fn_config)(fn_node*); 72319f91bbaedb4caef8a60ce94b0f507193cc0bc10florianBool CLG_(process_cmd_line_option)(const HChar*); 724a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_usage)(void); 725a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_debug_usage)(void); 726a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 727a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from sim.c */ 7285bba5258a193d980fb116a8b04f96dc16d96aacfweidendovoid CLG_(init_eventsets)(void); 729a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 730a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from main.c */ 73119f91bbaedb4caef8a60ce94b0f507193cc0bc10florianBool CLG_(get_debug_info)(Addr, HChar filename[FILENAME_LEN], 73219f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar fn_name[FN_NAME_LEN], UInt*, DebugInfo**); 7330b9d74abd0a663b530d290b2b788ddeda46e5400sewardjvoid CLG_(collectBlockInfo)(IRSB* bbIn, UInt*, UInt*, Bool*); 73425f6c57962b259a52e3e617eb96fa14d6fdbe364florianvoid CLG_(set_instrument_state)(const HChar*,Bool); 73525f6c57962b259a52e3e617eb96fa14d6fdbe364florianvoid CLG_(dump_profile)(const HChar* trigger,Bool only_current_thread); 736a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(zero_all_cost)(Bool only_current_thread); 737a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoInt CLG_(get_dump_counter)(void); 738a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(fini)(Int exitcode); 739a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 740a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from bb.c */ 741a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_bb_hash)(void); 742a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendobb_hash* CLG_(get_bb_hash)(void); 7430b9d74abd0a663b530d290b2b788ddeda46e5400sewardjBB* CLG_(get_bb)(Addr addr, IRSB* bb_in, Bool *seen_before); 744a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(delete_bb)(Addr addr); 745a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 746a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic __inline__ Addr bb_addr(BB* bb) 747a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo { return bb->offset + bb->obj->offset; } 748a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic __inline__ Addr bb_jmpaddr(BB* bb) 74990741fb06f058a401af52b3d0963f29bd737c154weidendo { UInt off = (bb->instr_count > 0) ? bb->instr[bb->instr_count-1].instr_offset : 0; 75090741fb06f058a401af52b3d0963f29bd737c154weidendo return off + bb->offset + bb->obj->offset; } 751a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 752a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from fn.c */ 753a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_fn_array)(fn_array*); 754a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_fn_array)(fn_array* dst); 755a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendofn_array* CLG_(get_current_fn_array)(void); 756a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_fn_array)(fn_array*); 757a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoUInt* CLG_(get_fn_entry)(Int n); 758a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 759a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_obj_table)(void); 760b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjobj_node* CLG_(get_obj_node)(DebugInfo* si); 76119f91bbaedb4caef8a60ce94b0f507193cc0bc10florianfile_node* CLG_(get_file_node)(obj_node*, HChar* filename); 762a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendofn_node* CLG_(get_fn_node)(BB* bb); 763a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 764a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from bbcc.c */ 765a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_bbcc_hash)(bbcc_hash* bbccs); 766a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_bbcc_hash)(bbcc_hash* dst); 767a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendobbcc_hash* CLG_(get_current_bbcc_hash)(void); 768a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_bbcc_hash)(bbcc_hash*); 769a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(forall_bbccs)(void (*func)(BBCC*)); 770a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(zero_bbcc)(BBCC* bbcc); 771a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoBBCC* CLG_(get_bbcc)(BB* bb); 772a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoBBCC* CLG_(clone_bbcc)(BBCC* orig, Context* cxt, Int rec_index); 773a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(setup_bbcc)(BB* bb) VG_REGPARM(1); 774a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 775a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 776a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from jumps.c */ 777a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_jcc_hash)(jcc_hash*); 778a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_jcc_hash)(jcc_hash* dst); 779a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendojcc_hash* CLG_(get_current_jcc_hash)(void); 780a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_jcc_hash)(jcc_hash*); 781a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendojCC* CLG_(get_jcc)(BBCC* from, UInt, BBCC* to); 782a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 783a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from callstack.c */ 784a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_call_stack)(call_stack*); 785a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_call_stack)(call_stack* dst); 786a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_call_stack)(call_stack*); 787a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendocall_entry* CLG_(get_call_entry)(Int n); 788a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 789a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(push_call_stack)(BBCC* from, UInt jmp, BBCC* to, Addr sp, Bool skip); 790a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(pop_call_stack)(void); 791c63ca370759170ce891430374315990c83852ed0weidendoInt CLG_(unwind_call_stack)(Addr sp, Int); 792a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 793a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from context.c */ 794a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_fn_stack)(fn_stack*); 795a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_fn_stack)(fn_stack*); 796a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendofn_stack* CLG_(get_current_fn_stack)(void); 797a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_fn_stack)(fn_stack*); 798a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 799a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_cxt_table)(void); 800a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendocxt_hash* CLG_(get_cxt_hash)(void); 801a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoContext* CLG_(get_cxt)(fn_node** fn); 802a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(push_cxt)(fn_node* fn); 803a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 804a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from threads.c */ 805a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_threads)(void); 806a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendothread_info** CLG_(get_threads)(void); 807a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendothread_info* CLG_(get_current_thread)(void); 808a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(switch_thread)(ThreadId tid); 809a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(forall_threads)(void (*func)(thread_info*)); 810a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(run_thread)(ThreadId tid); 811a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 812a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_exec_state)(exec_state* es); 813a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_exec_stack)(exec_stack*); 814a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_exec_stack)(exec_stack*); 815a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_exec_stack)(exec_stack*); 816a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(pre_signal)(ThreadId tid, Int sigNum, Bool alt_stack); 817a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(post_signal)(ThreadId tid, Int sigNum); 818a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(run_post_signal_on_call_stack_bottom)(void); 819a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 820a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from dump.c */ 8214ce5e79ff39cbdef678e4bd9d2d16fbaba9f7fdeweidendovoid CLG_(init_dumps)(void); 822a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 823a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 824a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Exported global variables ---*/ 825a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 826a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 827a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern CommandLineOptions CLG_(clo); 828a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern Statistics CLG_(stat); 829a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern EventMapping* CLG_(dumpmap); 830a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 831a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Function active counter array, indexed by function number */ 832a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern UInt* CLG_(fn_active_array); 833a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern Bool CLG_(instrument_state); 834c4ebde3931d3740270b92bea4c85a59443e7c65dsewardj /* min of L1 and LL cache line sizes */ 835c4ebde3931d3740270b92bea4c85a59443e7c65dsewardjextern Int CLG_(min_line_size); 836a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern call_stack CLG_(current_call_stack); 837a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern fn_stack CLG_(current_fn_stack); 838a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern exec_state CLG_(current_state); 839a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern ThreadId CLG_(current_tid); 8402f938d0f2968356d4a2b90136d95625efdc110feflorianextern FullCost CLG_(total_cost); 8412f938d0f2968356d4a2b90136d95625efdc110feflorianextern struct cachesim_if CLG_(cachesim); 8422f938d0f2968356d4a2b90136d95625efdc110feflorianextern struct event_sets CLG_(sets); 8432f938d0f2968356d4a2b90136d95625efdc110feflorian 8442f938d0f2968356d4a2b90136d95625efdc110feflorian// set by setup_bbcc at start of every BB, and needed by log_* helpers 8452f938d0f2968356d4a2b90136d95625efdc110feflorianextern Addr CLG_(bb_base); 8462f938d0f2968356d4a2b90136d95625efdc110feflorianextern ULong* CLG_(cost_base); 847a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 848a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 849a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 850a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Debug output ---*/ 851a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 852a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 853a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 854a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 855a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_DEBUGIF(x) \ 8561fda5fe517a976306f0ffdc53eeec293b8e21b45philippe if (UNLIKELY( (CLG_(clo).verbose >x) && \ 8571fda5fe517a976306f0ffdc53eeec293b8e21b45philippe (CLG_(stat).bb_executions >= CLG_(clo).verbose_start))) 858a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 859a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_DEBUG(x,format,args...) \ 860a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_DEBUGIF(x) { \ 861a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(print_bbno)(); \ 862a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo VG_(printf)(format,##args); \ 863a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 864a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 865a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_ASSERT(cond) \ 8661fda5fe517a976306f0ffdc53eeec293b8e21b45philippe if (UNLIKELY(!(cond))) { \ 867a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(print_context)(); \ 868a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(print_bbno)(); \ 869a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo tl_assert(cond); \ 870a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 871a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 872a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#else 873a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_DEBUGIF(x) if (0) 874a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_DEBUG(x...) {} 875a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_ASSERT(cond) tl_assert(cond); 876a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 877a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 878a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from debug.c */ 879a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_bbno)(void); 880a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_context)(void); 881a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_jcc)(int s, jCC* jcc); 88209ee78ec9675201840d895623d49efba1ffe05d8weidendovoid CLG_(print_bbcc)(int s, BBCC* bbcc); 883a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_bbcc_fn)(BBCC* bbcc); 884a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_execstate)(int s, exec_state* es); 885a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_eventset)(int s, EventSet* es); 886a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_cost)(int s, EventSet*, ULong* cost); 887a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_bb)(int s, BB* bb); 888a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_bbcc_cost)(int s, BBCC*); 889a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_cxt)(int s, Context* cxt, int rec_index); 890a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_short_jcc)(jCC* jcc); 891a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_stackentry)(int s, int sp); 892a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_addr)(Addr addr); 893a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_addr_ln)(Addr addr); 894a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 89519f91bbaedb4caef8a60ce94b0f507193cc0bc10florianvoid* CLG_(malloc)(const HChar* cc, UWord s, const HChar* f); 89619f91bbaedb4caef8a60ce94b0f507193cc0bc10florianvoid* CLG_(free)(void* p, const HChar* f); 897a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if 0 8989c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj#define CLG_MALLOC(_cc,x) CLG_(malloc)((_cc),x,__FUNCTION__) 8999c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj#define CLG_FREE(p) CLG_(free)(p,__FUNCTION__) 900a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#else 9019c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj#define CLG_MALLOC(_cc,x) VG_(malloc)((_cc),x) 9029c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj#define CLG_FREE(p) VG_(free)(p) 903a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 904a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 905a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif /* CLG_GLOBAL */ 906