Files
raddebugger/src/obj/obj.h
T
2026-02-10 23:57:43 -08:00

116 lines
2.3 KiB
C

// 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