diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index d60dc325..766fd90f 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -58,7 +58,7 @@ sizeof(RDI_NameMapNode), sizeof(RDI_U8), }; -RDI_U16 rdi_eval_op_ctrlbits_table[53] = +RDI_U16 rdi_eval_op_ctrlbits_table[54] = { RDI_EVAL_CTRLBITS(0, 0, 0), RDI_EVAL_CTRLBITS(0, 0, 0), @@ -112,6 +112,7 @@ RDI_EVAL_CTRLBITS(4, 0, 0), RDI_EVAL_CTRLBITS(4, 0, 0), RDI_EVAL_CTRLBITS(8, 0, 0), RDI_EVAL_CTRLBITS(0, 2, 2), +RDI_EVAL_CTRLBITS(0, 0, 1), RDI_EVAL_CTRLBITS(0, 0, 0), }; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index f4160b8b..fd680a04 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -531,7 +531,8 @@ RDI_EvalOp_CallSiteValue = 48, RDI_EvalOp_PartialValue = 49, RDI_EvalOp_PartialValueBit = 50, RDI_EvalOp_Swap = 51, -RDI_EvalOp_COUNT = 52, +RDI_EvalOp_PushCfa = 52, +RDI_EvalOp_COUNT = 53, } RDI_EvalOpEnum; typedef RDI_U8 RDI_EvalTypeGroup; @@ -1136,6 +1137,7 @@ X(CallSiteValue)\ X(PartialValue)\ X(PartialValueBit)\ X(Swap)\ +X(PushCfa)\ #define RDI_EvalTypeGroup_XList \ X(Other)\ @@ -1638,6 +1640,6 @@ RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTyp RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); extern RDI_U16 rdi_section_element_size_table[44]; -extern RDI_U16 rdi_eval_op_ctrlbits_table[53]; +extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; #endif // RDI_H diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 6d90e855..3e73f1ac 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1358,7 +1358,8 @@ RDI_EvalOpTable: {PartialValue 49 4 0 0} {PartialValueBit 50 8 0 0} {Swap 51 0 2 2} // swaps the top two entries on the stack - {COUNT 52 0 0 0} + {PushCfa 52 0 0 1} // push canonical frame address on the stack + {COUNT 53 0 0 0} } // NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 0c01d6be..0d7f5d6e 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1261,7 +1261,7 @@ d2r_bytecode_from_expression(Arena *arena, } } break; case DW_ExprOp_CallFrameCfa: { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_FrameOff, 0); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PushCfa, 0); d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); } break; case DW_ExprOp_PushObjectAddress: {