Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: native_client_sdk/src/libraries/xray/symtable.c

Issue 18120003: Update XRay to support x86-64 (RDTSC), use dladdr() as an optional way to (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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);
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
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
OLDNEW
« no previous file with comments | « native_client_sdk/src/libraries/xray/library.dsc ('k') | native_client_sdk/src/libraries/xray/xray.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698