mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-14 08:02:23 -07:00
evaluation compiler debug tooltip visualizer
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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:
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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)\
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user