diff options
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/env.c | 22 | ||||
| -rw-r--r-- | src/tools/gdbjit.c | 16 |
2 files changed, 29 insertions, 9 deletions
diff --git a/src/tools/env.c b/src/tools/env.c index e1840f29..c41d9b42 100644 --- a/src/tools/env.c +++ b/src/tools/env.c @@ -127,6 +127,28 @@ static void applyCustomRules() } } + if (box64env.is_dynarec_gdbjit_str_overridden) { + if (strlen(box64env.dynarec_gdbjit_str) == 1) { + if (box64env.dynarec_gdbjit_str[0] >= '0' && box64env.dynarec_gdbjit_str[0] <= '2') + box64env.dynarec_gdbjit = box64env.dynarec_gdbjit_str[0] - '0'; + + box64env.dynarec_gdbjit_start = 0x0; + box64env.dynarec_gdbjit_end = 0x0; + } else if (strchr(box64env.dynarec_gdbjit_str, '-')) { + if (sscanf(box64env.dynarec_gdbjit_str, "%ld-%ld", &box64env.dynarec_gdbjit_start, &box64env.dynarec_gdbjit_end) != 2) { + if (sscanf(box64env.dynarec_gdbjit_str, "0x%lX-0x%lX", &box64env.dynarec_gdbjit_start, &box64env.dynarec_gdbjit_end) != 2) { + if (sscanf(box64env.dynarec_gdbjit_str, "0x%lx-0x%lx", &box64env.dynarec_gdbjit_start, &box64env.dynarec_gdbjit_end) != 2) + sscanf(box64env.dynarec_gdbjit_str, "%lx-%lx", &box64env.dynarec_gdbjit_start, &box64env.dynarec_gdbjit_end); + } + } + if (box64env.dynarec_gdbjit_end > box64env.dynarec_gdbjit_start) { + box64env.dynarec_gdbjit = 2; + } else { + box64env.dynarec_gdbjit = 0; + } + } + } + if (box64env.is_nodynarec_overridden) { if(box64env.nodynarec) { if (strchr(box64env.nodynarec,'-')) { diff --git a/src/tools/gdbjit.c b/src/tools/gdbjit.c index 07731e9f..5813f562 100644 --- a/src/tools/gdbjit.c +++ b/src/tools/gdbjit.c @@ -48,9 +48,9 @@ EXPORT gdbjit_descriptor_t __jit_debug_descriptor = { 1, GDBJIT_NOACTION, NULL, void GdbJITNewBlock(gdbjit_block_t* block, GDB_CORE_ADDR start, GDB_CORE_ADDR end, uintptr_t x64start) { - if (!block) - return; + if (!block) return; + size_t alloced = block->alloced; memset(block, 0, sizeof(gdbjit_block_t)); strcpy(block->filename, "/tmp/box64gdbjit-XXXXXX.S"); @@ -60,13 +60,13 @@ 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; + block->alloced = alloced; + block->nlines = 0; } static size_t GdbJITLinesAvailable(gdbjit_block_t* block) { - if (!block) - return 0; + if (!block) return 0; return block->alloced > block->nlines; } @@ -88,10 +88,10 @@ static gdbjit_block_t* GdbJITMakeRoom(gdbjit_block_t* block) gdbjit_block_t* GdbJITBlockAddLine(gdbjit_block_t* block, GDB_CORE_ADDR addr, const char* line) { + if (!block || !block->file) return NULL; + block->nlines++; block = GdbJITMakeRoom(block); - if (!block) return NULL; - block->lines[block->nlines-1].pc = addr; block->lines[block->nlines-1].line = block->nlines; fprintf(block->file, "%s\n", line); @@ -104,14 +104,12 @@ void GdbJITBlockReady(gdbjit_block_t* block) if (block->nlines == 0) { fclose(block->file); - box_free(block); return; } gdbjit_code_entry_t* entry = (gdbjit_code_entry_t*)box_malloc(sizeof(gdbjit_code_entry_t)); if (!entry) { fclose(block->file); - box_free(block); return; } |