further progress on metacode-driven generation of rdi headers; metaprogram xlist generation; getting rdi_dump up-to-speed

This commit is contained in:
Ryan Fleury
2024-06-01 10:16:38 -07:00
parent de56231f4a
commit d66bbdc6a7
8 changed files with 428 additions and 92 deletions
+25
View File
@@ -264,6 +264,31 @@ int main(int argument_count, char **arguments)
}
}
//////////////////////////////
//- rjf: generate xlists
//
for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)
{
MD_Node *file = n->v.root;
for(MD_EachNode(node, file->first))
{
MD_Node *tag = md_tag_from_string(node, str8_lit("xlist"), 0);
if(!md_node_is_nil(tag))
{
String8 layer_key = mg_layer_key_from_path(file->string);
MG_Layer *layer = mg_layer_from_key(layer_key);
String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node);
str8_list_pushf(mg_arena, &layer->enums, "#define %S \\\n", node->string);
for(String8Node *n = gen_strings.first; n != 0; n = n->next)
{
String8 escaped = mg_escaped_from_str8(mg_arena, n->string);
str8_list_pushf(mg_arena, &layer->enums, "X(%S)\\\n", escaped);
}
str8_list_push(mg_arena, &layer->enums, str8_lit("\n"));
}
}
}
//////////////////////////////
//- rjf: generate structs
//
+72 -62
View File
@@ -5,77 +5,87 @@
//~ rjf: RDI Enum -> String Functions
internal String8
rdi_string_from_data_section_tag(RDI_DataSectionTag tag){
String8 result = {0};
switch (tag){
#define X(N,C) case C: result = str8_lit(#N); break;
#define Y(N)
RDI_DataSectionTagXList(X,Y)
#undef X
#undef Y
}
return(result);
}
internal String8
rdi_string_from_arch(RDI_Arch arch){
String8 result = {0};
switch (arch){
default: result = str8_lit("<invalid-arch>"); break;
case RDI_Arch_X86: result = str8_lit("x86"); break;
case RDI_Arch_X64: result = str8_lit("x64"); break;
}
return(result);
}
internal String8
rdi_string_from_language(RDI_Language language){
String8 result = {0};
switch (language){
#define X(name,code) case code: result = str8_lit(#name); break;
RDI_LanguageXList(X)
rdi_string_from_data_section_tag(RDI_DataSectionTag v)
{
String8 result = str8_lit("<invalid RDI_DataSectionTag>");
switch(v)
{
default:{}break;
#define X(name) case RDI_DataSectionTag_##name:{result = str8_lit(#name);}break;
RDI_DataSectionTag_XList
#undef X
}
return(result);
return result;
}
internal String8
rdi_string_from_type_kind(RDI_TypeKind type_kind){
String8 result = {0};
switch (type_kind){
default: result = str8_lit("<invalid-type-kind>"); break;
#define X(name,code) case code: result = str8_lit(#name); break;
#define XZ(name,code,size) X(name,code)
#define Y(a,n)
RDI_TypeKindXList(X,XZ,Y)
#undef X
#undef XZ
#undef Y
}
return(result);
}
internal String8
rdi_string_from_member_kind(RDI_MemberKind member_kind){
String8 result = {0};
switch (member_kind){
default: result = str8_lit("<invalid-member-kind>"); break;
#define X(N,C) case C: result = str8_lit(#N); break;
RDI_MemberKindXList(X)
rdi_string_from_arch(RDI_Arch v)
{
String8 result = str8_lit("<invalid RDI_Arch>");
switch(v)
{
default:{}break;
#define X(name) case RDI_Arch_##name:{result = str8_lit(#name);}break;
RDI_Arch_XList
#undef X
}
return(result);
return result;
}
internal String8
rdi_string_from_local_kind(RDI_LocalKind local_kind){
String8 result = {0};
switch (local_kind){
default: result = str8_lit("<invalid-local-kind>"); break;
case RDI_LocalKind_Parameter: result = str8_lit("Parameter"); break;
case RDI_LocalKind_Variable: result = str8_lit("Variable"); break;
rdi_string_from_language(RDI_Language v)
{
String8 result = str8_lit("<invalid RDI_Language>");
switch(v)
{
default:{}break;
#define X(name) case RDI_Language_##name:{result = str8_lit(#name);}break;
RDI_Language_XList
#undef X
}
return(result);
return result;
}
internal String8
rdi_string_from_type_kind(RDI_TypeKind v)
{
String8 result = str8_lit("<invalid RDI_TypeKind>");
switch(v)
{
default:{}break;
#define X(name) case RDI_TypeKind_##name:{result = str8_lit(#name);}break;
RDI_TypeKind_XList
#undef X
}
return result;
}
internal String8
rdi_string_from_member_kind(RDI_MemberKind v)
{
String8 result = str8_lit("<invalid RDI_MemberKind>");
switch(v)
{
default:{}break;
#define X(name) case RDI_MemberKind_##name:{result = str8_lit(#name);}break;
RDI_MemberKind_XList
#undef X
}
return result;
}
internal String8
rdi_string_from_local_kind(RDI_LocalKind v)
{
String8 result = str8_lit("<invalid RDI_LocalKind>");
switch(v)
{
default:{}break;
#define X(name) case RDI_LocalKind_##name:{result = str8_lit(#name);}break;
RDI_LocalKind_XList
#undef X
}
return result;
}
////////////////////////////////
@@ -160,11 +170,11 @@ rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *parsed,
internal void
rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *parsed,
RDI_TopLevelInfo *tli, U32 indent_level){
String8 arch_str = rdi_string_from_arch(tli->architecture);
String8 arch_str = rdi_string_from_arch(tli->arch);
String8 exe_name = {0};
exe_name.str = rdi_string_from_idx(parsed, tli->exe_name_string_idx, &exe_name.size);
str8_list_pushf(arena, out, "%.*sarchitecture=%.*s\n",
str8_list_pushf(arena, out, "%.*sarch=%.*s\n",
indent_level, rdi_stringize_spaces, str8_varg(arch_str));
str8_list_pushf(arena, out, "%.*sexe_name='%.*s'\n",
indent_level, rdi_stringize_spaces, str8_varg(exe_name));
+6 -6
View File
@@ -41,12 +41,12 @@ struct RDI_ScopeBundle
////////////////////////////////
//~ rjf: RDI Enum -> String Functions
internal String8 rdi_string_from_data_section_tag(RDI_DataSectionTag tag);
internal String8 rdi_string_from_arch(RDI_Arch arch);
internal String8 rdi_string_from_language(RDI_Language language);
internal String8 rdi_string_from_type_kind(RDI_TypeKind type_kind);
internal String8 rdi_string_from_member_kind(RDI_MemberKind member_kind);
internal String8 rdi_string_from_local_kind(RDI_LocalKind local_kind);
internal String8 rdi_string_from_data_section_tag(RDI_DataSectionTag v);
internal String8 rdi_string_from_arch(RDI_Arch v);
internal String8 rdi_string_from_language(RDI_Language v);
internal String8 rdi_string_from_type_kind(RDI_TypeKind v);
internal String8 rdi_string_from_member_kind(RDI_MemberKind v);
internal String8 rdi_string_from_local_kind(RDI_LocalKind v);
////////////////////////////////
//~ rjf: RDI Flags -> String Functions
+7 -7
View File
@@ -155,13 +155,6 @@ rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup
case RDI_Arch_X86:{result = 4;}break;
case RDI_Arch_X64:{result = 8;}break;
}
return result;
}
RDI_PROC RDI_EvalConversionKind
rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out)
return result;
}
@@ -193,4 +186,11 @@ rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group)
case RDI_EvalOp_Mul: case RDI_EvalOp_Div:
case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq:
case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq:
case RDI_EvalOp_Less:case RDI_EvalOp_Grtr:
{
+225 -3
View File
@@ -80,7 +80,6 @@ RDI_DataSectionTag_LocationData = 0x0017,
RDI_DataSectionTag_NameMaps = 0x0018,
RDI_DataSectionTag_PRIMARY_COUNT = 0x0019,
RDI_DataSectionTag_SECONDARY = 0x80000000,
RDI_DataSectionTag_SKIP = RDI_DataSectionTag_SECONDARY|0x0000,
RDI_DataSectionTag_LineInfoVoffs = RDI_DataSectionTag_SECONDARY|0x0001,
RDI_DataSectionTag_LineInfoData = RDI_DataSectionTag_SECONDARY|0x0002,
RDI_DataSectionTag_LineInfoColumns = RDI_DataSectionTag_SECONDARY|0x0003,
@@ -486,6 +485,229 @@ RDI_NameMapKind_NormalSourcePaths = 6,
RDI_NameMapKind_COUNT = 7,
} RDI_NameMapKindEnum;
#define RDI_DataSectionTag_XList \
X(NULL)\
X(TopLevelInfo)\
X(StringData)\
X(StringTable)\
X(IndexRuns)\
X(BinarySections)\
X(FilePathNodes)\
X(SourceFiles)\
X(Units)\
X(UnitVmap)\
X(TypeNodes)\
X(UDTs)\
X(Members)\
X(EnumMembers)\
X(GlobalVariables)\
X(GlobalVmap)\
X(ThreadVariables)\
X(Procedures)\
X(Scopes)\
X(ScopeVoffData)\
X(ScopeVmap)\
X(Locals)\
X(LocationBlocks)\
X(LocationData)\
X(NameMaps)\
X(PRIMARY_COUNT)\
X(SECONDARY)\
X(LineInfoVoffs)\
X(LineInfoData)\
X(LineInfoColumns)\
X(LineMapNumbers)\
X(LineMapRanges)\
X(LineMapVoffs)\
X(NameMapBuckets)\
X(NameMapNodes)\
#define RDI_DataSectionEncoding_XList \
X(Unpacked)\
X(LZB)\
#define RDI_Arch_XList \
X(NULL)\
X(X86)\
X(X64)\
#define RDI_BinarySectionFlags_XList \
X(NULL)\
X(X86)\
X(X64)\
#define RDI_Language_XList \
X(NULL)\
X(C)\
X(CPlusPlus)\
X(COUNT)\
#define RDI_TypeKind_XList \
X(NULL)\
X(Void)\
X(Handle)\
X(Char8)\
X(Char16)\
X(Char32)\
X(UChar8)\
X(UChar16)\
X(UChar32)\
X(U8)\
X(U16)\
X(U32)\
X(U64)\
X(U128)\
X(U256)\
X(U512)\
X(S8)\
X(S16)\
X(S32)\
X(S64)\
X(S128)\
X(S256)\
X(S512)\
X(Bool)\
X(F16)\
X(F32)\
X(F32PP)\
X(F48)\
X(F64)\
X(F80)\
X(F128)\
X(ComplexF32)\
X(ComplexF64)\
X(ComplexF80)\
X(ComplexF128)\
X(Modifier)\
X(Ptr)\
X(LRef)\
X(RRef)\
X(Array)\
X(Function)\
X(Method)\
X(MemberPtr)\
X(Struct)\
X(Class)\
X(Union)\
X(Enum)\
X(Alias)\
X(IncompleteStruct)\
X(IncompleteUnion)\
X(IncompleteClass)\
X(IncompleteEnum)\
X(Bitfield)\
X(Variadic)\
#define RDI_TypeModifierFlags_XList \
X(Const)\
X(Volatile)\
#define RDI_UDTFlag_XList \
X(EnumMembers)\
#define RDI_MemberKind_XList \
X(NULL)\
X(DataField)\
X(StaticData)\
X(Method)\
X(StaticMethod)\
X(VirtualMethod)\
X(VTablePtr)\
X(Base)\
X(VirtualBase)\
X(NestedType)\
#define RDI_LinkFlags_XList \
X(External)\
X(TypeScoped)\
X(ProcScoped)\
#define RDI_LocalKind_XList \
X(NULL)\
X(Parameter)\
X(Variable)\
#define RDI_LocationKind_XList \
X(NULL)\
X(AddrBytecodeStream)\
X(ValBytecodeStream)\
X(AddrRegPlusU16)\
X(AddrAddrRegPlusU16)\
X(ValReg)\
#define RDI_EvalOp_XList \
X(Stop)\
X(Noop)\
X(Cond)\
X(Skip)\
X(MemRead)\
X(RegRead)\
X(RegReadDyn)\
X(FrameOff)\
X(ModuleOff)\
X(TLSOff)\
X(ObjectOff)\
X(CFA)\
X(ConstU8)\
X(ConstU16)\
X(ConstU32)\
X(ConstU64)\
X(Abs)\
X(Neg)\
X(Add)\
X(Sub)\
X(Mul)\
X(Div)\
X(Mod)\
X(LShift)\
X(RShift)\
X(BitAnd)\
X(BitOr)\
X(BitXor)\
X(BitNot)\
X(LogAnd)\
X(LogOr)\
X(LogNot)\
X(EqEq)\
X(NtEq)\
X(LsEq)\
X(GrEq)\
X(Less)\
X(Grtr)\
X(Trunc)\
X(TruncSigned)\
X(Convert)\
X(Pick)\
X(Pop)\
X(Insert)\
X(COUNT)\
#define RDI_EvalTypeGroup_XList \
X(Other)\
X(U)\
X(S)\
X(F32)\
X(F64)\
X(COUNT)\
#define RDI_EvalConversionKind_XList \
X(Noop)\
X(Legal)\
X(OtherToOther)\
X(ToOther)\
X(FromOther)\
X(COUNT)\
#define RDI_NameMapKind_XList \
X(NULL)\
X(GlobalVariables)\
X(ThreadVariables)\
X(Procedures)\
X(Types)\
X(LinkNameProcedures)\
X(NormalSourcePaths)\
X(COUNT)\
#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6))
#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf)
@@ -779,8 +1001,8 @@ RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size);
RDI_LocationKind kind;
};
typedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16;
struct RDI_LocationRegPlusU16
typedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16;
struct RDI_LocationRegPlusU16
{
RDI_LocationKind kind;
RDI_RegCode reg_code;
+91 -12
View File
@@ -137,7 +137,6 @@ RDI_DataSectionTable:
{NameMaps 0x0018 ""}
{PRIMARY_COUNT 0x0019 ""}
{SECONDARY 0x80000000 ""}
{SKIP `RDI_DataSectionTag_SECONDARY|0x0000` ""}
{LineInfoVoffs `RDI_DataSectionTag_SECONDARY|0x0001` ""}
{LineInfoData `RDI_DataSectionTag_SECONDARY|0x0002` ""}
{LineInfoColumns `RDI_DataSectionTag_SECONDARY|0x0003` ""}
@@ -175,6 +174,16 @@ RDI_DataSectionMemberTable:
@expand(RDI_DataSectionEncodingTable a) `$(a.name .. =>10) = $(a.value)`,
}
@xlist RDI_DataSectionTag_XList:
{
@expand(RDI_DataSectionTable a) `$(a.name)`;
}
@xlist RDI_DataSectionEncoding_XList:
{
@expand(RDI_DataSectionEncodingTable a) `$(a.name)`;
}
@struct RDI_DataSection:
{
@expand(RDI_DataSectionMemberTable a) `$(a.type) $(a.name)`
@@ -359,6 +368,11 @@ RDI_RegCodeX64Table:
@expand(RDI_ArchTable a) `$(a.name .. =>10) = $(a.value)`
}
@xlist RDI_Arch_XList:
{
@expand(RDI_ArchTable a) `$(a.name)`;
}
@enum(RDI_U8) RDI_RegCode: {nil}
@enum(RDI_U8) RDI_RegCodeX86:
@@ -415,6 +429,11 @@ RDI_BinarySectionMemberTable:
@expand(RDI_BinarySectionFlagTable a) `$(a.name .. =>10) = $(a.value)`;
}
@xlist RDI_BinarySectionFlags_XList:
{
@expand(RDI_ArchTable a) `$(a.name)`;
}
@struct RDI_BinarySection:
{
@expand(RDI_BinarySectionMemberTable a) `$(a.type) $(a.name)`
@@ -529,6 +548,11 @@ RDI_LanguageTable:
@expand(RDI_LanguageTable a) `$(a.name .. =>10) = $(a.value)`
}
@xlist RDI_Language_XList:
{
@expand(RDI_LanguageTable a) `$(a.name)`;
}
////////////////////////////////
//~ rjf: Type Info Tables
@@ -673,6 +697,16 @@ RDI_EnumMemberTable:
@expand(RDI_TypeModifierFlagTable a) `$(a.name .. =>20) = $(a.value)`,
}
@xlist RDI_TypeKind_XList:
{
@expand(RDI_TypeKindTable a) `$(a.name)`;
}
@xlist RDI_TypeModifierFlags_XList:
{
@expand(RDI_TypeModifierFlagTable a) `$(a.name)`;
}
@struct RDI_TypeNode:
{
@expand(RDI_TypeNodeMemberTable a) `$(a.type_lhs) $(a.name)$(a.type_rhs)`
@@ -722,6 +756,11 @@ RDI_EnumMemberTable:
@expand(RDI_UDTFlagTable a) `$(a.name .. =>20) = $(a.value)`
}
@xlist RDI_UDTFlag_XList:
{
@expand(RDI_UDTFlagTable a) `$(a.name)`;
}
@struct RDI_UDT:
{
@expand(RDI_UDTMemberTable a) `$(a.type) $(a.name)`
@@ -732,6 +771,11 @@ RDI_EnumMemberTable:
@expand(RDI_MemberKindTable a) `$(a.name .. =>25) = $(a.value)`
}
@xlist RDI_MemberKind_XList:
{
@expand(RDI_MemberKindTable a) `$(a.name)`;
}
@struct RDI_Member:
{
@expand(RDI_MemberMemberTable a) `$(a.type) $(a.name)`
@@ -874,6 +918,21 @@ RDI_LocationRegMemberTable:
@expand(RDI_LocationKindTable a) `$(a.name .. =>20) = $(a.value)`
}
@xlist RDI_LinkFlags_XList:
{
@expand(RDI_LinkFlagTable a) `$(a.name)`;
}
@xlist RDI_LocalKind_XList:
{
@expand(RDI_LocalKindTable a) `$(a.name)`;
}
@xlist RDI_LocationKind_XList:
{
@expand(RDI_LocationKindTable a) `$(a.name)`;
}
@struct RDI_GlobalVariable:
{
@expand(RDI_GlobalVariableMemberTable a) `$(a.type) $(a.name)`
@@ -1011,6 +1070,21 @@ RDI_EvalConversionKindTable:
@expand(RDI_EvalConversionKindTable a) `$(a.name .. =>20) = $(a.value)`
}
@xlist RDI_EvalOp_XList:
{
@expand(RDI_EvalOpTable a) `$(a.name)`;
}
@xlist RDI_EvalTypeGroup_XList:
{
@expand(RDI_EvalTypeGroupTable a) `$(a.name)`;
}
@xlist RDI_EvalConversionKind_XList:
{
@expand(RDI_EvalConversionKindTable a) `$(a.name)`;
}
@gen(enums)
```
#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6))
@@ -1083,6 +1157,11 @@ RDI_NameMapNodeMemberTable:
@expand(RDI_NameMapKindTable a) `$(a.name .. =>20) = $(a.value)`
}
@xlist RDI_NameMapKind_XList:
{
@expand(RDI_NameMapKindTable a) `$(a.name)`;
}
@struct RDI_NameMap:
{
@expand(RDI_NameMapMemberTable a) `$(a.type) $(a.val)`
@@ -1107,8 +1186,8 @@ RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size);
RDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind);
RDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch);
RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out);
RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out);
RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group);
RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out);
```
@gen(functions) @c_file
@@ -1168,16 +1247,6 @@ rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup
}
```
@gen(functions) @c_file
```
RDI_PROC RDI_U8 *
rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out)
{
*size_out = rdi_eval_conversion_kind_message_string_table[kind].size;
return rdi_eval_conversion_kind_message_string_table[kind].str;
}
```
@gen(functions) @c_file
```
RDI_PROC RDI_S32
@@ -1211,3 +1280,13 @@ rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group)
return result;
}
```
@gen(functions) @c_file
```
RDI_PROC RDI_U8 *
rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out)
{
*size_out = rdi_eval_conversion_kind_message_string_table[kind].size;
return rdi_eval_conversion_kind_message_string_table[kind].str;
}
```
+1 -1
View File
@@ -2,7 +2,7 @@
// Licensed under the MIT license (https://opensource.org/license/mit/)
//#include "lib_rdi_format/rdi_format.c"
#include "rdi_format/generated/rdi_format.c"
#include "rdi_format/lib/rdi_format.c"
#include "lib_rdi_format/rdi_format_parse.c"
internal void
+1 -1
View File
@@ -5,7 +5,7 @@
#define RDI_FORMAT_LOCAL_H
//#include "lib_rdi_format/rdi_format.h"
#include "rdi_format/generated/rdi_format.h"
#include "rdi_format/lib/rdi_format.h"
#include "lib_rdi_format/rdi_format_parse.h"
internal void rdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi);