mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-10-14 04:49:41 -07:00
major clean-up pass over unwinding/module-info abstraction, + usage in the debug engine. simplified / cleaned up DWARF helpers for unwind info & expressions. decoupling unwinding / DWARF evaluation from memory read callbacks. light module info now prepared by demon layer - debug engine no longer duplicates per-backend parsing. unwind abstraction layer now does thin abstraction over unwinding backends, debug engine only calls abstraction. clean up demon to have fewer ad-hoc 'queries' on handles, and prefer sending info over debug events when possible / when it fits the usage pattern. move DWARF enum specifications to metacode, generate enums/xlists/tables/etc. decouple raddbg/radbin completely from old parsing helpers. replace portion of DWARF dumping; pull out some new parsing helpers from converter / dumper.
This commit is contained in:
1 parent
541d3afefa
commit
d73ce364b9
88 files changed
+9899
-4723
No files matched your search
@@ -13,6 +13,7 @@
|
||||
#include "base_arena.c"
|
||||
#include "base_math.c"
|
||||
#include "base_strings.c"
|
||||
#include "base_memory_map.c"
|
||||
#include "base_hash.c"
|
||||
#include "base_system.c"
|
||||
#include "base_threads.c"
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "base_arena.h"
|
||||
#include "base_math.h"
|
||||
#include "base_strings.h"
|
||||
#include "base_memory_map.h"
|
||||
#include "base_hash.h"
|
||||
#include "base_system.h"
|
||||
#include "base_threads.h"
|
||||
|
||||
@@ -4,12 +4,6 @@
|
||||
#ifndef BASE_MEMORY_H
|
||||
#define BASE_MEMORY_H
|
||||
|
||||
typedef struct SharedMemory SharedMemory;
|
||||
struct SharedMemory
|
||||
{
|
||||
U64 u64[1];
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: @per_os_impl Platform Memory Allocation
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
// Copyright (c) Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Memory Map Functions
|
||||
|
||||
internal void
|
||||
memory_map_push(Arena *arena, MemoryMap *map, Rng1U64 vaddr_range, void *data)
|
||||
{
|
||||
MemoryMapRangeNode *n = push_array(arena, MemoryMapRangeNode, 1);
|
||||
n->v.vaddr_range = vaddr_range;
|
||||
n->v.base = data;
|
||||
SLLQueuePush(map->first_range, map->last_range, n);
|
||||
}
|
||||
|
||||
internal U64
|
||||
memory_map_read(MemoryMap *map, Rng1U64 range, void *dst)
|
||||
{
|
||||
U64 dst_vaddr = range.min;
|
||||
{
|
||||
for(MemoryMapRangeNode *n = map->first_range; n != 0; n = n->next)
|
||||
{
|
||||
if(contains_1u64(n->v.vaddr_range, dst_vaddr))
|
||||
{
|
||||
U64 src_off = dst_vaddr - n->v.vaddr_range.min;
|
||||
U64 num_bytes_possible = n->v.vaddr_range.max - dst_vaddr;
|
||||
U64 num_bytes_needed = range.max - dst_vaddr;
|
||||
U64 num_bytes_to_read = Min(num_bytes_needed, num_bytes_possible);
|
||||
MemoryCopy((U8 *)dst + (dst_vaddr - range.min), (U8 *)n->v.base + src_off, num_bytes_to_read);
|
||||
dst_vaddr += num_bytes_to_read;
|
||||
}
|
||||
}
|
||||
}
|
||||
U64 bytes_read = (dst_vaddr - range.min);
|
||||
return bytes_read;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
// Copyright (c) Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
#ifndef BASE_MEMORY_MAP_H
|
||||
#define BASE_MEMORY_MAP_H
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Memory Map Types
|
||||
|
||||
typedef struct MemoryMapRange MemoryMapRange;
|
||||
struct MemoryMapRange
|
||||
{
|
||||
Rng1U64 vaddr_range;
|
||||
void *base;
|
||||
};
|
||||
|
||||
typedef struct MemoryMapRangeNode MemoryMapRangeNode;
|
||||
struct MemoryMapRangeNode
|
||||
{
|
||||
MemoryMapRangeNode *next;
|
||||
MemoryMapRange v;
|
||||
};
|
||||
|
||||
typedef struct MemoryMap MemoryMap;
|
||||
struct MemoryMap
|
||||
{
|
||||
MemoryMapRangeNode *first_range;
|
||||
MemoryMapRangeNode *last_range;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Memory Map Functions
|
||||
|
||||
internal void memory_map_push(Arena *arena, MemoryMap *map, Rng1U64 vaddr_range, void *data);
|
||||
internal U64 memory_map_read(MemoryMap *map, Rng1U64 range, void *dst);
|
||||
#define memory_map_read_struct(map, vaddr, ptr) memory_map_read((map), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
|
||||
|
||||
#endif // BASE_MEMORY_MAP_H
|
||||
@@ -4,8 +4,14 @@
|
||||
#ifndef BASE_SHARED_MEMORY_H
|
||||
#define BASE_SHARED_MEMORY_H
|
||||
|
||||
typedef struct SharedMemory SharedMemory;
|
||||
struct SharedMemory
|
||||
{
|
||||
U64 u64[1];
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: @os_hooks Shared Memory
|
||||
//~ rjf: @per_os_impl Shared Memory
|
||||
|
||||
internal SharedMemory shared_memory_alloc(U64 size, String8 name);
|
||||
internal SharedMemory shared_memory_open(String8 name);
|
||||
|
||||
+72
-27
@@ -1476,7 +1476,7 @@ str8_from_version(Arena *arena, U64 version)
|
||||
//~ rjf: String Path Helpers
|
||||
|
||||
internal String8
|
||||
default_exe_name_suffix_from_os(OperatingSystem os)
|
||||
program_ext_postfix_from_os(OperatingSystem os, B32 require_ext)
|
||||
{
|
||||
String8 result = {0};
|
||||
switch(os)
|
||||
@@ -1486,36 +1486,15 @@ default_exe_name_suffix_from_os(OperatingSystem os)
|
||||
{
|
||||
result = s(".exe");
|
||||
}break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal String8
|
||||
program_data_folder_prefix_from_os(OperatingSystem os)
|
||||
{
|
||||
String8 result = {0};
|
||||
switch(os)
|
||||
{
|
||||
default:{}break;
|
||||
case OperatingSystem_Linux:
|
||||
case OperatingSystem_Mac:
|
||||
if(require_ext)
|
||||
{
|
||||
result = s(".");
|
||||
result = s(".elf");
|
||||
}break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal String8
|
||||
program_ext_postfix_from_os(OperatingSystem os)
|
||||
{
|
||||
String8 result = {0};
|
||||
switch(os)
|
||||
{
|
||||
default:{}break;
|
||||
case OperatingSystem_Windows:
|
||||
case OperatingSystem_Mac:
|
||||
if(require_ext)
|
||||
{
|
||||
result = s(".exe");
|
||||
result = s(".macho");
|
||||
}break;
|
||||
}
|
||||
return result;
|
||||
@@ -3038,6 +3017,72 @@ str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out)
|
||||
return block_out->size;
|
||||
}
|
||||
|
||||
internal U64
|
||||
str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out)
|
||||
{
|
||||
U64 value = 0;
|
||||
U64 shift = 0;
|
||||
U64 cursor = off;
|
||||
for(;;)
|
||||
{
|
||||
U8 byte = 0;
|
||||
U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte);
|
||||
if(bytes_read != sizeof(byte))
|
||||
{
|
||||
break;
|
||||
}
|
||||
U8 val = byte & 0x7fu;
|
||||
value |= ((U64)val) << shift;
|
||||
cursor += bytes_read;
|
||||
shift += 7u;
|
||||
if((byte & 0x80u) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(value_out != 0)
|
||||
{
|
||||
*value_out = value;
|
||||
}
|
||||
U64 bytes_read = cursor - off;
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
internal U64
|
||||
str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out)
|
||||
{
|
||||
U64 value = 0;
|
||||
U64 shift = 0;
|
||||
U64 cursor = off;
|
||||
for(;;)
|
||||
{
|
||||
U8 byte;
|
||||
U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte);
|
||||
if(bytes_read != sizeof(byte))
|
||||
{
|
||||
break;
|
||||
}
|
||||
U8 val = byte & 0x7fu;
|
||||
value |= ((U64)val) << shift;
|
||||
cursor += bytes_read;
|
||||
shift += 7u;
|
||||
if((byte & 0x80u) == 0)
|
||||
{
|
||||
if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0)
|
||||
{
|
||||
value |= -(S64)(1ull << shift);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(value_out != 0)
|
||||
{
|
||||
*value_out = value;
|
||||
}
|
||||
U64 bytes_read = cursor - off;
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
internal int
|
||||
|
||||
@@ -323,9 +323,7 @@ g_path_style_map[] =
|
||||
{ str8_lit_comp("system"), PathStyle_SystemAbsolute },
|
||||
};
|
||||
|
||||
internal String8 default_exe_name_suffix_from_os(OperatingSystem os);
|
||||
internal String8 program_data_folder_prefix_from_os(OperatingSystem os);
|
||||
internal String8 program_ext_postfix_from_os(OperatingSystem os);
|
||||
internal String8 program_ext_postfix_from_os(OperatingSystem os, B32 require_ext);
|
||||
|
||||
internal String8 str8_chop_last_slash(String8 string);
|
||||
internal String8 str8_skip_last_slash(String8 string);
|
||||
@@ -457,6 +455,8 @@ internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 of
|
||||
internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out);
|
||||
#define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr)))
|
||||
#define str8_deserial_read_struct(string, off, ptr) str8_deserial_read_array(string, off, ptr, 1)
|
||||
internal U64 str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out);
|
||||
internal U64 str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out);
|
||||
|
||||
////////////////////////////////
|
||||
//~ string buffer
|
||||
|
||||
Reference in new issue
Block a user