generalize machine ops

This commit is contained in:
Nikita Smith committed 2025-12-16 10:40:48 -08:00
1 parent 782f87e512
commit 952afd49a7
7 files changed
+89 -119

No files matched your search

+7 -7
View File
@@ -2,24 +2,24 @@
// Licensed under the MIT license (https://opensource.org/license/mit/)
internal GNU_RDebugInfoList
gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud)
gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, MachineOp_MemRead *mem_read_func, void *mem_read_ud)
{
GNU_RDebugInfoList result = {0};
for (U64 rdebug_vaddr = first_rdebug_vaddr, rdebug_next = 0; rdebug_vaddr != 0; rdebug_vaddr = rdebug_next) {
GNU_RDebugInfo64 rdebug;
if (is_64bit) {
U64 rdebug_read_size = mem_read_func(rdebug_vaddr, sizeof(rdebug), &rdebug, mem_read_ud);
U64 rdebug_read_size = mem_read_func(rdebug_vaddr, &rdebug, sizeof(rdebug),mem_read_ud);
if (rdebug_read_size != sizeof(rdebug)) { goto exit; }
} else {
GNU_RDebugInfo32 rdebug32;
U64 rdebug_read_size = mem_read_func(rdebug_vaddr, sizeof(rdebug32), &rdebug32, mem_read_ud);
U64 rdebug_read_size = mem_read_func(rdebug_vaddr, &rdebug32, sizeof(rdebug32), mem_read_ud);
if (rdebug_read_size != sizeof(rdebug32)) { goto exit; }
}
if (rdebug.r_version < 1) { goto exit; }
if (rdebug.r_version > 1) {
U64 r_next_size = mem_read_func(rdebug_vaddr + sizeof(rdebug), sizeof(rdebug_next), &rdebug_next, mem_read_ud);
U64 r_next_size = mem_read_func(rdebug_vaddr + sizeof(rdebug), &rdebug_next, sizeof(rdebug_next), mem_read_ud);
if (r_next_size != sizeof(rdebug_next)) { goto exit; }
}
@@ -34,18 +34,18 @@ gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead
}
internal GNU_LinkMapList
gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud)
gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, MachineOp_MemRead *mem_read_func, void *mem_read_ud)
{
GNU_LinkMapList result = {0};
GNU_LinkMap64 link_map = {0};
for (U64 link_map_vaddr = first_link_map_vaddr; link_map_vaddr != 0; link_map_vaddr = link_map.next_vaddr) {
if (is_64bit) {
U64 link_map_size = mem_read_func(link_map_vaddr, sizeof(link_map), &link_map, mem_read_ud);
U64 link_map_size = mem_read_func(link_map_vaddr, &link_map, sizeof(link_map), mem_read_ud);
if (link_map_size != sizeof(link_map)) { goto exit; }
} else {
GNU_LinkMap32 link_map32 = {0};
U64 link_map_size = mem_read_func(link_map_vaddr, sizeof(link_map32), &link_map32, mem_read_ud);
U64 link_map_size = mem_read_func(link_map_vaddr, &link_map32, sizeof(link_map32), mem_read_ud);
if (link_map_size != sizeof(link_map32)) { goto exit; }
gnu_linkmap64_from_linkmap32(link_map32);
}
+3 -5
View File
@@ -30,12 +30,10 @@ typedef struct GNU_RDebugInfoList
GNU_RDebugInfoNode *last;
} GNU_RDebugInfoList;
#define GNU_MEM_READ(name) U64 name(U64 addr, U64 size, void *buffer, void *ud)
typedef GNU_MEM_READ(GNU_MemRead);
////////////////////////////////
internal GNU_RDebugInfoList gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud);
internal GNU_LinkMapList gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud);
internal GNU_RDebugInfoList gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, MachineOp_MemRead *mem_read_func, void *mem_read_ud);
internal GNU_LinkMapList gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, MachineOp_MemRead *mem_read_func, void *mem_read_ud);
#endif