Chromium Code Reviews| Index: native_client_sdk/src/libraries/xray/symtable.c |
| =================================================================== |
| --- native_client_sdk/src/libraries/xray/symtable.c (revision 208986) |
| +++ native_client_sdk/src/libraries/xray/symtable.c (working copy) |
| @@ -5,10 +5,16 @@ |
| /* XRay symbol table */ |
| +#define _GNU_SOURCE |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| + |
| +#if defined(__GLIBC__) |
| +#include <dlfcn.h> |
| +#endif |
| + |
| #include "xray/xray_priv.h" |
| #if defined(XRAY) |
| @@ -111,23 +117,41 @@ |
| return (struct XRaySymbol*)XRayHashTableAtIndex(symtab->hash_table, i); |
| } |
| +struct XRaySymbol* XRaySymbolTableAdd(struct XRaySymbolTable* symtab, |
| + struct XRaySymbol* symbol, |
| + uint32_t addr) { |
| + return (struct XRaySymbol*) |
| + XRayHashTableInsert(symtab->hash_table, symbol, addr); |
| +} |
| +struct XRaySymbol* XRaySymbolTableAddByName(struct XRaySymbolTable* symtab, |
| + const char* name, uint32_t addr) { |
| + char* recorded_symbol; |
| + struct XRaySymbol* symbol; |
| + /* copy the symbol name into the string pool */ |
| + recorded_symbol = XRayStringPoolAppend(symtab->string_pool, name); |
| + if (g_symtable_debug) |
| + printf("adding symbol %s\n", recorded_symbol); |
| + /* construct a symbol and put it in the symbol table */ |
| + symbol = XRaySymbolCreate(symtab->symbol_pool, recorded_symbol); |
| + return XRaySymbolTableAdd(symtab, symbol, addr); |
| +} |
| + |
| struct XRaySymbol* XRaySymbolTableLookup(struct XRaySymbolTable* symtab, |
| uint32_t addr) { |
| void *x = XRayHashTableLookup(symtab->hash_table, addr); |
| struct XRaySymbol* r = (struct XRaySymbol*)x; |
| +#if defined(__GLIBC__) |
| + if (r == NULL) { |
| + Dl_info info; |
| + if (dladdr((const void*)addr, &info) != 0) |
| + if (info.dli_sname) |
| + r = XRaySymbolTableAddByName(symtab, info.dli_sname, addr); |
|
bradn
2013/06/27 23:01:24
Why cache these in your hashtable?
Worried dladdr
nfullagar1
2013/06/27 23:41:55
dladdr (as I understand it) can take any address a
|
| + } |
| +#endif |
| return r; |
| } |
| - |
| -struct XRaySymbol* XRaySymbolTableAdd(struct XRaySymbolTable* symtab, |
| - struct XRaySymbol* symbol, |
| - uint32_t addr) { |
| - return (struct XRaySymbol*) |
| - XRayHashTableInsert(symtab->hash_table, symbol, addr); |
| -} |
| - |
| - |
| struct XRaySymbol* XRaySymbolTableCreateEntry(struct XRaySymbolTable* symtab, |
| const char* line) { |
| uint32_t addr; |
| @@ -135,8 +159,6 @@ |
| char symbol_text[XRAY_LINE_SIZE]; |
| char* parsed_symbol; |
| char* newln; |
| - struct XRaySymbol* symbol; |
| - char* recorded_symbol; |
| sscanf(line,"%x %s", &uiaddr, symbol_text); |
| if (uiaddr > 0x07FFFFFF) { |
| printf("While parsing the mapfile, XRay encountered:\n"); |
| @@ -151,13 +173,7 @@ |
| if (NULL != newln) { |
| *newln = 0; |
| } |
| - /* copy the parsed symbol name into the string pool */ |
| - recorded_symbol = XRayStringPoolAppend(symtab->string_pool, parsed_symbol); |
| - if (g_symtable_debug) |
| - printf("adding symbol %s\n", recorded_symbol); |
| - /* construct a symbol and put it in the symbol table */ |
| - symbol = XRaySymbolCreate(symtab->symbol_pool, recorded_symbol); |
| - return XRaySymbolTableAdd(symtab, symbol, addr); |
| + return XRaySymbolTableAddByName(symtab, parsed_symbol, addr); |
| } |