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 6 /* XRay -- a simple profiler for Native Client */ 7 8 #include <stdint.h> 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 #include <unistd.h> 13 #include "xray/xray_priv.h" 14 15 #if defined(XRAY) 16 17 struct XRaySymbol* XRaySymbolTableCreateEntry(struct XRaySymbolTable* symtab, 18 char* line) { 19 uint32_t addr; 20 unsigned int uiaddr; 21 char symbol_text[XRAY_LINE_SIZE]; 22 char* parsed_symbol; 23 char* newln; 24 if (2 != sscanf(line, "%x %1023s", &uiaddr, symbol_text)) 25 return NULL; 26 if (uiaddr > 0x07FFFFFF) { 27 fprintf(stderr, "While parsing the mapfile, XRay encountered:\n"); 28 fprintf(stderr, "%s\n", line); 29 fprintf(stderr, 30 "XRay only works with code addresses 0x00000000 - 0x07FFFFFF\n"); 31 fprintf(stderr, "All functions must reside in this address space.\n"); 32 exit(-1); 33 } 34 addr = (uint32_t)uiaddr; 35 parsed_symbol = strstr(line, symbol_text); 36 newln = strstr(parsed_symbol, "\n"); 37 if (NULL != newln) { 38 *newln = 0; 39 } 40 return XRaySymbolTableAddByName(symtab, parsed_symbol, addr); 41 } 42 43 44 void XRaySymbolTableParseMapfile(struct XRaySymbolTable* symtab, 45 const char* mapfile) { 46 FILE* f; 47 char line[XRAY_LINE_SIZE]; 48 bool in_text = false; 49 bool in_link_once = false; 50 int in_link_once_counter = 0; 51 int num_symbols = 0; 52 53 printf("XRay: opening mapfile %s\n", mapfile); 54 f = fopen(mapfile, "rt"); 55 if (0 == f) { 56 fprintf(stderr, "XRay: failed to open %s\n", mapfile); 57 return; 58 } 59 printf("XRay: parsing...\n"); 60 while (NULL != fgets(line, XRAY_LINE_SIZE, f)) { 61 if (line == strstr(line, " .text ")) { 62 in_text = true; 63 continue; 64 } 65 if (line == strstr(line, " .gnu.linkonce.t.")) { 66 in_link_once = true; 67 in_link_once_counter = 0; 68 continue; 69 } 70 if (line == strstr(line, " .text.")) { 71 in_link_once = true; 72 in_link_once_counter = 0; 73 continue; 74 } 75 if (line == strstr(line, " 0x")) { 76 if (in_text) { 77 XRaySymbolTableCreateEntry(symtab, line); 78 ++num_symbols; 79 } else if (in_link_once) { 80 if (in_link_once_counter != 0) { 81 if (NULL != XRaySymbolTableCreateEntry(symtab, line)) 82 ++num_symbols; 83 } else { 84 ++in_link_once_counter; 85 } 86 } 87 } else { 88 in_text = false; 89 in_link_once = false; 90 } 91 } 92 fclose(f); 93 printf("XRay: parsed %d symbols into symbol table\n", num_symbols); 94 } 95 96 #endif // XRAY 97