switched to using base Arch enum for converting DWARF registers,

simplified top level building path
This commit is contained in:
Nikita Smith
2025-03-27 11:12:48 -07:00
parent dc967f5274
commit 53c889e5d3
10 changed files with 87 additions and 90 deletions
+10 -10
View File
@@ -2,7 +2,7 @@
// Licensed under the MIT license (https://opensource.org/license/mit/)
internal U64
dw_reg_size_from_code_x86(U64 reg_code)
dw_reg_size_from_code_x86(DW_Reg reg_code)
{
switch (reg_code) {
#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX86_##reg_name_dw: return reg_size;
@@ -13,7 +13,7 @@ dw_reg_size_from_code_x86(U64 reg_code)
}
internal U64
dw_reg_pos_from_code_x86(U64 reg_code)
dw_reg_pos_from_code_x86(DW_Reg reg_code)
{
switch (reg_code) {
#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX86_##reg_name_dw: return reg_pos;
@@ -24,7 +24,7 @@ dw_reg_pos_from_code_x86(U64 reg_code)
}
internal U64
dw_reg_size_from_code_x64(U64 reg_code)
dw_reg_size_from_code_x64(DW_Reg reg_code)
{
switch (reg_code) {
#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_size;
@@ -35,7 +35,7 @@ dw_reg_size_from_code_x64(U64 reg_code)
}
internal U64
dw_reg_pos_from_code_x64(U64 reg_code)
dw_reg_pos_from_code_x64(DW_Reg reg_code)
{
switch (reg_code) {
#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_pos;
@@ -46,21 +46,21 @@ dw_reg_pos_from_code_x64(U64 reg_code)
}
internal U64
dw_reg_size_from_code(RDI_Arch arch, U64 reg_code)
dw_reg_size_from_code(RDI_Arch arch, DW_Reg reg_code)
{
switch (arch) {
case RDI_Arch_X86: return dw_reg_size_from_code_x86(reg_code);
case RDI_Arch_X64: return dw_reg_size_from_code_x64(reg_code);
case Arch_x86: return dw_reg_size_from_code_x86(reg_code);
case Arch_x64: return dw_reg_size_from_code_x64(reg_code);
}
return 0;
}
internal U64
dw_reg_pos_from_code(RDI_Arch arch, U64 reg_code)
dw_reg_pos_from_code(RDI_Arch arch, DW_Reg reg_code)
{
switch (arch) {
case RDI_Arch_X86: return dw_reg_pos_from_code_x86(reg_code);
case RDI_Arch_X64: return dw_reg_pos_from_code_x64(reg_code);
case Arch_x86: return dw_reg_pos_from_code_x86(reg_code);
case Arch_x64: return dw_reg_pos_from_code_x64(reg_code);
}
return max_U64;
}
+6 -6
View File
@@ -1734,12 +1734,12 @@ typedef enum DW_RegX64Enum
////////////////////////////////
internal U64 dw_reg_size_from_code_x86(U64 reg_code);
internal U64 dw_reg_pos_from_code_x86(U64 reg_code);
internal U64 dw_reg_size_from_code_x64(U64 reg_code);
internal U64 dw_reg_pos_from_code_x64(U64 reg_code);
internal U64 dw_reg_size_from_code(Arch arch, U64 reg_code);
internal U64 dw_reg_pos_from_code(Arch arch, U64 reg_code);
internal U64 dw_reg_size_from_code_x86(DW_Reg reg_code);
internal U64 dw_reg_pos_from_code_x86(DW_Reg reg_code);
internal U64 dw_reg_size_from_code_x64(DW_Reg reg_code);
internal U64 dw_reg_pos_from_code_x64(DW_Reg reg_code);
internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code);
internal U64 dw_reg_pos_from_code(Arch arch, DW_Reg reg_code);
//- Attrib Class Encodings
-22
View File
@@ -78,25 +78,3 @@ c2r_rdi_binary_sections_from_coff_sections(Arena *arena, String8 image_data, U64
return binary_sections;
}
internal RDIM_TopLevelInfo
c2r_make_rdim_top_level_info(String8 image_name, RDI_Arch arch, U64 exe_hash, U64 sectab_count, COFF_SectionHeader *sectab)
{
U64 exe_voff_max = 0;
{
COFF_SectionHeader *coff_sec_ptr = sectab;
COFF_SectionHeader *coff_ptr_opl = sectab + sectab_count;
for (;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1) {
U64 sec_voff_max = coff_sec_ptr->voff + coff_sec_ptr->vsize;
exe_voff_max = Max(exe_voff_max, sec_voff_max);
}
}
RDIM_TopLevelInfo top_level_info = {0};
top_level_info.arch = arch;
top_level_info.exe_name = str8_skip_last_slash(image_name);
top_level_info.exe_hash = exe_hash;
top_level_info.voff_max = exe_voff_max;
top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL);
return top_level_info;
}
-1
View File
@@ -7,7 +7,6 @@
internal RDI_Arch c2r_rdi_arch_from_coff_machine(COFF_MachineType machine);
internal RDI_BinarySectionFlags c2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags);
internal RDIM_BinarySectionList c2r_rdi_binary_sections_from_coff_sections(Arena *arena, String8 image_data, U64 string_table_off, U64 sectab_count, COFF_SectionHeader *sectab);
internal RDIM_TopLevelInfo c2r_make_rdim_top_level_info(String8 image_name, RDI_Arch arch, U64 exe_hash, U64 sectab_count, COFF_SectionHeader *sectab);
#endif // RADCON_COFF_H
+28 -38
View File
@@ -32,12 +32,12 @@ d2r_rdi_reg_from_dw_reg_code_x86(U64 reg_code)
}
internal RDI_RegCode
d2r_rdi_reg_from_dw_reg_code(RDI_Arch arch, U64 reg_code)
d2r_rdi_reg_from_dw_reg_code(Arch arch, U64 reg_code)
{
switch (arch) {
case RDI_Arch_NULL: return 0;
case RDI_Arch_X64: return d2r_rdi_reg_from_dw_reg_code_x64(reg_code);
case RDI_Arch_X86: return d2r_rdi_reg_from_dw_reg_code_x86(reg_code);
case Arch_Null: return 0;
case Arch_x64: return d2r_rdi_reg_from_dw_reg_code_x64(reg_code);
case Arch_x86: return d2r_rdi_reg_from_dw_reg_code_x86(reg_code);
}
InvalidPath;
return 0;
@@ -243,7 +243,7 @@ d2r_bytecode_from_expression(Arena *arena,
DW_Input *input,
U64 image_base,
U64 address_size,
RDI_Arch arch,
Arch arch,
DW_ListUnit *addr_lu,
String8 expr,
DW_CompUnit *cu,
@@ -821,7 +821,7 @@ d2r_bytecode_from_expression(Arena *arena,
}
internal RDIM_Location *
d2r_transpile_expression(Arena *arena, DW_Input *input, U64 image_base, U64 address_size, RDI_Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr)
d2r_transpile_expression(Arena *arena, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr)
{
RDIM_Location *loc = 0;
if (expr.size) {
@@ -836,7 +836,7 @@ d2r_transpile_expression(Arena *arena, DW_Input *input, U64 image_base, U64 addr
}
internal RDIM_Location *
d2r_location_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, RDI_Arch arch, DW_Tag tag, DW_AttribKind kind)
d2r_location_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind)
{
String8 expr = dw_exprloc_from_attrib(input, cu, tag, kind);
RDIM_Location *location = d2r_transpile_expression(arena, input, image_base, cu->address_size, arch, cu->addr_lu, cu, expr);
@@ -850,7 +850,7 @@ d2r_locset_from_attrib(Arena *arena,
RDIM_ScopeChunkList *scopes,
RDIM_Scope *curr_scope,
U64 image_base,
RDI_Arch arch,
Arch arch,
DW_Tag tag,
DW_AttribKind kind)
{
@@ -897,7 +897,7 @@ d2r_var_locset_from_tag(Arena *arena,
RDIM_ScopeChunkList *scopes,
RDIM_Scope *curr_scope,
U64 image_base,
RDI_Arch arch,
Arch arch,
DW_Tag tag)
{
RDIM_LocationSet locset = {0};
@@ -1086,60 +1086,46 @@ d2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in)
////////////////////////////////
RDI_Arch arch = RDI_Arch_NULL;
Arch arch = Arch_Null;
U64 image_base = 0;
RDIM_BinarySectionList binary_sections = {0};
RDIM_TopLevelInfo top_level_info = {0};
U64 image_base = 0;
DW_Input input = {0};
DW_ListUnitInput lui = {0};
DW_Input input = {0};
if (in->image == Image_CoffPe) {
PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, in->image_data);
// convert arch
switch (pe.arch) {
case Arch_Null: arch = RDI_Arch_NULL; break;
case Arch_x64: arch = RDI_Arch_X64; break;
case Arch_x86: arch = RDI_Arch_X86; break;
default: NotImplemented; break;
}
// get image arch
arch = pe.arch;
// get image base
image_base = pe.image_base;
// get COFF sections
// get image sections
String8 raw_sections = str8_substr(in->image_data, rng_1u64(pe.section_array_off, pe.section_array_off+sizeof(COFF_SectionHeader)*pe.section_count));
U64 section_count = raw_sections.size / sizeof(COFF_SectionHeader);
COFF_SectionHeader *section_array = (COFF_SectionHeader *)raw_sections.str;
// convert sections & top level info
// convert sections
binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, in->image_data, pe.string_table_off, section_count, section_array);
top_level_info = c2r_make_rdim_top_level_info(in->image_name, arch, exe_hash, section_count, section_array);
// find DWARF sections
// make DWARF input
input = dw_input_from_coff_section_table(scratch.arena, in->image_data, pe.string_table_off, section_count, section_array);
} else if (in->image == Image_Elf32 || in->image == Image_Elf64) {
ELF_BinInfo elf = elf_bin_from_data(in->debug_data);
// get image arch
arch = arch_from_elf_machine(elf.hdr.e_machine);
// get image base
image_base = elf_base_addr_from_bin(&elf.hdr);
// convert arch
switch (elf.hdr.e_machine) {
case ELF_MachineKind_None: arch = RDI_Arch_NULL; break;
case ELF_MachineKind_X86_64: arch = RDI_Arch_X64; break;
case ELF_MachineKind_386: arch = RDI_Arch_X86; break;
default: NotImplemented; break;
}
// get image sections
ELF_Shdr64Array shdrs = elf_shdr64_array_from_bin(scratch.arena, in->debug_data, &elf.hdr);
// convert sections & top level info
binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, shdrs);
top_level_info = e2r_make_rdim_top_level_info(in->debug_data, exe_hash, shdrs);
// convert sections
binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, shdrs);
// find DWARF sections
// make DWARF input
input = dw_input_from_elf_section_table(scratch.arena, in->debug_data, &elf);
} else {
InvalidPath;
@@ -1147,6 +1133,10 @@ d2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in)
////////////////////////////////
RDIM_TopLevelInfo top_level_info = rdim_make_top_level_info(in->image_name, arch, exe_hash, binary_sections);
////////////////////////////////
U64 arch_addr_size = rdi_addr_size_from_arch(arch);
////////////////////////////////
-7
View File
@@ -8,10 +8,3 @@ e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, ELF_Shdr64Array shd
return result;
}
internal RDIM_TopLevelInfo
e2r_make_rdim_top_level_info(String8 image_name, RDI_Arch arch, ELF_Shdr64Array shdrs)
{
RDIM_TopLevelInfo top_level_info = {0};
return top_level_info;
}
-1
View File
@@ -5,6 +5,5 @@
#define RADCON_ELF_H
internal RDIM_BinarySectionList e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, ELF_Shdr64Array shdrs);
internal RDIM_TopLevelInfo e2r_make_rdim_top_level_info(String8 image_name, RDI_Arch arch, ELF_Shdr64Array shdrs);
#endif // RADCON_ELF_H
+5 -5
View File
@@ -2363,15 +2363,15 @@ p2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in)
//
U64 exe_hash = *async_task_join_struct(exe_hash_task, U64);
//////////////////////////////////////////////////////////////
//- rjf: produce top-level-info
//
RDIM_TopLevelInfo top_level_info = c2r_make_rdim_top_level_info(in->image_name, arch, exe_hash, coff_sections.count, coff_sections.v);
//////////////////////////////////////////////////////////////
//- rjf: build binary sections list
//
RDIM_BinarySectionList binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, str8_zero(), 0, coff_sections.count, coff_sections.v);
//////////////////////////////////////////////////////////////
//- rjf: produce top-level-info
//
RDIM_TopLevelInfo top_level_info = rdim_make_top_level_info(in->image_name, arch_from_coff_machine(dbi->machine_type), exe_hash, binary_sections);
//////////////////////////////////////////////////////////////
//- rjf: kick off unit conversion & source file collection
+33
View File
@@ -37,6 +37,39 @@ rdim_infer_data_model(OperatingSystem os, RDI_Arch arch)
return data_model;
}
////////////////////////////////
internal RDIM_TopLevelInfo
rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections)
{
// convert arch
RDI_Arch arch_rdi;
switch (arch) {
case Arch_Null: arch_rdi = RDI_Arch_NULL; break;
case Arch_x64: arch_rdi = RDI_Arch_X64; break;
case Arch_x86: arch_rdi = RDI_Arch_X86; break;
default: NotImplemented; break;
}
// find max VOFF
U64 exe_voff_max = 0;
for (RDIM_BinarySectionNode *sect_n = sections.first; sect_n != 0 ; sect_n = sect_n->next) {
exe_voff_max = Max(exe_voff_max, sect_n->v.voff_opl);
}
// fill out top level info
RDIM_TopLevelInfo top_level_info = {0};
top_level_info.arch = arch_rdi;
top_level_info.exe_hash = exe_hash;
top_level_info.voff_max = exe_voff_max;
top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL);
return top_level_info;
}
////////////////////////////////
//~ rjf: Baking Stage Tasks
+5
View File
@@ -384,6 +384,11 @@ global RDIM_LocalState *rdim_local_state = 0;
////////////////////////////////
internal RDIM_DataModel rdim_infer_data_model(OperatingSystem os, RDI_Arch arch);
internal RDIM_TopLevelInfo rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections);
////////////////////////////////
internal RDIM_LocalState * rdim_local_init(void);
internal RDIM_BakeResults rdim_bake(RDIM_LocalState *state, RDIM_BakeParams *in);
internal RDIM_SerializedSectionBundle rdim_compress(Arena *arena, RDIM_SerializedSectionBundle *in);