p_exp->dw_requested = LIBGOBLIN_DWARF_REQUEST_NONE;
p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_ERROR;
p_exp->dw_depth = 0;
+ if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_setdata )
+ { p_exp->dw_reqsize = 0; }
memset( &((p_exp)->t_stack), 0x00,
sizeof( LibGoblin_DWARF_Expression_Stack ) * LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH );
= p_exp->t_stack[p_exp->dw_depth - 3].value.qw_value;
p_exp->t_stack[p_exp->dw_depth - 3].value.qw_value = qw_value;
break;
-
case DW_OP_deref: // 0x06
+ // Required TEST!!
+ if( 0 == p_exp->dw_depth )
+ { goto goto_DWARF_Expression_Evaluate_post; }
+
+ if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_DEREF ) {
+ qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_DEREF ];
+ PUSH_DWARF( p_exp, qw_value );
+ }
+ else {
+ p_exp->ptr_reference.value = (PtrValue)POP_DWARF( p_exp );
+ p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_DEREF;
+ }
break;
case DW_OP_deref_size: // 0x94
+ // Required TEST!!
+ if( 0 == p_exp->dw_depth )
+ { goto goto_DWARF_Expression_Evaluate_post; }
+
+ b_value = *pb_now++;
+ qw_remain--;
+
+ if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_DEREF ) {
+ qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_DEREF ];
+ PUSH_DWARF( p_exp, qw_value );
+ }
+ else {
+ p_exp->dw_reqsize = (DWord)b_value;
+ p_exp->ptr_reference.value = (PtrValue)POP_DWARF( p_exp );
+ p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_DEREF;
+ }
break;
case DW_OP_xderef: // 0x18
+ // Required TEST!!
+ if( 2 > p_exp->dw_depth )
+ { goto goto_DWARF_Expression_Evaluate_post; }
+
+ if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_XDEREF ) {
+ qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_XDEREF ];
+ PUSH_DWARF( p_exp, qw_value );
+ }
+ else {
+ p_exp->ptr_reference.value = (PtrValue)POP_DWARF( p_exp );
+ p_exp->qw_ident_addrspace = POP_DWARF( p_exp );
+ p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_XDEREF;
+ }
break;
case DW_OP_xderef_size: // 0x95
+ // Required TEST!!
+ if( 2 > p_exp->dw_depth )
+ { goto goto_DWARF_Expression_Evaluate_post; }
+
+ b_value = *pb_now++;
+ qw_remain--;
+
+ if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_XDEREF ) {
+ qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_XDEREF ];
+ PUSH_DWARF( p_exp, qw_value );
+ }
+ else {
+ p_exp->dw_reqsize = (DWord)b_value;
+ p_exp->ptr_reference.value = (PtrValue)POP_DWARF( p_exp );
+ p_exp->qw_ident_addrspace = POP_DWARF( p_exp );
+ p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_XDEREF;
+ }
break;
case DW_OP_push_object_address: // 0x97
break;
// 2019/09/03 Lunch-Coding (Required TEST!!)
if( 0 == p_exp->dw_depth )
{ goto goto_DWARF_Expression_Evaluate_post; }
- if( LIBGOBLIN_DWARF_STACK_SIGN == p_exp->t_stack[p_exp->dw_depth].b_flag ) {
+ if( LIBGOBLIN_DWARF_STACK_SIGN == p_exp->t_stack[p_exp->dw_depth].b_flag ) {
ii_value = POP_DWARF_SIGN( p_exp );
if( 0 > ii_value ) { ii_value *= -1; }
PUSH_DWARF_SIGN( p_exp, ii_value );
}while( 0 < qw_remain );
- if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_requested )
- { p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_REQUESTED; }
+ if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_requested ) {
+ if( 0 == p_exp->dw_reqsize ) {
+ if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_ADDRSIZE )
+ { p_exp->dw_reqsize = (DWord)p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ]; }
+ else { p_exp->dw_reqsize = 8; }
+ }
+ p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_REQUESTED;
+ }
else if( 0 < p_exp->dw_depth ) {
p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_EVALUATED;
p_exp->result.qw_value = p_exp->t_stack[ p_exp->dw_depth - 1 ].value.qw_value;
#define LIBGOBLIN_DWARF_REQUEST_REG 0x00000100
#define LIBGOBLIN_DWARF_REQUEST_ADDRSIZE 0x00000200
#define LIBGOBLIN_DWARF_REQUEST_FRAME_BASE 0x00000400
+#define LIBGOBLIN_DWARF_REQUEST_DEREF 0x00000800
+#define LIBGOBLIN_DWARF_REQUEST_XDEREF 0x00001000
#define LIBGOBLIN_DWARF_REQDATA_MAX 0x40
#define LIBGOBLIN_DWARF_DATAID_REG 0x0000001f // 0x00 - 0x1f
#define LIBGOBLIN_DWARF_DATAID_ADDRSIZE 0x00000020
#define LIBGOBLIN_DWARF_DATAID_FRAME_BASE 0x00000021
+#define LIBGOBLIN_DWARF_DATAID_DEREF 0x00000022
+#define LIBGOBLIN_DWARF_DATAID_XDEREF 0x00000023
/*=====================================================================*/
Int64 ii_value;
} result;
+ DWord dw_reqsize;
+ Ptr ptr_reference;
+ QWord qw_ident_addrspace;
QWord qw_reqdata[LIBGOBLIN_DWARF_REQDATA_MAX];
DWord dw_depth;