sketch out unified RDI_Variable to replace RDI_GlobalVariable, RDI_ThreadVariable, RDI_Local, and RDI_Constant, & plug into new RDI structured namespaces

This commit is contained in:
Ryan Fleury
2026-03-09 15:15:48 -07:00
parent 408b3af27c
commit 5badc7f325
4 changed files with 83 additions and 41 deletions
+41 -1
View File
@@ -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
{
-1
View File
@@ -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;
+42 -1
View File
@@ -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)`
-38
View File
@@ -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
//