diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index af756bb7..e3f980dd 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -388,7 +388,7 @@ typedef RDI_U32 RDI_ContainerFlags; typedef enum RDI_ContainerFlagsEnum { RDI_ContainerFlag_External = 1<<8, -RDI_ContainerFlag_KindMask = 0xff, +RDI_ContainerFlag_KindMask = 0xff, } RDI_ContainerFlagsEnum; typedef RDI_U32 RDI_LinkFlags; @@ -407,6 +407,15 @@ RDI_LocalKind_Parameter = 0x1, RDI_LocalKind_Variable = 0x2, } RDI_LocalKindEnum; +typedef RDI_U8 RDI_VariableKind; +typedef enum RDI_VariableKindEnum +{ +RDI_VariableKind_Local = 0x0, +RDI_VariableKind_Param = 0x1, +RDI_VariableKind_Global = 0x2, +RDI_VariableKind_Thread = 0x3, +} RDI_VariableKindEnum; + typedef RDI_U8 RDI_LocationKind; typedef enum RDI_LocationKindEnum { @@ -416,6 +425,10 @@ RDI_LocationKind_ValBytecodeStream = 0x2, RDI_LocationKind_AddrRegPlusU16 = 0x3, RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, RDI_LocationKind_ValReg = 0x5, +RDI_LocationKind_ModuleOff = 0x6, +RDI_LocationKind_TLSOff = 0x7, +RDI_LocationKind_ConstantDataOff = 0x8, +RDI_LocationKind_List = 0x9, } RDI_LocationKindEnum; typedef RDI_U8 RDI_EvalOp; @@ -891,12 +904,26 @@ X(ValBytecodeStream)\ X(AddrRegPlusU16)\ X(AddrAddrRegPlusU16)\ X(ValReg)\ +X(ModuleOff)\ +X(TLSOff)\ +X(ConstantDataOff)\ +X(List)\ #define RDI_Namespace_XList \ X(RDI_U32, name_string_idx)\ X(RDI_ContainerFlags, container_flags)\ X(RDI_U32, container_idx)\ +#define RDI_Variable_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_ContainerFlags, container_flags)\ +X(RDI_U32, container_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_VariableKind, variable_kind)\ +X(RDI_LocationKind, location_kind)\ +X(RDI_U16, padding)\ +X(RDI_U32, location_idx)\ + #define RDI_GlobalVariable_XList \ X(RDI_U32, name_string_idx)\ X(RDI_LinkFlags, link_flags)\ @@ -1351,6 +1378,19 @@ RDI_ContainerFlags container_flags; RDI_U32 container_idx; }; +typedef struct RDI_Variable RDI_Variable; +struct RDI_Variable +{ +RDI_U32 name_string_idx; +RDI_ContainerFlags container_flags; +RDI_U32 container_idx; +RDI_U32 type_idx; +RDI_VariableKind variable_kind; +RDI_LocationKind location_kind; +RDI_U16 padding; +RDI_U32 location_idx; +}; + typedef struct RDI_GlobalVariable RDI_GlobalVariable; struct RDI_GlobalVariable { diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 6ef897af..6329e602 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -722,7 +722,6 @@ struct RDIM_Type RDI_U32 off; RDI_U32 count; RDIM_String8 name; - RDIM_String8 link_name; RDIM_Type *direct_type; RDIM_Type **param_types; struct RDIM_UDT *udt; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 32188395..821888cb 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -956,6 +956,7 @@ RDI_ContainerKindTable: RDI_ContainerFlagTable: { {External `1<<8`} + {KindMask `0xff`} } @table(name value) @@ -983,6 +984,19 @@ RDI_LocationKindTable: {AddrRegPlusU16 0x3} {AddrAddrRegPlusU16 0x4} {ValReg 0x5} + {ModuleOff 0x6} + {TLSOff 0x7} + {ConstantDataOff 0x8} + {List 0x9} +} + +@table(name value) +RDI_VariableKindTable: +{ + {Local 0x0} + {Param 0x1} + {Global 0x2} + {Thread 0x3} } @table(name type desc) @@ -993,6 +1007,19 @@ RDI_NamespaceMemberTable: {container_idx RDI_U32 ""} } +@table(name type desc) +RDI_VariableMemberTable: +{ + {name_string_idx RDI_U32 ""} + {container_flags RDI_ContainerFlags ""} + {container_idx RDI_U32 ""} + {type_idx RDI_U32 ""} + {variable_kind RDI_VariableKind ""} + {location_kind RDI_LocationKind ""} + {padding RDI_U16 ""} + {location_idx RDI_U32 ""} +} + @table(name type desc) RDI_GlobalVariableMemberTable: { @@ -1108,7 +1135,6 @@ RDI_LocationRegMemberTable: @enum(RDI_U32) RDI_ContainerFlags: { @expand(RDI_ContainerFlagTable a) `$(a.name .. =>20) = $(a.value)`, - `KindMask = 0xff`, } @enum(RDI_U32) RDI_LinkFlags: @@ -1121,6 +1147,11 @@ RDI_LocationRegMemberTable: @expand(RDI_LocalKindTable a) `$(a.name .. =>20) = $(a.value)` } +@enum(RDI_U8) RDI_VariableKind: +{ + @expand(RDI_VariableKindTable a) `$(a.name .. =>20) = $(a.value)` +} + @enum(RDI_U8) RDI_LocationKind: { @expand(RDI_LocationKindTable a) `$(a.name .. =>20) = $(a.value)` @@ -1148,6 +1179,11 @@ RDI_LocationRegMemberTable: @expand(RDI_NamespaceMemberTable a) `$(a.type), $(a.name)` } +@xlist RDI_Variable_XList: +{ + @expand(RDI_VariableMemberTable a) `$(a.type), $(a.name)` +} + @xlist RDI_GlobalVariable_XList: { @expand(RDI_GlobalVariableMemberTable a) `$(a.type), $(a.name)` @@ -1205,6 +1241,11 @@ RDI_LocationRegMemberTable: @expand(RDI_NamespaceMemberTable a) `$(a.type) $(a.name)` } +@struct RDI_Variable: +{ + @expand(RDI_VariableMemberTable a) `$(a.type) $(a.name)` +} + @struct RDI_GlobalVariable: { @expand(RDI_GlobalVariableMemberTable a) `$(a.type) $(a.name)` diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 912b4cd2..8df02b23 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -1521,44 +1521,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync(); RDIM_SrcFileChunkList all_src_files = *all_src_files__sequenceless; - ////////////////////////////////////////////////////////////// - //- rjf: gather user-defined namespaces - // - ProfScope("gather user-defined namespaces") - { - U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; - lane_sync_u64(&sym_take_counter, 0); - for(;;) - { - //- rjf: take next sym - U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(sym_idx >= all_syms_count) - { - break; - } - - //- rjf: unpack sym - Temp scratch = scratch_begin(&arena, 1); - CV_SymParsed *sym = all_syms[sym_idx]; - - //- rjf: iterate namespaces - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - case CV_SymKind_UNAMESPACE: - { - String8 string = str8_cstring_capped(iter.struct_base, iter.opl); - // TODO(rjf) - }break; - } - } - - scratch_end(scratch); - } - } - ////////////////////////////////////////////////////////////// //- rjf: types pass 1: produce type forward resolution map //