moved enum handling code to separate files

This commit is contained in:
Nikita Smith
2024-12-12 15:07:13 -08:00
parent 3961f93d1a
commit b6b64be867
13 changed files with 1398 additions and 2907 deletions
+22 -11
View File
@@ -139,18 +139,29 @@ cv_decode_fp_reg(CV_Arch arch, CV_EncodedFramePtrReg encoded_reg)
return fp_reg;
}
////////////////////////////////
//~ Enum <-> String
internal String8
cv_string_from_type_index_source(CV_TypeIndexSource ti_source)
internal U32
cv_map_encoded_base_pointer(CV_Arch arch, U32 encoded_frame_reg)
{
switch (ti_source) {
case CV_TypeIndexSource_NULL: return str8_lit(""); break;
case CV_TypeIndexSource_TPI: return str8_lit("TPI"); break;
case CV_TypeIndexSource_IPI: return str8_lit("IPI"); break;
case CV_TypeIndexSource_COUNT: break;
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 str8_zero();
return r;
}
+2 -5
View File
@@ -2969,10 +2969,7 @@ internal U64 cv_size_from_reg(CV_Arch arch, CV_Reg reg);
internal B32 cv_is_reg_sp(CV_Arch arch, CV_Reg reg);
internal CV_EncodedFramePtrReg cv_pick_fp_encoding(CV_SymFrameproc *frameproc, B32 is_local_param);
internal CV_Reg cv_decode_fp_reg(CV_Arch arch, CV_EncodedFramePtrReg encoded_reg);
////////////////////////////////
//~ Enum <-> String
internal String8 cv_string_from_type_index_source(CV_TypeIndexSource ti_source);
internal U32 cv_map_encoded_base_pointer(CV_Arch arch, U32 encoded_frame_reg);
#endif // CODEVIEW_H
+775
View File
@@ -0,0 +1,775 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
internal String8
cv_string_from_type_index_source(CV_TypeIndexSource ti_source)
{
switch (ti_source) {
case CV_TypeIndexSource_NULL: return str8_lit(""); break;
case CV_TypeIndexSource_TPI: return str8_lit("TPI"); break;
case CV_TypeIndexSource_IPI: return str8_lit("IPI"); break;
case CV_TypeIndexSource_COUNT: break;
}
return str8_zero();
}
internal String8
cv_string_from_language(CV_Language x)
{
switch (x) {
#define X(_n,_i) case _i: return str8_lit(Stringify(_n));
CV_LanguageXList(X)
#undef X
}
return str8_zero();
}
internal String8
cv_string_from_numeric(Arena *arena, CV_NumericParsed num)
{
String8 result = str8_zero();
switch (num.kind) {
case CV_NumericKind_FLOAT16: break; // TODO: format float16
case CV_NumericKind_FLOAT32: result = push_str8f(arena, "%f", (F64)(*(F32*)num.val)); break;
case CV_NumericKind_FLOAT48: break; // TODO: format float48
case CV_NumericKind_FLOAT64: result = push_str8f(arena, "%f", *(F64*)num.val); break;
case CV_NumericKind_FLOAT80: break; // TODO: format float80
case CV_NumericKind_FLOAT128: break; // TODO: format float128
case CV_NumericKind_CHAR: result = push_str8f(arena, "%d", *(S8 *)num.val); break;
case CV_NumericKind_SHORT: result = push_str8f(arena, "%d", *(S16*)num.val); break;
case CV_NumericKind_LONG: result = push_str8f(arena, "%d", *(S32*)num.val); break;
case CV_NumericKind_QUADWORD: result = push_str8f(arena, "%lld", *(S64*)num.val); break;
case CV_NumericKind_USHORT: result = push_str8f(arena, "%u", *(U16*)num.val); break;
case CV_NumericKind_ULONG: result = push_str8f(arena, "%u", *(U32*)num.val); break;
case CV_NumericKind_UQUADWORD: result = push_str8f(arena, "%llu", *(U64*)num.val); break;
}
return result;
}
internal String8
cv_string_from_reg_id(CV_Arch arch, U32 id)
{
String8 result = str8_zero();
switch (arch) {
case CV_Arch_8086: {
switch (id) {
#define X(_name, _id,...) case _id: str8_lit(Stringify(_name)); break;
CV_Reg_X86_XList(X)
#undef X
}
} break;
case CV_Arch_X64: {
switch (id) {
#define X(_name, _id,...) case _id: str8_lit(Stringify(_name)); break;
CV_Reg_X64_XList(X)
#undef X
}
} break;
default: NotImplemented;
}
return result;
}
internal String8
cv_string_from_member_access(CV_MemberAccess x)
{
switch (x) {
case CV_MemberAccess_Null: break;
case CV_MemberAccess_Private: return str8_lit("Private");
case CV_MemberAccess_Protected: return str8_lit("Protected");
case CV_MemberAccess_Public: return str8_lit("Public");
}
return str8_zero();
}
internal String8
cv_string_from_method_prop(CV_MethodProp x)
{
switch (x) {
case CV_MethodProp_Vanilla: return str8_lit("Vanilla");
case CV_MethodProp_Virtual: return str8_lit("Virtual");
case CV_MethodProp_Static: return str8_lit("Static");
case CV_MethodProp_Friend: return str8_lit("Friend");
case CV_MethodProp_Intro: return str8_lit("Intro");
case CV_MethodProp_PureVirtual: return str8_lit("PureVirtual");
case CV_MethodProp_PureIntro: return str8_lit("PureIntro");
}
return str8_zero();
}
internal String8
cv_string_from_hfa(CV_HFAKind x)
{
switch (x) {
case CV_HFAKind_None: return str8_lit("None");
case CV_HFAKind_Float: return str8_lit("Float");
case CV_HFAKind_Double: return str8_lit("Double");
case CV_HFAKind_Other: return str8_lit("Other");
}
return str8_zero();
}
internal String8
cv_string_from_mcom(CV_MoComUDTKind x)
{
switch (x) {
case CV_MoComUDTKind_None: return str8_lit("None");
case CV_MoComUDTKind_Ref: return str8_lit("Ref");
case CV_MoComUDTKind_Value: return str8_lit("Value");
case CV_MoComUDTKind_Interface: return str8_lit("Interface");
}
return str8_zero();
}
internal String8
cv_string_from_binary_opcode(CV_InlineBinaryAnnotation x)
{
switch (x) {
case CV_InlineBinaryAnnotation_Null: break;
case CV_InlineBinaryAnnotation_CodeOffset: return str8_lit("CodeOffset");
case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase: return str8_lit("ChangeCodeOffsetBase");
case CV_InlineBinaryAnnotation_ChangeCodeOffset: return str8_lit("ChangeCodeOffset");
case CV_InlineBinaryAnnotation_ChangeCodeLength: return str8_lit("ChangeCodeLength");
case CV_InlineBinaryAnnotation_ChangeFile: return str8_lit("ChangeFile");
case CV_InlineBinaryAnnotation_ChangeLineOffset: return str8_lit("ChangeLineOffset");
case CV_InlineBinaryAnnotation_ChangeLineEndDelta: return str8_lit("ChangeLineEndDelta");
case CV_InlineBinaryAnnotation_ChangeRangeKind: return str8_lit("ChangeRangeKind");
case CV_InlineBinaryAnnotation_ChangeColumnStart: return str8_lit("ChangeColumnStart");
case CV_InlineBinaryAnnotation_ChangeColumnEndDelta: return str8_lit("ChangeColumnEndDelta");
case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: return str8_lit("ChangeCodeOffsetAndLineOffset");
case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: return str8_lit("ChangeCodeLengthAndCodeOffset");
case CV_InlineBinaryAnnotation_ChangeColumnEnd: return str8_lit("ChangeColumnEnd");
}
return str8_zero();
}
internal String8
cv_string_from_thunk_ordinal(CV_ThunkOrdinal x)
{
switch (x) {
case CV_ThunkOrdinal_NoType: return str8_lit("NoType");
case CV_ThunkOrdinal_Adjustor: return str8_lit("Adjustor");
case CV_ThunkOrdinal_VCall: return str8_lit("VCall");
case CV_ThunkOrdinal_PCode: return str8_lit("PCode");
case CV_ThunkOrdinal_Load: return str8_lit("Load");
case CV_ThunkOrdinal_TrampIncremental: return str8_lit("TrampIncremental");
case CV_ThunkOrdinal_TrampBranchIsland: return str8_lit("TrampBranchIsland");
}
return str8_zero();
}
internal String8
cv_string_from_frame_cookie_kind(CV_FrameCookieKind x)
{
switch (x) {
case CV_FrameCookieKind_Copy: return str8_lit("Copy");
case CV_FrameCookieKind_XorSP: return str8_lit("XorSP");
case CV_FrameCookieKind_XorBP: return str8_lit("XorR13");
}
return str8_zero();
}
internal String8
cv_string_from_generic_style(CV_GenericStyle x)
{
switch (x) {
case CV_GenericStyle_VOID: return str8_lit("VOID");
case CV_GenericStyle_REG: return str8_lit("REG");
case CV_GenericStyle_ICAN: return str8_lit("ICAN");
case CV_GenericStyle_ICAF: return str8_lit("ICAF");
case CV_GenericStyle_IRAN: return str8_lit("IRAN");
case CV_GenericStyle_IRAF: return str8_lit("IRAF");
case CV_GenericStyle_UNUSED: return str8_lit("UNUSED");
}
return str8_zero();
}
internal String8
cv_string_from_trampoline_kind(CV_TrampolineKind x)
{
switch (x) {
case CV_TrampolineKind_Incremental: return str8_lit("Incremental");
case CV_TrampolineKind_BranchIsland: return str8_lit("BranchIsland");
}
return str8_zero();
}
internal String8
cv_string_from_virtual_table_shape_kind(CV_VirtualTableShape x)
{
switch (x) {
case CV_VirtualTableShape_Near: return str8_lit("Near");
case CV_VirtualTableShape_Far: return str8_lit("Far");
case CV_VirtualTableShape_Thin: return str8_lit("Thin");
case CV_VirtualTableShape_Outer: return str8_lit("Outer");
case CV_VirtualTableShape_Meta: return str8_lit("Meta");
case CV_VirtualTableShape_Near32: return str8_lit("Near32");
case CV_VirtualTableShape_Far32: return str8_lit("Far32");
}
return str8_zero();
}
internal String8
cv_string_from_call_kind(CV_CallKind x)
{
switch (x) {
case CV_CallKind_NearC: return str8_lit("NearC");
case CV_CallKind_FarC: return str8_lit("FarC");
case CV_CallKind_NearPascal: return str8_lit("NearPascal");
case CV_CallKind_FarPascal: return str8_lit("FarPascal");
case CV_CallKind_NearFast: return str8_lit("NearFast");
case CV_CallKind_FarFast: return str8_lit("FarFast");
case CV_CallKind_UNUSED: return str8_lit("UNUSED");
case CV_CallKind_NearStd: return str8_lit("NearStd");
case CV_CallKind_FarStd: return str8_lit("FarStd");
case CV_CallKind_NearSys: return str8_lit("NearSys");
case CV_CallKind_FarSys: return str8_lit("FarSys");
case CV_CallKind_This: return str8_lit("This");
case CV_CallKind_Mips: return str8_lit("Mips");
case CV_CallKind_Generic: return str8_lit("Generic");
case CV_CallKind_Alpha: return str8_lit("Alpha");
case CV_CallKind_PPC: return str8_lit("PPC");
case CV_CallKind_HitachiSuperH: return str8_lit("HitachiSuperH");
case CV_CallKind_Arm: return str8_lit("Arm");
case CV_CallKind_AM33: return str8_lit("AM33");
case CV_CallKind_TriCore: return str8_lit("TriCore");
case CV_CallKind_HitachiSuperH5: return str8_lit("HitachiSuperH5");
case CV_CallKind_M32R: return str8_lit("M32R");
case CV_CallKind_Clr: return str8_lit("Clr");
case CV_CallKind_Inline: return str8_lit("Inline");
case CV_CallKind_NearVector: return str8_lit("NearVector");
}
return str8_zero();
}
internal String8
cv_string_from_member_pointer_kind(CV_MemberPointerKind x)
{
switch (x) {
case CV_MemberPointerKind_Undef: return str8_lit("Undef");
case CV_MemberPointerKind_DataSingle: return str8_lit("DataSingle");
case CV_MemberPointerKind_DataMultiple: return str8_lit("DataMultiple");
case CV_MemberPointerKind_DataVirtual: return str8_lit("DataVirtual");
case CV_MemberPointerKind_DataGeneral: return str8_lit("DataGeneral");
case CV_MemberPointerKind_FuncSingle: return str8_lit("FuncSingle");
case CV_MemberPointerKind_FuncMultiple: return str8_lit("FuncMultiple");
case CV_MemberPointerKind_FuncGeneral: return str8_lit("FuncGeneral");
}
return str8_zero();
}
internal String8
cv_string_from_pointer_kind(CV_PointerKind x)
{
switch (x) {
case CV_PointerKind_Near: return str8_lit("Near");
case CV_PointerKind_Far: return str8_lit("Far");
case CV_PointerKind_Huge: return str8_lit("Huge");
case CV_PointerKind_BaseSeg: return str8_lit("BaseSeg");
case CV_PointerKind_BaseVal: return str8_lit("BaseVal");
case CV_PointerKind_BaseSegVal: return str8_lit("BaseSegVal");
case CV_PointerKind_BaseAddr: return str8_lit("BaseAddr");
case CV_PointerKind_BaseSegAddr: return str8_lit("BaseSegAddr");
case CV_PointerKind_BaseType: return str8_lit("BaseType");
case CV_PointerKind_BaseSelf: return str8_lit("BaseSelf");
case CV_PointerKind_Near32: return str8_lit("Near32");
case CV_PointerKind_Far32: return str8_lit("Far32");
case CV_PointerKind_64: return str8_lit("64");
}
return str8_zero();
}
internal String8
cv_string_from_pointer_mode(CV_PointerMode x)
{
switch (x) {
case CV_PointerMode_Ptr: return str8_lit("Ptr");
case CV_PointerMode_LRef: return str8_lit("LRef");
case CV_PointerMode_PtrMem: return str8_lit("PtrMem");
case CV_PointerMode_PtrMethod: return str8_lit("PtrMethod");
case CV_PointerMode_RRef: return str8_lit("RRef");
}
return str8_zero();
}
internal String8
cv_string_from_c13_checksum_kind(CV_C13ChecksumKind x)
{
switch (x) {
case CV_C13ChecksumKind_Null: break;
case CV_C13ChecksumKind_MD5: return str8_lit("MD5");
case CV_C13ChecksumKind_SHA1: return str8_lit("SHA1");
case CV_C13ChecksumKind_SHA256: return str8_lit("SHA256");
}
return str8_zero();
}
internal String8
cv_string_from_c13_subsection_kind(CV_C13SubSectionKind x)
{
switch (x) {
#define X(_id, _name) case CV_C13SubSectionKind_##_id: return str8_lit(Stringify(_name));
CV_C13SubSectionKindXList(X)
#undef X
}
return str8_zero();
}
internal String8
cv_string_from_modifier_flags(Arena *arena, CV_ModifierFlags x)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (x & CV_ModifierFlag_Const) {
str8_list_pushf(scratch.arena, &list, "Const");
}
if (x & CV_ModifierFlag_Volatile) {
str8_list_pushf(scratch.arena, &list, "Volatile");
}
if (x & CV_ModifierFlag_Unaligned) {
str8_list_pushf(scratch.arena, &list, "Unaligned");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
}
internal String8
cv_string_from_pointer_attribs(Arena *arena, CV_PointerAttribs x)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (x & CV_PointerAttrib_IsFlat) {
str8_list_pushf(scratch.arena, &list, "IsFlat");
}
if (x & CV_PointerAttrib_Volatile) {
str8_list_pushf(scratch.arena, &list, "Volatile");
}
if (x & CV_PointerAttrib_Const) {
str8_list_pushf(scratch.arena, &list, "Const");
}
if (x & CV_PointerAttrib_Unaligned) {
str8_list_pushf(scratch.arena, &list, "Unaligned");
}
if (x & CV_PointerAttrib_Restricted) {
str8_list_pushf(scratch.arena, &list, "Restricted");
}
if (x & CV_PointerAttrib_MOCOM) {
str8_list_pushf(scratch.arena, &list, "MOCOM");
}
if (x & CV_PointerAttrib_LRef) {
str8_list_pushf(scratch.arena, &list, "LRef");
}
if (x & CV_PointerAttrib_RRef) {
str8_list_pushf(scratch.arena, &list, "RRef");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
cv_string_from_function_attribs(Arena *arena, CV_FunctionAttribs x)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (x & CV_FunctionAttrib_CxxReturnUDT) {
str8_list_pushf(scratch.arena, &list, "CxxReturnUDT");
}
if (x & CV_FunctionAttrib_Constructor) {
str8_list_pushf(scratch.arena, &list, "Constructor");
}
if (x & CV_FunctionAttrib_ConstructorVBase) {
str8_list_pushf(scratch.arena, &list, "ConstructorVBase");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
cv_string_from_export_flags(Arena *arena, CV_ExportFlags x)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (x & CV_ExportFlag_Constant) {
str8_list_pushf(scratch.arena, &list, "Constant");
}
if (x & CV_ExportFlag_Data) {
str8_list_pushf(scratch.arena, &list, "Data");
}
if (x & CV_ExportFlag_Private) {
str8_list_pushf(scratch.arena, &list, "Private");
}
if (x & CV_ExportFlag_NoName) {
str8_list_pushf(scratch.arena, &list, "NoName");
}
if (x & CV_ExportFlag_Ordinal) {
str8_list_pushf(scratch.arena, &list, "Ordinal");
}
if (x & CV_ExportFlag_Forwarder) {
str8_list_pushf(scratch.arena, &list, "Forwarder");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
cv_string_from_sepcode(Arena *arena, CV_SepcodeFlags x)
{
Temp scratch = scratch_begin(&arena,1);
String8List list = {0};
if (x & CV_SepcodeFlag_IsLexicalScope) {
str8_list_pushf(scratch.arena, &list, "IsLexicalScope");
}
if (x & CV_SepcodeFlag_ReturnsToParent) {
str8_list_pushf(scratch.arena, &list, "ReturnsToParent");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
cv_string_from_pub32_flags(Arena *arena, CV_Pub32Flags x)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (x & CV_Pub32Flag_Code) {
str8_list_pushf(scratch.arena, &list, "Code");
}
if (x & CV_Pub32Flag_Function) {
str8_list_pushf(scratch.arena, &list, "Function");
}
if (x & CV_Pub32Flag_ManagedCode) {
str8_list_pushf(scratch.arena, &list, "ManagedCode");
}
if (x & CV_Pub32Flag_MSIL) {
str8_list_pushf(scratch.arena, &list, "MSIL");
}
String8 result = str8_list_join(scratch.arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
cv_string_generic_flags(Arena *arena, CV_GenericFlags x)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (x & CV_GenericFlags_CSTYLE) {
str8_list_pushf(scratch.arena, &list, "CSTYLE");
}
if (x & CV_GenericFlags_RSCLEAN) {
str8_list_pushf(scratch.arena, &list, "RSCLEAN");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
cv_string_from_frame_proc_flags(Arena *arena, CV_FrameprocFlags x)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (x & CV_FrameprocFlag_UsesAlloca) {
str8_list_pushf(scratch.arena, &list, "UsesAlloca");
}
if (x & CV_FrameprocFlag_UsesSetJmp) {
str8_list_pushf(scratch.arena, &list, "UsesSetJmp");
}
if (x & CV_FrameprocFlag_UsesLongJmp) {
str8_list_pushf(scratch.arena, &list, "UsesLongJmp");
}
if (x & CV_FrameprocFlag_UsesInlAsm) {
str8_list_pushf(scratch.arena, &list, "UsesInlAsm");
}
if (x & CV_FrameprocFlag_UsesEH) {
str8_list_pushf(scratch.arena, &list, "UsesEH");
}
if (x & CV_FrameprocFlag_Inline) {
str8_list_pushf(scratch.arena, &list, "Inline");
}
if (x & CV_FrameprocFlag_HasSEH) {
str8_list_pushf(scratch.arena, &list, "HasSEH");
}
if (x & CV_FrameprocFlag_Naked) {
str8_list_pushf(scratch.arena, &list, "Naked");
}
if (x & CV_FrameprocFlag_HasSecurityChecks) {
str8_list_pushf(scratch.arena, &list, "HasSecurityChecks");
}
if (x & CV_FrameprocFlag_AsyncEH) {
str8_list_pushf(scratch.arena, &list, "AsyncEH");
}
if (x & CV_FrameprocFlag_GSNoStackOrdering) {
str8_list_pushf(scratch.arena, &list, "GSNoStackOrdering");
}
if (x & CV_FrameprocFlag_WasInlined) {
str8_list_pushf(scratch.arena, &list, "WasInlined");
}
if (x & CV_FrameprocFlag_GSCheck) {
str8_list_pushf(scratch.arena, &list, "GSCheck");
}
if (x & CV_FrameprocFlag_SafeBuffers) {
str8_list_pushf(scratch.arena, &list, "SafeBuffers");
}
if (x & CV_FrameprocFlag_PogoOn) {
str8_list_pushf(scratch.arena, &list, "PogoOn");
}
if (x & CV_FrameprocFlag_PogoCountsValid) {
str8_list_pushf(scratch.arena, &list, "PogoCountsValid");
}
if (x & CV_FrameprocFlag_OptSpeed) {
str8_list_pushf(scratch.arena, &list, "OptSpeed");
}
if (x & CV_FrameprocFlag_HasCFG) {
str8_list_pushf(scratch.arena, &list, "HasCFG");
}
if (x & CV_FrameprocFlag_HasCFW) {
str8_list_pushf(scratch.arena, &list, "HasCFW");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
cv_string_from_type_props(Arena *arena, CV_TypeProps x)
{
Temp scratch = scratch_begin(&arena, 1);
U32 hfa = CV_TypeProps_Extract_HFA(x);
U32 mcom = CV_TypeProps_Extract_MOCOM(x);
String8 flags_str;
{
String8List list = {0};
if (x & CV_TypeProp_Packed) {
str8_list_pushf(scratch.arena, &list, "Packed");
}
if (x & CV_TypeProp_HasConstructorsDestructors) {
str8_list_pushf(scratch.arena, &list, "HasConstructorsDestructors");
}
if (x & CV_TypeProp_OverloadedOperators) {
str8_list_pushf(scratch.arena, &list, "OverloadedOperators");
}
if (x & CV_TypeProp_IsNested) {
str8_list_pushf(scratch.arena, &list, "IsNested");
}
if (x & CV_TypeProp_ContainsNested) {
str8_list_pushf(scratch.arena, &list, "ContainsNested");
}
if (x & CV_TypeProp_OverloadedAssignment) {
str8_list_pushf(scratch.arena, &list, "OverloadedAssignment");
}
if (x & CV_TypeProp_OverloadedCasting) {
str8_list_pushf(scratch.arena, &list, "OverloadedCasting");
}
if (x & CV_TypeProp_FwdRef) {
str8_list_pushf(scratch.arena, &list, "FwdRef");
}
if (x & CV_TypeProp_Scoped) {
str8_list_pushf(scratch.arena, &list, "Scoped");
}
if (x & CV_TypeProp_HasUniqueName) {
str8_list_pushf(scratch.arena, &list, "HasUniqueName");
}
if (x & CV_TypeProp_Sealed) {
str8_list_pushf(scratch.arena, &list, "Sealed");
}
flags_str = str8_list_join(scratch.arena, &list, &(StringJoin){.sep=str8_lit(", ") });
}
String8 hfa_str = cv_string_from_hfa(hfa);
String8 mcom_str = cv_string_from_mcom(mcom);
String8 result = push_str8f(arena, "flags = %S, HFA = %S, MCOM = %S", flags_str, hfa_str, mcom_str);
scratch_end(scratch);
return result;
}
internal String8
cv_string_from_local_flags(Arena *arena, CV_LocalFlags x)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (x & CV_LocalFlag_Param) {
str8_list_pushf(scratch.arena, &list, "Param");
}
if (x & CV_LocalFlag_AddrTaken) {
str8_list_pushf(scratch.arena, &list, "AddrTaken");
}
if (x & CV_LocalFlag_Compgen) {
str8_list_pushf(scratch.arena, &list, "Compgen");
}
if (x & CV_LocalFlag_Aggregate) {
str8_list_pushf(scratch.arena, &list, "Aggregate");
}
if (x & CV_LocalFlag_PartOfAggregate) {
str8_list_pushf(scratch.arena, &list, "PartOfAggregate");
}
if (x & CV_LocalFlag_Aliased) {
str8_list_pushf(scratch.arena, &list, "Aliased");
}
if (x & CV_LocalFlag_Alias) {
str8_list_pushf(scratch.arena, &list, "Alias");
}
if (x & CV_LocalFlag_Retval) {
str8_list_pushf(scratch.arena, &list, "Retval");
}
if (x & CV_LocalFlag_OptOut) {
str8_list_pushf(scratch.arena, &list, "OptOut");
}
if (x & CV_LocalFlag_Global) {
str8_list_pushf(scratch.arena, &list, "Global");
}
if (x & CV_LocalFlag_Static) {
str8_list_pushf(scratch.arena, &list, "Static");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
cv_string_from_proc_flags(Arena *arena, CV_ProcFlags x)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (x & CV_ProcFlag_NoFPO) {
str8_list_pushf(scratch.arena, &list, "NoFPO");
}
if (x & CV_ProcFlag_IntReturn) {
str8_list_pushf(scratch.arena, &list, "IntReturn");
}
if (x & CV_ProcFlag_FarReturn) {
str8_list_pushf(scratch.arena, &list, "FarReturn");
}
if (x & CV_ProcFlag_NeverReturn) {
str8_list_pushf(scratch.arena, &list, "NeverReturn");
}
if (x & CV_ProcFlag_NotReached) {
str8_list_pushf(scratch.arena, &list, "NotReached");
}
if (x & CV_ProcFlag_CustomCall) {
str8_list_pushf(scratch.arena, &list, "CustomCall");
}
if (x & CV_ProcFlag_NoInline) {
str8_list_pushf(scratch.arena, &list, "NoInline");
}
if (x & CV_ProcFlag_OptDbgInfo) {
str8_list_pushf(scratch.arena, &list, "OptDbgInfo");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
temp_end(scratch);
return result;
}
internal String8
cv_string_from_range_attribs(Arena *arena, CV_RangeAttribs x)
{ (void)arena;
String8 result = str8_lit("None");
if (x == CV_RangeAttrib_Maybe) {
result = str8_lit("Maybe");
}
return result;
}
internal String8
cv_string_from_defrange_register_rel_flags(Arena *arena, CV_DefrangeRegisterRelFlags x)
{ (void)arena;
String8 result = str8_lit("None");
if (x == CV_DefrangeRegisterRelFlag_SpilledOutUDTMember) {
result = str8_lit("SpilledOutUDTMember");
}
return result;
}
internal String8
cv_string_from_field_attribs(Arena *arena, CV_FieldAttribs attribs)
{
Temp scratch = scratch_begin(&arena, 1);
U32 access = CV_FieldAttribs_Extract_ACCESS(attribs);
U32 mprop = CV_FieldAttribs_Extract_MPROP(attribs);
String8 attribs_str;
{
String8List list = {0};
if (attribs & CV_FieldAttrib_Pseudo) {
str8_list_pushf(scratch.arena, &list, "Pseudo");
}
if (attribs & CV_FieldAttrib_NoInherit) {
str8_list_pushf(scratch.arena, &list, "NoInherit");
}
if (attribs & CV_FieldAttrib_NoConstruct) {
str8_list_pushf(scratch.arena, &list, "NoConstruct");
}
if (attribs & CV_FieldAttrib_CompilerGenated) {
str8_list_pushf(scratch.arena, &list, "CompilerGenerated");
}
if (attribs & CV_FieldAttrib_Sealed) {
str8_list_pushf(scratch.arena, &list, "Sealed");
}
attribs_str = str8_list_join(scratch.arena, &list, &(StringJoin){.sep=", " });
}
String8 access_str = cv_string_from_member_access(access);
String8 mprop_str = cv_string_from_method_prop(mprop);
String8 result = push_str8f(arena, "flags = %S, access = %S, method prop = %S", attribs_str, access_str, mprop_str);
scratch_end(scratch);
return result;
}
internal String8
cv_string_from_itype(Arena *arena, CV_TypeIndex itype)
{
String8 result = push_str8f(arena, "%x", itype);
return result;
}
internal String8
cv_string_from_itemid(Arena *arena, CV_ItemId itemid)
{
String8 result = push_str8f(arena, "%x", itemid);
return result;
}
internal String8
cv_string_from_reg_off(Arena *arena, CV_Arch arch, U32 reg, U32 off)
{
return push_str8f(arena, "%S+%x", cv_string_from_reg_id(arch, reg), off);
}
internal String8
cv_string_from_symbol_type(Arena *arena, CV_SymKind symbol_type)
{
String8 str = cv_string_from_sym_kind(symbol_type);
String8 result = push_str8f(arena, "S_%S", str);
return result;
}
internal String8
cv_string_from_symbol_kind(Arena *arena, CV_SymKind kind)
{
String8 str = cv_string_from_sym_kind(kind);
String8 result = push_str8f(arena, "S_%S", str);
return result;
}
internal String8
cv_string_from_leaf_name(Arena *arena, U32 leaf_type)
{
String8 str = cv_string_from_leaf_kind(leaf_type);
String8 result = push_str8f(arena, "LF_%S", str);
return result;
}
internal String8
cv_string_sec_off(Arena *arena, U32 sec, U32 off)
{
return push_str8f(arena, "%04x:%08x", sec, off);
}
+51
View File
@@ -0,0 +1,51 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef CODEVIEW_ENUM_H
#define CODEVIEW_ENUM_H
internal String8 cv_string_from_type_index_source(CV_TypeIndexSource ti_source);
internal String8 cv_string_from_language(CV_Language x);
internal String8 cv_string_from_numeric(Arena *arena, CV_NumericParsed num);
internal String8 cv_string_from_reg_id(CV_Arch arch, U32 id);
internal String8 cv_string_from_member_access(CV_MemberAccess x);
internal String8 cv_string_from_method_prop(CV_MethodProp x);
internal String8 cv_string_from_hfa(CV_HFAKind x);
internal String8 cv_string_from_mcom(CV_MoComUDTKind x);
internal String8 cv_string_from_binary_opcode(CV_InlineBinaryAnnotation x);
internal String8 cv_string_from_thunk_ordinal(CV_ThunkOrdinal x);
internal String8 cv_string_from_frame_cookie_kind(CV_FrameCookieKind x);
internal String8 cv_string_from_generic_style(CV_GenericStyle x);
internal String8 cv_string_from_trampoline_kind(CV_TrampolineKind x);
internal String8 cv_string_from_virtual_table_shape_kind(CV_VirtualTableShape x);
internal String8 cv_string_from_call_kind(CV_CallKind x);
internal String8 cv_string_from_member_pointer_kind(CV_MemberPointerKind x);
internal String8 cv_string_from_pointer_kind(CV_PointerKind x);
internal String8 cv_string_from_pointer_mode(CV_PointerMode x);
internal String8 cv_string_from_c13_checksum_kind(CV_C13ChecksumKind x);
internal String8 cv_string_from_c13_subsection_kind(CV_C13SubSectionKind x);
internal String8 cv_string_from_modifier_flags(Arena *arena, CV_ModifierFlags x);
internal String8 cv_string_from_pointer_attribs(Arena *arena, CV_PointerAttribs x);
internal String8 cv_string_from_function_attribs(Arena *arena, CV_FunctionAttribs x);
internal String8 cv_string_from_export_flags(Arena *arena, CV_ExportFlags x);
internal String8 cv_string_from_sepcode(Arena *arena, CV_SepcodeFlags x);
internal String8 cv_string_from_pub32_flags(Arena *arena, CV_Pub32Flags x);
internal String8 cv_string_generic_flags(Arena *arena, CV_GenericFlags x);
internal String8 cv_string_from_frame_proc_flags(Arena *arena, CV_FrameprocFlags x);
internal String8 cv_string_from_type_props(Arena *arena, CV_TypeProps x);
internal String8 cv_string_from_local_flags(Arena *arena, CV_LocalFlags x);
internal String8 cv_string_from_proc_flags(Arena *arena, CV_ProcFlags x);
internal String8 cv_string_from_range_attribs(Arena *arena, CV_RangeAttribs x);
internal String8 cv_string_from_defrange_register_rel_flags(Arena *arena, CV_DefrangeRegisterRelFlags x);
internal String8 cv_string_from_field_attribs(Arena *arena, CV_FieldAttribs attribs);
internal String8 cv_string_from_itype(Arena *arena, CV_TypeIndex itype);
internal String8 cv_string_from_itemid(Arena *arena, CV_ItemId itemid);
internal String8 cv_string_from_reg_off(Arena *arena, CV_Arch arch, U32 reg, U32 off);
internal String8 cv_string_from_symbol_type(Arena *arena, CV_SymKind symbol_type);
internal String8 cv_string_from_symbol_kind(Arena *arena, CV_SymKind kind);
internal String8 cv_string_from_leaf_name(Arena *arena, U32 leaf_type);
internal String8 cv_string_sec_off(Arena *arena, U32 sec, U32 off);
#endif // CODEVIEW_ENUM_H
File diff suppressed because it is too large Load Diff
-84
View File
@@ -1,84 +0,0 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef CODEVIEW_STRINGIZE_H
#define CODEVIEW_STRINGIZE_H
////////////////////////////////
//~ CodeView Stringize Helper Types
typedef struct CV_StringizeSymParams{
CV_Arch arch;
} CV_StringizeSymParams;
typedef struct CV_StringizeLeafParams{
U32 dummy;
} CV_StringizeLeafParams;
////////////////////////////////
//~ CodeView Common Stringize Functions
internal void cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num);
internal void cv_stringize_lvar_addr_range(Arena *arena, String8List *out,
CV_LvarAddrRange *range);
internal void cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_LvarAddrGap *gap);
internal void cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out,
void *first, void *opl);
internal String8 cv_string_from_basic_type(CV_BasicType basic_type);
internal String8 cv_string_from_c13_sub_section_kind(CV_C13SubSectionKind kind);
internal String8 cv_string_from_reg(CV_Arch arch, CV_Reg reg);
internal String8 cv_string_from_pointer_kind(CV_PointerKind ptr_kind);
internal String8 cv_string_from_pointer_mode(CV_PointerMode ptr_mode);
internal String8 cv_string_from_hfa_kind(CV_HFAKind hfa_kind);
internal String8 cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind);
////////////////////////////////
//~ CodeView Flags Stringize Functions
internal void cv_stringize_modifier_flags(Arena *arena, String8List *out,
U32 indent, CV_ModifierFlags flags);
internal void cv_stringize_type_props(Arena *arena, String8List *out,
U32 indent, CV_TypeProps props);
internal void cv_stringize_pointer_attribs(Arena *arena, String8List *out,
U32 indent, CV_PointerAttribs attribs);
internal void cv_stringize_local_flags(Arena *arena, String8List *out,
U32 indent, CV_LocalFlags flags);
////////////////////////////////
//~ CodeView Sym Stringize Functions
internal void cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym);
internal void cv_stringize_sym_range(Arena *arena, String8List *out,
CV_RecRange *range, String8 data,
CV_StringizeSymParams *p);
internal void cv_stringize_sym_array(Arena *arena, String8List *out,
CV_RecRangeArray *ranges, String8 data,
CV_StringizeSymParams *p);
////////////////////////////////
//~ CodeView Leaf Stringize Functions
internal void cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf);
internal void cv_stringize_leaf_range(Arena *arena, String8List *out,
CV_RecRange *range, CV_TypeId itype, String8 data,
CV_StringizeLeafParams *p);
internal void cv_stringize_leaf_array(Arena *arena, String8List *out,
CV_RecRangeArray *ranges, CV_TypeId itype_first,
String8 data,
CV_StringizeLeafParams *p);
////////////////////////////////
//~ CodeView C13 Stringize Functions
internal void cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13);
internal String8 cv_string_from_inline_range_kind(CV_InlineRangeKind kind);
#endif // CODEVIEW_STRINGIZE_H