mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-25 05:04:58 -07:00
179 lines
5.2 KiB
C
179 lines
5.2 KiB
C
// Copyright (c) Epic Games Tools
|
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
|
|
|
////////////////////////////////
|
|
//~ Generated Code
|
|
|
|
#include "generated/codeview.meta.c"
|
|
|
|
////////////////////////////////
|
|
|
|
internal CV_Arch
|
|
cv_arch_from_coff_machine(COFF_MachineType machine)
|
|
{
|
|
CV_Arch arch = 0;
|
|
switch(machine)
|
|
{
|
|
case COFF_MachineType_X64: arch = CV_Arch_X64; break;
|
|
case COFF_MachineType_X86: arch = CV_Arch_8086; break;
|
|
case COFF_MachineType_Am33: arch = CV_Arch_AM33; break;
|
|
case COFF_MachineType_Arm: NotImplemented; break;
|
|
case COFF_MachineType_Arm64: arch = CV_Arch_ARM64; break;
|
|
case COFF_MachineType_ArmNt: arch = CV_Arch_ARMNT; break;
|
|
case COFF_MachineType_Ebc: arch = CV_Arch_EBC; break;
|
|
case COFF_MachineType_Ia64: arch = CV_Arch_IA64; break;
|
|
case COFF_MachineType_M32R: arch = CV_Arch_M32R; break;
|
|
case COFF_MachineType_Mips16: arch = CV_Arch_MIPS16; break;
|
|
case COFF_MachineType_MipsFpu: NotImplemented; break;
|
|
case COFF_MachineType_MipsFpu16: NotImplemented; break;
|
|
case COFF_MachineType_PowerPc: NotImplemented; break;
|
|
case COFF_MachineType_PowerPcFp: arch = CV_Arch_PPCFP; break;
|
|
case COFF_MachineType_R4000: NotImplemented; break;
|
|
case COFF_MachineType_RiscV32: NotImplemented; break;
|
|
case COFF_MachineType_RiscV64: NotImplemented; break;
|
|
case COFF_MachineType_RiscV128: NotImplemented; break;
|
|
case COFF_MachineType_Sh3: arch = CV_Arch_SH3; break;
|
|
case COFF_MachineType_Sh3Dsp: arch = CV_Arch_SH3DSP; break;
|
|
case COFF_MachineType_Sh4: arch = CV_Arch_SH4; break;
|
|
case COFF_MachineType_Sh5: NotImplemented; break;
|
|
case COFF_MachineType_Thumb: arch = CV_Arch_THUMB; break;
|
|
case COFF_MachineType_WceMipsV2: NotImplemented; break;
|
|
}
|
|
return arch;
|
|
}
|
|
|
|
internal U64
|
|
cv_size_from_reg(CV_Arch arch, CV_Reg reg)
|
|
{
|
|
switch(arch)
|
|
{
|
|
case CV_Arch_8086: return cv_size_from_reg_x86(reg);
|
|
case CV_Arch_X64 : return cv_size_from_reg_x64(reg);
|
|
default: NotImplemented;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
internal B32
|
|
cv_is_reg_sp(CV_Arch arch, CV_Reg reg)
|
|
{
|
|
switch(arch)
|
|
{
|
|
case CV_Arch_8086: return reg == CV_Regx86_ESP;
|
|
case CV_Arch_X64: return reg == CV_Regx64_RSP;
|
|
default: NotImplemented;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
internal U64
|
|
cv_size_from_reg_x86(CV_Reg reg)
|
|
{
|
|
switch(reg)
|
|
{
|
|
#define X(NAME, CODE, RDI_NAME, BYTE_POS, BYTE_SIZE) case CV_Regx86_##NAME: return BYTE_SIZE;
|
|
CV_Reg_X86_XList(X)
|
|
#undef X
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
internal U64
|
|
cv_size_from_reg_x64(CV_Reg reg)
|
|
{
|
|
switch(reg)
|
|
{
|
|
#define X(NAME, CODE, RDI_NAME, BYTE_POS, BYTE_SIZE) case CV_Regx64_##NAME: return BYTE_SIZE;
|
|
CV_Reg_X64_XList(X)
|
|
#undef X
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
internal CV_EncodedFramePtrReg
|
|
cv_pick_fp_encoding(CV_SymFrameproc *frameproc, B32 is_local_param)
|
|
{
|
|
CV_EncodedFramePtrReg fp_reg = 0;
|
|
if(is_local_param)
|
|
{
|
|
fp_reg = CV_FrameprocFlags_Extract_ParamBasePointer(frameproc->flags);
|
|
}
|
|
else
|
|
{
|
|
fp_reg = CV_FrameprocFlags_Extract_LocalBasePointer(frameproc->flags);
|
|
}
|
|
return fp_reg;
|
|
}
|
|
|
|
internal CV_Reg
|
|
cv_decode_fp_reg(CV_Arch arch, CV_EncodedFramePtrReg encoded_reg)
|
|
{
|
|
CV_Reg fp_reg = 0;
|
|
switch (arch)
|
|
{
|
|
case CV_Arch_8086:
|
|
{
|
|
switch (encoded_reg)
|
|
{
|
|
case CV_EncodedFramePtrReg_None : break;
|
|
case CV_EncodedFramePtrReg_StackPtr: AssertAlways(!"TODO: not tested, this is a guess");
|
|
fp_reg = CV_Regx86_ESP; break;
|
|
case CV_EncodedFramePtrReg_FramePtr: fp_reg = CV_Regx86_EBP; break;
|
|
case CV_EncodedFramePtrReg_BasePtr : fp_reg = CV_Regx86_EBX; break;
|
|
default: InvalidPath;
|
|
}
|
|
} break;
|
|
case CV_Arch_X64:
|
|
{
|
|
switch (encoded_reg)
|
|
{
|
|
case CV_EncodedFramePtrReg_None : break;
|
|
case CV_EncodedFramePtrReg_StackPtr: fp_reg = CV_Regx64_RSP; break;
|
|
case CV_EncodedFramePtrReg_FramePtr: fp_reg = CV_Regx64_RBP; break;
|
|
case CV_EncodedFramePtrReg_BasePtr : fp_reg = CV_Regx64_R13; break;
|
|
default: InvalidPath;
|
|
}
|
|
} break;
|
|
default: NotImplemented;
|
|
}
|
|
return fp_reg;
|
|
}
|
|
|
|
internal U32
|
|
cv_map_encoded_base_pointer(CV_Arch arch, U32 encoded_frame_reg)
|
|
{
|
|
U32 r = 0;
|
|
switch (arch) {
|
|
case CV_Arch_8086: {
|
|
switch (encoded_frame_reg) {
|
|
case 0: r = 0; break;
|
|
case 1: r = CV_AllReg_VFRAME; break;
|
|
case 2: r = CV_Regx86_EBP; break;
|
|
case 3: r = CV_Regx86_EBX; break;
|
|
}
|
|
} break;
|
|
case CV_Arch_X64: {
|
|
switch (encoded_frame_reg) {
|
|
case 0: r = 0; break;
|
|
case 1: r = CV_Regx64_RSP; break;
|
|
case 2: r = CV_Regx64_RBP; break;
|
|
case 3: r = CV_Regx64_R13; break;
|
|
}
|
|
} break;
|
|
default: NotImplemented;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
|
|
internal String8
|
|
cv_string_from_inline_range_kind(CV_InlineRangeKind kind)
|
|
{
|
|
switch (kind) {
|
|
case CV_InlineRangeKind_Expr: return str8_lit("Expr");
|
|
case CV_InlineRangeKind_Stmt: return str8_lit("Stmt");
|
|
}
|
|
return str8_zero();
|
|
}
|
|
|