/* Copyright (c) 2013 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* XRay -- a simple profiler for Native Client */ #include #include #include #include #include #include "xray/xray_priv.h" #if defined(XRAY) struct XRaySymbol* XRaySymbolTableCreateEntry(struct XRaySymbolTable* symtab, char* line) { uint32_t addr; unsigned int uiaddr; char symbol_text[XRAY_LINE_SIZE]; char* parsed_symbol; char* newln; if (2 != sscanf(line, "%x %1023s", &uiaddr, symbol_text)) return NULL; if (uiaddr > 0x07FFFFFF) { fprintf(stderr, "While parsing the mapfile, XRay encountered:\n"); fprintf(stderr, "%s\n", line); fprintf(stderr, "XRay only works with code addresses 0x00000000 - 0x07FFFFFF\n"); fprintf(stderr, "All functions must reside in this address space.\n"); exit(-1); } addr = (uint32_t)uiaddr; parsed_symbol = strstr(line, symbol_text); newln = strstr(parsed_symbol, "\n"); if (NULL != newln) { *newln = 0; } return XRaySymbolTableAddByName(symtab, parsed_symbol, addr); } void XRaySymbolTableParseMapfile(struct XRaySymbolTable* symtab, const char* mapfile) { FILE* f; char line[XRAY_LINE_SIZE]; bool in_text = false; bool in_link_once = false; int in_link_once_counter = 0; int num_symbols = 0; printf("XRay: opening mapfile %s\n", mapfile); f = fopen(mapfile, "rt"); if (0 == f) { fprintf(stderr, "XRay: failed to open %s\n", mapfile); return; } printf("XRay: parsing...\n"); while (NULL != fgets(line, XRAY_LINE_SIZE, f)) { if (line == strstr(line, " .text ")) { in_text = true; continue; } if (line == strstr(line, " .gnu.linkonce.t.")) { in_link_once = true; in_link_once_counter = 0; continue; } if (line == strstr(line, " .text.")) { in_link_once = true; in_link_once_counter = 0; continue; } if (line == strstr(line, " 0x")) { if (in_text) { XRaySymbolTableCreateEntry(symtab, line); ++num_symbols; } else if (in_link_once) { if (in_link_once_counter != 0) { if (NULL != XRaySymbolTableCreateEntry(symtab, line)) ++num_symbols; } else { ++in_link_once_counter; } } } else { in_text = false; in_link_once = false; } } fclose(f); printf("XRay: parsed %d symbols into symbol table\n", num_symbols); } #endif // XRAY