about summary refs log tree commit diff stats
path: root/src/tools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-10 18:02:21 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-10 18:02:21 +0100
commit02161dc4d761cf209095b614534db908a140384a (patch)
tree5c1684fba444768e3a5ac528474529e69e03d18f /src/tools
parenta62f6860247b57b3a27500cd88c9d42e388a782b (diff)
downloadbox64-02161dc4d761cf209095b614534db908a140384a.tar.gz
box64-02161dc4d761cf209095b614534db908a140384a.zip
Better functions name resolving when using TRACE, and fixed some printf stuff again
Diffstat (limited to 'src/tools')
-rwxr-xr-xsrc/tools/bridge.c61
1 files changed, 57 insertions, 4 deletions
diff --git a/src/tools/bridge.c b/src/tools/bridge.c
index 76eb20b2..3724e0b3 100755
--- a/src/tools/bridge.c
+++ b/src/tools/bridge.c
@@ -70,7 +70,11 @@ void FreeBridge(bridge_t** bridge)
     *bridge = NULL;
 }
 
-uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N)
+#ifdef HAVE_TRACE
+void addBridgeName(void* addr, const char* name);
+#endif
+
+uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name)
 {
     pthread_mutex_lock(&bridge->mutex);
     brick_t *b = bridge->last;
@@ -103,6 +107,10 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N)
     khint_t k = kh_put(bridgemap, bridge->bridgemap, (uintptr_t)fnc, &ret);
     kh_value(bridge->bridgemap, k) = (uintptr_t)&b->b[b->sz].CC;
     pthread_mutex_unlock(&bridge->mutex);
+    #ifdef HAVE_TRACE
+    if(name)
+        addBridgeName(fnc, name);
+    #endif
 
     return (uintptr_t)&b->b[b->sz++].CC;
 }
@@ -116,13 +124,13 @@ uintptr_t CheckBridged(bridge_t* bridge, void* fnc)
     return kh_value(bridge->bridgemap, k);
 }
 
-uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N)
+uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name)
 {
     if(!fnc && w)
         return 0;
     uintptr_t ret = CheckBridged(bridge, fnc);
     if(!ret)
-        ret = AddBridge(bridge, w, fnc, N);
+        ret = AddBridge(bridge, w, fnc, N, name);
     return ret;
 }
 
@@ -132,7 +140,7 @@ uintptr_t AddAutomaticBridge(x64emu_t* emu, bridge_t* bridge, wrapper_t w, void*
         return 0;
     uintptr_t ret = CheckBridged(bridge, fnc);
     if(!ret)
-        ret = AddBridge(bridge, w, fnc, N);
+        ret = AddBridge(bridge, w, fnc, N, NULL);
     if(!hasAlternate(fnc)) {
         printf_log(LOG_DEBUG, "Adding AutomaticBridge for %p to %p\n", fnc, (void*)ret);
         addAlternate(fnc, (void*)ret);
@@ -180,6 +188,36 @@ void* GetNativeFncOrFnc(uintptr_t fnc)
     return (void*)b->f;
 }
 
+#ifdef HAVE_TRACE
+KHASH_MAP_INIT_INT64(bridgename, const char*)
+static kh_bridgename_t *bridgename;
+void initBridgeName()
+{
+    bridgename = kh_init(bridgename);
+}
+void finiBridgeName()
+{
+    kh_destroy(bridgename, bridgename);
+    bridgename = NULL;
+}
+void addBridgeName(void* addr, const char* name)
+{
+    int ret;
+    khint_t k = kh_put(bridgename, bridgename, (uintptr_t)addr, &ret);
+    if(!ret) // already there
+        return;
+    kh_value(bridgename, k) = name;
+}
+const char* getBridgeName(void* addr)
+{
+    khint_t k = kh_get(bridgename, bridgename, (uintptr_t)addr);
+    if(k!=kh_end(bridgename))
+        return kh_value(bridgename, k);
+    return NULL;
+}
+#endif
+
+
 // Alternate address handling
 KHASH_MAP_INIT_INT64(alternate, void*)
 static kh_alternate_t *my_alternates = NULL;
@@ -218,3 +256,18 @@ void cleanAlternate() {
         my_alternates = NULL;
     }
 }
+
+void init_bridge_helper()
+{
+    #ifdef HAVE_TRACE
+    initBridgeName();
+    #endif
+}
+
+void fini_bridge_helper()
+{
+    cleanAlternate();
+    #ifdef HAVE_TRACE
+    finiBridgeName();
+    #endif
+}