evaluation compiler debug tooltip visualizer

This commit is contained in:
Ryan Fleury
2024-08-13 15:41:01 -07:00
parent c64d207d4d
commit 07c4e6ee87
7 changed files with 204 additions and 29 deletions
+146
View File
@@ -2595,6 +2595,152 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Edit));
}
// rjf: [DEV] hovering -> tooltips
if(DEV_eval_compiler_tooltips && ui_hovering(sig)) UI_Tooltip DF_Font(ws, DF_FontSlot_Code)
{
local_persist char *spaces = " ";
String8 string = row->display_expr;
E_TokenArray tokens = e_token_array_from_text(scratch.arena, string);
E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, string, &tokens);
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr);
E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree.root);
String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);
UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Text:");
ui_label(string);
ui_spacer(ui_em(2.f, 1.f));
UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Tokens:");
for(U64 idx = 0; idx < tokens.count; idx += 1)
{
ui_labelf("%S: '%S'", e_token_kind_strings[tokens.v[idx].kind], str8_substr(string, tokens.v[idx].range));
}
ui_spacer(ui_em(2.f, 1.f));
UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Expression:");
{
typedef struct Task Task;
struct Task
{
Task *next;
Task *prev;
E_Expr *expr;
S64 depth;
};
Task start_task = {0, 0, parse.expr};
Task *first_task = &start_task;
Task *last_task = first_task;
for(Task *t = first_task; t != 0; t = t->next)
{
String8 ext = {0};
switch(t->expr->kind)
{
default:
{
if(t->expr->string.size != 0)
{
ext = push_str8f(scratch.arena, "'%S'", t->expr->string);
}
else if(t->expr->u32 != 0)
{
ext = push_str8f(scratch.arena, "0x%x", t->expr->u32);
}
else if(t->expr->f32 != 0)
{
ext = push_str8f(scratch.arena, "%f", t->expr->f32);
}
else if(t->expr->f64 != 0)
{
ext = push_str8f(scratch.arena, "%f", t->expr->f64);
}
else if(t->expr->u64 != 0)
{
ext = push_str8f(scratch.arena, "0x%I64x", t->expr->u64);
}
}break;
}
ui_labelf("%.*s%S%s%S", (int)t->depth*2, spaces, e_expr_kind_strings[t->expr->kind], ext.size ? " " : "", ext);
for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next)
{
Task *task = push_array(scratch.arena, Task, 1);
task->expr = child;
task->depth = t->depth+1;
DLLInsert(first_task, last_task, t, task);
}
}
}
ui_spacer(ui_em(2.f, 1.f));
UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("IR Tree:");
{
typedef struct Task Task;
struct Task
{
Task *next;
Task *prev;
E_IRNode *node;
S64 depth;
};
Task start_task = {0, 0, irtree.root};
Task *first_task = &start_task;
Task *last_task = first_task;
for(Task *t = first_task; t != 0; t = t->next)
{
String8 op_string = {0};
switch(t->node->op)
{
default:{}break;
case E_IRExtKind_Data:{op_string = str8_lit("Data");}break;
case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break;
#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break;
RDI_EvalOp_XList
#undef X
}
String8 ext = {0};
ui_labelf("%.*s%S", (int)t->depth*2, spaces, op_string);
for(E_IRNode *child = t->node->first; child != &e_irnode_nil; child = child->next)
{
Task *task = push_array(scratch.arena, Task, 1);
task->node = child;
task->depth = t->depth+1;
DLLInsert(first_task, last_task, t, task);
}
}
}
ui_spacer(ui_em(2.f, 1.f));
UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Op List:");
{
for(E_Op *op = oplist.first; op != 0; op = op->next)
{
String8 op_string = {0};
switch(op->opcode)
{
default:{}break;
case E_IRExtKind_Data:{op_string = str8_lit("Data");}break;
case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break;
#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break;
RDI_EvalOp_XList
#undef X
}
String8 ext = {0};
switch(op->opcode)
{
case E_IRExtKind_Data:{ext = push_str8f(scratch.arena, "'%S'", op->data);}break;
case E_IRExtKind_Bytecode:{ext = str8_lit("[bytecode]");}break;
default:
{
ext = str8_from_u64(scratch.arena, op->p, 16, 0, 0);
}break;
}
ui_labelf(" %S%s%S", op_string, ext.size ? " " : "", ext);
}
}
ui_spacer(ui_em(2.f, 1.f));
UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Bytecode:");
{
for(U64 idx = 0; idx < bytecode.size; idx += 1)
{
ui_labelf(" 0x%x ('%c')", (U32)bytecode.str[idx], (char)bytecode.str[idx]);
}
}
}
// rjf: commit expansion state
if(next_expanded != row_expanded)
{
+23
View File
@@ -1,6 +1,17 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
@table(name)
E_TokenKindTable:
{
{Null}
{Identifier}
{Numeric}
{StringLiteral}
{CharLiteral}
{Symbol}
}
@table(name basic_string basic_byte_size)
// NOTE(rjf): basic_byte_size == 0xFF? => address sized
E_TypeKindTable:
@@ -131,6 +142,12 @@ E_InterpretationCodeTable:
{ MalformedBytecode "Malformed bytecode." }
}
@enum E_TokenKind:
{
@expand(E_TokenKindTable a) `$(a.name)`,
COUNT,
}
@enum E_TypeKind:
{
@expand(E_TypeKindTable a) `$(a.name)`,
@@ -159,6 +176,12 @@ E_InterpretationCodeTable:
COUNT,
}
@data(String8)
e_token_kind_strings:
{
@expand(E_TokenKindTable a) `str8_lit_comp("$(a.name)")`
}
@data(String8)
e_expr_kind_strings:
{
-12
View File
@@ -44,18 +44,6 @@ struct E_MsgList
////////////////////////////////
//~ rjf: Token Types
typedef enum E_TokenKind
{
E_TokenKind_Null,
E_TokenKind_Identifier,
E_TokenKind_Numeric,
E_TokenKind_StringLiteral,
E_TokenKind_CharLiteral,
E_TokenKind_Symbol,
E_TokenKind_COUNT
}
E_TokenKind;
typedef struct E_Token E_Token;
struct E_Token
{
+10
View File
@@ -4,6 +4,16 @@
//- GENERATED CODE
C_LINKAGE_BEGIN
String8 e_token_kind_strings[6] =
{
str8_lit_comp("Null"),
str8_lit_comp("Identifier"),
str8_lit_comp("Numeric"),
str8_lit_comp("StringLiteral"),
str8_lit_comp("CharLiteral"),
str8_lit_comp("Symbol"),
};
String8 e_expr_kind_strings[41] =
{
str8_lit_comp("Nil"),
+12
View File
@@ -6,6 +6,17 @@
#ifndef EVAL_META_H
#define EVAL_META_H
typedef enum E_TokenKind
{
E_TokenKind_Null,
E_TokenKind_Identifier,
E_TokenKind_Numeric,
E_TokenKind_StringLiteral,
E_TokenKind_CharLiteral,
E_TokenKind_Symbol,
E_TokenKind_COUNT,
} E_TokenKind;
typedef enum E_TypeKind
{
E_TypeKind_Null,
@@ -139,6 +150,7 @@ E_InterpretationCode_COUNT,
} E_InterpretationCode;
C_LINKAGE_BEGIN
extern String8 e_token_kind_strings[6];
extern String8 e_expr_kind_strings[41];
extern String8 e_interpretation_code_display_strings[11];
extern String8 e_expr_op_strings[41];
+5 -9
View File
@@ -779,11 +779,11 @@ X(RDI_U32, type_idx)\
X(RDI_U32, container_idx)\
#define RDI_ThreadVariable_XList \
X(RDI_U32, name_string_idx)\
X(RDI_LinkFlags, link_flags)\
X(RDI_U32, tls_off)\
X(RDI_U32, type_idx)\
X(RDI_U32, container_idx)\
X(type, name_string_idx)\
X(type, link_flags)\
X(type, tls_off)\
X(type, type_idx)\
X(type, container_idx)\
#define RDI_Procedure_XList \
X(RDI_U32, name_string_idx)\
@@ -882,7 +882,6 @@ X(Convert)\
X(Pick)\
X(Pop)\
X(Insert)\
X(COUNT)\
#define RDI_EvalTypeGroup_XList \
X(Other)\
@@ -890,7 +889,6 @@ X(U)\
X(S)\
X(F32)\
X(F64)\
X(COUNT)\
#define RDI_EvalConversionKind_XList \
X(Noop)\
@@ -898,7 +896,6 @@ X(Legal)\
X(OtherToOther)\
X(ToOther)\
X(FromOther)\
X(COUNT)\
#define RDI_NameMapKind_XList \
X(NULL)\
@@ -908,7 +905,6 @@ X(Procedures)\
X(Types)\
X(LinkNameProcedures)\
X(NormalSourcePaths)\
X(COUNT)\
#define RDI_NameMap_XList \
X(RDI_U32, bucket_base_idx)\
+8 -8
View File
@@ -1108,17 +1108,17 @@ RDI_LocationRegMemberTable:
@xlist RDI_LinkFlags_XList:
{
@expand(RDI_LinkFlagTable a) `$(a.name)`;
@expand(RDI_LinkFlagTable a) `$(a.name != COUNT -> a.name)`;
}
@xlist RDI_LocalKind_XList:
{
@expand(RDI_LocalKindTable a) `$(a.name)`;
@expand(RDI_LocalKindTable a) `$(a.name != COUNT -> a.name)`;
}
@xlist RDI_LocationKind_XList:
{
@expand(RDI_LocationKindTable a) `$(a.name)`;
@expand(RDI_LocationKindTable a) `$(a.name != COUNT -> a.name)`;
}
@xlist RDI_GlobalVariable_XList:
@@ -1128,7 +1128,7 @@ RDI_LocationRegMemberTable:
@xlist RDI_ThreadVariable_XList:
{
@expand(RDI_ThreadVariableMemberTable a) `$(a.type), $(a.name)`
@expand(RDI_ThreadVariableMemberTable a) `$(type), $(a.name)`
}
@xlist RDI_Procedure_XList:
@@ -1317,17 +1317,17 @@ RDI_EvalConversionKindTable:
@xlist RDI_EvalOp_XList:
{
@expand(RDI_EvalOpTable a) `$(a.name)`;
@expand(RDI_EvalOpTable a) `$(a.name != COUNT -> a.name)`;
}
@xlist RDI_EvalTypeGroup_XList:
{
@expand(RDI_EvalTypeGroupTable a) `$(a.name)`;
@expand(RDI_EvalTypeGroupTable a) `$(a.name != COUNT -> a.name)`;
}
@xlist RDI_EvalConversionKind_XList:
{
@expand(RDI_EvalConversionKindTable a) `$(a.name)`;
@expand(RDI_EvalConversionKindTable a) `$(a.name != COUNT -> a.name)`;
}
@gen(enums)
@@ -1405,7 +1405,7 @@ RDI_NameMapNodeMemberTable:
@xlist RDI_NameMapKind_XList:
{
@expand(RDI_NameMapKindTable a) `$(a.name)`;
@expand(RDI_NameMapKindTable a) `$(a.name != COUNT -> a.name)`;
}
@xlist RDI_NameMap_XList: