2016-05-18 00:24:42 +02:00
|
|
|
/* 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 <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
2016-05-18 00:35:35 +02:00
|
|
|
#include "xray_priv.h"
|
2016-05-18 00:24:42 +02:00
|
|
|
|
|
|
|
#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
|