mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-31 11:20:03 +00:00
first pass at filesystem evaluation in eval system
This commit is contained in:
+17
-10
@@ -36,6 +36,21 @@ struct E_MsgList
|
||||
U64 count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Register-Sized Value Type
|
||||
|
||||
typedef union E_Value E_Value;
|
||||
union E_Value
|
||||
{
|
||||
U64 u512[8];
|
||||
U64 u256[4];
|
||||
U128 u128;
|
||||
U64 u64;
|
||||
S64 s64;
|
||||
F64 f64;
|
||||
F32 f32;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Operator Info
|
||||
|
||||
@@ -60,7 +75,7 @@ struct E_OpInfo
|
||||
////////////////////////////////
|
||||
//~ rjf: Evaluation Spaces
|
||||
|
||||
typedef U64 E_Space;
|
||||
typedef U128 E_Space;
|
||||
//
|
||||
// NOTE(rjf): Evaluations occur within the context of a "space". Each "space"
|
||||
// refers to a different offset/address-space, but it's a bit looser of a
|
||||
@@ -71,15 +86,6 @@ typedef U64 E_Space;
|
||||
// Effectively, when considering the result of an evaluation, you use the
|
||||
// value for understanding a key *into* a space, e.g. 1+2 -> 3, in a null
|
||||
// space, or &foo, in the space of PID: 1234.
|
||||
//
|
||||
// The values in the E_Space enum are reserved, but apart from those, any
|
||||
// arbitrary value can be used, and then later interpreted.
|
||||
//
|
||||
enum
|
||||
{
|
||||
E_Space_Null,
|
||||
E_Space_FIXED_COUNT
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Evaluation Modes
|
||||
@@ -114,6 +120,7 @@ struct E_Module
|
||||
|
||||
internal U64 e_hash_from_string(U64 seed, String8 string);
|
||||
internal String8 e_raw_from_escaped_string(Arena *arena, String8 string);
|
||||
#define e_value_u64(v) (E_Value){.u64 = (v)}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Message Functions
|
||||
|
||||
+11
-18
@@ -24,15 +24,9 @@ e_space_read(E_Space space, void *out, Rng1U64 range)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
B32 result = 0;
|
||||
switch(space)
|
||||
if(e_interpret_ctx->space_read != 0)
|
||||
{
|
||||
case E_Space_FIXED_COUNT:
|
||||
case E_Space_Null:{}break;
|
||||
default:
|
||||
if(e_interpret_ctx->space_read != 0)
|
||||
{
|
||||
result = e_interpret_ctx->space_read(e_interpret_ctx->space_rw_user_data, space, out, range);
|
||||
}break;
|
||||
result = e_interpret_ctx->space_read(e_interpret_ctx->space_rw_user_data, space, out, range);
|
||||
}
|
||||
ProfEnd();
|
||||
return result;
|
||||
@@ -43,15 +37,9 @@ e_space_write(E_Space space, void *in, Rng1U64 range)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
B32 result = 0;
|
||||
switch(space)
|
||||
if(e_interpret_ctx->space_write != 0)
|
||||
{
|
||||
case E_Space_FIXED_COUNT:
|
||||
case E_Space_Null:{}break;
|
||||
default:
|
||||
if(e_interpret_ctx->space_write != 0)
|
||||
{
|
||||
result = e_interpret_ctx->space_write(e_interpret_ctx->space_rw_user_data, space, in, range);
|
||||
}break;
|
||||
result = e_interpret_ctx->space_write(e_interpret_ctx->space_rw_user_data, space, in, range);
|
||||
}
|
||||
ProfEnd();
|
||||
return result;
|
||||
@@ -86,7 +74,7 @@ e_interpret(String8 bytecode)
|
||||
}
|
||||
else switch(op)
|
||||
{
|
||||
case E_IRExtKind_SetSpace:{ctrlbits = RDI_EVAL_CTRLBITS(8, 0, 0);}break;
|
||||
case E_IRExtKind_SetSpace:{ctrlbits = RDI_EVAL_CTRLBITS(16, 0, 0);}break;
|
||||
default:
|
||||
{
|
||||
result.code = E_InterpretationCode_BadOp;
|
||||
@@ -139,7 +127,7 @@ e_interpret(String8 bytecode)
|
||||
{
|
||||
case E_IRExtKind_SetSpace:
|
||||
{
|
||||
selected_space = imm;
|
||||
MemoryCopy(&selected_space, ptr, sizeof(E_Space));
|
||||
}break;
|
||||
|
||||
case RDI_EvalOp_Stop:
|
||||
@@ -251,6 +239,11 @@ e_interpret(String8 bytecode)
|
||||
nval.u64 = imm;
|
||||
}break;
|
||||
|
||||
case RDI_EvalOp_ConstU128:
|
||||
{
|
||||
MemoryCopy(&nval, ptr, 16);
|
||||
}break;
|
||||
|
||||
case RDI_EvalOp_ConstString:
|
||||
{
|
||||
MemoryCopy(&nval, ptr, imm);
|
||||
|
||||
@@ -7,18 +7,6 @@
|
||||
////////////////////////////////
|
||||
//~ rjf: Bytecode Interpretation Types
|
||||
|
||||
typedef union E_Value E_Value;
|
||||
union E_Value
|
||||
{
|
||||
U64 u512[8];
|
||||
U64 u256[4];
|
||||
U64 u128[2];
|
||||
U64 u64;
|
||||
S64 s64;
|
||||
F64 f64;
|
||||
F32 f32;
|
||||
};
|
||||
|
||||
typedef struct E_Interpretation E_Interpretation;
|
||||
struct E_Interpretation
|
||||
{
|
||||
|
||||
+80
-53
@@ -76,13 +76,13 @@ e_select_ir_ctx(E_IRCtx *ctx)
|
||||
//- rjf: op list functions
|
||||
|
||||
internal void
|
||||
e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, U64 p)
|
||||
e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, E_Value value)
|
||||
{
|
||||
U8 ctrlbits = rdi_eval_op_ctrlbits_table[opcode];
|
||||
U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);
|
||||
E_Op *node = push_array_no_zero(arena, E_Op, 1);
|
||||
node->opcode = opcode;
|
||||
node->u64 = p;
|
||||
node->value = value;
|
||||
SLLQueuePush(list->first, list->last, node);
|
||||
list->op_count += 1;
|
||||
list->encoded_size += 1 + p_size;
|
||||
@@ -92,10 +92,10 @@ internal void
|
||||
e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x)
|
||||
{
|
||||
if(0){}
|
||||
else if(x <= 0xFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, x); }
|
||||
else if(x <= 0xFFFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, x); }
|
||||
else if(x <= 0xFFFFFFFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, x); }
|
||||
else { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, x); }
|
||||
else if(x <= 0xFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, e_value_u64(x)); }
|
||||
else if(x <= 0xFFFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, e_value_u64(x)); }
|
||||
else if(x <= 0xFFFFFFFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, e_value_u64(x)); }
|
||||
else { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, e_value_u64(x)); }
|
||||
}
|
||||
|
||||
internal void
|
||||
@@ -103,22 +103,22 @@ e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x)
|
||||
{
|
||||
if(-0x80 <= x && x <= 0x7F)
|
||||
{
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, (U64)x);
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, 8);
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, e_value_u64((U64)x));
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, e_value_u64(8));
|
||||
}
|
||||
else if(-0x8000 <= x && x <= 0x7FFF)
|
||||
{
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, (U64)x);
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, 16);
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, e_value_u64((U64)x));
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, e_value_u64(16));
|
||||
}
|
||||
else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll)
|
||||
{
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, (U64)x);
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, 32);
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, e_value_u64((U64)x));
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, e_value_u64(32));
|
||||
}
|
||||
else
|
||||
{
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, (U64)x);
|
||||
e_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, e_value_u64((U64)x));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space)
|
||||
{
|
||||
E_Op *node = push_array_no_zero(arena, E_Op, 1);
|
||||
node->opcode = E_IRExtKind_SetSpace;
|
||||
node->u64 = space;
|
||||
node->value.u128 = space;
|
||||
SLLQueuePush(list->first, list->last, node);
|
||||
list->op_count += 1;
|
||||
list->encoded_size += 1 + sizeof(space);
|
||||
@@ -153,10 +153,10 @@ e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string)
|
||||
E_Op *node = push_array_no_zero(arena, E_Op, 1);
|
||||
node->opcode = opcode;
|
||||
node->string = string;
|
||||
node->u64 = Min(string.size, 64);
|
||||
node->value.u64 = Min(string.size, 64);
|
||||
SLLQueuePush(list->first, list->last, node);
|
||||
list->op_count += 1;
|
||||
list->encoded_size += 1 + p_size + node->u64;
|
||||
list->encoded_size += 1 + p_size + node->value.u64;
|
||||
}
|
||||
|
||||
internal void
|
||||
@@ -206,7 +206,7 @@ e_irtree_const_u(Arena *arena, U64 v)
|
||||
|
||||
// rjf: build
|
||||
E_IRNode *n = e_push_irnode(arena, op);
|
||||
n->u64 = v;
|
||||
n->value.u64 = v;
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ internal E_IRNode *
|
||||
e_irtree_unary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *c)
|
||||
{
|
||||
E_IRNode *n = e_push_irnode(arena, op);
|
||||
n->u64 = group;
|
||||
n->value.u64 = group;
|
||||
e_irnode_push_child(n, c);
|
||||
return n;
|
||||
}
|
||||
@@ -223,7 +223,7 @@ internal E_IRNode *
|
||||
e_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *l, E_IRNode *r)
|
||||
{
|
||||
E_IRNode *n = e_push_irnode(arena, op);
|
||||
n->u64 = group;
|
||||
n->value.u64 = group;
|
||||
e_irnode_push_child(n, l);
|
||||
e_irnode_push_child(n, r);
|
||||
return n;
|
||||
@@ -266,7 +266,7 @@ internal E_IRNode *
|
||||
e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c)
|
||||
{
|
||||
E_IRNode *root = e_push_irnode(arena, E_IRExtKind_SetSpace);
|
||||
root->u64 = space;
|
||||
root->value.u128 = space;
|
||||
e_irnode_push_child(root, c);
|
||||
return root;
|
||||
}
|
||||
@@ -280,7 +280,7 @@ e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_
|
||||
|
||||
// rjf: build the read node
|
||||
E_IRNode *read_node = e_push_irnode(arena, RDI_EvalOp_MemRead);
|
||||
read_node->u64 = byte_size;
|
||||
read_node->value.u64 = byte_size;
|
||||
e_irnode_push_child(read_node, c);
|
||||
|
||||
// rjf: build a signed trunc node if needed
|
||||
@@ -290,7 +290,7 @@ e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_
|
||||
if(bit_size < 64 && e_type_kind_is_signed(kind))
|
||||
{
|
||||
with_trunc = e_push_irnode(arena, RDI_EvalOp_TruncSigned);
|
||||
with_trunc->u64 = bit_size;
|
||||
with_trunc->value.u64 = bit_size;
|
||||
e_irnode_push_child(with_trunc, read_node);
|
||||
}
|
||||
|
||||
@@ -307,7 +307,7 @@ internal E_IRNode *
|
||||
e_irtree_convert_lo(Arena *arena, E_IRNode *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in)
|
||||
{
|
||||
E_IRNode *n = e_push_irnode(arena, RDI_EvalOp_Convert);
|
||||
n->u64 = in | (out << 8);
|
||||
n->value.u64 = in | (out << 8);
|
||||
e_irnode_push_child(n, c);
|
||||
return n;
|
||||
}
|
||||
@@ -327,7 +327,7 @@ e_irtree_trunc(Arena *arena, E_IRNode *c, E_TypeKey type_key)
|
||||
}
|
||||
U64 bit_size = byte_size << 3;
|
||||
result = e_push_irnode(arena, op);
|
||||
result->u64 = bit_size;
|
||||
result->value.u64 = bit_size;
|
||||
e_irnode_push_child(result, c);
|
||||
}
|
||||
return result;
|
||||
@@ -358,22 +358,11 @@ e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in)
|
||||
internal E_IRNode *
|
||||
e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key)
|
||||
{
|
||||
// TODO(rjf): @spaces double check that this path is working for register spaces
|
||||
E_IRNode *result = tree;
|
||||
if(from_mode == E_Mode_Offset)
|
||||
{
|
||||
switch(from_space)
|
||||
{
|
||||
#if 0
|
||||
case E_Space_Regs:
|
||||
{
|
||||
result = e_irtree_unary_op(arena, RDI_EvalOp_RegReadDyn, RDI_EvalTypeGroup_U, tree);
|
||||
}break;
|
||||
#endif
|
||||
default:
|
||||
{
|
||||
result = e_irtree_mem_read_type(arena, from_space, tree, type_key);
|
||||
}break;
|
||||
}
|
||||
result = e_irtree_mem_read_type(arena, from_space, tree, type_key);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -491,7 +480,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
|
||||
// rjf: ops to push stack value, push offset, + read from stack value
|
||||
new_tree = e_push_irnode(arena, RDI_EvalOp_ValueRead);
|
||||
new_tree->u64 = direct_type_size;
|
||||
new_tree->value.u64 = direct_type_size;
|
||||
e_irnode_push_child(new_tree, offset_tree);
|
||||
e_irnode_push_child(new_tree, l.root);
|
||||
}break;
|
||||
@@ -964,7 +953,12 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
result.root = new_tree;
|
||||
result.type_key = final_type_key;
|
||||
result.mode = E_Mode_Value;
|
||||
result.space = l_tree.space ? l_tree.space : r_tree.space;
|
||||
result.space = l_tree.space;
|
||||
E_Space zero_space = {0};
|
||||
if(MemoryMatchStruct(&result.space, &zero_space))
|
||||
{
|
||||
result.space = r_tree.space;
|
||||
}
|
||||
}
|
||||
}break;
|
||||
|
||||
@@ -1008,7 +1002,12 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
result.root = new_root;
|
||||
result.type_key = ptr_type;
|
||||
result.mode = E_Mode_Value;
|
||||
result.space = l_tree.space ? l_tree.space : r_tree.space;
|
||||
result.space = l_tree.space;
|
||||
E_Space zero_space = {0};
|
||||
if(MemoryMatchStruct(&result.space, &zero_space))
|
||||
{
|
||||
result.space = r_tree.space;
|
||||
}
|
||||
}
|
||||
}break;
|
||||
|
||||
@@ -1040,7 +1039,12 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
result.root = new_tree;
|
||||
result.type_key = e_type_key_basic(E_TypeKind_U64);
|
||||
result.mode = E_Mode_Value;
|
||||
result.space = l_tree.space ? l_tree.space : r_tree.space;
|
||||
result.space = l_tree.space;
|
||||
E_Space zero_space = {0};
|
||||
if(MemoryMatchStruct(&result.space, &zero_space))
|
||||
{
|
||||
result.space = r_tree.space;
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: pointer array comparison
|
||||
@@ -1069,7 +1073,12 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
result.root = e_irtree_binary_op(arena, op, RDI_EvalTypeGroup_Other, mem_root, arr_root);
|
||||
result.type_key = e_type_key_basic(E_TypeKind_Bool);
|
||||
result.mode = E_Mode_Value;
|
||||
result.space = ptr_tree->space ? ptr_tree->space : arr_tree->space;
|
||||
result.space = ptr_tree->space;
|
||||
E_Space zero_space = {0};
|
||||
if(MemoryMatchStruct(&result.space, &zero_space))
|
||||
{
|
||||
result.space = arr_tree->space;
|
||||
}
|
||||
}break;
|
||||
}
|
||||
}break;
|
||||
@@ -1120,7 +1129,12 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
result.root = new_tree;
|
||||
result.type_key = result_type;
|
||||
result.mode = E_Mode_Value;
|
||||
result.space = l_expr->space ? l_expr->space : r_expr->space;
|
||||
result.space = l_expr->space;
|
||||
E_Space zero_space = {0};
|
||||
if(MemoryMatchStruct(&result.space, &zero_space))
|
||||
{
|
||||
result.space = r_expr->space;
|
||||
}
|
||||
}
|
||||
}break;
|
||||
|
||||
@@ -1207,13 +1221,26 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
case E_ExprKind_LeafID:
|
||||
{
|
||||
E_IRNode *new_tree = e_push_irnode(arena, RDI_EvalOp_ConstU64);
|
||||
new_tree->u64 = expr->u64;
|
||||
new_tree->value.u64 = expr->u64;
|
||||
result.root = new_tree;
|
||||
result.type_key = expr->type_key;
|
||||
result.mode = E_Mode_Offset;
|
||||
result.space = expr->space;
|
||||
}break;
|
||||
|
||||
//- rjf: leaf file paths
|
||||
case E_ExprKind_LeafFilePath:
|
||||
{
|
||||
U128 key = fs_key_from_path(expr->string);
|
||||
U64 size = fs_size_from_path(expr->string);
|
||||
E_IRNode *base_offset = e_irtree_const_u(arena, 0);
|
||||
E_IRNode *set_space = e_irtree_set_space(arena, key, base_offset);
|
||||
result.root = set_space;
|
||||
result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), size);
|
||||
result.mode = E_Mode_Offset;
|
||||
result.space = key;
|
||||
}break;
|
||||
|
||||
//- rjf: types
|
||||
case E_ExprKind_TypeIdent:
|
||||
{
|
||||
@@ -1269,7 +1296,7 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out)
|
||||
|
||||
case E_IRExtKind_SetSpace:
|
||||
{
|
||||
e_oplist_push_set_space(arena, out, root->u64);
|
||||
e_oplist_push_set_space(arena, out, root->value.u128);
|
||||
for(E_IRNode *child = root->first;
|
||||
child != &e_irnode_nil;
|
||||
child = child->next)
|
||||
@@ -1292,11 +1319,11 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out)
|
||||
// 3. <ptr_left>
|
||||
|
||||
// rjf: modify prt_right in place to create step 2
|
||||
e_oplist_push_op(arena, &prt_right, RDI_EvalOp_Skip, prt_left.encoded_size);
|
||||
e_oplist_push_op(arena, &prt_right, RDI_EvalOp_Skip, e_value_u64(prt_left.encoded_size));
|
||||
|
||||
// rjf: merge 1 into out
|
||||
e_oplist_concat_in_place(out, &prt_cond);
|
||||
e_oplist_push_op(arena, out, RDI_EvalOp_Cond, prt_right.encoded_size);
|
||||
e_oplist_push_op(arena, out, RDI_EvalOp_Cond, e_value_u64(prt_right.encoded_size));
|
||||
|
||||
// rjf: merge 2 into out
|
||||
e_oplist_concat_in_place(out, &prt_right);
|
||||
@@ -1330,7 +1357,7 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out)
|
||||
}
|
||||
|
||||
// rjf: emit op to compute this node
|
||||
e_oplist_push_op(arena, out, (RDI_EvalOp)root->op, root->u64);
|
||||
e_oplist_push_op(arena, out, (RDI_EvalOp)root->op, root->value);
|
||||
}
|
||||
}break;
|
||||
}
|
||||
@@ -1371,7 +1398,7 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist)
|
||||
|
||||
// rjf: fill bytecode
|
||||
ptr[0] = opcode;
|
||||
MemoryCopy(ptr + 1, &op->u64, extra_byte_count);
|
||||
MemoryCopy(ptr + 1, &op->value.u64, extra_byte_count);
|
||||
|
||||
// rjf: advance
|
||||
ptr = next_ptr;
|
||||
@@ -1380,13 +1407,13 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist)
|
||||
case RDI_EvalOp_ConstString:
|
||||
{
|
||||
// rjf: compute bytecode advance
|
||||
U8 *next_ptr = ptr + 2 + op->u64;
|
||||
U8 *next_ptr = ptr + 2 + op->value.u64;
|
||||
Assert(next_ptr <= opl);
|
||||
|
||||
// rjf: fill
|
||||
ptr[0] = opcode;
|
||||
ptr[1] = (U8)op->u64;
|
||||
MemoryCopy(ptr+2, op->string.str, op->u64);
|
||||
ptr[1] = (U8)op->value.u64;
|
||||
MemoryCopy(ptr+2, op->string.str, op->value.u64);
|
||||
|
||||
// rjf: advance
|
||||
ptr = next_ptr;
|
||||
@@ -1415,7 +1442,7 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist)
|
||||
|
||||
// rjf: fill bytecode
|
||||
ptr[0] = opcode;
|
||||
MemoryCopy(ptr + 1, &op->u64, extra_byte_count);
|
||||
MemoryCopy(ptr + 1, &op->value.u64, extra_byte_count);
|
||||
|
||||
// rjf: advance
|
||||
ptr = next_ptr;
|
||||
|
||||
+3
-3
@@ -19,7 +19,7 @@ struct E_Op
|
||||
{
|
||||
E_Op *next;
|
||||
RDI_EvalOp opcode;
|
||||
U64 u64;
|
||||
E_Value value;
|
||||
String8 string;
|
||||
};
|
||||
|
||||
@@ -43,7 +43,7 @@ struct E_IRNode
|
||||
E_IRNode *next;
|
||||
RDI_EvalOp op;
|
||||
String8 string;
|
||||
U64 u64;
|
||||
E_Value value;
|
||||
};
|
||||
|
||||
typedef struct E_IRTreeAndType E_IRTreeAndType;
|
||||
@@ -87,7 +87,7 @@ internal void e_select_ir_ctx(E_IRCtx *ctx);
|
||||
//~ rjf: IR-ization Functions
|
||||
|
||||
//- rjf: op list functions
|
||||
internal void e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, U64 p);
|
||||
internal void e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, E_Value value);
|
||||
internal void e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x);
|
||||
internal void e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x);
|
||||
internal void e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode);
|
||||
|
||||
+13
-13
@@ -1257,7 +1257,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
REGS_AliasCode alias_code = 0;
|
||||
E_TypeKey type_key = zero_struct;
|
||||
String8 local_lookup_string = token_string;
|
||||
E_Space space = E_Space_Null;
|
||||
E_Space space = {0};
|
||||
Architecture arch = Architecture_Null;
|
||||
|
||||
//- rjf: identifiers surrounded by ``s should have those `s stripped
|
||||
@@ -1430,7 +1430,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
U32 match_idx = matches[matches_count-1];
|
||||
RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, match_idx);
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, global_var->voff);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, e_value_u64(global_var->voff));
|
||||
loc_kind = RDI_LocationKind_AddrBytecodeStream;
|
||||
loc_bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = global_var->type_idx;
|
||||
@@ -1470,7 +1470,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
U32 match_idx = matches[0];
|
||||
RDI_ThreadVariable *thread_var = rdi_element_from_name_idx(rdi, ThreadVariables, match_idx);
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, thread_var->tls_off);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(thread_var->tls_off));
|
||||
loc_kind = RDI_LocationKind_AddrBytecodeStream;
|
||||
loc_bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = thread_var->type_idx;
|
||||
@@ -1512,7 +1512,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx);
|
||||
U64 voff = *rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_first);
|
||||
E_OpList oplist = {0};
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, voff);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, e_value_u64(voff));
|
||||
loc_kind = RDI_LocationKind_ValBytecodeStream;
|
||||
loc_bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
U32 type_idx = procedure->type_idx;
|
||||
@@ -1534,7 +1534,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
{
|
||||
mapped_identifier = 1;
|
||||
identifier_looks_like_type_expr = 1;
|
||||
space = E_Space_Null;
|
||||
MemoryZeroStruct(&space);
|
||||
arch = e_parse_ctx->primary_module->arch;
|
||||
}
|
||||
}
|
||||
@@ -1611,9 +1611,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
E_OpList oplist = {0};
|
||||
U64 byte_size = bit_size_from_arch(arch)/8;
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc_reg_u16.offset));
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0));
|
||||
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
|
||||
atom->mode = E_Mode_Offset;
|
||||
atom->space = space;
|
||||
@@ -1626,10 +1626,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
E_OpList oplist = {0};
|
||||
U64 byte_size = bit_size_from_arch(arch)/8;
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, bit_size_from_arch(arch)/8);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc_reg_u16.offset));
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0));
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, e_value_u64(bit_size_from_arch(arch)/8));
|
||||
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
|
||||
atom->mode = E_Mode_Offset;
|
||||
atom->space = space;
|
||||
@@ -1645,7 +1645,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
U64 byte_size = (U64)reg_rng.byte_size;
|
||||
U64 byte_pos = 0;
|
||||
U64 regread_param = RDI_EncodeRegReadParam(loc_reg.reg_code, byte_size, byte_pos);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param);
|
||||
e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));
|
||||
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
|
||||
atom->mode = E_Mode_Value;
|
||||
atom->space = space;
|
||||
|
||||
Reference in New Issue
Block a user