mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-07 22:38:41 +00:00
use the make library to generate RDI
This commit is contained in:
committed by
Ryan Fleury
parent
4e44a3c271
commit
4ff6d2cc6c
+80
-53
@@ -58,13 +58,6 @@
|
||||
#include "llvm/llvm.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 ----------------------------------------------------
|
||||
|
||||
#include "base_ext/base_inc.h"
|
||||
@@ -83,15 +76,21 @@
|
||||
#include "pdb_ext/pdb_helpers.c"
|
||||
#include "pdb_ext/pdb_builder.c"
|
||||
|
||||
// --- RDI Builder -------------------------------------------------------------
|
||||
// --- RDI ---------------------------------------------------------------------
|
||||
|
||||
#include "rdi/rdi_builder.h"
|
||||
#include "rdi/rdi_coff.h"
|
||||
#include "rdi/rdi_cv.h"
|
||||
#include "pdb/pdb_parse.h"
|
||||
#include "rdi/rdi_local.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 "rdi/rdi_coff.c"
|
||||
#include "rdi/rdi_cv.c"
|
||||
#include "pdb/pdb_parse.c"
|
||||
#include "rdi/rdi_local.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 ------------------------------------------------------------------
|
||||
|
||||
@@ -5259,6 +5258,40 @@ lnk_log_timers(void)
|
||||
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
|
||||
lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config)
|
||||
{
|
||||
@@ -5349,51 +5382,45 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config)
|
||||
LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv);
|
||||
|
||||
//
|
||||
// RDI
|
||||
//
|
||||
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
|
||||
// Debug Info
|
||||
//
|
||||
// TODO: Parallel debug info builds are currently blocked by the patch
|
||||
// strings in $$FILE_CHECKSUM step in `lnk_process_c13_data_task`.
|
||||
if (config->debug_mode == LNK_DebugMode_Full) {
|
||||
lnk_timer_begin(LNK_Timer_Pdb);
|
||||
if (config->debug_mode == LNK_DebugMode_Full || config->rad_debug == LNK_SwitchState_Yes) {
|
||||
Temp huge_arena_temp = temp_begin(lnk_get_huge_arena());
|
||||
|
||||
if (config->pdb_hash_type_names != LNK_TypeNameHashMode_Null && config->pdb_hash_type_names != LNK_TypeNameHashMode_None) {
|
||||
lnk_replace_type_names_with_hashes(tp,
|
||||
arena,
|
||||
cv_types.count[CV_TypeIndexSource_TPI],
|
||||
cv_types.v [CV_TypeIndexSource_TPI],
|
||||
config->pdb_hash_type_names,
|
||||
config->pdb_hash_type_name_length,
|
||||
config->pdb_hash_type_name_map);
|
||||
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) {
|
||||
lnk_replace_type_names_with_hashes(tp,
|
||||
arena,
|
||||
cv_types.count[CV_TypeIndexSource_TPI],
|
||||
cv_types.v [CV_TypeIndexSource_TPI],
|
||||
config->pdb_hash_type_names,
|
||||
config->pdb_hash_type_name_length,
|
||||
config->pdb_hash_type_name_map);
|
||||
}
|
||||
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_timer_end(LNK_Timer_Pdb);
|
||||
}
|
||||
|
||||
String8List pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &cv, cv_types);
|
||||
lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data);
|
||||
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);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -309,6 +309,14 @@ typedef struct
|
||||
U128 *hashes;
|
||||
} LNK_Blake3Hasher;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
RDIM_BakeResults bake_results;
|
||||
LNK_Config *config;
|
||||
String8 pdb_data;
|
||||
String8 image_data;
|
||||
} LNK_P2R;
|
||||
|
||||
// --- Config -----------------------------------------------------------------
|
||||
|
||||
internal LNK_Config * lnk_config_from_argcv(Arena *arena, int argc, char **argv);
|
||||
|
||||
+10
-2
@@ -753,11 +753,19 @@ lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_Me
|
||||
internal String8
|
||||
lnk_get_image_name(LNK_Config *config)
|
||||
{
|
||||
String8 image_name = config->image_alt_path.size ? config->image_alt_path : config->out_path;
|
||||
image_name = str8_skip_last_slash(image_name);
|
||||
String8 image_path = config->image_alt_path.size ? config->image_alt_path : config->out_path;
|
||||
String8 image_name = str8_skip_last_slash(image_path);
|
||||
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
|
||||
lnk_get_default_function_pad_min(COFF_MachineType machine)
|
||||
{
|
||||
|
||||
@@ -542,6 +542,7 @@ internal LNK_MergeDirectiveNode * lnk_merge_directive_list_push(Arena *arena, LN
|
||||
// --- Getters -----------------------------------------------------------------
|
||||
|
||||
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_base_addr (LNK_Config *config);
|
||||
internal Version lnk_get_default_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine);
|
||||
|
||||
+1
-2261
File diff suppressed because it is too large
Load Diff
@@ -162,120 +162,6 @@ typedef struct
|
||||
String8List *maps;
|
||||
} 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
|
||||
|
||||
@@ -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);
|
||||
|
||||
////////////////////////////////
|
||||
// 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
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
Reference in New Issue
Block a user