eval, local variable resolution -> do not assume offset evaluations. infer evaluation mode from location info

This commit is contained in:
Ryan Fleury
2026-07-27 14:47:40 -07:00
parent 7fbea68613
commit 0c434583bc
5 changed files with 60 additions and 34 deletions
+5
View File
@@ -68,3 +68,8 @@ target:
executable: "build/ryan_scratch.exe" executable: "build/ryan_scratch.exe"
working_directory: build working_directory: build
} }
target:
{
executable: "../../Program Files/SuperTux/bin/supertux2.exe"
working_directory: "../../Program Files/SuperTux/bin/"
}
+32 -18
View File
@@ -1025,63 +1025,77 @@ internal U64
cv_name_offset_from_symbol(CV_SymKind kind, String8 data) cv_name_offset_from_symbol(CV_SymKind kind, String8 data)
{ {
U64 offset = data.size; U64 offset = data.size;
switch (kind) { switch(kind)
case CV_SymKind_COMPILE: break; {
case CV_SymKind_OBJNAME: break; case CV_SymKind_COMPILE:{}break;
case CV_SymKind_THUNK32: { case CV_SymKind_OBJNAME:{}break;
case CV_SymKind_THUNK32:
{
offset = sizeof(CV_SymThunk32); offset = sizeof(CV_SymThunk32);
}break; }break;
case CV_SymKind_LABEL32: { case CV_SymKind_LABEL32:
{
offset = sizeof(CV_SymLabel32); offset = sizeof(CV_SymLabel32);
}break; }break;
case CV_SymKind_REGISTER: { case CV_SymKind_REGISTER:
{
offset = sizeof(CV_SymRegister); offset = sizeof(CV_SymRegister);
}break; }break;
case CV_SymKind_CONSTANT: { case CV_SymKind_CONSTANT:
{
offset = sizeof(CV_SymConstant); offset = sizeof(CV_SymConstant);
CV_NumericParsed size; CV_NumericParsed size;
offset += cv_read_numeric(data, offset, &size); offset += cv_read_numeric(data, offset, &size);
}break; }break;
case CV_SymKind_UDT: { case CV_SymKind_UDT:
{
offset = sizeof(CV_SymUDT); offset = sizeof(CV_SymUDT);
}break; }break;
case CV_SymKind_BPREL32: { case CV_SymKind_BPREL32:
{
offset = sizeof(CV_SymBPRel32); offset = sizeof(CV_SymBPRel32);
}break; }break;
case CV_SymKind_LDATA32: case CV_SymKind_LDATA32:
case CV_SymKind_GDATA32: { case CV_SymKind_GDATA32:
{
offset = sizeof(CV_SymData32); offset = sizeof(CV_SymData32);
}break; }break;
case CV_SymKind_PUB32: { case CV_SymKind_PUB32:
{
offset = sizeof(CV_SymPub32); offset = sizeof(CV_SymPub32);
}break; }break;
case CV_SymKind_LPROC32: case CV_SymKind_LPROC32:
case CV_SymKind_GPROC32: case CV_SymKind_GPROC32:
case CV_SymKind_LPROC32_ID: case CV_SymKind_LPROC32_ID:
case CV_SymKind_GPROC32_ID: { case CV_SymKind_GPROC32_ID:
{
offset = sizeof(CV_SymProc32); offset = sizeof(CV_SymProc32);
}break; }break;
case CV_SymKind_REGREL32: { case CV_SymKind_REGREL32:
{
offset = sizeof(CV_SymRegrel32); offset = sizeof(CV_SymRegrel32);
}break; }break;
case CV_SymKind_LTHREAD32: case CV_SymKind_LTHREAD32:
case CV_SymKind_GTHREAD32: { case CV_SymKind_GTHREAD32:
{
offset = sizeof(CV_SymData32); offset = sizeof(CV_SymData32);
}break; }break;
case CV_SymKind_COMPILE2: break; case CV_SymKind_COMPILE2: break;
case CV_SymKind_LOCALSLOT: { case CV_SymKind_LOCALSLOT:
{
offset = sizeof(CV_SymSlot); offset = sizeof(CV_SymSlot);
}break; }break;
case CV_SymKind_PROCREF: case CV_SymKind_PROCREF:
case CV_SymKind_LPROCREF: case CV_SymKind_LPROCREF:
case CV_SymKind_DATAREF: { case CV_SymKind_DATAREF:
{
offset = sizeof(CV_SymRef2); offset = sizeof(CV_SymRef2);
}break; }break;
case CV_SymKind_TRAMPOLINE: break; case CV_SymKind_TRAMPOLINE: break;
case CV_SymKind_LOCAL: { case CV_SymKind_LOCAL:
{
offset = sizeof(CV_SymLocal); offset = sizeof(CV_SymLocal);
}break; }break;
default: InvalidPath;
} }
return offset; return offset;
} }
+1 -2
View File
@@ -709,8 +709,7 @@ e_oplist_from_location(Arena *arena, RDI_Parsed *rdi, RDI_Location loc)
ARCH_RegCode reg_code = arch_reg_code_from_rdi(arch, rdi_regcode); ARCH_RegCode reg_code = arch_reg_code_from_rdi(arch, rdi_regcode);
Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code];
U64 byte_size = (U64)dim_1u16(reg_rng); U64 byte_size = (U64)dim_1u16(reg_rng);
U64 byte_pos = reg_rng.min; e_oplist_push_op(arena, &result, RDI_EvalOp_RegRead, e_value_u64(RDI_EncodeRegReadParam(rdi_regcode, byte_size, 0)));
e_oplist_push_op(arena, &result, RDI_EvalOp_RegRead, e_value_u64(RDI_EncodeRegReadParam(rdi_regcode, byte_size, byte_pos)));
}break; }break;
//- rjf: space offsets //- rjf: space offsets
+1
View File
@@ -1874,6 +1874,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
U64 ip_voff = e_base_ctx->thread_ip_voff; U64 ip_voff = e_base_ctx->thread_ip_voff;
{ {
mapped_location = rdi_location_from_location_voff(rdi, local->location, ip_voff); mapped_location = rdi_location_from_location_voff(rdi, local->location, ip_voff);
mapped_bytecode_mode = E_Mode_Null;
if(mapped_location != 0) if(mapped_location != 0)
{ {
got_location_block = 1; got_location_block = 1;
+7
View File
@@ -3983,6 +3983,7 @@ txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64
//- rjf: advance across many token candidates until we find the new line //- rjf: advance across many token candidates until we find the new line
if(line_advance) if(line_advance)
{ {
B32 found = 0;
U64 scan_cand_chunk_idx = cand_chunk_idx; U64 scan_cand_chunk_idx = cand_chunk_idx;
for(TokenEndpointCandidateChunkNode *n = cand_chunk_n; n != 0; n = n->next) for(TokenEndpointCandidateChunkNode *n = cand_chunk_n; n != 0; n = n->next)
{ {
@@ -3990,6 +3991,7 @@ txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64
{ {
if(n->v[n_idx] >= active_token_end_off) if(n->v[n_idx] >= active_token_end_off)
{ {
found = 1;
cand_chunk_n = n; cand_chunk_n = n;
cand_chunk_idx = n_idx; cand_chunk_idx = n_idx;
goto dbl_break_find_candidate_in_next_line; goto dbl_break_find_candidate_in_next_line;
@@ -3998,6 +4000,11 @@ txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64
scan_cand_chunk_idx = 0; scan_cand_chunk_idx = 0;
} }
dbl_break_find_candidate_in_next_line:; dbl_break_find_candidate_in_next_line:;
if(!found)
{
cand_chunk_n = 0;
cand_chunk_idx = 0;
}
} }
//- rjf: advance by token candidate //- rjf: advance by token candidate