Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 * Use of this source code is governed by a BSD-style license that can be |
| 3 * found in the LICENSE file. | 3 * found in the LICENSE file. |
| 4 */ | 4 */ |
| 5 | 5 |
| 6 /* XRay symbol table */ | 6 /* XRay symbol table */ |
| 7 | 7 |
| 8 #define _GNU_SOURCE | |
| 8 #include <stdint.h> | 9 #include <stdint.h> |
| 9 #include <stdio.h> | 10 #include <stdio.h> |
| 10 #include <stdlib.h> | 11 #include <stdlib.h> |
| 11 #include <string.h> | 12 #include <string.h> |
| 13 | |
| 14 #if defined(__GLIBC__) | |
| 15 #include <dlfcn.h> | |
| 16 #endif | |
| 17 | |
| 12 #include "xray/xray_priv.h" | 18 #include "xray/xray_priv.h" |
| 13 | 19 |
| 14 #if defined(XRAY) | 20 #if defined(XRAY) |
| 15 | 21 |
| 16 bool g_symtable_debug = false; | 22 bool g_symtable_debug = false; |
| 17 | 23 |
| 18 struct XRayFrameInfo { | 24 struct XRayFrameInfo { |
| 19 int times_called; | 25 int times_called; |
| 20 int total_ticks; | 26 int total_ticks; |
| 21 }; | 27 }; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 104 int XRaySymbolTableGetSize(struct XRaySymbolTable* symtab) { | 110 int XRaySymbolTableGetSize(struct XRaySymbolTable* symtab) { |
| 105 return XRayHashTableGetSize(symtab->hash_table); | 111 return XRayHashTableGetSize(symtab->hash_table); |
| 106 } | 112 } |
| 107 | 113 |
| 108 | 114 |
| 109 struct XRaySymbol* XRaySymbolTableAtIndex(struct XRaySymbolTable* symtab, | 115 struct XRaySymbol* XRaySymbolTableAtIndex(struct XRaySymbolTable* symtab, |
| 110 int i) { | 116 int i) { |
| 111 return (struct XRaySymbol*)XRayHashTableAtIndex(symtab->hash_table, i); | 117 return (struct XRaySymbol*)XRayHashTableAtIndex(symtab->hash_table, i); |
| 112 } | 118 } |
| 113 | 119 |
| 114 | |
| 115 struct XRaySymbol* XRaySymbolTableLookup(struct XRaySymbolTable* symtab, | |
| 116 uint32_t addr) { | |
| 117 void *x = XRayHashTableLookup(symtab->hash_table, addr); | |
| 118 struct XRaySymbol* r = (struct XRaySymbol*)x; | |
| 119 return r; | |
| 120 } | |
| 121 | |
| 122 | |
| 123 struct XRaySymbol* XRaySymbolTableAdd(struct XRaySymbolTable* symtab, | 120 struct XRaySymbol* XRaySymbolTableAdd(struct XRaySymbolTable* symtab, |
| 124 struct XRaySymbol* symbol, | 121 struct XRaySymbol* symbol, |
| 125 uint32_t addr) { | 122 uint32_t addr) { |
| 126 return (struct XRaySymbol*) | 123 return (struct XRaySymbol*) |
| 127 XRayHashTableInsert(symtab->hash_table, symbol, addr); | 124 XRayHashTableInsert(symtab->hash_table, symbol, addr); |
| 128 } | 125 } |
| 129 | 126 |
| 127 struct XRaySymbol* XRaySymbolTableAddByName(struct XRaySymbolTable* symtab, | |
| 128 const char* name, uint32_t addr) { | |
| 129 char* recorded_symbol; | |
| 130 struct XRaySymbol* symbol; | |
| 131 /* copy the symbol name into the string pool */ | |
| 132 recorded_symbol = XRayStringPoolAppend(symtab->string_pool, name); | |
| 133 if (g_symtable_debug) | |
| 134 printf("adding symbol %s\n", recorded_symbol); | |
| 135 /* construct a symbol and put it in the symbol table */ | |
| 136 symbol = XRaySymbolCreate(symtab->symbol_pool, recorded_symbol); | |
| 137 return XRaySymbolTableAdd(symtab, symbol, addr); | |
| 138 } | |
| 139 | |
| 140 struct XRaySymbol* XRaySymbolTableLookup(struct XRaySymbolTable* symtab, | |
| 141 uint32_t addr) { | |
| 142 void *x = XRayHashTableLookup(symtab->hash_table, addr); | |
| 143 struct XRaySymbol* r = (struct XRaySymbol*)x; | |
| 144 #if defined(__GLIBC__) | |
| 145 if (r == NULL) { | |
| 146 Dl_info info; | |
| 147 if (dladdr((const void*)addr, &info) != 0) | |
| 148 if (info.dli_sname) | |
| 149 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
| |
| 150 } | |
| 151 #endif | |
| 152 return r; | |
| 153 } | |
| 130 | 154 |
| 131 struct XRaySymbol* XRaySymbolTableCreateEntry(struct XRaySymbolTable* symtab, | 155 struct XRaySymbol* XRaySymbolTableCreateEntry(struct XRaySymbolTable* symtab, |
| 132 const char* line) { | 156 const char* line) { |
| 133 uint32_t addr; | 157 uint32_t addr; |
| 134 unsigned int uiaddr; | 158 unsigned int uiaddr; |
| 135 char symbol_text[XRAY_LINE_SIZE]; | 159 char symbol_text[XRAY_LINE_SIZE]; |
| 136 char* parsed_symbol; | 160 char* parsed_symbol; |
| 137 char* newln; | 161 char* newln; |
| 138 struct XRaySymbol* symbol; | |
| 139 char* recorded_symbol; | |
| 140 sscanf(line,"%x %s", &uiaddr, symbol_text); | 162 sscanf(line,"%x %s", &uiaddr, symbol_text); |
| 141 if (uiaddr > 0x07FFFFFF) { | 163 if (uiaddr > 0x07FFFFFF) { |
| 142 printf("While parsing the mapfile, XRay encountered:\n"); | 164 printf("While parsing the mapfile, XRay encountered:\n"); |
| 143 printf("%s\n", line); | 165 printf("%s\n", line); |
| 144 printf("XRay only works with code addresses 0x00000000 - 0x07FFFFFF\n"); | 166 printf("XRay only works with code addresses 0x00000000 - 0x07FFFFFF\n"); |
| 145 printf("All functions must reside in this address space.\n"); | 167 printf("All functions must reside in this address space.\n"); |
| 146 exit(-1); | 168 exit(-1); |
| 147 } | 169 } |
| 148 addr = (uint32_t)uiaddr; | 170 addr = (uint32_t)uiaddr; |
| 149 parsed_symbol = strstr(line, symbol_text); | 171 parsed_symbol = strstr(line, symbol_text); |
| 150 newln = strstr(parsed_symbol, "\n"); | 172 newln = strstr(parsed_symbol, "\n"); |
| 151 if (NULL != newln) { | 173 if (NULL != newln) { |
| 152 *newln = 0; | 174 *newln = 0; |
| 153 } | 175 } |
| 154 /* copy the parsed symbol name into the string pool */ | 176 return XRaySymbolTableAddByName(symtab, parsed_symbol, addr); |
| 155 recorded_symbol = XRayStringPoolAppend(symtab->string_pool, parsed_symbol); | |
| 156 if (g_symtable_debug) | |
| 157 printf("adding symbol %s\n", recorded_symbol); | |
| 158 /* construct a symbol and put it in the symbol table */ | |
| 159 symbol = XRaySymbolCreate(symtab->symbol_pool, recorded_symbol); | |
| 160 return XRaySymbolTableAdd(symtab, symbol, addr); | |
| 161 } | 177 } |
| 162 | 178 |
| 163 | 179 |
| 164 void XRaySymbolTableParseMapfile(struct XRaySymbolTable* symtab, | 180 void XRaySymbolTableParseMapfile(struct XRaySymbolTable* symtab, |
| 165 const char* mapfile) | 181 const char* mapfile) |
| 166 { | 182 { |
| 167 FILE* f; | 183 FILE* f; |
| 168 char line[XRAY_LINE_SIZE]; | 184 char line[XRAY_LINE_SIZE]; |
| 169 bool in_text = false; | 185 bool in_text = false; |
| 170 bool in_link_once = false; | 186 bool in_link_once = false; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 238 void XRaySymbolTableFree(struct XRaySymbolTable* symtab) { | 254 void XRaySymbolTableFree(struct XRaySymbolTable* symtab) { |
| 239 XRayStringPoolFree(symtab->string_pool); | 255 XRayStringPoolFree(symtab->string_pool); |
| 240 XRaySymbolPoolFree(symtab->symbol_pool); | 256 XRaySymbolPoolFree(symtab->symbol_pool); |
| 241 XRayHashTableFree(symtab->hash_table); | 257 XRayHashTableFree(symtab->hash_table); |
| 242 symtab->num_symbols = 0; | 258 symtab->num_symbols = 0; |
| 243 XRayFree(symtab); | 259 XRayFree(symtab); |
| 244 } | 260 } |
| 245 | 261 |
| 246 #endif /* XRAY */ | 262 #endif /* XRAY */ |
| 247 | 263 |
| OLD | NEW |