u_debug_symbol.c revision 6c1fcf85838a4aa76bcb9f9ceb312f1772f1122e
15ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul/************************************************************************** 25ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul * 35ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul * Copyright 2009 VMware, Inc. 4bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * All Rights Reserved. 55ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul * 65ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 7bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * copy of this software and associated documentation files (the 83584a44270a7f3a04e187bd79b5373314514d383Dave Airlie * "Software"), to deal in the Software without restriction, including 9625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs * without limitation the rights to use, copy, modify, merge, publish, 10625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs * distribute, sub license, and/or sell copies of the Software, and to 11bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * permit persons to whom the Software is furnished to do so, subject to 12bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * the following conditions: 13bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * 14bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * The above copyright notice and this permission notice (including the 15bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * next paragraph) shall be included in all copies or substantial portions 16bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * of the Software. 17bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * 18bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * 26bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs **************************************************************************/ 27bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 28bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs/** 29bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * @file 30bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * Symbol lookup. 31bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * 32bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * @author Jose Fonseca <jfonseca@vmware.com> 33bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs */ 34bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 35bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "pipe/p_compiler.h" 3685dcc070719ef6a6bcf65dc4996b1733f63912d8Younes Manton#include "os/os_thread.h" 37bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "u_string.h" 38bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 39bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "u_debug.h" 40bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "u_debug_symbol.h" 41bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "u_hash_table.h" 42bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 43bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#if defined(PIPE_OS_WINDOWS) && defined(PIPE_ARCH_X86) 44bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 45bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include <windows.h> 46bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include <stddef.h> 47bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 48bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "dbghelp.h" 49bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 50bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 51bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic BOOL bSymInitialized = FALSE; 52bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 53bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic HMODULE hModule_Dbghelp = NULL; 54bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 55bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 56bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic 57bc466be695913cd504cefddd857ac1cefda87a04Ben SkeggsFARPROC WINAPI __GetProcAddress(LPCSTR lpProcName) 586af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs{ 59bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#ifdef PIPE_CC_GCC 60bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if (!hModule_Dbghelp) { 61bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs /* 62bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * bfdhelp.dll is a dbghelp.dll look-alike replacement, which is able to 63bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * understand MinGW symbols using BFD library. It is available from 64bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * http://people.freedesktop.org/~jrfonseca/bfdhelp/ for now. 65bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs */ 66bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs hModule_Dbghelp = LoadLibraryA("bfdhelp.dll"); 67bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs } 68bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#endif 69bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 70bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if (!hModule_Dbghelp) { 71bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs hModule_Dbghelp = LoadLibraryA("dbghelp.dll"); 72bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if (!hModule_Dbghelp) { 73bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return NULL; 74bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs } 75bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs } 76bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 77bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return GetProcAddress(hModule_Dbghelp, lpProcName); 78bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 79bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 80bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 816af75a0ff47acfe1e51c93637045affb770f00abBen Skeggstypedef BOOL (WINAPI *PFNSYMINITIALIZE)(HANDLE, LPSTR, BOOL); 826af75a0ff47acfe1e51c93637045affb770f00abBen Skeggsstatic PFNSYMINITIALIZE pfnSymInitialize = NULL; 836af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs 84bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic 85bc466be695913cd504cefddd857ac1cefda87a04Ben SkeggsBOOL WINAPI j_SymInitialize(HANDLE hProcess, PSTR UserSearchPath, BOOL fInvadeProcess) 86bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 876af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs if( 886af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs (pfnSymInitialize || (pfnSymInitialize = (PFNSYMINITIALIZE) __GetProcAddress("SymInitialize"))) 89bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs ) 90bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return pfnSymInitialize(hProcess, UserSearchPath, fInvadeProcess); 91bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs else 92bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return FALSE; 93bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 94bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 95bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggstypedef DWORD (WINAPI *PFNSYMSETOPTIONS)(DWORD); 96bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic PFNSYMSETOPTIONS pfnSymSetOptions = NULL; 97bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 98bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic 99bc466be695913cd504cefddd857ac1cefda87a04Ben SkeggsDWORD WINAPI j_SymSetOptions(DWORD SymOptions) 100bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 101bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if( 102bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs (pfnSymSetOptions || (pfnSymSetOptions = (PFNSYMSETOPTIONS) __GetProcAddress("SymSetOptions"))) 103bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs ) 104bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return pfnSymSetOptions(SymOptions); 105bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs else 106bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return FALSE; 107bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 108bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 109bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggstypedef BOOL (WINAPI *PFNSYMGETSYMFROMADDR)(HANDLE, DWORD64, PDWORD64, PSYMBOL_INFO); 110bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic PFNSYMGETSYMFROMADDR pfnSymFromAddr = NULL; 111bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 112bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic 113bc466be695913cd504cefddd857ac1cefda87a04Ben SkeggsBOOL WINAPI j_SymFromAddr(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFO Symbol) 114bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 115bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if( 116bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs (pfnSymFromAddr || (pfnSymFromAddr = (PFNSYMGETSYMFROMADDR) __GetProcAddress("SymFromAddr"))) 117bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs ) 118bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return pfnSymFromAddr(hProcess, Address, Displacement, Symbol); 119bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs else 120bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return FALSE; 121bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 122bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 123bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 124bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic INLINE void 125bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsdebug_symbol_name_dbghelp(const void *addr, char* buf, unsigned size) 126bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 127bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs HANDLE hProcess; 128bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs BYTE symbolBuffer[1024]; 129bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs PSYMBOL_INFO pSymbol = (PSYMBOL_INFO) symbolBuffer; 130bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs DWORD64 dwDisplacement = 0; /* Displacement of the input address, relative to the start of the symbol */ 131bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 132bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs hProcess = GetCurrentProcess(); 133bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 134c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis memset(pSymbol, 0, sizeof *pSymbol); 135bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs pSymbol->SizeOfStruct = sizeof(symbolBuffer); 136bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs pSymbol->MaxNameLen = sizeof(symbolBuffer) - offsetof(SYMBOL_INFO, Name); 137c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis 138c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis if(!bSymInitialized) { 139c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis j_SymSetOptions(/* SYMOPT_UNDNAME | */ SYMOPT_LOAD_LINES); 140c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis if(j_SymInitialize(hProcess, NULL, TRUE)) 141c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis bSymInitialized = TRUE; 142c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis } 143c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis 144c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis if(!j_SymFromAddr(hProcess, (DWORD64)(uintptr_t)addr, &dwDisplacement, pSymbol)) 145c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis buf[0] = 0; 146bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs else 147bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs { 148bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs strncpy(buf, pSymbol->Name, size); 149bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs buf[size - 1] = 0; 150bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs } 151bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 152bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#endif 153bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 154bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#ifdef __GLIBC__ 155bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include <execinfo.h> 156bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 157bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs/* This can only provide dynamic symbols, or binary offsets into a file. 158bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * 159bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs * To fix this, post-process the output with tools/addr2line.sh 160c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis */ 161625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggsstatic INLINE void 162bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsdebug_symbol_name_glibc(const void *addr, char* buf, unsigned size) 163bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 164c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis char** syms = backtrace_symbols((void**)&addr, 1); 165c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis strncpy(buf, syms[0], size); 166c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis buf[size - 1] = 0; 167c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis free(syms); 168c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis} 169c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis#endif 170c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis 171c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuisvoid 172c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuisdebug_symbol_name(const void *addr, char* buf, unsigned size) 173625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs{ 174bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#if defined(PIPE_OS_WINDOWS) && defined(PIPE_ARCH_X86) 175c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis debug_symbol_name_dbghelp(addr, buf, size); 176625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs if(buf[0]) 177625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs return; 178bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#endif 179bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 180bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#ifdef __GLIBC__ 18136705ee044681da9899d0950c22ae7baa10c3d33Ben Skeggs debug_symbol_name_glibc(addr, buf, size); 182bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if(buf[0]) 183bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return; 184bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#endif 185bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 186bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs util_snprintf(buf, size, "%p", addr); 187bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs buf[size - 1] = 0; 188bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 189bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 190bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsvoid 191bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsdebug_symbol_print(const void *addr) 192bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 193bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs char buf[1024]; 194bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs debug_symbol_name(addr, buf, sizeof(buf)); 195bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs debug_printf("\t%s\n", buf); 196bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 197bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 198bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstruct util_hash_table* symbols_hash; 199bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggspipe_mutex symbols_mutex; 200bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 201bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic unsigned hash_ptr(void* p) 202bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 203bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return (unsigned)(uintptr_t)p; 204bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 205bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 206bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic int compare_ptr(void* a, void* b) 207bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 208bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if(a == b) 209bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return 0; 210bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs else if(a < b) 211bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return -1; 212bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs else 213bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return 1; 214bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 215bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 216bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsconst char* 217bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsdebug_symbol_name_cached(const void *addr) 218bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{ 219bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs const char* name; 220bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs pipe_mutex_lock(symbols_mutex); 221bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if(!symbols_hash) 222bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs symbols_hash = util_hash_table_create(hash_ptr, compare_ptr); 223bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs name = util_hash_table_get(symbols_hash, (void*)addr); 224bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs if(!name) 225bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs { 226bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs char buf[1024]; 227bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs debug_symbol_name(addr, buf, sizeof(buf)); 228bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs name = strdup(buf); 229bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs 230bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs util_hash_table_set(symbols_hash, (void*)addr, (void*)name); 231bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs } 232bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs pipe_mutex_unlock(symbols_mutex); 233bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs return name; 234bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs} 235bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs