mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-03 12:38:11 +00: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));
|
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
|
// rjf: commit expansion state
|
||||||
if(next_expanded != row_expanded)
|
if(next_expanded != row_expanded)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,17 @@
|
|||||||
// Copyright (c) 2024 Epic Games Tools
|
// Copyright (c) 2024 Epic Games Tools
|
||||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
// 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)
|
@table(name basic_string basic_byte_size)
|
||||||
// NOTE(rjf): basic_byte_size == 0xFF? => address sized
|
// NOTE(rjf): basic_byte_size == 0xFF? => address sized
|
||||||
E_TypeKindTable:
|
E_TypeKindTable:
|
||||||
@@ -131,6 +142,12 @@ E_InterpretationCodeTable:
|
|||||||
{ MalformedBytecode "Malformed bytecode." }
|
{ MalformedBytecode "Malformed bytecode." }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@enum E_TokenKind:
|
||||||
|
{
|
||||||
|
@expand(E_TokenKindTable a) `$(a.name)`,
|
||||||
|
COUNT,
|
||||||
|
}
|
||||||
|
|
||||||
@enum E_TypeKind:
|
@enum E_TypeKind:
|
||||||
{
|
{
|
||||||
@expand(E_TypeKindTable a) `$(a.name)`,
|
@expand(E_TypeKindTable a) `$(a.name)`,
|
||||||
@@ -159,6 +176,12 @@ E_InterpretationCodeTable:
|
|||||||
COUNT,
|
COUNT,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@data(String8)
|
||||||
|
e_token_kind_strings:
|
||||||
|
{
|
||||||
|
@expand(E_TokenKindTable a) `str8_lit_comp("$(a.name)")`
|
||||||
|
}
|
||||||
|
|
||||||
@data(String8)
|
@data(String8)
|
||||||
e_expr_kind_strings:
|
e_expr_kind_strings:
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -44,18 +44,6 @@ struct E_MsgList
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Token Types
|
//~ 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;
|
typedef struct E_Token E_Token;
|
||||||
struct E_Token
|
struct E_Token
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,16 @@
|
|||||||
//- GENERATED CODE
|
//- GENERATED CODE
|
||||||
|
|
||||||
C_LINKAGE_BEGIN
|
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] =
|
String8 e_expr_kind_strings[41] =
|
||||||
{
|
{
|
||||||
str8_lit_comp("Nil"),
|
str8_lit_comp("Nil"),
|
||||||
|
|||||||
@@ -6,6 +6,17 @@
|
|||||||
#ifndef EVAL_META_H
|
#ifndef EVAL_META_H
|
||||||
#define 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
|
typedef enum E_TypeKind
|
||||||
{
|
{
|
||||||
E_TypeKind_Null,
|
E_TypeKind_Null,
|
||||||
@@ -139,6 +150,7 @@ E_InterpretationCode_COUNT,
|
|||||||
} E_InterpretationCode;
|
} E_InterpretationCode;
|
||||||
|
|
||||||
C_LINKAGE_BEGIN
|
C_LINKAGE_BEGIN
|
||||||
|
extern String8 e_token_kind_strings[6];
|
||||||
extern String8 e_expr_kind_strings[41];
|
extern String8 e_expr_kind_strings[41];
|
||||||
extern String8 e_interpretation_code_display_strings[11];
|
extern String8 e_interpretation_code_display_strings[11];
|
||||||
extern String8 e_expr_op_strings[41];
|
extern String8 e_expr_op_strings[41];
|
||||||
|
|||||||
@@ -779,11 +779,11 @@ X(RDI_U32, type_idx)\
|
|||||||
X(RDI_U32, container_idx)\
|
X(RDI_U32, container_idx)\
|
||||||
|
|
||||||
#define RDI_ThreadVariable_XList \
|
#define RDI_ThreadVariable_XList \
|
||||||
X(RDI_U32, name_string_idx)\
|
X(type, name_string_idx)\
|
||||||
X(RDI_LinkFlags, link_flags)\
|
X(type, link_flags)\
|
||||||
X(RDI_U32, tls_off)\
|
X(type, tls_off)\
|
||||||
X(RDI_U32, type_idx)\
|
X(type, type_idx)\
|
||||||
X(RDI_U32, container_idx)\
|
X(type, container_idx)\
|
||||||
|
|
||||||
#define RDI_Procedure_XList \
|
#define RDI_Procedure_XList \
|
||||||
X(RDI_U32, name_string_idx)\
|
X(RDI_U32, name_string_idx)\
|
||||||
@@ -882,7 +882,6 @@ X(Convert)\
|
|||||||
X(Pick)\
|
X(Pick)\
|
||||||
X(Pop)\
|
X(Pop)\
|
||||||
X(Insert)\
|
X(Insert)\
|
||||||
X(COUNT)\
|
|
||||||
|
|
||||||
#define RDI_EvalTypeGroup_XList \
|
#define RDI_EvalTypeGroup_XList \
|
||||||
X(Other)\
|
X(Other)\
|
||||||
@@ -890,7 +889,6 @@ X(U)\
|
|||||||
X(S)\
|
X(S)\
|
||||||
X(F32)\
|
X(F32)\
|
||||||
X(F64)\
|
X(F64)\
|
||||||
X(COUNT)\
|
|
||||||
|
|
||||||
#define RDI_EvalConversionKind_XList \
|
#define RDI_EvalConversionKind_XList \
|
||||||
X(Noop)\
|
X(Noop)\
|
||||||
@@ -898,7 +896,6 @@ X(Legal)\
|
|||||||
X(OtherToOther)\
|
X(OtherToOther)\
|
||||||
X(ToOther)\
|
X(ToOther)\
|
||||||
X(FromOther)\
|
X(FromOther)\
|
||||||
X(COUNT)\
|
|
||||||
|
|
||||||
#define RDI_NameMapKind_XList \
|
#define RDI_NameMapKind_XList \
|
||||||
X(NULL)\
|
X(NULL)\
|
||||||
@@ -908,7 +905,6 @@ X(Procedures)\
|
|||||||
X(Types)\
|
X(Types)\
|
||||||
X(LinkNameProcedures)\
|
X(LinkNameProcedures)\
|
||||||
X(NormalSourcePaths)\
|
X(NormalSourcePaths)\
|
||||||
X(COUNT)\
|
|
||||||
|
|
||||||
#define RDI_NameMap_XList \
|
#define RDI_NameMap_XList \
|
||||||
X(RDI_U32, bucket_base_idx)\
|
X(RDI_U32, bucket_base_idx)\
|
||||||
|
|||||||
@@ -1108,17 +1108,17 @@ RDI_LocationRegMemberTable:
|
|||||||
|
|
||||||
@xlist RDI_LinkFlags_XList:
|
@xlist RDI_LinkFlags_XList:
|
||||||
{
|
{
|
||||||
@expand(RDI_LinkFlagTable a) `$(a.name)`;
|
@expand(RDI_LinkFlagTable a) `$(a.name != COUNT -> a.name)`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@xlist RDI_LocalKind_XList:
|
@xlist RDI_LocalKind_XList:
|
||||||
{
|
{
|
||||||
@expand(RDI_LocalKindTable a) `$(a.name)`;
|
@expand(RDI_LocalKindTable a) `$(a.name != COUNT -> a.name)`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@xlist RDI_LocationKind_XList:
|
@xlist RDI_LocationKind_XList:
|
||||||
{
|
{
|
||||||
@expand(RDI_LocationKindTable a) `$(a.name)`;
|
@expand(RDI_LocationKindTable a) `$(a.name != COUNT -> a.name)`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@xlist RDI_GlobalVariable_XList:
|
@xlist RDI_GlobalVariable_XList:
|
||||||
@@ -1128,7 +1128,7 @@ RDI_LocationRegMemberTable:
|
|||||||
|
|
||||||
@xlist RDI_ThreadVariable_XList:
|
@xlist RDI_ThreadVariable_XList:
|
||||||
{
|
{
|
||||||
@expand(RDI_ThreadVariableMemberTable a) `$(a.type), $(a.name)`
|
@expand(RDI_ThreadVariableMemberTable a) `$(type), $(a.name)`
|
||||||
}
|
}
|
||||||
|
|
||||||
@xlist RDI_Procedure_XList:
|
@xlist RDI_Procedure_XList:
|
||||||
@@ -1317,17 +1317,17 @@ RDI_EvalConversionKindTable:
|
|||||||
|
|
||||||
@xlist RDI_EvalOp_XList:
|
@xlist RDI_EvalOp_XList:
|
||||||
{
|
{
|
||||||
@expand(RDI_EvalOpTable a) `$(a.name)`;
|
@expand(RDI_EvalOpTable a) `$(a.name != COUNT -> a.name)`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@xlist RDI_EvalTypeGroup_XList:
|
@xlist RDI_EvalTypeGroup_XList:
|
||||||
{
|
{
|
||||||
@expand(RDI_EvalTypeGroupTable a) `$(a.name)`;
|
@expand(RDI_EvalTypeGroupTable a) `$(a.name != COUNT -> a.name)`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@xlist RDI_EvalConversionKind_XList:
|
@xlist RDI_EvalConversionKind_XList:
|
||||||
{
|
{
|
||||||
@expand(RDI_EvalConversionKindTable a) `$(a.name)`;
|
@expand(RDI_EvalConversionKindTable a) `$(a.name != COUNT -> a.name)`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@gen(enums)
|
@gen(enums)
|
||||||
@@ -1405,7 +1405,7 @@ RDI_NameMapNodeMemberTable:
|
|||||||
|
|
||||||
@xlist RDI_NameMapKind_XList:
|
@xlist RDI_NameMapKind_XList:
|
||||||
{
|
{
|
||||||
@expand(RDI_NameMapKindTable a) `$(a.name)`;
|
@expand(RDI_NameMapKindTable a) `$(a.name != COUNT -> a.name)`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@xlist RDI_NameMap_XList:
|
@xlist RDI_NameMap_XList:
|
||||||
|
|||||||
Reference in New Issue
Block a user