use the make library to generate RDI

This commit is contained in:
Nikita Smith
2026-06-02 12:10:49 -07:00
committed by Ryan Fleury
parent 4e44a3c271
commit 4ff6d2cc6c
14 changed files with 100 additions and 9635 deletions
+71 -44
View File
@@ -58,13 +58,6 @@
#include "llvm/llvm.c" #include "llvm/llvm.c"
#include "dwarf/x64/dwarf_x64.c" #include "dwarf/x64/dwarf_x64.c"
// --- RDI ---------------------------------------------------------------------
#include "rdi/rdi_local.h"
#include "arch/arch_inc.h"
#include "rdi/rdi_local.c"
#include "arch/arch_inc.c"
// --- Code Base Extensions ---------------------------------------------------- // --- Code Base Extensions ----------------------------------------------------
#include "base_ext/base_inc.h" #include "base_ext/base_inc.h"
@@ -83,15 +76,21 @@
#include "pdb_ext/pdb_helpers.c" #include "pdb_ext/pdb_helpers.c"
#include "pdb_ext/pdb_builder.c" #include "pdb_ext/pdb_builder.c"
// --- RDI Builder ------------------------------------------------------------- // --- RDI ---------------------------------------------------------------------
#include "rdi/rdi_builder.h" #include "pdb/pdb_parse.h"
#include "rdi/rdi_coff.h" #include "rdi/rdi_local.h"
#include "rdi/rdi_cv.h" #include "rdi_make/rdi_make_local.h"
#include "rdi_from_coff/rdi_from_coff.h"
#include "rdi_from_pdb/rdi_from_pdb.h"
#include "arch/arch_inc.h"
#include "rdi/rdi_builder.c" #include "pdb/pdb_parse.c"
#include "rdi/rdi_coff.c" #include "rdi/rdi_local.c"
#include "rdi/rdi_cv.c" #include "rdi_make/rdi_make_local.c"
#include "rdi_from_coff/rdi_from_coff.c"
#include "rdi_from_pdb/rdi_from_pdb.c"
#include "arch/arch_inc.c"
// --- Linker ------------------------------------------------------------------ // --- Linker ------------------------------------------------------------------
@@ -5259,6 +5258,40 @@ lnk_log_timers(void)
scratch_end(scratch); scratch_end(scratch);
} }
internal
THREAD_POOL_TASK_FUNC(lnk_p2r_worker)
{
Temp scratch = scratch_begin(&arena, 1);
LNK_P2R *ctx = raw_task;
P2R_ConvertParams p2r_params = {0};
if (task_id == 0) {
p2r_params.input_pdb_name = lnk_get_pdb_name(ctx->config);
p2r_params.input_pdb_data = ctx->pdb_data;
p2r_params.input_exe_name = lnk_get_image_name(ctx->config);
p2r_params.input_exe_data = ctx->image_data;
p2r_params.subset_flags = max_U32;
}
tp_broadcast(&p2r_params);
LaneCtx lctx = { .lane_idx = task_id, .lane_count = tp->worker_count, .barrier = tp->barrier, .broadcast_memory = tp->broadcast };
lane_ctx(lctx);
Arena *bake_arena = arena_alloc();
RDIM_BakeParams bake_params = p2r_convert(bake_arena, &p2r_params);
barrier_wait(tp->barrier);
RDIM_BakeResults bake_results = rdim_bake(arena, &bake_params);
barrier_wait(tp->barrier);
if (task_id == 0) {
ctx->bake_results = bake_results;
}
scratch_end(scratch);
}
internal void internal void
lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config)
{ {
@@ -5349,38 +5382,16 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config)
LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv); LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv);
// //
// RDI // Debug Info
//
if (config->rad_debug == LNK_SwitchState_Yes) {
lnk_timer_begin(LNK_Timer_Rdi);
String8List rdi_data = lnk_build_rad_debug_info(tp,
arena,
OperatingSystem_Windows,
rdi_arch_from_coff_machine(config->machine),
lnk_get_image_name(config),
image_ctx.image_data,
debug_info_objs_count,
debug_info_objs,
cv.debug_s_arr,
cv.symbol_input_count,
cv.symbol_inputs,
(CV_SymbolListArray[]){0},
cv_types);
lnk_write_data_list_to_file_path(config->rad_debug_name, config->temp_rad_debug_name, rdi_data);
lnk_timer_end(LNK_Timer_Rdi);
}
//
// PDB
// //
// TODO: Parallel debug info builds are currently blocked by the patch // TODO: Parallel debug info builds are currently blocked by the patch
// strings in $$FILE_CHECKSUM step in `lnk_process_c13_data_task`. // strings in $$FILE_CHECKSUM step in `lnk_process_c13_data_task`.
if (config->debug_mode == LNK_DebugMode_Full) { if (config->debug_mode == LNK_DebugMode_Full || config->rad_debug == LNK_SwitchState_Yes) {
lnk_timer_begin(LNK_Timer_Pdb); Temp huge_arena_temp = temp_begin(lnk_get_huge_arena());
String8List pdb_data = {0};
{
lnk_timer_begin(LNK_Timer_Pdb);
if (config->pdb_hash_type_names != LNK_TypeNameHashMode_Null && config->pdb_hash_type_names != LNK_TypeNameHashMode_None) { if (config->pdb_hash_type_names != LNK_TypeNameHashMode_Null && config->pdb_hash_type_names != LNK_TypeNameHashMode_None) {
lnk_replace_type_names_with_hashes(tp, lnk_replace_type_names_with_hashes(tp,
arena, arena,
@@ -5390,12 +5401,28 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config)
config->pdb_hash_type_name_length, config->pdb_hash_type_name_length,
config->pdb_hash_type_name_map); config->pdb_hash_type_name_map);
} }
pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &cv, cv_types);
String8List pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &cv, cv_types); if (config->debug_mode == LNK_DebugMode_Full) {
lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data); lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data);
}
lnk_timer_end(LNK_Timer_Pdb); lnk_timer_end(LNK_Timer_Pdb);
} }
if (config->rad_debug == LNK_SwitchState_Yes) {
lnk_timer_begin(LNK_Timer_Rdi);
LNK_P2R p2r = { .config = config, .pdb_data = str8_list_join(lnk_get_huge_arena(), &pdb_data, 0), .image_data = image_ctx.image_data };
tp_for_parallel(tp, arena, tp->worker_count, lnk_p2r_worker, &p2r);
String8List rdi_blobs = rdim_file_blobs_from_section_bundle(scratch.arena, &p2r.bake_results.section_bundle);
lnk_write_data_list_to_file_path(config->rad_debug_name, config->temp_rad_debug_name, rdi_blobs);
lnk_timer_end(LNK_Timer_Rdi);
}
temp_end(huge_arena_temp);
}
// //
// stripped PDB // stripped PDB
// //
+8
View File
@@ -309,6 +309,14 @@ typedef struct
U128 *hashes; U128 *hashes;
} LNK_Blake3Hasher; } LNK_Blake3Hasher;
typedef struct
{
RDIM_BakeResults bake_results;
LNK_Config *config;
String8 pdb_data;
String8 image_data;
} LNK_P2R;
// --- Config ----------------------------------------------------------------- // --- Config -----------------------------------------------------------------
internal LNK_Config * lnk_config_from_argcv(Arena *arena, int argc, char **argv); internal LNK_Config * lnk_config_from_argcv(Arena *arena, int argc, char **argv);
+10 -2
View File
@@ -753,11 +753,19 @@ lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_Me
internal String8 internal String8
lnk_get_image_name(LNK_Config *config) lnk_get_image_name(LNK_Config *config)
{ {
String8 image_name = config->image_alt_path.size ? config->image_alt_path : config->out_path; String8 image_path = config->image_alt_path.size ? config->image_alt_path : config->out_path;
image_name = str8_skip_last_slash(image_name); String8 image_name = str8_skip_last_slash(image_path);
return image_name; return image_name;
} }
internal String8
lnk_get_pdb_name(LNK_Config *config)
{
String8 pdb_path = config->pdb_alt_path.size ? config->pdb_alt_path : config->pdb_name;
String8 pdb_name = str8_skip_last_slash(pdb_path);
return pdb_name;
}
internal U64 internal U64
lnk_get_default_function_pad_min(COFF_MachineType machine) lnk_get_default_function_pad_min(COFF_MachineType machine)
{ {
+1
View File
@@ -542,6 +542,7 @@ internal LNK_MergeDirectiveNode * lnk_merge_directive_list_push(Arena *arena, LN
// --- Getters ----------------------------------------------------------------- // --- Getters -----------------------------------------------------------------
internal String8 lnk_get_image_name (LNK_Config *config); internal String8 lnk_get_image_name (LNK_Config *config);
internal String8 lnk_get_pdb_name (LNK_Config *config);
internal U64 lnk_get_default_function_pad_min (COFF_MachineType machine); internal U64 lnk_get_default_function_pad_min (COFF_MachineType machine);
internal U64 lnk_get_base_addr (LNK_Config *config); internal U64 lnk_get_base_addr (LNK_Config *config);
internal Version lnk_get_default_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine); internal Version lnk_get_default_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine);
File diff suppressed because it is too large Load Diff
-157
View File
@@ -162,120 +162,6 @@ typedef struct
String8List *maps; String8List *maps;
} LNK_TypeNameReplacer; } LNK_TypeNameReplacer;
////////////////////////////////
// RDI
typedef struct
{
String8 name;
U64 leaf_idx;
} LNK_UDTNameBucket;
typedef struct
{
U64 leaf_count;
U8 **leaf_arr;
Rng1U64 *ranges;
U64 buckets_cap;
LNK_UDTNameBucket **buckets;
} LNK_BuildUDTNameHashTableTask;
typedef struct
{
CV_DebugT debug_t;
CV_TypeIndex ti_lo;
Rng1U64 *ranges;
U64 udt_name_buckets_cap;
LNK_UDTNameBucket **udt_name_buckets;
CV_TypeIndex *fwdmap;
} LNK_BuildUDTFwdMapTask;
typedef struct
{
U64 leaf_count[CV_TypeIndexSource_COUNT];
U8 **leaf_arr[CV_TypeIndexSource_COUNT];
U64 type_cap;
U64 udt_cap;
RDIB_TypeRef variadic_type_ref;
Rng1U64 *itype_ranges;
U64 udt_name_bucket_cap;
LNK_UDTNameBucket **udt_name_buckets;
RDIB_Type **tpi_itype_map;
RDIB_TypeChunkList *rdib_types_lists;
RDIB_TypeChunkList *rdib_types_struct_lists;
RDIB_TypeChunkList *rdib_types_union_lists;
RDIB_TypeChunkList *rdib_types_enum_lists;
RDIB_TypeChunkList *rdib_types_params_lists;
RDIB_TypeChunkList *rdib_types_udt_members_lists;
RDIB_TypeChunkList *rdib_types_enum_members_lists;
RDIB_UDTMemberChunkList *rdib_udt_members_lists;
RDIB_UDTMemberChunkList *rdib_enum_members_lists;
Rng1U64 *ranges;
} LNK_ConvertTypesToRDI;
typedef struct
{
U64 obj_idx;
RDIB_SourceFile *src_file;
} LNK_SourceFileBucket;
typedef struct
{
LNK_Obj **obj_arr;
CV_DebugS *debug_s_arr;
U64 total_src_file_count;
LNK_SourceFileBucket **src_file_buckets;
U64 src_file_buckets_cap;
} LNK_ConvertSourceFilesToRDITask;
typedef struct
{
CV_Arch arch;
CV_Language language;
String8 compiler_name;
} LNK_CodeViewCompilerInfo;
typedef struct
{
COFF_SectionHeaderArray image_sects;
LNK_Obj **obj_arr;
CV_DebugS *debug_s_arr;
U64 leaf_arr_count_ipi;
U8 **leaf_arr_ipi;
LNK_SymbolInput *symbol_inputs;
Rng1U64 ipi_itype_range;
Rng1U64 tpi_itype_range;
RDIB_Type **tpi_itype_map;
U64 src_file_buckets_cap;
LNK_SourceFileBucket **src_file_buckets;
LNK_UDTNameBucket **udt_name_buckets;
U64 line_table_cap;
U64 udt_name_buckets_cap;
U64 src_file_chunk_cap;
U64 symbol_chunk_cap;
U64 unit_chunk_cap;
U64 inline_site_cap;
RDIB_LineTable *null_line_table;
HashTable *extern_symbol_voff_ht;
LNK_CodeViewCompilerInfo *comp_info_arr;
CV_InlineeLinesAccel **inlinee_lines_accel_arr;
RDIB_InlineSiteChunk **inline_site_chunks;
// output
RDIB_UnitChunk *units;
RDIB_VariableChunkList *locals;
RDIB_ScopeChunkList *scopes;
RDIB_VariableChunkList *extern_gvars;
RDIB_VariableChunkList *static_gvars;
RDIB_VariableChunkList *extern_tvars;
RDIB_VariableChunkList *static_tvars;
RDIB_ProcedureChunkList *extern_procs;
RDIB_ProcedureChunkList *static_procs;
RDIB_InlineSiteChunkList *inline_sites;
RDIB_LineTableChunkList *line_tables;
} LNK_ConvertUnitToRDITask;
//////////////////////////////// ////////////////////////////////
// CodeView // CodeView
@@ -296,46 +182,3 @@ internal void lnk_replace_type_names_with_hashes (TP_Context *tp, TP
internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types); internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types);
////////////////////////////////
// RDI
internal U64 lnk_udt_name_hash_table_hash (String8 string);
internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, U64 *buckets_cap_out);
internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name);
internal CV_TypeIndex * lnk_build_udt_fwdmap (TP_Context *tp, Arena *arena, CV_DebugT debug_t, CV_TypeIndex ti_lo, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap);
internal RDIB_TypeRef lnk_rdib_type_from_itype (LNK_ConvertTypesToRDI *task, CV_TypeIndex itype);
internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop (CV_MethodProp prop);
internal LNK_SourceFileBucket * lnk_src_file_hash_table_hash (String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes);
internal LNK_SourceFileBucket * lnk_src_file_hash_table_lookup_slot(LNK_SourceFileBucket **src_file_buckets, U64 src_file_buckets_cap, U64 hash, String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes);
internal String8List
lnk_build_rad_debug_info(TP_Context *tp,
TP_Arena *tp_arena,
OperatingSystem os,
RDI_Arch arch,
String8 image_name,
String8 image_data,
U64 obj_count,
LNK_Obj **obj_arr,
CV_DebugS *debug_s_arr,
U64 symbol_input_count,
LNK_SymbolInput *symbol_inputs,
CV_SymbolListArray *parsed_symbols,
LNK_MergedTypes types);
internal U64 lnk_udt_name_hash_table_hash (String8 string);
internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, U64 *buckets_cap_out);
internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name);
internal CV_TypeIndex * lnk_build_udt_fwdmap(TP_Context *tp,
Arena *arena,
CV_DebugT debug_t,
CV_TypeIndex ti_lo,
LNK_UDTNameBucket **udt_name_buckets,
U64 udt_name_buckets_cap);
internal void lnk_init_rdib_itype_map (Arena *arena, RDI_Arch arch, RDIB_Type **itype_map, RDIB_TypeChunkList *rdib_types_list);
internal RDIB_TypeRef lnk_rdib_type_from_itype (LNK_ConvertTypesToRDI *task, CV_TypeIndex itype);
internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop);
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-53
View File
@@ -1,53 +0,0 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
internal RDI_Arch
rdi_arch_from_coff_machine(COFF_MachineType machine)
{
switch (machine) {
case COFF_MachineType_X64: return RDI_Arch_X64;
case COFF_MachineType_X86:
case COFF_MachineType_Unknown:
case COFF_MachineType_Am33:
case COFF_MachineType_Arm:
case COFF_MachineType_Arm64:
case COFF_MachineType_ArmNt:
case COFF_MachineType_Ebc:
case COFF_MachineType_Ia64:
case COFF_MachineType_M32R:
case COFF_MachineType_Mips16:
case COFF_MachineType_MipsFpu:
case COFF_MachineType_MipsFpu16:
case COFF_MachineType_PowerPc:
case COFF_MachineType_PowerPcFp:
case COFF_MachineType_R4000:
case COFF_MachineType_RiscV32:
case COFF_MachineType_RiscV64:
case COFF_MachineType_Sh3:
case COFF_MachineType_Sh3Dsp:
case COFF_MachineType_Sh4:
case COFF_MachineType_Sh5:
case COFF_MachineType_Thumb:
case COFF_MachineType_WceMipsV2:
NotImplemented;
default:
return RDI_Arch_NULL;
}
}
internal RDI_BinarySectionFlags
rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags)
{
RDI_BinarySectionFlags result = 0;
if (flags & COFF_SectionFlag_MemRead) {
result |= RDI_BinarySectionFlag_Read;
}
if (flags & COFF_SectionFlag_MemWrite) {
result |= RDI_BinarySectionFlag_Write;
}
if (flags & COFF_SectionFlag_MemExecute) {
result |= RDI_BinarySectionFlag_Execute;
}
return result;
}
-7
View File
@@ -1,7 +0,0 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#pragma once
internal RDI_Arch rdi_arch_from_coff_machine(COFF_MachineType machine);
-237
View File
@@ -1,237 +0,0 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
internal RDI_Arch
rdi_arch_from_cv_arch(CV_Arch arch)
{
switch (arch) {
case CV_Arch_X64: return RDI_Arch_X64;
case CV_Arch_8086:
case CV_Arch_8080:
case CV_Arch_80286:
case CV_Arch_80386:
case CV_Arch_80486:
case CV_Arch_PENTIUM:
case CV_Arch_PENTIUMII:
case CV_Arch_PENTIUMIII:
case CV_Arch_MIPS:
case CV_Arch_MIPS16:
case CV_Arch_MIPS32:
case CV_Arch_MIPS64:
case CV_Arch_MIPSI:
case CV_Arch_MIPSII:
case CV_Arch_MIPSIII:
case CV_Arch_MIPSIV:
case CV_Arch_MIPSV:
case CV_Arch_M68000:
case CV_Arch_M68010:
case CV_Arch_M68020:
case CV_Arch_M68030:
case CV_Arch_M68040:
case CV_Arch_ALPHA:
case CV_Arch_ALPHA_21164:
case CV_Arch_ALPHA_21164A:
case CV_Arch_ALPHA_21264:
case CV_Arch_ALPHA_21364:
case CV_Arch_PPC601:
case CV_Arch_PPC603:
case CV_Arch_PPC604:
case CV_Arch_PPC620:
case CV_Arch_PPCFP:
case CV_Arch_PPCBE:
case CV_Arch_SH3:
case CV_Arch_SH3E:
case CV_Arch_SH3DSP:
case CV_Arch_SH4:
case CV_Arch_SHMEDIA:
case CV_Arch_ARM3:
case CV_Arch_ARM4:
case CV_Arch_ARM4T:
case CV_Arch_ARM5:
case CV_Arch_ARM5T:
case CV_Arch_ARM6:
case CV_Arch_ARM_XMAC:
case CV_Arch_ARM_WMMX:
case CV_Arch_ARM7:
case CV_Arch_OMNI:
case CV_Arch_IA64_1:
case CV_Arch_IA64_2:
case CV_Arch_CEE:
case CV_Arch_AM33:
case CV_Arch_M32R:
case CV_Arch_TRICORE:
case CV_Arch_EBC:
case CV_Arch_THUMB:
case CV_Arch_ARMNT:
case CV_Arch_ARM64:
case CV_Arch_D3D11_SHADER:
NotImplemented;
default:
return RDI_Arch_NULL;
}
}
internal RDI_Language
rdi_language_from_cv_language(CV_Language language)
{
switch (language) {
case CV_Language_C: return RDI_Language_C;
case CV_Language_CXX: return RDI_Language_CPlusPlus;
case CV_Language_MASM: return RDI_Language_Masm;
case CV_Language_LINK: return RDI_Language_NULL;
case CV_Language_CVTRES: return RDI_Language_NULL;
case CV_Language_FORTRAN:
case CV_Language_PASCAL:
case CV_Language_BASIC:
case CV_Language_COBOL:
case CV_Language_CVTPGD:
case CV_Language_CSHARP:
case CV_Language_VB:
case CV_Language_ILASM:
case CV_Language_JAVA:
case CV_Language_JSCRIPT:
case CV_Language_MSIL:
case CV_Language_HLSL:
NotImplemented;
default:
return RDI_Language_NULL;
}
}
internal RDI_TypeModifierFlags
rdi_type_modifier_flags_from_cv_modifier_flags(CV_ModifierFlags flags)
{
RDI_TypeModifierFlags result = 0;
if (flags & CV_ModifierFlag_Const) {
result |= RDI_TypeModifierFlag_Const;
}
if (flags & CV_ModifierFlag_Volatile) {
result |= RDI_TypeModifierFlag_Volatile;
}
return result;
}
internal RDI_TypeModifierFlags
rdi_type_modifier_flags_from_cv_pointer_attribs(CV_PointerAttribs attribs)
{
RDI_TypeModifierFlags result = 0;
if (attribs & CV_PointerAttrib_Const) {
result |= RDI_TypeModifierFlag_Const;
}
if (attribs & CV_PointerAttrib_Volatile) {
result |= RDI_TypeModifierFlag_Volatile;
}
return result;
}
internal RDI_TypeKind
rdi_type_kind_from_pointer(CV_PointerAttribs attribs, CV_PointerMode mode)
{
RDI_TypeKind result = RDI_TypeKind_Ptr;
if (attribs & CV_PointerAttrib_LRef) {
result = RDI_TypeKind_LRef;
} else if (attribs & CV_PointerAttrib_RRef) {
result = RDI_TypeKind_RRef;
}
if (mode == CV_PointerMode_LRef) {
result = RDI_TypeKind_LRef;
} else if (mode == CV_PointerMode_RRef) {
result = RDI_TypeKind_RRef;
}
return result;
}
internal RDI_TypeKind
rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type)
{
switch (basic_type) {
case CV_BasicType_NOTYPE : return RDI_TypeKind_NULL;
case CV_BasicType_ABS : return RDI_TypeKind_NULL;
case CV_BasicType_SEGMENT : return RDI_TypeKind_NULL;
case CV_BasicType_VOID : return RDI_TypeKind_Void;
case CV_BasicType_CURRENCY : return RDI_TypeKind_NULL;
case CV_BasicType_NBASICSTR : return RDI_TypeKind_NULL;
case CV_BasicType_FBASICSTR : return RDI_TypeKind_NULL;
case CV_BasicType_HRESULT : return RDI_TypeKind_Handle;
case CV_BasicType_CHAR : return RDI_TypeKind_Char8;
case CV_BasicType_SHORT : return RDI_TypeKind_S16;
case CV_BasicType_LONG : return RDI_TypeKind_S32;
case CV_BasicType_QUAD : return RDI_TypeKind_S64;
case CV_BasicType_OCT : return RDI_TypeKind_S128;
case CV_BasicType_UCHAR : return RDI_TypeKind_UChar8;
case CV_BasicType_USHORT : return RDI_TypeKind_U16;
case CV_BasicType_ULONG : return RDI_TypeKind_U32;
case CV_BasicType_UQUAD : return RDI_TypeKind_U64;
case CV_BasicType_UOCT : return RDI_TypeKind_U128;
case CV_BasicType_BOOL8 : return RDI_TypeKind_S8;
case CV_BasicType_BOOL16 : return RDI_TypeKind_S16;
case CV_BasicType_BOOL32 : return RDI_TypeKind_S32;
case CV_BasicType_BOOL64 : return RDI_TypeKind_S64;
case CV_BasicType_FLOAT32 : return RDI_TypeKind_F32;
case CV_BasicType_FLOAT64 : return RDI_TypeKind_F64;
case CV_BasicType_FLOAT80 : return RDI_TypeKind_F80;
case CV_BasicType_FLOAT128 : return RDI_TypeKind_F128;
case CV_BasicType_FLOAT48 : return RDI_TypeKind_F48;
case CV_BasicType_FLOAT32PP : return RDI_TypeKind_F32PP;
case CV_BasicType_FLOAT16 : return RDI_TypeKind_F16;
case CV_BasicType_COMPLEX32 : return RDI_TypeKind_ComplexF32;
case CV_BasicType_COMPLEX64 : return RDI_TypeKind_ComplexF64;
case CV_BasicType_COMPLEX80 : return RDI_TypeKind_ComplexF80;
case CV_BasicType_COMPLEX128: return RDI_TypeKind_ComplexF128;
case CV_BasicType_BIT : return RDI_TypeKind_NULL;
case CV_BasicType_PASCHAR : return RDI_TypeKind_NULL;
case CV_BasicType_BOOL32FF : return RDI_TypeKind_NULL;
case CV_BasicType_INT8 : return RDI_TypeKind_S8;
case CV_BasicType_UINT8 : return RDI_TypeKind_U8;
case CV_BasicType_RCHAR : return RDI_TypeKind_Char8;
case CV_BasicType_WCHAR : return RDI_TypeKind_UChar16;
case CV_BasicType_CHAR16 : return RDI_TypeKind_Char16;
case CV_BasicType_CHAR32 : return RDI_TypeKind_Char32;
case CV_BasicType_INT16 : return RDI_TypeKind_S16;
case CV_BasicType_UINT16 : return RDI_TypeKind_U16;
case CV_BasicType_INT32 : return RDI_TypeKind_S32;
case CV_BasicType_UINT32 : return RDI_TypeKind_U32;
case CV_BasicType_INT64 : return RDI_TypeKind_S64;
case CV_BasicType_UINT64 : return RDI_TypeKind_U64;
case CV_BasicType_INT128 : return RDI_TypeKind_S128;
case CV_BasicType_UINT128 : return RDI_TypeKind_U128;
case CV_BasicType_CHAR8 : return RDI_TypeKind_Char8;
case CV_BasicType_PTR : return RDI_TypeKind_Ptr;
}
return RDI_TypeKind_NULL;
}
internal RDI_RegCode
rdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg)
{
RDI_RegCode result = 0;
switch (arch) {
case CV_Arch_X64: {
switch (reg) {
#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break;
CV_Reg_X64_XList(X)
#undef X
}
} break;
case CV_Arch_8086:
default: NotImplemented;
}
return result;
}
internal RDI_ChecksumKind
rdi_checksum_from_cv_c13(CV_C13ChecksumKind kind)
{
switch (kind) {
case CV_C13ChecksumKind_Null: return RDI_ChecksumKind_NULL;
case CV_C13ChecksumKind_MD5: return RDI_ChecksumKind_MD5;
case CV_C13ChecksumKind_SHA1: return RDI_ChecksumKind_SHA1;
case CV_C13ChecksumKind_SHA256: return RDI_ChecksumKind_SHA256;
}
return RDI_ChecksumKind_NULL;
}
-14
View File
@@ -1,14 +0,0 @@
// Copyright (c) Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#pragma once
internal RDI_Arch rdi_arch_from_cv_arch(CV_Arch arch);
internal RDI_Language rdi_language_from_cv_language(CV_Language language);
internal RDI_TypeModifierFlags rdi_type_modifier_flags_from_cv_pointer_attribs(CV_PointerAttribs attribs);
internal RDI_TypeKind rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type);
internal RDI_RegCode rdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg);
internal RDI_ChecksumKind rdi_checksum_from_cv_c13(CV_C13ChecksumKind kind);
-20
View File
@@ -1,20 +0,0 @@
#pragma once
typedef U8 RDI_U8;
typedef U16 RDI_U16;
typedef U32 RDI_U32;
typedef U64 RDI_U64;
typedef S8 RDI_S8;
typedef S16 RDI_S16;
typedef S32 RDI_S32;
typedef S64 RDI_S64;
#define RDI_PROC internal
#define RDIM_MEMSET_OVERRIDE
#define rdim_memset MemorySet
#define RDIM_MEMCPY_OVERRIDE
#define rdim_memcpy MemoryCopy
#define rdim_vsnprintf raddbg_vsnprintf
-16
View File
@@ -1,16 +0,0 @@
import subprocess
import sys
import os
def get_sorted_objs(pdb_path):
result = subprocess.run(["llvm-pdbutil", "dump", "--modules", pdb_path], stdout=subprocess.PIPE, text=True)
lines = result.stdout.strip().split('\n')
filtered_lines = [line for line in lines if line.lstrip().startswith("Mod ")]
# sort by the obj_path portion (line format: "Mod <imod> <obj_path>")
def extract_path(line): return line.split(maxsplit=2)[2].lower()
#sorted_lines = sorted(filtered_lines, key=extract_path)
return filtered_lines
if __name__ == "__main__":
sorted_objs = get_sorted_objs(sys.argv[1])
for l in sorted_objs: print(l.lstrip())