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