mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-10-08 08:55:46 +00:00
WIP DWARF writer
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
// Copyright (c) Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
internal OBJ *
|
||||
obj_alloc(U64 time_stamp, Arch arch)
|
||||
{
|
||||
Arena *arena = arena_alloc();
|
||||
OBJ *obj = push_array(arena, OBJ, 1);
|
||||
obj->arena = arena;
|
||||
obj->time_stamp = time_stamp;
|
||||
obj->arch = arch;
|
||||
return obj;
|
||||
}
|
||||
|
||||
internal void
|
||||
obj_release(OBJ **obj_ptr)
|
||||
{
|
||||
arena_release((*obj_ptr)->arena);
|
||||
*obj_ptr = 0;
|
||||
}
|
||||
|
||||
internal OBJ_Symbol *
|
||||
obj_push_symbol(OBJ *obj, String8 name, OBJ_SymbolScope scope, OBJ_RefKind ref_kind, void *ref)
|
||||
{
|
||||
OBJ_SymbolNode *n = push_array(obj->arena, OBJ_SymbolNode, 1);
|
||||
SLLQueuePush(obj->symbols.first, obj->symbols.last, n);
|
||||
obj->symbols.count += 1;
|
||||
|
||||
OBJ_Symbol *v = &n->v;
|
||||
v->name = push_str8_copy(obj->arena, name);
|
||||
v->scope = scope;
|
||||
v->ref_kind = ref_kind;
|
||||
v->ref = ref;
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
internal OBJ_Section *
|
||||
obj_push_section(OBJ *obj, String8 name, OBJ_SectionFlags flags)
|
||||
{
|
||||
OBJ_SectionNode *n = push_array(obj->arena, OBJ_SectionNode, 1);
|
||||
SLLQueuePush(obj->sections.first, obj->sections.last, n);
|
||||
obj->sections.count += 1;
|
||||
|
||||
OBJ_Section *v = &n->v;
|
||||
v->name = push_str8_copy(obj->arena, name);
|
||||
v->flags = flags;
|
||||
v->symbol = obj_push_symbol(obj, name, OBJ_SymbolScope_Local, OBJ_RefKind_Section, v);
|
||||
str8_serial_begin(obj->arena, &v->data);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
internal OBJ_Reloc *
|
||||
obj_push_reloc(OBJ *obj, OBJ_Section *sec, OBJ_RelocKind kind, U64 offset, OBJ_Symbol *symbol)
|
||||
{
|
||||
OBJ_RelocNode *n = push_array(obj->arena, OBJ_RelocNode, 1);
|
||||
SLLQueuePush(sec->relocs.first, sec->relocs.last, n);
|
||||
sec->relocs.count += 1;
|
||||
|
||||
OBJ_Reloc *v = &n->v;
|
||||
v->kind = kind;
|
||||
v->offset = offset;
|
||||
v->symbol = symbol;
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
// Copyright (c) Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
#ifndef OBJ_H
|
||||
#define OBJ_H
|
||||
|
||||
typedef enum
|
||||
{
|
||||
OBJ_RefKind_Null,
|
||||
OBJ_RefKind_Section,
|
||||
} OBJ_RefKind;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
OBJ_SymbolScope_Null,
|
||||
OBJ_SymbolScope_Local,
|
||||
OBJ_SymbolScope_Global,
|
||||
} OBJ_SymbolScope;
|
||||
|
||||
typedef struct OBJ_Symbol
|
||||
{
|
||||
String8 name;
|
||||
OBJ_SymbolScope scope;
|
||||
OBJ_RefKind ref_kind;
|
||||
void *ref;
|
||||
} OBJ_Symbol;
|
||||
|
||||
typedef struct OBJ_SymbolNode
|
||||
{
|
||||
OBJ_Symbol v;
|
||||
struct OBJ_SymbolNode *next;
|
||||
} OBJ_SymbolNode;
|
||||
|
||||
typedef struct OBJ_SymbolList
|
||||
{
|
||||
U64 count;
|
||||
OBJ_SymbolNode *first;
|
||||
OBJ_SymbolNode *last;
|
||||
} OBJ_SymbolList;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
OBJ_RelocKind_Null,
|
||||
OBJ_RelocKind_SecRel,
|
||||
} OBJ_RelocKind;
|
||||
|
||||
typedef struct OBJ_Reloc
|
||||
{
|
||||
OBJ_RelocKind kind;
|
||||
U64 offset;
|
||||
OBJ_Symbol *symbol;
|
||||
} OBJ_Reloc;
|
||||
|
||||
typedef struct OBJ_RelocNode
|
||||
{
|
||||
OBJ_Reloc v;
|
||||
struct OBJ_RelocNode *next;
|
||||
} OBJ_RelocNode;
|
||||
|
||||
typedef struct OBJ_RelocList
|
||||
{
|
||||
U64 count;
|
||||
OBJ_RelocNode *first;
|
||||
OBJ_RelocNode *last;
|
||||
} OBJ_RelocList;
|
||||
|
||||
typedef enum OBJ_SectionFlags
|
||||
{
|
||||
OBJ_SectionFlag_Read = (1 << 0),
|
||||
OBJ_SectionFlag_Write = (1 << 1),
|
||||
OBJ_SectionFlag_Exec = (1 << 2),
|
||||
OBJ_SectionFlag_Load = (1 << 3),
|
||||
} OBJ_SectionFlags;
|
||||
|
||||
typedef struct OBJ_Section
|
||||
{
|
||||
String8 name;
|
||||
String8List data;
|
||||
OBJ_SectionFlags flags;
|
||||
OBJ_RelocList relocs;
|
||||
OBJ_Symbol *symbol;
|
||||
} OBJ_Section;
|
||||
|
||||
typedef struct OBJ_SectionNode
|
||||
{
|
||||
OBJ_Section v;
|
||||
struct OBJ_SectionNode *next;
|
||||
} OBJ_SectionNode;
|
||||
|
||||
typedef struct OBJ_SectionList
|
||||
{
|
||||
U64 count;
|
||||
OBJ_SectionNode *first;
|
||||
OBJ_SectionNode *last;
|
||||
} OBJ_SectionList;
|
||||
|
||||
typedef struct OBJ
|
||||
{
|
||||
Arena *arena;
|
||||
U64 time_stamp;
|
||||
Arch arch;
|
||||
OBJ_SectionList sections;
|
||||
OBJ_SymbolList symbols;
|
||||
} OBJ;
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
internal OBJ * obj_alloc(U64 time_stamp, Arch arch);
|
||||
internal void obj_release(OBJ **obj_ptr);
|
||||
internal OBJ_Symbol * obj_push_symbol(OBJ *obj, String8 name, OBJ_SymbolScope scope, OBJ_RefKind ref_kind, void *ref);
|
||||
internal OBJ_Section * obj_push_section(OBJ *obj, String8 name, OBJ_SectionFlags flags);
|
||||
internal OBJ_Reloc * obj_push_reloc(OBJ *obj, OBJ_Section *sec, OBJ_RelocKind kind, U64 offset, OBJ_Symbol *symbol);
|
||||
|
||||
#endif // OBJ_H
|
||||
|
||||
Reference in New Issue
Block a user