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
+9 -444
View File
@@ -1322,452 +1322,17 @@ coff_archive_parse_from_data(String8 data)
return null_parse;
}
////////////////////////////////
read_only struct
{
String8 string;
COFF_MachineType machine;
} g_coff_machine_map[] = {
{ str8_lit_comp(""), COFF_MachineType_UNKNOWN },
{ str8_lit_comp("X86"), COFF_MachineType_X86 },
{ str8_lit_comp("AMD64"), COFF_MachineType_X64 },
{ str8_lit_comp("X64"), COFF_MachineType_X64 },
{ str8_lit_comp("AM33"), COFF_MachineType_AM33 },
{ str8_lit_comp("ARM"), COFF_MachineType_ARM },
{ str8_lit_comp("ARM64"), COFF_MachineType_ARM64 },
{ str8_lit_comp("ARMNT"), COFF_MachineType_ARMNT },
{ str8_lit_comp("EBC"), COFF_MachineType_EBC },
{ str8_lit_comp("IA64"), COFF_MachineType_IA64 },
{ str8_lit_comp("M32R"), COFF_MachineType_M32R },
{ str8_lit_comp("MIPS16"), COFF_MachineType_MIPS16 },
{ str8_lit_comp("MIPSFPU"), COFF_MachineType_MIPSFPU },
{ str8_lit_comp("MIPSFPU16"), COFF_MachineType_MIPSFPU16 },
{ str8_lit_comp("POWERPC"), COFF_MachineType_POWERPC },
{ str8_lit_comp("POWERPCFP"), COFF_MachineType_POWERPCFP },
{ str8_lit_comp("R4000"), COFF_MachineType_R4000 },
{ str8_lit_comp("RISCV32"), COFF_MachineType_RISCV32 },
{ str8_lit_comp("RISCV64"), COFF_MachineType_RISCV64 },
{ str8_lit_comp("SH3"), COFF_MachineType_SH3 },
{ str8_lit_comp("SH3DSP"), COFF_MachineType_SH3DSP },
{ str8_lit_comp("SH4"), COFF_MachineType_SH4 },
{ str8_lit_comp("SH5"), COFF_MachineType_SH5 },
{ str8_lit_comp("THUMB"), COFF_MachineType_THUMB },
{ str8_lit_comp("WCEMIPSV2"), COFF_MachineType_WCEMIPSV2 },
};
read_only static struct {
char * name;
COFF_ImportHeaderType type;
} g_coff_import_header_type_map[] = {
{ "CODE", COFF_ImportHeaderType_CODE },
{ "DATA", COFF_ImportHeaderType_DATA },
{ "CONST", COFF_ImportHeaderType_CONST },
};
internal String8
coff_string_from_comdat_select_type(COFF_ComdatSelectType select)
{
String8 result = str8(0,0);
switch (select) {
case COFF_ComdatSelectType_NULL: result = str8_lit("NULL"); break;
case COFF_ComdatSelectType_NODUPLICATES: result = str8_lit("NODUPLICATES"); break;
case COFF_ComdatSelectType_ANY: result = str8_lit("ANY"); break;
case COFF_ComdatSelectType_SAME_SIZE: result = str8_lit("SAME_SIZE"); break;
case COFF_ComdatSelectType_EXACT_MATCH: result = str8_lit("EXACT_MATCH"); break;
case COFF_ComdatSelectType_ASSOCIATIVE: result = str8_lit("ASSOCIATIVE"); break;
case COFF_ComdatSelectType_LARGEST: result = str8_lit("LARGEST"); break;
}
return result;
}
internal String8
coff_string_from_machine_type(COFF_MachineType machine)
{
for (U64 i = 0; i < ArrayCount(g_coff_machine_map); ++i) {
if (g_coff_machine_map[i].machine == machine) {
return g_coff_machine_map[i].string;
}
}
return str8_zero();
}
internal String8
coff_string_from_flags(Arena *arena, COFF_Flags flags)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (flags & COFF_Flag_RELOC_STRIPPED) {
str8_list_pushf(scratch.arena, &list, "Relocs Stripped");
}
if (flags & COFF_Flag_EXECUTABLE_IMAGE) {
str8_list_pushf(scratch.arena, &list, "Executable");
}
if (flags & COFF_Flag_LINE_NUMS_STRIPPED) {
str8_list_pushf(scratch.arena, &list, "Line Numbers Stripped");
}
if (flags & COFF_Flag_SYM_STRIPPED) {
str8_list_pushf(scratch.arena, &list, "Symbols Stripped");
}
if (flags & COFF_Flag_LARGE_ADDRESS_AWARE) {
str8_list_pushf(scratch.arena, &list, "Large Address Aware");
}
if (flags & COFF_Flag_32BIT_MACHINE) {
str8_list_pushf(scratch.arena, &list, "32-Bit Machine");
}
if (flags & COFF_Flag_DEBUG_STRIPPED) {
str8_list_pushf(scratch.arena, &list, "Debug Stripped");
}
if (flags & COFF_Flag_REMOVABLE_RUN_FROM_SWAP) {
str8_list_pushf(scratch.arena, &list, "Removeable Run From Swap");
}
if (flags & COFF_Flag_NET_RUN_FROM_SWAP) {
str8_list_pushf(scratch.arena, &list, "Net Run From Swap");
}
if (flags & COFF_Flag_SYSTEM) {
str8_list_pushf(scratch.arena, &list, "System");
}
if (flags & COFF_Flag_DLL) {
str8_list_pushf(scratch.arena, &list, "DLL");
}
if (flags & COFF_Flag_UP_SYSTEM_ONLY) {
str8_list_pushf(scratch.arena, &list, "Up System Only");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
coff_string_from_section_flags(Arena *arena, COFF_SectionFlags flags)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (flags & COFF_SectionFlag_TYPE_NO_PAD) {
str8_list_pushf(scratch.arena, &list, "TYPE_NO_PAD");
}
if (flags & COFF_SectionFlag_CNT_CODE) {
str8_list_pushf(scratch.arena, &list, "CNT_CODE");
}
if (flags & COFF_SectionFlag_CNT_INITIALIZED_DATA) {
str8_list_pushf(scratch.arena, &list, "CNT_INITIALIZED_DATA");
}
if (flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) {
str8_list_pushf(scratch.arena, &list, "CNT_UNINITIALIZED_DATA");
}
if (flags & COFF_SectionFlag_LNK_OTHER) {
str8_list_pushf(scratch.arena, &list, "LNK_OTHER");
}
if (flags & COFF_SectionFlag_LNK_INFO) {
str8_list_pushf(scratch.arena, &list, "LNK_INFO");
}
if (flags & COFF_SectionFlag_LNK_COMDAT) {
str8_list_pushf(scratch.arena, &list, "LNK_COMDAT");
}
if (flags & COFF_SectionFlag_GPREL) {
str8_list_pushf(scratch.arena, &list, "GPREL");
}
if (flags & COFF_SectionFlag_MEM_16BIT) {
str8_list_pushf(scratch.arena, &list, "MEM_16BIT");
}
if (flags & COFF_SectionFlag_MEM_LOCKED) {
str8_list_pushf(scratch.arena, &list, "MEM_LOCKED");
}
if (flags & COFF_SectionFlag_MEM_PRELOAD) {
str8_list_pushf(scratch.arena, &list, "MEM_PRELOAD");
}
if (flags & COFF_SectionFlag_LNK_NRELOC_OVFL) {
str8_list_pushf(scratch.arena, &list, "LNK_NRELOC_OVFL");
}
if (flags & COFF_SectionFlag_MEM_DISCARDABLE) {
str8_list_pushf(scratch.arena, &list, "MEM_DISCARDABLE");
}
if (flags & COFF_SectionFlag_MEM_NOT_CACHED) {
str8_list_pushf(scratch.arena, &list, "MEM_NOT_CACHED");
}
if (flags & COFF_SectionFlag_MEM_NOT_PAGED) {
str8_list_pushf(scratch.arena, &list, "MEM_NOT_PAGED");
}
if (flags & COFF_SectionFlag_MEM_SHARED) {
str8_list_pushf(scratch.arena, &list, "MEM_SHARED");
}
if (flags & COFF_SectionFlag_MEM_EXECUTE) {
str8_list_pushf(scratch.arena, &list, "MEM_EXECUTE");
}
if (flags & COFF_SectionFlag_MEM_READ) {
str8_list_pushf(scratch.arena, &list, "MEM_READ");
}
if (flags & COFF_SectionFlag_MEM_WRITE) {
str8_list_pushf(scratch.arena, &list, "MEM_WRITE");
}
U64 align = coff_align_size_from_section_flags(flags);
if (align) {
str8_list_pushf(scratch.arena, &list, "Align=%u", align);
}
if (!list.node_count) {
str8_list_pushf(scratch.arena, &list, "None");
}
StringJoin join = {0};
join.sep = str8_lit(", ");
String8 result = str8_list_join(arena, &list, &join);
scratch_end(scratch);
return result;
}
internal String8
coff_string_from_import_header_type(COFF_ImportHeaderType type)
{
for (U64 i = 0; i < ArrayCount(g_coff_import_header_type_map); ++i) {
if (g_coff_import_header_type_map[i].type == type) {
return str8_cstring(g_coff_import_header_type_map[i].name);
}
}
return str8(0,0);
}
internal String8
coff_string_from_sym_dtype(COFF_SymDType x)
{
switch (x) {
case COFF_SymDType_NULL: return str8_lit("NULL");
case COFF_SymDType_PTR : return str8_lit("PTR");
case COFF_SymDType_FUNC: return str8_lit("FUNC");
case COFF_SymDType_ARRAY: return str8_lit("ARRAY");
}
return str8_zero();
}
internal String8
coff_string_from_sym_type(COFF_SymType x)
{
switch (x) {
case COFF_SymType_NULL: return str8_lit("NULL");
case COFF_SymType_VOID: return str8_lit("VOID");
case COFF_SymType_CHAR: return str8_lit("CHAR");
case COFF_SymType_SHORT: return str8_lit("SHORT");
case COFF_SymType_INT: return str8_lit("INT");
case COFF_SymType_LONG: return str8_lit("LONG");
case COFF_SymType_FLOAT: return str8_lit("FLOAT");
case COFF_SymType_DOUBLE: return str8_lit("DOUBLE");
case COFF_SymType_STRUCT: return str8_lit("STRUCT");
case COFF_SymType_UNION: return str8_lit("UNION");
case COFF_SymType_ENUM: return str8_lit("ENUM");
case COFF_SymType_MOE: return str8_lit("MOE");
case COFF_SymType_BYTE: return str8_lit("BYTE");
case COFF_SymType_WORD: return str8_lit("WORD");
case COFF_SymType_UINT: return str8_lit("UINT");
case COFF_SymType_DWORD: return str8_lit("DWORD");
}
return str8_zero();
}
internal String8
coff_string_from_sym_storage_class(COFF_SymStorageClass x)
{
switch (x) {
case COFF_SymStorageClass_NULL: break;
case COFF_SymStorageClass_END_OF_FUNCTION: return str8_lit("EOF");
case COFF_SymStorageClass_AUTOMATIC: return str8_lit("AUTOMATIC");
case COFF_SymStorageClass_EXTERNAL: return str8_lit("EXTERNAL");
case COFF_SymStorageClass_STATIC: return str8_lit("STATIC");
case COFF_SymStorageClass_REGISTER: return str8_lit("REGISTER");
case COFF_SymStorageClass_EXTERNAL_DEF: return str8_lit("DEF");
case COFF_SymStorageClass_LABEL: return str8_lit("LABEL");
case COFF_SymStorageClass_UNDEFINED_LABEL: return str8_lit("LABEL");
case COFF_SymStorageClass_MEMBER_OF_STRUCT: return str8_lit("STRUCT");
case COFF_SymStorageClass_ARGUMENT: return str8_lit("ARGUMENT");
case COFF_SymStorageClass_STRUCT_TAG: return str8_lit("TAG");
case COFF_SymStorageClass_MEMBER_OF_UNION: return str8_lit("UNION");
case COFF_SymStorageClass_UNION_TAG: return str8_lit("TAG");
case COFF_SymStorageClass_TYPE_DEFINITION: return str8_lit("DEFINITION");
case COFF_SymStorageClass_UNDEFINED_STATIC: return str8_lit("STATIC");
case COFF_SymStorageClass_ENUM_TAG: return str8_lit("TAG");
case COFF_SymStorageClass_MEMBER_OF_ENUM: return str8_lit("ENUM");
case COFF_SymStorageClass_REGISTER_PARAM: return str8_lit("PARAM");
case COFF_SymStorageClass_BIT_FIELD: return str8_lit("FIELD");
case COFF_SymStorageClass_BLOCK: return str8_lit("BLOCK");
case COFF_SymStorageClass_FUNCTION: return str8_lit("FUNCTION");
case COFF_SymStorageClass_END_OF_STRUCT: return str8_lit("STRUCT");
case COFF_SymStorageClass_FILE: return str8_lit("FILE");
case COFF_SymStorageClass_SECTION: return str8_lit("SECTION");
case COFF_SymStorageClass_WEAK_EXTERNAL: return str8_lit("EXTERNAL");
case COFF_SymStorageClass_CLR_TOKEN: return str8_lit("TOKEN");
}
return str8_zero();
}
internal String8
coff_string_from_weak_ext_type(COFF_WeakExtType x)
{
switch (x) {
case COFF_WeakExtType_NOLIBRARY: return str8_lit("NOLIBRARY");
case COFF_WeakExtType_SEARCH_LIBRARY: return str8_lit("SEARCH_LIBRARY");
case COFF_WeakExtType_SEARCH_ALIAS: return str8_lit("SEARCH_ALIAS");
}
return str8_zero();
}
internal String8
coff_string_from_selection(COFF_ComdatSelectType x)
{
switch (x) {
case COFF_ComdatSelectType_NULL: break;
case COFF_ComdatSelectType_NODUPLICATES: return str8_lit("NODUPLICATES");
case COFF_ComdatSelectType_ANY: return str8_lit("ANY");
case COFF_ComdatSelectType_SAME_SIZE: return str8_lit("SIZE");
case COFF_ComdatSelectType_EXACT_MATCH: return str8_lit("MATCH");
case COFF_ComdatSelectType_ASSOCIATIVE: return str8_lit("ASSOCIATIVE");
case COFF_ComdatSelectType_LARGEST: return str8_lit("LARGEST");
}
return str8_zero();
}
internal String8
coff_string_from_reloc_x86(COFF_RelocTypeX86 x)
{
switch (x) {
case COFF_RelocTypeX86_ABS: return str8_lit("ABS");
case COFF_RelocTypeX86_DIR16: return str8_lit("DIR16");
case COFF_RelocTypeX86_REL16: return str8_lit("REL16");
case COFF_RelocTypeX86_UNKNOWN0: return str8_lit("UNKNOWN0");
case COFF_RelocTypeX86_UNKNOWN2: return str8_lit("UNKNOWN2");
case COFF_RelocTypeX86_UNKNOWN3: return str8_lit("UNKNOWN3");
case COFF_RelocTypeX86_DIR32: return str8_lit("DIR32");
case COFF_RelocTypeX86_DIR32NB: return str8_lit("DIR32NB");
case COFF_RelocTypeX86_SEG12: return str8_lit("SEG12");
case COFF_RelocTypeX86_SECTION: return str8_lit("SECTION");
case COFF_RelocTypeX86_SECREL: return str8_lit("SECREL");
case COFF_RelocTypeX86_TOKEN: return str8_lit("TOKEN");
case COFF_RelocTypeX86_SECREL7: return str8_lit("SECREL7");
case COFF_RelocTypeX86_UNKNOWN4: return str8_lit("UNKNOWN4");
case COFF_RelocTypeX86_UNKNOWN5: return str8_lit("UNKNOWN5");
case COFF_RelocTypeX86_UNKNOWN6: return str8_lit("UNKNOWN6");
case COFF_RelocTypeX86_UNKNOWN7: return str8_lit("UNKNOWN7");
case COFF_RelocTypeX86_UNKNOWN8: return str8_lit("UNKNOWN8");
case COFF_RelocTypeX86_UNKNOWN9: return str8_lit("UNKNOWN9");
case COFF_RelocTypeX86_REL32: return str8_lit("REL32");
}
return str8_zero();
}
internal String8
coff_string_from_reloc_x64(COFF_RelocTypeX64 x)
{
switch (x) {
case COFF_RelocTypeX64_ABS: return str8_lit("ABS");
case COFF_RelocTypeX64_ADDR64: return str8_lit("ADDR64");
case COFF_RelocTypeX64_ADDR32: return str8_lit("ADDR32");
case COFF_RelocTypeX64_ADDR32NB: return str8_lit("ADDR32NB");
case COFF_RelocTypeX64_REL32: return str8_lit("REL32");
case COFF_RelocTypeX64_REL32_1: return str8_lit("REL32_1");
case COFF_RelocTypeX64_REL32_2: return str8_lit("REL32_2");
case COFF_RelocTypeX64_REL32_3: return str8_lit("REL32_3");
case COFF_RelocTypeX64_REL32_4: return str8_lit("REL32_4");
case COFF_RelocTypeX64_REL32_5: return str8_lit("REL32_5");
case COFF_RelocTypeX64_SECTION: return str8_lit("SECTION");
case COFF_RelocTypeX64_SECREL: return str8_lit("SECREL");
case COFF_RelocTypeX64_SECREL7: return str8_lit("SECREL7");
case COFF_RelocTypeX64_TOKEN: return str8_lit("TOKEN");
case COFF_RelocTypeX64_SREL32: return str8_lit("SREL32");
case COFF_RelocTypeX64_PAIR: return str8_lit("PAIR");
case COFF_RelocTypeX64_SSPAN32: return str8_lit("SSPAN32");
}
return str8_zero();
}
internal String8
coff_string_from_reloc_arm(COFF_RelocTypeARM x)
{
switch (x) {
case COFF_RelocTypeARM_ABS: return str8_lit("ABS");
case COFF_RelocTypeARM_ADDR32: return str8_lit("ADDR32");
case COFF_RelocTypeARM_ADDR32NB: return str8_lit("ADDR32NB");
case COFF_RelocTypeARM_BRANCH24: return str8_lit("BRANCH24");
case COFF_RelocTypeARM_BRANCH11: return str8_lit("BRANCH11");
case COFF_RelocTypeARM_UNKNOWN1: return str8_lit("UNKNOWN1");
case COFF_RelocTypeARM_UNKNOWN2: return str8_lit("UNKNOWN2");
case COFF_RelocTypeARM_UNKNOWN3: return str8_lit("UNKNOWN3");
case COFF_RelocTypeARM_UNKNOWN4: return str8_lit("UNKNOWN4");
case COFF_RelocTypeARM_UNKNOWN5: return str8_lit("UNKNOWN5");
case COFF_RelocTypeARM_REL32: return str8_lit("REL32");
case COFF_RelocTypeARM_SECTION: return str8_lit("SECTION");
case COFF_RelocTypeARM_SECREL: return str8_lit("SECREL");
case COFF_RelocTypeARM_MOV32: return str8_lit("MOV32");
case COFF_RelocTypeARM_THUMB_MOV32: return str8_lit("THUMB_MOV32");
case COFF_RelocTypeARM_THUMB_BRANCH20: return str8_lit("THUMB_BRANCH20");
case COFF_RelocTypeARM_UNUSED: return str8_lit("UNUSED");
case COFF_RelocTypeARM_THUMB_BRANCH24: return str8_lit("THUMB_BRANCH24");
case COFF_RelocTypeARM_THUMB_BLX23: return str8_lit("THUMB_BLX23");
case COFF_RelocTypeARM_PAIR: return str8_lit("PAIR");
}
return str8_zero();
}
internal String8
coff_string_from_reloc_arm64(COFF_RelocTypeARM64 x)
{
switch (x) {
case COFF_RelocTypeARM64_ABS: return str8_lit("ABS");
case COFF_RelocTypeARM64_ADDR32: return str8_lit("ADDR32");
case COFF_RelocTypeARM64_ADDR32NB: return str8_lit("ADDR32NB");
case COFF_RelocTypeARM64_BRANCH26: return str8_lit("BRANCH26");
case COFF_RelocTypeARM64_PAGEBASE_REL21: return str8_lit("PAGEBASE_REL21");
case COFF_RelocTypeARM64_REL21: return str8_lit("REL21");
case COFF_RelocTypeARM64_PAGEOFFSET_12A: return str8_lit("PAGEOFFSET_12A");
case COFF_RelocTypeARM64_SECREL: return str8_lit("SECREL");
case COFF_RelocTypeARM64_SECREL_LOW12A: return str8_lit("SECREL_LOW12A");
case COFF_RelocTypeARM64_SECREL_HIGH12A: return str8_lit("SECREL_HIGH12A");
case COFF_RelocTypeARM64_SECREL_LOW12L: return str8_lit("SECREL_LOW12L");
case COFF_RelocTypeARM64_TOKEN: return str8_lit("TOKEN");
case COFF_RelocTypeARM64_SECTION: return str8_lit("SECTION");
case COFF_RelocTypeARM64_ADDR64: return str8_lit("ADDR64");
case COFF_RelocTypeARM64_BRANCH19: return str8_lit("BRANCH19");
case COFF_RelocTypeARM64_BRANCH14: return str8_lit("BRANCH14");
case COFF_RelocTypeARM64_REL32: return str8_lit("REL32");
}
return str8_zero();
}
internal String8
coff_string_from_reloc(COFF_MachineType machine, COFF_RelocType x)
internal Arch
arch_from_coff_machine(COFF_MachineType machine)
{
Arch result = Arch_Null;
switch (machine) {
case COFF_MachineType_X86: return coff_string_from_reloc_x86(x);
case COFF_MachineType_X64: return coff_string_from_reloc_x64(x);
case COFF_MachineType_ARM: return coff_string_from_reloc_arm(x);
case COFF_MachineType_ARM64: return coff_string_from_reloc_arm64(x);
case COFF_MachineType_UNKNOWN: break;
case COFF_MachineType_X86: result = Arch_x86; break;
case COFF_MachineType_X64: result = Arch_x64; break;
case COFF_MachineType_ARM: result = Arch_arm32; break;
case COFF_MachineType_ARM64: result = Arch_arm64; break;
}
return str8_zero();
return result;
}
internal COFF_MachineType
coff_machine_from_string(String8 string)
{
for (U64 i = 0; i < ArrayCount(g_coff_machine_map); ++i) {
if (str8_match(g_coff_machine_map[i].string, string, StringMatchFlag_CaseInsensitive)) {
return g_coff_machine_map[i].machine;
}
}
return COFF_MachineType_UNKNOWN;
}
internal COFF_ImportHeaderType
coff_import_header_type_from_string(String8 name)
{
for (U64 i = 0; i < ArrayCount(g_coff_import_header_type_map); ++i) {
if (str8_match(str8_cstring(g_coff_import_header_type_map[i].name), name, StringMatchFlag_CaseInsensitive)) {
return g_coff_import_header_type_map[i].type;
}
}
return COFF_ImportHeaderType_COUNT;
}
+1 -21
View File
@@ -895,26 +895,6 @@ internal COFF_ArchiveParse coff_archive_from_data(String8 data);
internal COFF_ArchiveParse coff_thin_archive_from_data(String8 data);
internal COFF_ArchiveParse coff_archive_parse_from_data(String8 data);
////////////////////////////////
// String <-> Enum
internal String8 coff_string_from_comdat_select_type(COFF_ComdatSelectType select);
internal String8 coff_string_from_machine_type(COFF_MachineType machine);
internal String8 coff_string_from_flags(Arena *arena, COFF_Flags flags);
internal String8 coff_string_from_section_flags(Arena *arena, COFF_SectionFlags flags);
internal String8 coff_string_from_import_header_type(COFF_ImportHeaderType type);
internal String8 coff_string_from_sym_dtype(COFF_SymDType x);
internal String8 coff_string_from_sym_type(COFF_SymType x);
internal String8 coff_string_from_sym_storage_class(COFF_SymStorageClass x);
internal String8 coff_string_from_weak_ext_type(COFF_WeakExtType x);
internal String8 coff_string_from_selection(COFF_ComdatSelectType x);
internal String8 coff_string_from_reloc_x86(COFF_RelocTypeX86 x);
internal String8 coff_string_from_reloc_x64(COFF_RelocTypeX64 x);
internal String8 coff_string_from_reloc_arm(COFF_RelocTypeARM x);
internal String8 coff_string_from_reloc_arm64(COFF_RelocTypeARM64 x);
internal String8 coff_string_from_reloc(COFF_MachineType machine, COFF_RelocType x);
internal COFF_MachineType coff_machine_from_string(String8 string);
internal COFF_ImportHeaderType coff_import_header_type_from_string(String8 name);
internal Arch arch_from_coff_machine(COFF_MachineType machine);
#endif //COFF_H
+466
View File
@@ -0,0 +1,466 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
internal String8
coff_string_from_time_stamp(Arena *arena, COFF_TimeStamp time_stamp)
{
String8 result;
if (time_stamp == 0) {
result = str8_lit("0");
} else if (time_stamp >= max_U32) {
result = str8_lit("-1");
} else {
DateTime dt = date_time_from_unix_time(time_stamp);
result = push_date_time_string(arena, &dt);
}
return result;
}
read_only struct
{
String8 string;
COFF_MachineType machine;
} g_coff_machine_map[] = {
{ str8_lit_comp(""), COFF_MachineType_UNKNOWN },
{ str8_lit_comp("X86"), COFF_MachineType_X86 },
{ str8_lit_comp("AMD64"), COFF_MachineType_X64 },
{ str8_lit_comp("X64"), COFF_MachineType_X64 },
{ str8_lit_comp("AM33"), COFF_MachineType_AM33 },
{ str8_lit_comp("ARM"), COFF_MachineType_ARM },
{ str8_lit_comp("ARM64"), COFF_MachineType_ARM64 },
{ str8_lit_comp("ARMNT"), COFF_MachineType_ARMNT },
{ str8_lit_comp("EBC"), COFF_MachineType_EBC },
{ str8_lit_comp("IA64"), COFF_MachineType_IA64 },
{ str8_lit_comp("M32R"), COFF_MachineType_M32R },
{ str8_lit_comp("MIPS16"), COFF_MachineType_MIPS16 },
{ str8_lit_comp("MIPSFPU"), COFF_MachineType_MIPSFPU },
{ str8_lit_comp("MIPSFPU16"), COFF_MachineType_MIPSFPU16 },
{ str8_lit_comp("POWERPC"), COFF_MachineType_POWERPC },
{ str8_lit_comp("POWERPCFP"), COFF_MachineType_POWERPCFP },
{ str8_lit_comp("R4000"), COFF_MachineType_R4000 },
{ str8_lit_comp("RISCV32"), COFF_MachineType_RISCV32 },
{ str8_lit_comp("RISCV64"), COFF_MachineType_RISCV64 },
{ str8_lit_comp("SH3"), COFF_MachineType_SH3 },
{ str8_lit_comp("SH3DSP"), COFF_MachineType_SH3DSP },
{ str8_lit_comp("SH4"), COFF_MachineType_SH4 },
{ str8_lit_comp("SH5"), COFF_MachineType_SH5 },
{ str8_lit_comp("THUMB"), COFF_MachineType_THUMB },
{ str8_lit_comp("WCEMIPSV2"), COFF_MachineType_WCEMIPSV2 },
};
read_only static struct {
char * name;
COFF_ImportHeaderType type;
} g_coff_import_header_type_map[] = {
{ "CODE", COFF_ImportHeaderType_CODE },
{ "DATA", COFF_ImportHeaderType_DATA },
{ "CONST", COFF_ImportHeaderType_CONST },
};
internal String8
coff_string_from_comdat_select_type(COFF_ComdatSelectType select)
{
String8 result = str8(0,0);
switch (select) {
case COFF_ComdatSelectType_NULL: result = str8_lit("NULL"); break;
case COFF_ComdatSelectType_NODUPLICATES: result = str8_lit("NODUPLICATES"); break;
case COFF_ComdatSelectType_ANY: result = str8_lit("ANY"); break;
case COFF_ComdatSelectType_SAME_SIZE: result = str8_lit("SAME_SIZE"); break;
case COFF_ComdatSelectType_EXACT_MATCH: result = str8_lit("EXACT_MATCH"); break;
case COFF_ComdatSelectType_ASSOCIATIVE: result = str8_lit("ASSOCIATIVE"); break;
case COFF_ComdatSelectType_LARGEST: result = str8_lit("LARGEST"); break;
}
return result;
}
internal String8
coff_string_from_machine_type(COFF_MachineType machine)
{
for (U64 i = 0; i < ArrayCount(g_coff_machine_map); ++i) {
if (g_coff_machine_map[i].machine == machine) {
return g_coff_machine_map[i].string;
}
}
return str8_zero();
}
internal String8
coff_string_from_flags(Arena *arena, COFF_Flags flags)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (flags & COFF_Flag_RELOC_STRIPPED) {
str8_list_pushf(scratch.arena, &list, "Relocs Stripped");
}
if (flags & COFF_Flag_EXECUTABLE_IMAGE) {
str8_list_pushf(scratch.arena, &list, "Executable");
}
if (flags & COFF_Flag_LINE_NUMS_STRIPPED) {
str8_list_pushf(scratch.arena, &list, "Line Numbers Stripped");
}
if (flags & COFF_Flag_SYM_STRIPPED) {
str8_list_pushf(scratch.arena, &list, "Symbols Stripped");
}
if (flags & COFF_Flag_LARGE_ADDRESS_AWARE) {
str8_list_pushf(scratch.arena, &list, "Large Address Aware");
}
if (flags & COFF_Flag_32BIT_MACHINE) {
str8_list_pushf(scratch.arena, &list, "32-Bit Machine");
}
if (flags & COFF_Flag_DEBUG_STRIPPED) {
str8_list_pushf(scratch.arena, &list, "Debug Stripped");
}
if (flags & COFF_Flag_REMOVABLE_RUN_FROM_SWAP) {
str8_list_pushf(scratch.arena, &list, "Removeable Run From Swap");
}
if (flags & COFF_Flag_NET_RUN_FROM_SWAP) {
str8_list_pushf(scratch.arena, &list, "Net Run From Swap");
}
if (flags & COFF_Flag_SYSTEM) {
str8_list_pushf(scratch.arena, &list, "System");
}
if (flags & COFF_Flag_DLL) {
str8_list_pushf(scratch.arena, &list, "DLL");
}
if (flags & COFF_Flag_UP_SYSTEM_ONLY) {
str8_list_pushf(scratch.arena, &list, "Up System Only");
}
String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
internal String8
coff_string_from_section_flags(Arena *arena, COFF_SectionFlags flags)
{
Temp scratch = scratch_begin(&arena, 1);
String8List list = {0};
if (flags & COFF_SectionFlag_TYPE_NO_PAD) {
str8_list_pushf(scratch.arena, &list, "TYPE_NO_PAD");
}
if (flags & COFF_SectionFlag_CNT_CODE) {
str8_list_pushf(scratch.arena, &list, "CNT_CODE");
}
if (flags & COFF_SectionFlag_CNT_INITIALIZED_DATA) {
str8_list_pushf(scratch.arena, &list, "CNT_INITIALIZED_DATA");
}
if (flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) {
str8_list_pushf(scratch.arena, &list, "CNT_UNINITIALIZED_DATA");
}
if (flags & COFF_SectionFlag_LNK_OTHER) {
str8_list_pushf(scratch.arena, &list, "LNK_OTHER");
}
if (flags & COFF_SectionFlag_LNK_INFO) {
str8_list_pushf(scratch.arena, &list, "LNK_INFO");
}
if (flags & COFF_SectionFlag_LNK_COMDAT) {
str8_list_pushf(scratch.arena, &list, "LNK_COMDAT");
}
if (flags & COFF_SectionFlag_GPREL) {
str8_list_pushf(scratch.arena, &list, "GPREL");
}
if (flags & COFF_SectionFlag_MEM_16BIT) {
str8_list_pushf(scratch.arena, &list, "MEM_16BIT");
}
if (flags & COFF_SectionFlag_MEM_LOCKED) {
str8_list_pushf(scratch.arena, &list, "MEM_LOCKED");
}
if (flags & COFF_SectionFlag_MEM_PRELOAD) {
str8_list_pushf(scratch.arena, &list, "MEM_PRELOAD");
}
if (flags & COFF_SectionFlag_LNK_NRELOC_OVFL) {
str8_list_pushf(scratch.arena, &list, "LNK_NRELOC_OVFL");
}
if (flags & COFF_SectionFlag_MEM_DISCARDABLE) {
str8_list_pushf(scratch.arena, &list, "MEM_DISCARDABLE");
}
if (flags & COFF_SectionFlag_MEM_NOT_CACHED) {
str8_list_pushf(scratch.arena, &list, "MEM_NOT_CACHED");
}
if (flags & COFF_SectionFlag_MEM_NOT_PAGED) {
str8_list_pushf(scratch.arena, &list, "MEM_NOT_PAGED");
}
if (flags & COFF_SectionFlag_MEM_SHARED) {
str8_list_pushf(scratch.arena, &list, "MEM_SHARED");
}
if (flags & COFF_SectionFlag_MEM_EXECUTE) {
str8_list_pushf(scratch.arena, &list, "MEM_EXECUTE");
}
if (flags & COFF_SectionFlag_MEM_READ) {
str8_list_pushf(scratch.arena, &list, "MEM_READ");
}
if (flags & COFF_SectionFlag_MEM_WRITE) {
str8_list_pushf(scratch.arena, &list, "MEM_WRITE");
}
U64 align = coff_align_size_from_section_flags(flags);
if (align) {
str8_list_pushf(scratch.arena, &list, "Align=%u", align);
}
if (!list.node_count) {
str8_list_pushf(scratch.arena, &list, "None");
}
StringJoin join = {0};
join.sep = str8_lit(", ");
String8 result = str8_list_join(arena, &list, &join);
scratch_end(scratch);
return result;
}
internal String8
coff_string_from_import_header_type(COFF_ImportHeaderType type)
{
for (U64 i = 0; i < ArrayCount(g_coff_import_header_type_map); ++i) {
if (g_coff_import_header_type_map[i].type == type) {
return str8_cstring(g_coff_import_header_type_map[i].name);
}
}
return str8(0,0);
}
internal String8
coff_string_from_sym_dtype(COFF_SymDType x)
{
switch (x) {
case COFF_SymDType_NULL: return str8_lit("NULL");
case COFF_SymDType_PTR : return str8_lit("PTR");
case COFF_SymDType_FUNC: return str8_lit("FUNC");
case COFF_SymDType_ARRAY: return str8_lit("ARRAY");
}
return str8_zero();
}
internal String8
coff_string_from_sym_type(COFF_SymType x)
{
switch (x) {
case COFF_SymType_NULL: return str8_lit("NULL");
case COFF_SymType_VOID: return str8_lit("VOID");
case COFF_SymType_CHAR: return str8_lit("CHAR");
case COFF_SymType_SHORT: return str8_lit("SHORT");
case COFF_SymType_INT: return str8_lit("INT");
case COFF_SymType_LONG: return str8_lit("LONG");
case COFF_SymType_FLOAT: return str8_lit("FLOAT");
case COFF_SymType_DOUBLE: return str8_lit("DOUBLE");
case COFF_SymType_STRUCT: return str8_lit("STRUCT");
case COFF_SymType_UNION: return str8_lit("UNION");
case COFF_SymType_ENUM: return str8_lit("ENUM");
case COFF_SymType_MOE: return str8_lit("MOE");
case COFF_SymType_BYTE: return str8_lit("BYTE");
case COFF_SymType_WORD: return str8_lit("WORD");
case COFF_SymType_UINT: return str8_lit("UINT");
case COFF_SymType_DWORD: return str8_lit("DWORD");
}
return str8_zero();
}
internal String8
coff_string_from_sym_storage_class(COFF_SymStorageClass x)
{
switch (x) {
case COFF_SymStorageClass_NULL: break;
case COFF_SymStorageClass_END_OF_FUNCTION: return str8_lit("EOF");
case COFF_SymStorageClass_AUTOMATIC: return str8_lit("AUTOMATIC");
case COFF_SymStorageClass_EXTERNAL: return str8_lit("EXTERNAL");
case COFF_SymStorageClass_STATIC: return str8_lit("STATIC");
case COFF_SymStorageClass_REGISTER: return str8_lit("REGISTER");
case COFF_SymStorageClass_EXTERNAL_DEF: return str8_lit("DEF");
case COFF_SymStorageClass_LABEL: return str8_lit("LABEL");
case COFF_SymStorageClass_UNDEFINED_LABEL: return str8_lit("LABEL");
case COFF_SymStorageClass_MEMBER_OF_STRUCT: return str8_lit("STRUCT");
case COFF_SymStorageClass_ARGUMENT: return str8_lit("ARGUMENT");
case COFF_SymStorageClass_STRUCT_TAG: return str8_lit("TAG");
case COFF_SymStorageClass_MEMBER_OF_UNION: return str8_lit("UNION");
case COFF_SymStorageClass_UNION_TAG: return str8_lit("TAG");
case COFF_SymStorageClass_TYPE_DEFINITION: return str8_lit("DEFINITION");
case COFF_SymStorageClass_UNDEFINED_STATIC: return str8_lit("STATIC");
case COFF_SymStorageClass_ENUM_TAG: return str8_lit("TAG");
case COFF_SymStorageClass_MEMBER_OF_ENUM: return str8_lit("ENUM");
case COFF_SymStorageClass_REGISTER_PARAM: return str8_lit("PARAM");
case COFF_SymStorageClass_BIT_FIELD: return str8_lit("FIELD");
case COFF_SymStorageClass_BLOCK: return str8_lit("BLOCK");
case COFF_SymStorageClass_FUNCTION: return str8_lit("FUNCTION");
case COFF_SymStorageClass_END_OF_STRUCT: return str8_lit("STRUCT");
case COFF_SymStorageClass_FILE: return str8_lit("FILE");
case COFF_SymStorageClass_SECTION: return str8_lit("SECTION");
case COFF_SymStorageClass_WEAK_EXTERNAL: return str8_lit("EXTERNAL");
case COFF_SymStorageClass_CLR_TOKEN: return str8_lit("TOKEN");
}
return str8_zero();
}
internal String8
coff_string_from_weak_ext_type(COFF_WeakExtType x)
{
switch (x) {
case COFF_WeakExtType_NOLIBRARY: return str8_lit("NOLIBRARY");
case COFF_WeakExtType_SEARCH_LIBRARY: return str8_lit("SEARCH_LIBRARY");
case COFF_WeakExtType_SEARCH_ALIAS: return str8_lit("SEARCH_ALIAS");
}
return str8_zero();
}
internal String8
coff_string_from_selection(COFF_ComdatSelectType x)
{
switch (x) {
case COFF_ComdatSelectType_NULL: break;
case COFF_ComdatSelectType_NODUPLICATES: return str8_lit("NODUPLICATES");
case COFF_ComdatSelectType_ANY: return str8_lit("ANY");
case COFF_ComdatSelectType_SAME_SIZE: return str8_lit("SIZE");
case COFF_ComdatSelectType_EXACT_MATCH: return str8_lit("MATCH");
case COFF_ComdatSelectType_ASSOCIATIVE: return str8_lit("ASSOCIATIVE");
case COFF_ComdatSelectType_LARGEST: return str8_lit("LARGEST");
}
return str8_zero();
}
internal String8
coff_string_from_reloc_x86(COFF_RelocTypeX86 x)
{
switch (x) {
case COFF_RelocTypeX86_ABS: return str8_lit("ABS");
case COFF_RelocTypeX86_DIR16: return str8_lit("DIR16");
case COFF_RelocTypeX86_REL16: return str8_lit("REL16");
case COFF_RelocTypeX86_UNKNOWN0: return str8_lit("UNKNOWN0");
case COFF_RelocTypeX86_UNKNOWN2: return str8_lit("UNKNOWN2");
case COFF_RelocTypeX86_UNKNOWN3: return str8_lit("UNKNOWN3");
case COFF_RelocTypeX86_DIR32: return str8_lit("DIR32");
case COFF_RelocTypeX86_DIR32NB: return str8_lit("DIR32NB");
case COFF_RelocTypeX86_SEG12: return str8_lit("SEG12");
case COFF_RelocTypeX86_SECTION: return str8_lit("SECTION");
case COFF_RelocTypeX86_SECREL: return str8_lit("SECREL");
case COFF_RelocTypeX86_TOKEN: return str8_lit("TOKEN");
case COFF_RelocTypeX86_SECREL7: return str8_lit("SECREL7");
case COFF_RelocTypeX86_UNKNOWN4: return str8_lit("UNKNOWN4");
case COFF_RelocTypeX86_UNKNOWN5: return str8_lit("UNKNOWN5");
case COFF_RelocTypeX86_UNKNOWN6: return str8_lit("UNKNOWN6");
case COFF_RelocTypeX86_UNKNOWN7: return str8_lit("UNKNOWN7");
case COFF_RelocTypeX86_UNKNOWN8: return str8_lit("UNKNOWN8");
case COFF_RelocTypeX86_UNKNOWN9: return str8_lit("UNKNOWN9");
case COFF_RelocTypeX86_REL32: return str8_lit("REL32");
}
return str8_zero();
}
internal String8
coff_string_from_reloc_x64(COFF_RelocTypeX64 x)
{
switch (x) {
case COFF_RelocTypeX64_ABS: return str8_lit("ABS");
case COFF_RelocTypeX64_ADDR64: return str8_lit("ADDR64");
case COFF_RelocTypeX64_ADDR32: return str8_lit("ADDR32");
case COFF_RelocTypeX64_ADDR32NB: return str8_lit("ADDR32NB");
case COFF_RelocTypeX64_REL32: return str8_lit("REL32");
case COFF_RelocTypeX64_REL32_1: return str8_lit("REL32_1");
case COFF_RelocTypeX64_REL32_2: return str8_lit("REL32_2");
case COFF_RelocTypeX64_REL32_3: return str8_lit("REL32_3");
case COFF_RelocTypeX64_REL32_4: return str8_lit("REL32_4");
case COFF_RelocTypeX64_REL32_5: return str8_lit("REL32_5");
case COFF_RelocTypeX64_SECTION: return str8_lit("SECTION");
case COFF_RelocTypeX64_SECREL: return str8_lit("SECREL");
case COFF_RelocTypeX64_SECREL7: return str8_lit("SECREL7");
case COFF_RelocTypeX64_TOKEN: return str8_lit("TOKEN");
case COFF_RelocTypeX64_SREL32: return str8_lit("SREL32");
case COFF_RelocTypeX64_PAIR: return str8_lit("PAIR");
case COFF_RelocTypeX64_SSPAN32: return str8_lit("SSPAN32");
}
return str8_zero();
}
internal String8
coff_string_from_reloc_arm(COFF_RelocTypeARM x)
{
switch (x) {
case COFF_RelocTypeARM_ABS: return str8_lit("ABS");
case COFF_RelocTypeARM_ADDR32: return str8_lit("ADDR32");
case COFF_RelocTypeARM_ADDR32NB: return str8_lit("ADDR32NB");
case COFF_RelocTypeARM_BRANCH24: return str8_lit("BRANCH24");
case COFF_RelocTypeARM_BRANCH11: return str8_lit("BRANCH11");
case COFF_RelocTypeARM_UNKNOWN1: return str8_lit("UNKNOWN1");
case COFF_RelocTypeARM_UNKNOWN2: return str8_lit("UNKNOWN2");
case COFF_RelocTypeARM_UNKNOWN3: return str8_lit("UNKNOWN3");
case COFF_RelocTypeARM_UNKNOWN4: return str8_lit("UNKNOWN4");
case COFF_RelocTypeARM_UNKNOWN5: return str8_lit("UNKNOWN5");
case COFF_RelocTypeARM_REL32: return str8_lit("REL32");
case COFF_RelocTypeARM_SECTION: return str8_lit("SECTION");
case COFF_RelocTypeARM_SECREL: return str8_lit("SECREL");
case COFF_RelocTypeARM_MOV32: return str8_lit("MOV32");
case COFF_RelocTypeARM_THUMB_MOV32: return str8_lit("THUMB_MOV32");
case COFF_RelocTypeARM_THUMB_BRANCH20: return str8_lit("THUMB_BRANCH20");
case COFF_RelocTypeARM_UNUSED: return str8_lit("UNUSED");
case COFF_RelocTypeARM_THUMB_BRANCH24: return str8_lit("THUMB_BRANCH24");
case COFF_RelocTypeARM_THUMB_BLX23: return str8_lit("THUMB_BLX23");
case COFF_RelocTypeARM_PAIR: return str8_lit("PAIR");
}
return str8_zero();
}
internal String8
coff_string_from_reloc_arm64(COFF_RelocTypeARM64 x)
{
switch (x) {
case COFF_RelocTypeARM64_ABS: return str8_lit("ABS");
case COFF_RelocTypeARM64_ADDR32: return str8_lit("ADDR32");
case COFF_RelocTypeARM64_ADDR32NB: return str8_lit("ADDR32NB");
case COFF_RelocTypeARM64_BRANCH26: return str8_lit("BRANCH26");
case COFF_RelocTypeARM64_PAGEBASE_REL21: return str8_lit("PAGEBASE_REL21");
case COFF_RelocTypeARM64_REL21: return str8_lit("REL21");
case COFF_RelocTypeARM64_PAGEOFFSET_12A: return str8_lit("PAGEOFFSET_12A");
case COFF_RelocTypeARM64_SECREL: return str8_lit("SECREL");
case COFF_RelocTypeARM64_SECREL_LOW12A: return str8_lit("SECREL_LOW12A");
case COFF_RelocTypeARM64_SECREL_HIGH12A: return str8_lit("SECREL_HIGH12A");
case COFF_RelocTypeARM64_SECREL_LOW12L: return str8_lit("SECREL_LOW12L");
case COFF_RelocTypeARM64_TOKEN: return str8_lit("TOKEN");
case COFF_RelocTypeARM64_SECTION: return str8_lit("SECTION");
case COFF_RelocTypeARM64_ADDR64: return str8_lit("ADDR64");
case COFF_RelocTypeARM64_BRANCH19: return str8_lit("BRANCH19");
case COFF_RelocTypeARM64_BRANCH14: return str8_lit("BRANCH14");
case COFF_RelocTypeARM64_REL32: return str8_lit("REL32");
}
return str8_zero();
}
internal String8
coff_string_from_reloc(COFF_MachineType machine, COFF_RelocType x)
{
switch (machine) {
case COFF_MachineType_X86: return coff_string_from_reloc_x86(x);
case COFF_MachineType_X64: return coff_string_from_reloc_x64(x);
case COFF_MachineType_ARM: return coff_string_from_reloc_arm(x);
case COFF_MachineType_ARM64: return coff_string_from_reloc_arm64(x);
}
return str8_zero();
}
internal COFF_MachineType
coff_machine_from_string(String8 string)
{
for (U64 i = 0; i < ArrayCount(g_coff_machine_map); ++i) {
if (str8_match(g_coff_machine_map[i].string, string, StringMatchFlag_CaseInsensitive)) {
return g_coff_machine_map[i].machine;
}
}
return COFF_MachineType_UNKNOWN;
}
internal COFF_ImportHeaderType
coff_import_header_type_from_string(String8 name)
{
for (U64 i = 0; i < ArrayCount(g_coff_import_header_type_map); ++i) {
if (str8_match(str8_cstring(g_coff_import_header_type_map[i].name), name, StringMatchFlag_CaseInsensitive)) {
return g_coff_import_header_type_map[i].type;
}
}
return COFF_ImportHeaderType_COUNT;
}
+27
View File
@@ -0,0 +1,27 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef COFF_ENUM_H
#define COFF_ENUM_H
internal String8 coff_string_from_time_stamp(Arena *arena, COFF_TimeStamp time_stamp);
internal String8 coff_string_from_comdat_select_type(COFF_ComdatSelectType select);
internal String8 coff_string_from_machine_type(COFF_MachineType machine);
internal String8 coff_string_from_flags(Arena *arena, COFF_Flags flags);
internal String8 coff_string_from_section_flags(Arena *arena, COFF_SectionFlags flags);
internal String8 coff_string_from_import_header_type(COFF_ImportHeaderType type);
internal String8 coff_string_from_sym_dtype(COFF_SymDType x);
internal String8 coff_string_from_sym_type(COFF_SymType x);
internal String8 coff_string_from_sym_storage_class(COFF_SymStorageClass x);
internal String8 coff_string_from_weak_ext_type(COFF_WeakExtType x);
internal String8 coff_string_from_selection(COFF_ComdatSelectType x);
internal String8 coff_string_from_reloc_x86(COFF_RelocTypeX86 x);
internal String8 coff_string_from_reloc_x64(COFF_RelocTypeX64 x);
internal String8 coff_string_from_reloc_arm(COFF_RelocTypeARM x);
internal String8 coff_string_from_reloc_arm64(COFF_RelocTypeARM64 x);
internal String8 coff_string_from_reloc(COFF_MachineType machine, COFF_RelocType x);
internal COFF_MachineType coff_machine_from_string(String8 string);
internal COFF_ImportHeaderType coff_import_header_type_from_string(String8 name);
#endif // COFF_ENUM_H
+2
View File
@@ -35,6 +35,7 @@
#include "os/os_inc.h"
#include "path/path.h"
#include "coff/coff.h"
#include "coff/coff_enum.h"
#include "pe/pe.h"
#include "codeview/codeview.h"
#include "codeview/codeview_parse.h"
@@ -47,6 +48,7 @@
#include "os/os_inc.c"
#include "path/path.c"
#include "coff/coff.c"
#include "coff/coff_enum.c"
#include "pe/pe.c"
#include "codeview/codeview.c"
#include "codeview/codeview_parse.c"
+34
View File
@@ -0,0 +1,34 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
internal String8
mscrt_string_from_eh_adjectives(Arena *arena, MSCRT_EhHandlerTypeFlags adjectives)
{
Temp scratch = scratch_begin(&arena, 1);
String8List adj_list = {0};
if (adjectives & MSCRT_EhHandlerTypeFlag_IsConst) {
str8_list_pushf(scratch.arena, &adj_list, "Const");
}
if (adjectives & MSCRT_EhHandlerTypeFlag_IsVolatile) {
str8_list_pushf(scratch.arena, &adj_list, "Volatile");
}
if (adjectives & MSCRT_EhHandlerTypeFlag_IsUnaligned) {
str8_list_pushf(scratch.arena, &adj_list, "Unaligned");
}
if (adjectives & MSCRT_EhHandlerTypeFlag_IsReference) {
str8_list_pushf(scratch.arena, &adj_list, "Reference");
}
if (adjectives & MSCRT_EhHandlerTypeFlag_IsResumable) {
str8_list_pushf(scratch.arena, &adj_list, "Resumable");
}
if (adjectives & MSCRT_EhHandlerTypeFlag_IsStdDotDot) {
str8_list_pushf(scratch.arena, &adj_list, "StdDotDot");
}
if (adjectives & MSCRT_EhHandlerTypeFlag_IsComplusEH) {
str8_list_pushf(scratch.arena, &adj_list, "ComplusEH");
}
String8 result = str8_list_join(arena, &adj_list, &(StringJoin){.sep=str8_lit(", ")});
scratch_end(scratch);
return result;
}
+9
View File
@@ -0,0 +1,9 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef MSVC_CRT_ENUM_H
#define MSVC_CRT_ENUM_H
internal String8 mscrt_string_from_eh_adjectives(Arena *arena, MSCRT_EhHandlerTypeFlags adjectives);
#endif // MSVC_CRT_ENUM_H