1/* Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. */ 4 5/* XRay -- a simple profiler for Native Client */ 6 7/* This header file is the private internal interface. */ 8 9#ifndef LIBRARIES_XRAY_XRAY_PRIV_H_ 10#define LIBRARIES_XRAY_XRAY_PRIV_H_ 11 12#include <stdbool.h> 13#include <stdint.h> 14#include <stdio.h> 15#include <stdlib.h> 16#include "xray/xray.h" 17 18#ifdef __cplusplus 19extern "C" { 20#endif 21 22#if defined(XRAY) 23 24#define XRAY_FORCE_INLINE __attribute__((always_inline)) 25 26#define XRAY_TRACE_STACK_SIZE (256) 27#define XRAY_TRACE_ANNOTATION_LENGTH (1024) 28#define XRAY_TRACE_BUFFER_SIZE (1048576) 29#define XRAY_ANNOTATION_STACK_SIZE ((XRAY_TRACE_STACK_SIZE) * \ 30 (XRAY_TRACE_ANNOTATION_LENGTH)) 31#define XRAY_STRING_POOL_NODE_SIZE (32768) 32#define XRAY_FRAME_MARKER (0xFFFFFFFF) 33#define XRAY_NULL_ANNOTATION (0x0) 34#define XRAY_FUNCTION_ALIGNMENT_BITS (4) 35#define XRAY_ADDR_MASK (0xFFFFFF00) 36#define XRAY_ADDR_SHIFT (4) 37#define XRAY_DEPTH_MASK (0x000000FF) 38#define XRAY_SYMBOL_TABLE_MAX_RATIO (0.66f) 39#define XRAY_LINE_SIZE (1024) 40#define XRAY_MAX_FRAMES (60) 41#define XRAY_MAX_LABEL (64) 42#define XRAY_DEFAULT_SYMBOL_TABLE_SIZE (4096) 43#define XRAY_SYMBOL_POOL_NODE_SIZE (1024) 44#define XRAY_GUARD_VALUE_0x12345678 (0x12345678) 45#define XRAY_GUARD_VALUE_0x87654321 (0x87654321) 46#define XRAY_EXTRACT_ADDR(x) (((x) & XRAY_ADDR_MASK) >> XRAY_ADDR_SHIFT) 47#define XRAY_EXTRACT_DEPTH(x) ((x) & XRAY_DEPTH_MASK) 48#define XRAY_PACK_ADDR(x) (((x) << XRAY_ADDR_SHIFT) & XRAY_ADDR_MASK) 49#define XRAY_PACK_DEPTH(x) ((x) & XRAY_DEPTH_MASK) 50#define XRAY_PACK_DEPTH_ADDR(d, a) (XRAY_PACK_DEPTH(d) | XRAY_PACK_ADDR(a)) 51#define XRAY_ALIGN64 __attribute((aligned(64))) 52 53struct XRayStringPool; 54struct XRayHashTable; 55struct XRaySymbolPool; 56struct XRaySymbol; 57struct XRaySymbolTable; 58struct XRayTraceCapture; 59 60struct XRayTraceBufferEntry { 61 uint32_t depth_addr; 62 uint32_t annotation_index; 63 uint64_t start_tick; 64 uint64_t end_tick; 65}; 66 67 68/* Important: don't instrument xray itself, so use */ 69/* XRAY_NO_INSTRUMENT on all xray functions */ 70 71XRAY_NO_INSTRUMENT char* XRayStringPoolAppend(struct XRayStringPool* pool, 72 const char* src); 73XRAY_NO_INSTRUMENT struct XRayStringPool* XRayStringPoolCreate(); 74XRAY_NO_INSTRUMENT void XRayStringPoolFree(struct XRayStringPool* pool); 75 76XRAY_NO_INSTRUMENT void* XRayHashTableLookup(struct XRayHashTable* table, 77 uint32_t addr); 78XRAY_NO_INSTRUMENT void* XRayHashTableInsert(struct XRayHashTable* table, 79 void* data, uint32_t addr); 80XRAY_NO_INSTRUMENT void* XRayHashTableAtIndex( 81 struct XRayHashTable* table, int i); 82XRAY_NO_INSTRUMENT int XRayHashTableGetCapacity(struct XRayHashTable* table); 83XRAY_NO_INSTRUMENT int XRayHashTableGetCount(struct XRayHashTable* table); 84XRAY_NO_INSTRUMENT struct XRayHashTable* XRayHashTableCreate(int capacity); 85XRAY_NO_INSTRUMENT void XRayHashTableFree(struct XRayHashTable* table); 86XRAY_NO_INSTRUMENT void XRayHashTableHisto(FILE* f); 87 88XRAY_NO_INSTRUMENT struct XRaySymbol* XRaySymbolPoolAlloc( 89 struct XRaySymbolPool* sympool); 90XRAY_NO_INSTRUMENT struct XRaySymbolPool* XRaySymbolPoolCreate(); 91XRAY_NO_INSTRUMENT void XRaySymbolPoolFree(struct XRaySymbolPool* sympool); 92 93XRAY_NO_INSTRUMENT const char* XRayDemangle(char* demangle, size_t buffersize, 94 const char* symbol); 95 96XRAY_NO_INSTRUMENT const char* XRaySymbolGetName(struct XRaySymbol* symbol); 97XRAY_NO_INSTRUMENT struct XRaySymbol* XRaySymbolCreate( 98 struct XRaySymbolPool* sympool, const char* name); 99XRAY_NO_INSTRUMENT void XRaySymbolFree(struct XRaySymbol* symbol); 100XRAY_NO_INSTRUMENT int XRaySymbolCount(struct XRaySymbolTable* symtab); 101 102XRAY_NO_INSTRUMENT struct XRaySymbol* XRaySymbolTableCreateEntry( 103 struct XRaySymbolTable* symtab, const char* line); 104XRAY_NO_INSTRUMENT void XRaySymbolTableParseMapfile( 105 struct XRaySymbolTable* symbols, const char* mapfilename); 106 107XRAY_NO_INSTRUMENT struct XRaySymbol* XRaySymbolTableAddByName( 108 struct XRaySymbolTable* symtab, const char* name, uint32_t addr); 109 110XRAY_NO_INSTRUMENT int XRaySymbolTableGetCount(struct XRaySymbolTable* symtab); 111XRAY_NO_INSTRUMENT struct XRaySymbol* XRaySymbolTableLookup( 112 struct XRaySymbolTable* symbols, uint32_t addr); 113XRAY_NO_INSTRUMENT struct XRaySymbol* XRaySymbolTableAtIndex( 114 struct XRaySymbolTable* symbols, int i); 115XRAY_NO_INSTRUMENT struct XRaySymbolTable* XRaySymbolTableCreate(int size); 116XRAY_NO_INSTRUMENT void XRaySymbolTableFree(struct XRaySymbolTable* symbtab); 117 118XRAY_NO_INSTRUMENT struct XRaySymbolTable* XRayGetSymbolTable(); 119 120XRAY_NO_INSTRUMENT void XRayCheckGuards(struct XRayTraceCapture* capture); 121 122XRAY_NO_INSTRUMENT struct XRayTraceBufferEntry* XRayTraceGetEntry( 123 struct XRayTraceCapture* capture, int index); 124XRAY_NO_INSTRUMENT int XRayTraceIncrementIndex( 125 struct XRayTraceCapture* capture, int i); 126XRAY_NO_INSTRUMENT int XRayTraceDecrementIndex( 127 struct XRayTraceCapture* capture, int i); 128XRAY_NO_INSTRUMENT bool XRayTraceIsAnnotation( 129 struct XRayTraceCapture* capture, int index); 130XRAY_NO_INSTRUMENT void XRayTraceAppendString( 131 struct XRayTraceCapture* capture, char* src); 132XRAY_NO_INSTRUMENT int XRayTraceCopyToString( 133 struct XRayTraceCapture* capture, int index, char* dst); 134XRAY_NO_INSTRUMENT int XRayTraceSkipAnnotation( 135 struct XRayTraceCapture* capture, int index); 136XRAY_NO_INSTRUMENT int XRayTraceNextEntry( 137 struct XRayTraceCapture* capture, int index); 138 139XRAY_NO_INSTRUMENT void XRayFrameMakeLabel(struct XRayTraceCapture* capture, 140 int counter, 141 char* label); 142XRAY_NO_INSTRUMENT int XRayFrameFindTail(struct XRayTraceCapture* capture); 143 144XRAY_NO_INSTRUMENT int XRayFrameGetCount(struct XRayTraceCapture* capture); 145XRAY_NO_INSTRUMENT int XRayFrameGetHead(struct XRayTraceCapture* capture); 146XRAY_NO_INSTRUMENT int XRayFrameGetTail(struct XRayTraceCapture* capture); 147XRAY_NO_INSTRUMENT int XRayFrameGetNext( 148 struct XRayTraceCapture* capture, int index); 149XRAY_NO_INSTRUMENT int XRayFrameGetTotalTicks( 150 struct XRayTraceCapture* capture, int frame); 151XRAY_NO_INSTRUMENT int XRayFrameGetTraceCount( 152 struct XRayTraceCapture* capture, int frame); 153XRAY_NO_INSTRUMENT int XRayFrameGetTraceStartIndex( 154 struct XRayTraceCapture* capture, int frame); 155XRAY_NO_INSTRUMENT int XRayFrameGetTraceEndIndex( 156 struct XRayTraceCapture* capture, int frame); 157XRAY_NO_INSTRUMENT int XRayFrameGetAnnotationCount( 158 struct XRayTraceCapture* capture, int frame); 159XRAY_NO_INSTRUMENT bool XRayFrameIsValid( 160 struct XRayTraceCapture* capture, int frame); 161 162 163XRAY_NO_INSTRUMENT void XRayTraceReport(struct XRayTraceCapture* capture, 164 FILE* f, 165 int frame, 166 char* label, 167 float percent_cutoff, 168 int ticks_cutoff); 169XRAY_NO_INSTRUMENT void XRayFrameReport(struct XRayTraceCapture* capture, 170 FILE* f); 171 172XRAY_NO_INSTRUMENT void* XRayMalloc(size_t t); 173XRAY_NO_INSTRUMENT void XRayFree(void* data); 174 175XRAY_NO_INSTRUMENT void XRaySetMaxStackDepth( 176 struct XRayTraceCapture* capture, int stack_depth); 177XRAY_NO_INSTRUMENT int XRayGetLastFrame(struct XRayTraceCapture* capture); 178XRAY_NO_INSTRUMENT void XRayDisableCapture(struct XRayTraceCapture* capture); 179XRAY_NO_INSTRUMENT void XRayEnableCapture(struct XRayTraceCapture* capture); 180XRAY_NO_INSTRUMENT void XRayLoadMapfile( 181 struct XRayTraceCapture* capture, const char* mapfilename); 182 183struct XRayTimestampPair { 184 uint64_t xray; /* internal xray timestamp */ 185 int64_t pepper; /* corresponding timestamp from PPAPI interface */ 186}; 187 188#ifndef XRAY_DISABLE_BROWSER_INTEGRATION 189XRAY_NO_INSTRUMENT void XRayGetTSC(uint64_t* tsc); 190XRAY_NO_INSTRUMENT int32_t XRayGetSavedThreadID( 191 struct XRayTraceCapture* capture); 192XRAY_NO_INSTRUMENT struct XRayTimestampPair XRayFrameGetStartTimestampPair( 193 struct XRayTraceCapture* capture, int frame); 194XRAY_NO_INSTRUMENT struct XRayTimestampPair XRayFrameGetEndTimestampPair( 195 struct XRayTraceCapture* capture, int frame); 196XRAY_NO_INSTRUMENT struct XRayTimestampPair XRayGenerateTimestampsNow(void); 197#endif 198 199 200#endif /* defined(XRAY) */ 201 202#ifdef __cplusplus 203} 204#endif 205 206#endif /* LIBRARIES_XRAY_XRAY_PRIV_H_ */ 207