about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-12-18 15:11:09 +0800
committerGitHub <noreply@github.com>2024-12-18 08:11:09 +0100
commit47f5fe7caf92ed5b96b8d6b3e34a098bc6c2643a (patch)
treea0e24c61b2996c11a37ae17abeca1bcfe0cb9166 /src
parent6e0f32f4ca4b35bda036caa6ad3abcae4ae64cdc (diff)
downloadbox64-47f5fe7caf92ed5b96b8d6b3e34a098bc6c2643a.tar.gz
box64-47f5fe7caf92ed5b96b8d6b3e34a098bc6c2643a.zip
[GDBJIT] Show x64pc in gdb, also added documentation (#2163)
* [GDBJIT] Show x64pc in gdb

* Add env. variable and documentation

* typo

* oops
Diffstat (limited to 'src')
-rw-r--r--src/core.c11
-rw-r--r--src/dynarec/dynarec_native.c2
-rw-r--r--src/include/gdbjit.h7
-rw-r--r--src/tools/gdbjit.c3
4 files changed, 17 insertions, 6 deletions
diff --git a/src/core.c b/src/core.c
index ddb83ce2..5d7666b6 100644
--- a/src/core.c
+++ b/src/core.c
@@ -72,7 +72,6 @@ int box64_rdtsc_1ghz = 0;
 uint8_t box64_rdtsc_shift = 0;
 char* box64_insert_args = NULL;
 char* box64_new_args = NULL;
-int box64_dynarec_gdbjit = 1;
 #ifdef DYNAREC
 int box64_dynarec = 1;
 int box64_dynarec_dump = 0;
@@ -98,6 +97,7 @@ uintptr_t box64_nodynarec_start = 0;
 uintptr_t box64_nodynarec_end = 0;
 uintptr_t box64_dynarec_test_start = 0;
 uintptr_t box64_dynarec_test_end = 0;
+int box64_dynarec_gdbjit = 0;
 #ifdef ARM64
 int arm64_asimd = 0;
 int arm64_aes = 0;
@@ -901,6 +901,15 @@ void LoadLogEnv()
         if(!box64_dynarec_wait)
             printf_log(LOG_INFO, "Dynarec will not wait for FillBlock to ready and use Interpreter instead\n");
     }
+    p = getenv("BOX64_DYNAREC_GDBJIT");
+    if(p) {
+        if(strlen(p)==1) {
+            if(p[0]>='0' && p[0]<='1')
+                box64_dynarec_gdbjit = p[0]-'0';
+        }
+        if(box64_dynarec_gdbjit)
+            printf_log(LOG_INFO, "Dynarec will generate debuginfo for gdbjit\n");
+    }
     p = getenv("BOX64_DYNAREC_ALIGNED_ATOMICS");
     if(p) {
         if(strlen(p)==1) {
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c
index 011815bc..3b761a19 100644
--- a/src/dynarec/dynarec_native.c
+++ b/src/dynarec/dynarec_native.c
@@ -754,7 +754,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
         dynarec_log(LOG_NONE, "%s\n", (box64_dynarec_dump>1)?"\e[m":"");
     }
     if (box64_dynarec_gdbjit) {
-        GdbJITNewBlock(helper.gdbjit_block, (GDB_CORE_ADDR)block->actual_block, (GDB_CORE_ADDR)block->actual_block + native_size);
+        GdbJITNewBlock(helper.gdbjit_block, (GDB_CORE_ADDR)block->actual_block, (GDB_CORE_ADDR)block->actual_block + native_size, helper.start);
     }
     int oldtable64size = helper.table64size;
     size_t oldnativesize = helper.native_size;
diff --git a/src/include/gdbjit.h b/src/include/gdbjit.h
index 70405d3e..40f1ad58 100644
--- a/src/include/gdbjit.h
+++ b/src/include/gdbjit.h
@@ -11,19 +11,20 @@ typedef struct gdbjit_block_s {
     FILE* file;
     GDB_CORE_ADDR start;
     GDB_CORE_ADDR end;
-    uintptr_t alloced;
+    uintptr_t x64start;
+    size_t alloced;
     size_t nlines;
     struct gdb_line_mapping lines[0];
 } gdbjit_block_t;
 
 
-void GdbJITNewBlock(gdbjit_block_t* block, GDB_CORE_ADDR start, GDB_CORE_ADDR end);
+void GdbJITNewBlock(gdbjit_block_t* block, GDB_CORE_ADDR start, GDB_CORE_ADDR end, uintptr_t x64start);
 gdbjit_block_t* GdbJITBlockAddLine(gdbjit_block_t* block, GDB_CORE_ADDR addr, const char* line);
 void GdbJITBlockReady(gdbjit_block_t* block);
 
 #else
 
-#define GdbJITNewBlock(a, b, c)
+#define GdbJITNewBlock(a, b, c, d)
 #define GdbJITBlockAddLine(a, b, c) NULL
 #define GdbJITBlockReady(a)
 
diff --git a/src/tools/gdbjit.c b/src/tools/gdbjit.c
index d91c4c05..baf45fe6 100644
--- a/src/tools/gdbjit.c
+++ b/src/tools/gdbjit.c
@@ -46,7 +46,7 @@ gdbjit_descriptor_t __jit_debug_descriptor = { 1, GDBJIT_NOACTION, NULL, NULL };
 
 /* --------------------------------------------------------------------------- */
 
-void GdbJITNewBlock(gdbjit_block_t* block, GDB_CORE_ADDR start, GDB_CORE_ADDR end)
+void GdbJITNewBlock(gdbjit_block_t* block, GDB_CORE_ADDR start, GDB_CORE_ADDR end, uintptr_t x64start)
 {
     if (!block)
         return;
@@ -59,6 +59,7 @@ void GdbJITNewBlock(gdbjit_block_t* block, GDB_CORE_ADDR start, GDB_CORE_ADDR en
 
     block->start = start;
     block->end = end;
+    block->x64start = x64start;
     block->alloced = block->nlines = 0;
 }