mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-10-06 16:05:42 +00:00
d2r2: .debug_loclists parsing, DWARF expression -> RDI location info; first pass at baking frame base into var locations to match simpler PDB behavior; fixes to high-pc address evaluation (based on form kind)
This commit is contained in:
@@ -684,17 +684,17 @@ e_oplist_from_location(Arena *arena, RDI_Parsed *rdi, RDI_Location loc)
|
||||
}break;
|
||||
|
||||
//- rjf: reg + off
|
||||
case RDI_LocationKind_AddrRegPlusU16: goto reg_plus_off;
|
||||
case RDI_LocationKind_AddrAddrRegPlusU16: need_extra_memread = 1; goto reg_plus_off;
|
||||
case RDI_LocationKind_AddrRegPlusOff: goto reg_plus_off;
|
||||
case RDI_LocationKind_AddrAddrRegPlusOff: need_extra_memread = 1; goto reg_plus_off;
|
||||
reg_plus_off:;
|
||||
{
|
||||
RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);
|
||||
Arch arch = arch_from_rdi_arch(tli->arch);
|
||||
U64 arch_addr_bytesize = byte_size_from_arch(arch);
|
||||
RDI_RegCode regcode = rdi_regcode_from_location(loc);
|
||||
U64 reg_off = rdi_regoff_from_location(loc);
|
||||
S64 reg_off = rdi_regoff_from_location(loc);
|
||||
e_oplist_push_op(arena, &result, RDI_EvalOp_RegRead, e_value_u64(RDI_EncodeRegReadParam(regcode, arch_addr_bytesize, 0)));
|
||||
e_oplist_push_uconst(arena, &result, reg_off);
|
||||
e_oplist_push_sconst(arena, &result, reg_off);
|
||||
e_oplist_push_op(arena, &result, RDI_EvalOp_Add, e_value_u64(0));
|
||||
if(need_extra_memread)
|
||||
{
|
||||
|
||||
+10
-21
@@ -936,31 +936,20 @@ e_interpret(String8 bytecode)
|
||||
}
|
||||
}break;
|
||||
|
||||
case RDI_EvalOp_CallSiteValue:
|
||||
{
|
||||
NotImplemented;
|
||||
}break;
|
||||
|
||||
case RDI_EvalOp_PartialValue:
|
||||
{
|
||||
NotImplemented;
|
||||
}break;
|
||||
|
||||
case RDI_EvalOp_PartialValueBit:
|
||||
{
|
||||
NotImplemented;
|
||||
}break;
|
||||
|
||||
case RDI_EvalOp_Swap:
|
||||
{
|
||||
// TODO: add support for pushing multiple values onto the stack
|
||||
NotImplemented;
|
||||
}break;
|
||||
|
||||
case RDI_EvalOp_PushCfa:
|
||||
{
|
||||
nval.u64 = e_interpret_ctx->cfa;
|
||||
}break;
|
||||
|
||||
case RDI_EvalOp_CallSiteValue:
|
||||
case RDI_EvalOp_PartialValue:
|
||||
case RDI_EvalOp_PartialValueBit:
|
||||
case RDI_EvalOp_Swap:
|
||||
{
|
||||
// TODO(rjf)
|
||||
result.code = E_InterpretationCode_BadOp;
|
||||
goto done;
|
||||
}break;
|
||||
}
|
||||
|
||||
// rjf: push
|
||||
|
||||
+2
-2
@@ -2108,8 +2108,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
|
||||
mapped_bytecode_mode = E_Mode_Value;
|
||||
}break;
|
||||
case RDI_LocationKind_AddrBytecodeStream:
|
||||
case RDI_LocationKind_AddrRegPlusU16:
|
||||
case RDI_LocationKind_AddrAddrRegPlusU16:
|
||||
case RDI_LocationKind_AddrRegPlusOff:
|
||||
case RDI_LocationKind_AddrAddrRegPlusOff:
|
||||
{
|
||||
mapped_bytecode_mode = E_Mode_Offset;
|
||||
}break;
|
||||
|
||||
Reference in New Issue
Block a user