global.h revision 10ef725f1e8e9f1615c483555348eb75b69c4713
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 139a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 140a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Statistics ---*/ 141a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 142a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 143a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _Statistics Statistics; 144a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _Statistics { 145a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong call_counter; 146a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong jcnd_counter; 147a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong jump_counter; 148a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong rec_call_counter; 149a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong ret_counter; 150a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong bb_executions; 151a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 152a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int context_counter; 153a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bb_retranslations; 154a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 155a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_objs; 156a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_files; 157a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_fns; 158a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_contexts; 159a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_bbs; 160a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_jccs; 161a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_bbccs; 162a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_instrs; 163a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int distinct_skips; 164a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 165a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bb_hash_resizes; 166a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bbcc_hash_resizes; 167a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int jcc_hash_resizes; 168a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int cxt_hash_resizes; 169a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int fn_array_resizes; 170a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int call_stack_resizes; 171a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int fn_stack_resizes; 172a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 173a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int full_debug_BBs; 174a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int file_line_debug_BBs; 175a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int fn_name_debug_BBs; 176a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int no_debug_BBs; 177a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bbcc_lru_misses; 178a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int jcc_lru_misses; 179a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int cxt_lru_misses; 180a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int bbcc_clones; 181a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 182a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 183a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 184a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 185a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Structure declarations ---*/ 186a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 187a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 188a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _Context Context; 189a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _CC CC; 190a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _BB BB; 191a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _BBCC BBCC; 192a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _jCC jCC; 193a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fCC fCC; 194a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fn_node fn_node; 195a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _file_node file_node; 196a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _obj_node obj_node; 197a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fn_config fn_config; 198a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _call_entry call_entry; 199a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _thread_info thread_info; 200a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 201a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Costs of event sets. Aliases to arrays of 64-bit values */ 202a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef ULong* SimCost; /* All events the simulator can produce */ 203a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef ULong* UserCost; 204a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef ULong* FullCost; /* Simulator + User */ 205a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 206a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 20728a23c05ce81a384283eb6d92d39ace2ff7283caweidendo/* The types of control flow changes that can happen between 20828a23c05ce81a384283eb6d92d39ace2ff7283caweidendo * execution of two BBs in a thread. 20928a23c05ce81a384283eb6d92d39ace2ff7283caweidendo */ 21028a23c05ce81a384283eb6d92d39ace2ff7283caweidendotypedef enum { 21128a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_None = 0, /* no explicit change by a guest instruction */ 21228a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_Jump, /* regular jump */ 21328a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_Call, 21428a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_Return, 21528a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jk_CondJump /* conditional jump taken (only used as jCC type) */ 21628a23c05ce81a384283eb6d92d39ace2ff7283caweidendo} ClgJumpKind; 21728a23c05ce81a384283eb6d92d39ace2ff7283caweidendo 21828a23c05ce81a384283eb6d92d39ace2ff7283caweidendo 219a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* JmpCall cost center 220a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * for subroutine call (from->bb->jmp_addr => to->bb->addr) 221a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 222a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Each BB has at most one CALL instruction. The list of JCC from 223a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * this call is a pointer to the list head (stored in BBCC), and 224a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <next_from> in the JCC struct. 225a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 226a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * For fast lookup, JCCs are reachable with a hash table, keyed by 227a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * the (from_bbcc,to) pair. <next_hash> is used for the JCC chain 228a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * of one hash table entry. 229a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 230a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Cost <sum> holds event counts for already returned executions. 231a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <last> are the event counters at last enter of the subroutine. 232a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <sum> is updated on returning from the subroutine by 233a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * adding the diff of <last> and current event counters to <sum>. 234a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 235a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * After updating, <last> is set to current event counters. Thus, 236a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * events are not counted twice for recursive calls (TODO: True?) 237a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 238a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 239a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _jCC { 24028a23c05ce81a384283eb6d92d39ace2ff7283caweidendo ClgJumpKind jmpkind; /* jk_Call, jk_Jump, jk_CondJump */ 241a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* next_hash; /* for hash entry chain */ 242a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* next_from; /* next JCC from a BBCC */ 243a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC *from, *to; /* call arc from/to this BBCC */ 244a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt jmp; /* jump no. in source */ 245a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 246a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong call_counter; /* no wraparound with 64 bit */ 247a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 248a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost cost; /* simulator + user counters */ 249a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 250a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 251a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 252a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 253a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Info for one instruction of a basic block. 254a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 255a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _InstrInfo InstrInfo; 256a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _InstrInfo { 257a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt instr_offset; 258a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt instr_size; 259a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt cost_offset; 260a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo EventSet* eventset; 261a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 262a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 263a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 26428a23c05ce81a384283eb6d92d39ace2ff7283caweidendo 265a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 26628a23c05ce81a384283eb6d92d39ace2ff7283caweidendo * Info for a side exit in a BB 267a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 268a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _CJmpInfo CJmpInfo; 269a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _CJmpInfo { 27028a23c05ce81a384283eb6d92d39ace2ff7283caweidendo UInt instr; /* instruction index for BB.instr array */ 27128a23c05ce81a384283eb6d92d39ace2ff7283caweidendo ClgJumpKind jmpkind; /* jump kind when leaving BB at this side exit */ 272a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 273a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 274a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 275a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/** 276a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * An instrumented basic block (BB). 277a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 278a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * BBs are put into a resizable hash to allow for fast detection if a 279a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * BB is to be retranslated but cost info is already available. 280a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * The key for a BB is a (object, offset) tupel making it independent 281a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * from possibly multiple mappings of the same ELF object. 282a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 283a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * At the beginning of each instrumented BB, 284a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * a call to setup_bbcc(), specifying a pointer to the 285a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * according BB structure, is added. 286a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 287a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * As cost of a BB has to be distinguished depending on the context, 288a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * multiple cost centers for one BB (struct BBCC) exist and the according 289a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * BBCC is set by setup_bbcc. 290a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 291a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _BB { 292a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo obj_node* obj; /* ELF object of BB */ 293c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT offset; /* offset of BB in ELF object file */ 294a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BB* next; /* chaining for a hash entry */ 295a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 296a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo VgSectKind sect_kind; /* section of this BB, e.g. PLT */ 297a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt instr_count; 298a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 299a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* filled by CLG_(get_fn_node) if debug info is available */ 300a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* fn; /* debug info for this BB */ 301a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt line; 302a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool is_entry; /* True if this BB is a function entry */ 303a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 304a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* bbcc_list; /* BBCCs for same BB (see next_bbcc in BBCC) */ 305a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* last_bbcc; /* Temporary: Cached for faster access (LRU) */ 306a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 307a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* filled by CLG_(instrument) if not seen before */ 30828a23c05ce81a384283eb6d92d39ace2ff7283caweidendo UInt cjmp_count; /* number of side exits */ 309a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CJmpInfo* jmp; /* array of info for condition jumps, 310a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * allocated directly after this struct */ 31128a23c05ce81a384283eb6d92d39ace2ff7283caweidendo Bool cjmp_inverted; /* is last side exit actually fall through? */ 312a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 313a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt instr_len; 314a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt cost_count; 315a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo InstrInfo instr[0]; /* info on instruction sizes and costs */ 316a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 317a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 318a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 319a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 320a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/** 321a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Function context 322a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 323a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Basic blocks are always executed in the scope of a context. 324a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * A function context is a list of function nodes representing 325a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * the call chain to the current context: I.e. fn[0] is the 326a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * function we are currently in, fn[1] has called fn[0], and so on. 327a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Recursion levels are used for fn[0]. 328a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 329a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * To get a unique number for a full execution context, use 330a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * rec_index = min(<fn->rec_separation>,<active>) - 1; 331a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * unique_no = <number> + rec_index 332a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 333a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * For each Context, recursion index and BB, there can be a BBCC. 334a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 335a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _Context { 336a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size; // number of function dependencies 337a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt base_number; // for context compression & dump array 338a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* next; // entry chaining for hash 339a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UWord hash; // for faster lookup... 340a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* fn[0]; 341a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 342a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 343a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 344a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 34528a23c05ce81a384283eb6d92d39ace2ff7283caweidendo * Cost info for a side exits from a BB 346a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 347a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _JmpData JmpData; 348a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _JmpData { 349a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong ecounter; /* number of times the BB was left at this exit */ 35028a23c05ce81a384283eb6d92d39ace2ff7283caweidendo jCC* jcc_list; /* JCCs used for this exit */ 351a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 352a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 353a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 354a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 355a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Basic Block Cost Center 356a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 357a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * On demand, multiple BBCCs will be created for the same BB 358a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * dependend on command line options and: 359a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - current function (it's possible that a BB is executed in the 360a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * context of different functions, e.g. in manual assembler/PLT) 361a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - current thread ID 362a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - position where current function is called from 363a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - recursion level of current function 364a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 365a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * The cost centres for the instructions of a basic block are 366a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * stored in a contiguous array. 367a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * They are distinguishable by their tag field. 368a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 369a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _BBCC { 370a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BB* bb; /* BB for this cost center */ 371a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 372a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* cxt; /* execution context of this BBCC */ 373a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ThreadId tid; /* only for assertion check purpose */ 374a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt rec_index; /* Recursion index in rec->bbcc for this bbcc */ 375a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC** rec_array; /* Variable sized array of pointers to 376a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * recursion BBCCs. Shared. */ 377a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong ret_counter; /* how often returned from jccs of this bbcc; 378a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * used to check if a dump for this BBCC is needed */ 379a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 380a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* next_bbcc; /* Chain of BBCCs for same BB */ 381a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* lru_next_bbcc; /* BBCC executed next the last time */ 382a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 383a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* lru_from_jcc; /* Temporary: Cached for faster access (LRU) */ 384a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* lru_to_jcc; /* Temporary: Cached for faster access (LRU) */ 385a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost skipped; /* cost for skipped functions called from 386a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * jmp_addr. Allocated lazy */ 387a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 388a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* next; /* entry chain in hash */ 389a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong* cost; /* start of 64bit costs for this BBCC */ 390a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ULong ecounter_sum; /* execution counter for first instruction of BB */ 391a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo JmpData jmp[0]; 392a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 393a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 394a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 395a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* the <number> of fn_node, file_node and obj_node are for compressed dumping 396a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * and a index into the dump boolean table and fn_info_table 397a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 398a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 399a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _fn_node { 40019f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* name; 401a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt number; 402a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* last_cxt; /* LRU info */ 403a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* pure_cxt; /* the context with only the function itself */ 404a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* file; /* reverse mapping for 2nd hash */ 405a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* next; 406a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 407a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool dump_before :1; 408a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool dump_after :1; 409a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool zero_before :1; 410a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool toggle_collect :1; 411a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool skip :1; 412a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool pop_on_jump : 1; 413a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 414a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool is_malloc :1; 415a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool is_realloc :1; 416a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool is_free :1; 417a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 418a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int group; 419a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int separate_callers; 420a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int separate_recursions; 421a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 422a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int verbosity; /* Stores old verbosity level while in function */ 423a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 424a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 425a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 426a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Quite arbitrary fixed hash sizes */ 427a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 428a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define N_OBJ_ENTRIES 47 429a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define N_FILE_ENTRIES 53 430a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define N_FN_ENTRIES 87 431a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 432a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _file_node { 43319f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* name; 434a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* fns[N_FN_ENTRIES]; 435a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt number; 436a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo obj_node* obj; 437a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* next; 438a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 439a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 440a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* If an object is dlopened multiple times, we hope that <name> is unique; 441a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <start> and <offset> can change with each dlopen, and <start> is 442a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * zero when object is unmapped (possible at dump time). 443a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 444a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _obj_node { 44525f6c57962b259a52e3e617eb96fa14d6fdbe364florian const HChar* name; 446a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt last_slash_pos; 447a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 448a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr start; /* Start address of text segment mapping */ 449a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo SizeT size; /* Length of mapping */ 450c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT offset; /* Offset between symbol address and file offset */ 451a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 452a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* files[N_FILE_ENTRIES]; 453a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt number; 454a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo obj_node* next; 455a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 456a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 457a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* an entry in the callstack 458a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 459a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <nonskipped> is 0 if the function called is not skipped (usual case). 460a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Otherwise, it is the last non-skipped BBCC. This one gets all 461a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * the calls to non-skipped functions and all costs in skipped 462a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * instructions. 463a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 464a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _call_entry { 465a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* jcc; /* jCC for this call */ 466a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost enter_cost; /* cost event counters at entering frame */ 467a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr sp; /* stack pointer directly after call */ 468a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr ret_addr; /* address to which to return to 469a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * is 0 on a simulated call */ 470a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* nonskipped; /* see above */ 471a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* cxt; /* context before call */ 472a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int fn_sp; /* function stack index before call */ 473a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 474a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 475a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 476a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 477a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Execution state of main thread or a running signal handler in 478a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * a thread while interrupted by another signal handler. 479a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * As there's no scheduling among running signal handlers of one thread, 480a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * we only need a subset of a full thread state: 481a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - event counter 482a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - collect state 483a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - last BB, last jump kind, last nonskipped BB 484a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - callstack pointer for sanity checking and correct unwinding 485a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * after exit 486a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 487a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _exec_state exec_state; 488a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _exec_state { 489a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 490a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* the signum of the handler, 0 for main thread context 491a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 492a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int sig; 493a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 494a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* the old call stack pointer at entering the signal handler */ 495a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int orig_sp; 496a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 497a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost cost; 498a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool collect; 499a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* cxt; 500a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 501d7341d8948ba0082488ea478ec7a6ba15949895bweidendo /* number of conditional jumps passed in last BB */ 502d7341d8948ba0082488ea478ec7a6ba15949895bweidendo Int jmps_passed; 503a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* bbcc; /* last BB executed */ 504a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC* nonskipped; 505a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 506a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int call_stack_bottom; /* Index into fn_stack */ 507a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 508a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 509a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Global state structures */ 510a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _bb_hash bb_hash; 511a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _bb_hash { 512a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size, entries; 513a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BB** table; 514a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 515a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 516a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _cxt_hash cxt_hash; 517a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _cxt_hash { 518a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size, entries; 519a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context** table; 520a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 521a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 522a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Thread specific state structures, i.e. parts of a thread state. 523a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * There are variables for the current state of each part, 524a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * on which a thread state is copied at thread switch. 525a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 526a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _bbcc_hash bbcc_hash; 527a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _bbcc_hash { 528a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size, entries; 529a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo BBCC** table; 530a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 531a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 532a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _jcc_hash jcc_hash; 533a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _jcc_hash { 534a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size, entries; 535a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC** table; 536a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jCC* spontaneous; 537a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 538a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 539a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fn_array fn_array; 540a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _fn_array { 541a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size; 542a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt* array; 543a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 544a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 545a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _call_stack call_stack; 546a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _call_stack { 547a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size; 548a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int sp; 549a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo call_entry* entry; 550a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 551a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 552a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _fn_stack fn_stack; 553a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _fn_stack { 554a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt size; 555a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node **bottom, **top; 556a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 557a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 558a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* The maximum number of simultaneous running signal handlers per thread. 559a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * This is the number of execution states storable in a thread. 560a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 561a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define MAX_SIGHANDLERS 10 562a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 563a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _exec_stack exec_stack; 564a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _exec_stack { 565a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int sp; /* > 0 if a handler is running */ 566a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo exec_state* entry[MAX_SIGHANDLERS]; 567a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 568a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 569a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Thread State 570a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 571a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * This structure stores thread specific info while a thread is *not* 572a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * running. See function switch_thread() for save/restore on thread switch. 573a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 574a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * If --separate-threads=no, BBCCs and JCCs can be shared by all threads, i.e. 575a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * only structures of thread 1 are used. 576a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * This involves variables fn_info_table, bbcc_table and jcc_table. 577a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 578a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _thread_info { 579a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 580a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* state */ 581a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_stack fns; /* function stack */ 582a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo call_stack calls; /* context call arc stack */ 583a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo exec_stack states; /* execution states interrupted by signals */ 584a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 585a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* dump statistics */ 586a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost lastdump_cost; /* Cost at last dump */ 587a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo FullCost sighandler_cost; 588a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 589a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* thread specific data structure containers */ 590a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_array fn_active; 591a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo jcc_hash jccs; 592a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo bbcc_hash bbccs; 593a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 594a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 595a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Structs used for dumping */ 596a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 597a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Address position inside of a BBCC: 598a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * This includes 599a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - the address offset from the BB start address 600a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - file/line from debug info for that address (can change inside a BB) 601a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 602a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _AddrPos AddrPos; 603a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _AddrPos { 604a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr addr; 605a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Addr bb_addr; 606a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* file; 607a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt line; 608a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 609a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 610a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* a simulator cost entity that can be written out in one line */ 611a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _AddrCost AddrCost; 612a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _AddrCost { 613a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo AddrPos p; 614a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo SimCost cost; 615a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 616a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 617a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* A function in an execution context */ 618a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _FnPos FnPos; 619a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _FnPos { 620a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo file_node* file; 621a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_node* fn; 622a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo obj_node* obj; 623a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Context* cxt; 624a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo int rec_index; 625a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo UInt line; 626a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 627a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 628a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 629a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Cache simulator interface ---*/ 630a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 631a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 632a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct cachesim_if 633a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 634a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*print_opts)(void); 63519f91bbaedb4caef8a60ce94b0f507193cc0bc10florian Bool (*parse_opt)(const HChar* arg); 636a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*post_clo_init)(void); 637a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*clear)(void); 638dbb3584f591710a15a437918c0fc27e300993566florian void (*getdesc)(HChar* buf); 639320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo void (*printstat)(Int,Int,Int); 640a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*add_icost)(SimCost, BBCC*, InstrInfo*, ULong); 641a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*finish)(void); 642a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 643a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo void (*log_1I0D)(InstrInfo*) VG_REGPARM(1); 6440a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_2I0D)(InstrInfo*, InstrInfo*) VG_REGPARM(2); 6450a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_3I0D)(InstrInfo*, InstrInfo*, InstrInfo*) VG_REGPARM(3); 646a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 6470a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_1I1Dr)(InstrInfo*, Addr, Word) VG_REGPARM(3); 6480a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_1I1Dw)(InstrInfo*, Addr, Word) VG_REGPARM(3); 649a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 6500a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_0I1Dr)(InstrInfo*, Addr, Word) VG_REGPARM(3); 6510a1951d64df79f98f885426671fc9d3982647a6bweidendo void (*log_0I1Dw)(InstrInfo*, Addr, Word) VG_REGPARM(3); 652a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 653a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo // function names of helpers (for debugging generated code) 65425f6c57962b259a52e3e617eb96fa14d6fdbe364florian const HChar *log_1I0D_name, *log_2I0D_name, *log_3I0D_name; 65525f6c57962b259a52e3e617eb96fa14d6fdbe364florian const HChar *log_1I1Dr_name, *log_1I1Dw_name; 65625f6c57962b259a52e3e617eb96fa14d6fdbe364florian const HChar *log_0I1Dr_name, *log_0I1Dw_name; 657a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 658a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 6595bba5258a193d980fb116a8b04f96dc16d96aacfweidendo// Event groups 6605bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define EG_USE 0 6615bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define EG_IR 1 6625bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define EG_DR 2 6635bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define EG_DW 3 664320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_BC 4 665320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_BI 5 666320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_BUS 6 667320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_ALLOC 7 668320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo#define EG_SYS 8 6695bba5258a193d980fb116a8b04f96dc16d96aacfweidendo 6705bba5258a193d980fb116a8b04f96dc16d96aacfweidendostruct event_sets { 6715bba5258a193d980fb116a8b04f96dc16d96aacfweidendo EventSet *base, *full; 6725bba5258a193d980fb116a8b04f96dc16d96aacfweidendo}; 6735bba5258a193d980fb116a8b04f96dc16d96aacfweidendo 6745bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define fullOffset(group) (CLG_(sets).full->offset[group]) 6755bba5258a193d980fb116a8b04f96dc16d96aacfweidendo 676a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 677a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 678a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Functions ---*/ 679a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 680a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 681a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from clo.c */ 682a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 683a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_clo_defaults)(void); 684a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(update_fn_config)(fn_node*); 68519f91bbaedb4caef8a60ce94b0f507193cc0bc10florianBool CLG_(process_cmd_line_option)(const HChar*); 686a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_usage)(void); 687a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_debug_usage)(void); 688a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 689a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from sim.c */ 6905bba5258a193d980fb116a8b04f96dc16d96aacfweidendovoid CLG_(init_eventsets)(void); 691a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 692a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from main.c */ 69310ef725f1e8e9f1615c483555348eb75b69c4713florianBool CLG_(get_debug_info)(Addr, const HChar **dirname, 69410ef725f1e8e9f1615c483555348eb75b69c4713florian const HChar **filename, 695536e3d733b5fa756266321e14d67b6df742af8deflorian const HChar **fn_name, UInt*, DebugInfo**); 6960b9d74abd0a663b530d290b2b788ddeda46e5400sewardjvoid CLG_(collectBlockInfo)(IRSB* bbIn, UInt*, UInt*, Bool*); 69725f6c57962b259a52e3e617eb96fa14d6fdbe364florianvoid CLG_(set_instrument_state)(const HChar*,Bool); 69825f6c57962b259a52e3e617eb96fa14d6fdbe364florianvoid CLG_(dump_profile)(const HChar* trigger,Bool only_current_thread); 699a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(zero_all_cost)(Bool only_current_thread); 700a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoInt CLG_(get_dump_counter)(void); 701a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(fini)(Int exitcode); 702a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 703a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from bb.c */ 704a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_bb_hash)(void); 705a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendobb_hash* CLG_(get_bb_hash)(void); 7060b9d74abd0a663b530d290b2b788ddeda46e5400sewardjBB* CLG_(get_bb)(Addr addr, IRSB* bb_in, Bool *seen_before); 707a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(delete_bb)(Addr addr); 708a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 709a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic __inline__ Addr bb_addr(BB* bb) 710a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo { return bb->offset + bb->obj->offset; } 711a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic __inline__ Addr bb_jmpaddr(BB* bb) 71290741fb06f058a401af52b3d0963f29bd737c154weidendo { UInt off = (bb->instr_count > 0) ? bb->instr[bb->instr_count-1].instr_offset : 0; 71390741fb06f058a401af52b3d0963f29bd737c154weidendo return off + bb->offset + bb->obj->offset; } 714a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 715a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from fn.c */ 716a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_fn_array)(fn_array*); 717a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_fn_array)(fn_array* dst); 718a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendofn_array* CLG_(get_current_fn_array)(void); 719a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_fn_array)(fn_array*); 720a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoUInt* CLG_(get_fn_entry)(Int n); 721a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 722a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_obj_table)(void); 723b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjobj_node* CLG_(get_obj_node)(DebugInfo* si); 724536e3d733b5fa756266321e14d67b6df742af8deflorianfile_node* CLG_(get_file_node)(obj_node*, const HChar *dirname, 725536e3d733b5fa756266321e14d67b6df742af8deflorian const HChar* filename); 726a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendofn_node* CLG_(get_fn_node)(BB* bb); 727a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 728a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from bbcc.c */ 729a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_bbcc_hash)(bbcc_hash* bbccs); 730a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_bbcc_hash)(bbcc_hash* dst); 731a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendobbcc_hash* CLG_(get_current_bbcc_hash)(void); 732a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_bbcc_hash)(bbcc_hash*); 733a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(forall_bbccs)(void (*func)(BBCC*)); 734a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(zero_bbcc)(BBCC* bbcc); 735a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoBBCC* CLG_(get_bbcc)(BB* bb); 736a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoBBCC* CLG_(clone_bbcc)(BBCC* orig, Context* cxt, Int rec_index); 737a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(setup_bbcc)(BB* bb) VG_REGPARM(1); 738a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 739a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 740a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from jumps.c */ 741a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_jcc_hash)(jcc_hash*); 742a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_jcc_hash)(jcc_hash* dst); 743a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_jcc_hash)(jcc_hash*); 744a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendojCC* CLG_(get_jcc)(BBCC* from, UInt, BBCC* to); 745a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 746a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from callstack.c */ 747a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_call_stack)(call_stack*); 748a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_call_stack)(call_stack* dst); 749a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_call_stack)(call_stack*); 750a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendocall_entry* CLG_(get_call_entry)(Int n); 751a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 752a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(push_call_stack)(BBCC* from, UInt jmp, BBCC* to, Addr sp, Bool skip); 753a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(pop_call_stack)(void); 754c63ca370759170ce891430374315990c83852ed0weidendoInt CLG_(unwind_call_stack)(Addr sp, Int); 755a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 756a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from context.c */ 757a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_fn_stack)(fn_stack*); 758a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_fn_stack)(fn_stack*); 759a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_fn_stack)(fn_stack*); 760a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 761a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_cxt_table)(void); 762a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoContext* CLG_(get_cxt)(fn_node** fn); 763a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(push_cxt)(fn_node* fn); 764a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 765a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from threads.c */ 766a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_threads)(void); 767a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendothread_info** CLG_(get_threads)(void); 768a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendothread_info* CLG_(get_current_thread)(void); 769a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(switch_thread)(ThreadId tid); 770a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(forall_threads)(void (*func)(thread_info*)); 771a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(run_thread)(ThreadId tid); 772a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 773a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_exec_state)(exec_state* es); 774a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_exec_stack)(exec_stack*); 775a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_current_exec_stack)(exec_stack*); 776a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_current_exec_stack)(exec_stack*); 777a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(pre_signal)(ThreadId tid, Int sigNum, Bool alt_stack); 778a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(post_signal)(ThreadId tid, Int sigNum); 779a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(run_post_signal_on_call_stack_bottom)(void); 780a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 781a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from dump.c */ 7824ce5e79ff39cbdef678e4bd9d2d16fbaba9f7fdeweidendovoid CLG_(init_dumps)(void); 783a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 784a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 785a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Exported global variables ---*/ 786a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 787a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 788a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern CommandLineOptions CLG_(clo); 789a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern Statistics CLG_(stat); 790a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern EventMapping* CLG_(dumpmap); 791a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 792a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Function active counter array, indexed by function number */ 793a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern UInt* CLG_(fn_active_array); 794a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern Bool CLG_(instrument_state); 795c4ebde3931d3740270b92bea4c85a59443e7c65dsewardj /* min of L1 and LL cache line sizes */ 796c4ebde3931d3740270b92bea4c85a59443e7c65dsewardjextern Int CLG_(min_line_size); 797a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern call_stack CLG_(current_call_stack); 798a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern fn_stack CLG_(current_fn_stack); 799a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern exec_state CLG_(current_state); 800a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoextern ThreadId CLG_(current_tid); 8012f938d0f2968356d4a2b90136d95625efdc110feflorianextern FullCost CLG_(total_cost); 8022f938d0f2968356d4a2b90136d95625efdc110feflorianextern struct cachesim_if CLG_(cachesim); 8032f938d0f2968356d4a2b90136d95625efdc110feflorianextern struct event_sets CLG_(sets); 8042f938d0f2968356d4a2b90136d95625efdc110feflorian 8052f938d0f2968356d4a2b90136d95625efdc110feflorian// set by setup_bbcc at start of every BB, and needed by log_* helpers 8062f938d0f2968356d4a2b90136d95625efdc110feflorianextern Addr CLG_(bb_base); 8072f938d0f2968356d4a2b90136d95625efdc110feflorianextern ULong* CLG_(cost_base); 808a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 809a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 810a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 811a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Debug output ---*/ 812a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 813a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 814a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 815a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 816a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_DEBUGIF(x) \ 8171fda5fe517a976306f0ffdc53eeec293b8e21b45philippe if (UNLIKELY( (CLG_(clo).verbose >x) && \ 8181fda5fe517a976306f0ffdc53eeec293b8e21b45philippe (CLG_(stat).bb_executions >= CLG_(clo).verbose_start))) 819a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 820a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_DEBUG(x,format,args...) \ 821a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_DEBUGIF(x) { \ 822a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(print_bbno)(); \ 823a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo VG_(printf)(format,##args); \ 824a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 825a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 826a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_ASSERT(cond) \ 8271fda5fe517a976306f0ffdc53eeec293b8e21b45philippe if (UNLIKELY(!(cond))) { \ 828a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(print_context)(); \ 829a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(print_bbno)(); \ 830a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo tl_assert(cond); \ 831a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 832a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 833a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#else 834a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_DEBUGIF(x) if (0) 835a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_DEBUG(x...) {} 836a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CLG_ASSERT(cond) tl_assert(cond); 837a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 838a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 839a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* from debug.c */ 840a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_bbno)(void); 841a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_context)(void); 842a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_jcc)(int s, jCC* jcc); 84309ee78ec9675201840d895623d49efba1ffe05d8weidendovoid CLG_(print_bbcc)(int s, BBCC* bbcc); 844a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_bbcc_fn)(BBCC* bbcc); 845a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_execstate)(int s, exec_state* es); 846a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_eventset)(int s, EventSet* es); 847a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_cost)(int s, EventSet*, ULong* cost); 848a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_bb)(int s, BB* bb); 849a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_bbcc_cost)(int s, BBCC*); 850a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_cxt)(int s, Context* cxt, int rec_index); 851a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_short_jcc)(jCC* jcc); 852a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_stackentry)(int s, int sp); 853a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_addr)(Addr addr); 854a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_addr_ln)(Addr addr); 855a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 85619f91bbaedb4caef8a60ce94b0f507193cc0bc10florianvoid* CLG_(malloc)(const HChar* cc, UWord s, const HChar* f); 85719f91bbaedb4caef8a60ce94b0f507193cc0bc10florianvoid* CLG_(free)(void* p, const HChar* f); 858a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if 0 8599c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj#define CLG_MALLOC(_cc,x) CLG_(malloc)((_cc),x,__FUNCTION__) 8609c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj#define CLG_FREE(p) CLG_(free)(p,__FUNCTION__) 861a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#else 8629c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj#define CLG_MALLOC(_cc,x) VG_(malloc)((_cc),x) 8639c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj#define CLG_FREE(p) VG_(free)(p) 864a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 865a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 866a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif /* CLG_GLOBAL */ 867