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 |