diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 4fd083ce..19d3a24a 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -119,6 +119,20 @@ typedef enum DW_LanguageEnum DW_Language_UserHi = 0xffff, } DW_LanguageEnum; +#define DW_Inl_XList(X) \ + X(NotInlined, 0) \ + X(Inlined, 1) \ + X(DeclaredNotInlined, 2) \ + X(DeclaredInlined, 3) + +typedef U32 DW_InlKind; +typedef enum DW_InlKindEnum +{ +#define X(_N,_ID) DW_Inl_##_N = _ID, + DW_Inl_XList(X) +#undef X +} DW_InlKindEnum; + #define DW_StdOpcode_XList(X) \ X(ExtendedOpcode, 0x00) \ X(Copy, 0x01) \ @@ -250,6 +264,7 @@ typedef enum DW_NameCase typedef U64 DW_TagKind; typedef enum DW_TagKindEnum { + DW_Tag_Null, #define X(_N,_ID) DW_Tag_##_N = _ID, DW_Tag_V3_XList(X) DW_Tag_V5_XList(X) @@ -1172,12 +1187,12 @@ typedef enum DW_AttribTypeEncodingKindEnum #undef X } DW_AttribTypeEncodingKindEnum; -#define DW_CallingConventionKind_XList(X) \ - X(DW_CallingConvention_Normal, 0x0) \ - X(DW_CallingConvention_Program, 0x1) \ - X(DW_CallingConvention_NoCall, 0x2) \ - X(DW_CallingConvention_PassByValue, 0x1) \ - X(DW_CallingConvention_PassByReference, 0x2) +#define DW_CallingConventionKind_XList(X) \ + X(Normal, 0x0) \ + X(Program, 0x1) \ + X(NoCall, 0x3) \ + X(PassByValue, 0x4) \ + X(PassByReference, 0x5) typedef U64 DW_CallingConventionKind; typedef enum DW_CallingConventionKindEnum @@ -1188,9 +1203,9 @@ typedef enum DW_CallingConventionKindEnum } DW_CallingConventionKindEnum; #define DW_AccessKind_XList(X) \ - X(DW_Access_Public, 0x00) \ - X(DW_Access_Private, 0x01) \ - X(DW_Access_Protected, 0x02) + X(Public, 0x00) \ + X(Private, 0x01) \ + X(Protected, 0x02) typedef U64 DW_AccessKind; typedef enum DW_AccessKindEnum @@ -1505,9 +1520,18 @@ enum X(Convert, 0xa8) \ X(ReInterpret, 0xa9) -#define DW_Expr_GNU_XList(X) \ - X(GNU_PushTlsAddress, 0xe0) \ - X(GNU_UnInit, 0xf0) +#define DW_Expr_GNU_XList(X) \ + X(GNU_PushTlsAddress, 0xe0) \ + X(GNU_UnInit, 0xf0) \ + X(GNU_ImplicitPointer, 0xf2) \ + X(GNU_EntryValue, 0xf3) \ + X(GNU_ConstType, 0xf4) \ + X(GNU_RegvalType, 0xf5) \ + X(GNU_DerefType, 0xf6) \ + X(GNU_Convert, 0xf7) \ + X(GNU_AddrIndex, 0xfb) \ + X(GNU_ConstIndex, 0xfc) + typedef U64 DW_ExprOp; typedef enum DW_ExprOpEnum { @@ -1541,22 +1565,22 @@ typedef enum DW_ExprOpEnum X(St5, 16, st5, 0, 10) \ X(St6, 17, st6, 0, 10) \ X(St7, 18, st7, 0, 10) \ - X(Xmm0, 21, xmm0, 0, 16) \ - X(Xmm1, 22, xmm1, 0, 16) \ - X(Xmm2, 23, xmm2, 0, 16) \ - X(Xmm3, 24, xmm3, 0, 16) \ - X(Xmm4, 25, xmm4, 0, 16) \ - X(Xmm5, 26, xmm5, 0, 16) \ - X(Xmm6, 27, xmm6, 0, 16) \ - X(Xmm7, 28, xmm7, 0, 16) \ - X(Mm0, 29, mm0, 0, 4) \ - X(Mm1, 30, mm1, 0, 4) \ - X(Mm2, 31, mm2, 0, 4) \ - X(Mm3, 32, mm3, 0, 4) \ - X(Mm4, 33, mm4, 0, 4) \ - X(Mm5, 34, mm5, 0, 4) \ - X(Mm6, 35, mm6, 0, 4) \ - X(Mm7, 36, mm7, 0, 4) \ + X(Xmm0, 21, ymm0, 0, 16) \ + X(Xmm1, 22, ymm1, 0, 16) \ + X(Xmm2, 23, ymm2, 0, 16) \ + X(Xmm3, 24, ymm3, 0, 16) \ + X(Xmm4, 25, ymm4, 0, 16) \ + X(Xmm5, 26, ymm5, 0, 16) \ + X(Xmm6, 27, ymm6, 0, 16) \ + X(Xmm7, 28, ymm7, 0, 16) \ + X(Mm0, 29, fpr0, 0, 8) \ + X(Mm1, 30, fpr1, 0, 8) \ + X(Mm2, 31, fpr2, 0, 8) \ + X(Mm3, 32, fpr3, 0, 8) \ + X(Mm4, 33, fpr4, 0, 8) \ + X(Mm5, 34, fpr5, 0, 8) \ + X(Mm6, 35, fpr6, 0, 8) \ + X(Mm7, 36, fpr7, 0, 8) \ X(Fcw, 37, fcw, 0, 2) \ X(Fsw, 38, fsw, 0, 2) \ X(Mxcsr, 39, mxcsr, 0, 4) \ @@ -1587,22 +1611,22 @@ typedef enum DW_ExprOpEnum X(R14, 14, r14, 0, 8) \ X(R15, 15, r15, 0, 8) \ X(Rip, 16, rip, 0, 8) \ - X(Xmm0, 17, ymm0, 0, 16) \ - X(Xmm1, 18, ymm1, 0, 16) \ - X(Xmm2, 19, ymm2, 0, 16) \ - X(Xmm3, 20, ymm3, 0, 16) \ - X(Xmm4, 21, ymm4, 0, 16) \ - X(Xmm5, 22, ymm5, 0, 16) \ - X(Xmm6, 23, ymm6, 0, 16) \ - X(Xmm7, 24, ymm7, 0, 16) \ - X(Xmm8, 25, ymm8, 0, 16) \ - X(Xmm9, 26, ymm9, 0, 16) \ - X(Xmm10, 27, ymm10, 0, 16) \ - X(Xmm11, 28, ymm11, 0, 16) \ - X(Xmm12, 29, ymm12, 0, 16) \ - X(Xmm13, 30, ymm13, 0, 16) \ - X(Xmm14, 31, ymm14, 0, 16) \ - X(Xmm15, 32, ymm15, 0, 16) \ + X(Xmm0, 17, zmm0, 0, 16) \ + X(Xmm1, 18, zmm1, 0, 16) \ + X(Xmm2, 19, zmm2, 0, 16) \ + X(Xmm3, 20, zmm3, 0, 16) \ + X(Xmm4, 21, zmm4, 0, 16) \ + X(Xmm5, 22, zmm5, 0, 16) \ + X(Xmm6, 23, zmm6, 0, 16) \ + X(Xmm7, 24, zmm7, 0, 16) \ + X(Xmm8, 25, zmm8, 0, 16) \ + X(Xmm9, 26, zmm9, 0, 16) \ + X(Xmm10, 27, zmm10, 0, 16) \ + X(Xmm11, 28, zmm11, 0, 16) \ + X(Xmm12, 29, zmm12, 0, 16) \ + X(Xmm13, 30, zmm13, 0, 16) \ + X(Xmm14, 31, zmm14, 0, 16) \ + X(Xmm15, 32, zmm15, 0, 16) \ X(St0, 33, st0, 0, 10) \ X(St1, 34, st1, 0, 10) \ X(St2, 35, st2, 0, 10) \ @@ -1611,14 +1635,14 @@ typedef enum DW_ExprOpEnum X(St5, 38, st5, 0, 10) \ X(St6, 39, st6, 0, 10) \ X(St7, 40, st7, 0, 10) \ - X(Mm0, 41, mm0, 0, 8) \ - X(Mm1, 42, mm1, 0, 8) \ - X(Mm2, 43, mm2, 0, 8) \ - X(Mm3, 44, mm3, 0, 8) \ - X(Mm4, 45, mm4, 0, 8) \ - X(Mm5, 46, mm5, 0, 8) \ - X(Mm6, 47, mm6, 0, 8) \ - X(Mm7, 48, mm7, 0, 8) \ + X(Mm0, 41, fpr0, 0, 8) \ + X(Mm1, 42, fpr1, 0, 8) \ + X(Mm2, 43, fpr2, 0, 8) \ + X(Mm3, 44, fpr3, 0, 8) \ + X(Mm4, 45, fpr4, 0, 8) \ + X(Mm5, 46, fpr5, 0, 8) \ + X(Mm6, 47, fpr6, 0, 8) \ + X(Mm7, 48, fpr7, 0, 8) \ X(Rflags, 49, rflags, 0, 4) \ X(Es, 50, es, 0, 2) \ X(Cs, 51, cs, 0, 2) \ @@ -1631,18 +1655,20 @@ typedef enum DW_ExprOpEnum X(Tr, 62, nil, 0, 0) \ X(Ldtr, 63, nil, 0, 0) -typedef U32 DW_RegX86; +typedef U32 DW_Reg; + +typedef DW_Reg DW_RegX86; typedef enum DW_RegX86Enum { -#define X(_N,_ID,...) DW_Reg_x86_##_N = _ID, +#define X(_N,_ID,...) DW_RegX86_##_N = _ID, DW_Regs_X86_XList(X) #undef X } DW_RegX86Enum; -typedef U32 DW_RegX64; +typedef DW_Reg DW_RegX64; typedef enum DW_RegX64Enum { -#define X(_N,_ID,...) DW_Reg_x64_##_N = _ID, +#define X(_N,_ID,...) DW_RegX64_##_N = _ID, DW_Regs_X64_XList(X) #undef X } DW_RegX64Enum; diff --git a/src/dwarf/dwarf_enum.c b/src/dwarf/dwarf_enum.c index 68b29463..8ea41d98 100644 --- a/src/dwarf/dwarf_enum.c +++ b/src/dwarf/dwarf_enum.c @@ -12,7 +12,11 @@ dw_string_from_expr_op(Arena *arena, DW_Version ver, DW_Ext ext, DW_ExprOp op) case DW_Ext_LLVM: break; case DW_Ext_APPLE: break; case DW_Ext_MIPS: break; - case DW_Ext_GNU: DW_Expr_GNU_XList(X); break; + case DW_Ext_GNU: { + switch (op) { + DW_Expr_GNU_XList(X); + } + } break; } switch (ver) { @@ -48,6 +52,7 @@ internal String8 dw_string_from_tag_kind(Arena *arena, DW_TagKind kind) { switch (kind) { + case DW_Tag_Null: return str8_lit("Null"); #define X(_N,_ID) case DW_Tag_##_N: return str8_lit(Stringify(_N)); DW_Tag_V3_XList(X) DW_Tag_V5_XList(X) @@ -149,6 +154,50 @@ dw_string_from_language(Arena *arena, DW_Language kind) return push_str8f(arena, "%x", kind); } +internal String8 +dw_string_from_inl(Arena *arena, DW_InlKind kind) +{ + switch (kind) { +#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); + DW_Inl_XList(X) +#undef X + } + return push_str8f(arena, "%x", kind); +} + +internal String8 +dw_string_from_access_kind(Arena *arena, DW_AccessKind kind) +{ + switch (kind) { +#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); + DW_AccessKind_XList(X) +#undef X + } + return push_str8f(arena, "%llx", kind); +} + +internal String8 +dw_string_from_calling_convetion(Arena *arena, DW_CallingConventionKind kind) +{ + switch (kind) { +#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); + DW_CallingConventionKind_XList(X) +#undef X + } + return push_str8f(arena, "%llx", kind); +} + +internal String8 +dw_string_from_attrib_type_encoding(Arena *arena, DW_AttribTypeEncodingKind kind) +{ + switch (kind) { +#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); + DW_AttribTypeEncodingKind_XList(X) +#undef X + } + return push_str8f(arena, "%llx", kind); +} + internal String8 dw_string_from_std_opcode(Arena *arena, DW_StdOpcode kind) { @@ -201,14 +250,14 @@ dw_string_from_register(Arena *arena, Arch arch, U64 reg_id) case Arch_Null: break; case Arch_x86: { switch (reg_id) { - #define X(_N, _ID, ...) case DW_Reg_x86_##_N: reg_str = str8_lit(Stringify(_ID)); break; + #define X(_N, _ID, ...) case DW_RegX86_##_N: reg_str = str8_lit(Stringify(_N)); break; DW_Regs_X86_XList(X) #undef X } } break; case Arch_x64: { switch (reg_id) { - #define X(_N, _ID, ...) case DW_Reg_x64_##_N: reg_str = str8_lit(Stringify(_ID)); break; + #define X(_N, _ID, ...) case DW_RegX64_##_N: reg_str = str8_lit(Stringify(_N)); break; DW_Regs_X64_XList(X) #undef X } diff --git a/src/dwarf/dwarf_enum.h b/src/dwarf/dwarf_enum.h index 1bbc3898..1a770ee9 100644 --- a/src/dwarf/dwarf_enum.h +++ b/src/dwarf/dwarf_enum.h @@ -8,6 +8,7 @@ internal String8 dw_string_from_expr_op(Arena *arena, DW_Version ver, DW_Ext ext internal String8 dw_string_from_tag_kind(Arena *arena, DW_TagKind kind); internal String8 dw_string_from_attrib_kind(Arena *arena, DW_Version ver, DW_Ext ext, DW_AttribKind kind); internal String8 dw_string_from_form_kind(Arena *arena, DW_Version ver, DW_FormKind kind); +internal String8 dw_string_access_kind(Arena *arena, DW_AccessKind kind); //internal String8 dw_string_from_register(Arena *arena, Arch arch, U64 reg_id); diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index 2731dd9c..4ca39ce9 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -148,7 +148,7 @@ dw_unwind_x64__apply_frame_rules(String8 raw_eh_frame, // is this a roll-over CFA? B32 is_roll_over_cfa = 0; - if (reg_idx == DW_Reg_x64_Rsp) { + if (reg_idx == DW_RegX64_Rsp) { DW_CFIRegisterRule rule = row->cells[reg_idx].rule; if (rule == DW_CFIRegisterRule_Undefined || rule == DW_CFIRegisterRule_SameValue) { is_roll_over_cfa = 1;