QWord qw_remain;
QWord qw_value;
QWord qw_temp;
+ QWord qw_pop[4];
Int64 ii_value;
Int64 ii_temp;
else {
pb_now = pb_data;
qw_remain = (QWord)dw_size;
- p_exp->dw_depth = 0;
- memset( &((p_exp)->t_stack), 0x00,
- sizeof( LibGoblin_DWARF_Expression_Stack ) * LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH );
+
+ if( 0 == p_exp->b_callers ) {
+ p_exp->dw_depth = 0;
+ memset( &((p_exp)->t_stack), 0x00,
+ sizeof( LibGoblin_DWARF_Expression_Stack ) * LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH );
+ }
}
qw_value = 0x00000000;
p_exp->result.qw_value = 0x00000000;
case DW_OP_drop: // 0x13
if( 0 == p_exp->dw_depth )
{ goto goto_DWARF_Expression_Evaluate_post; }
- qw_value = POP_DWARF( p_exp );
+ qw_pop[0] = POP_DWARF( p_exp );
break;
case DW_OP_pick: // 0x15
b_value = *pb_now++;
case DW_OP_deref: // 0x06
if( 0 == p_exp->dw_depth )
{ goto goto_DWARF_Expression_Evaluate_post; }
+ qw_pop[0] = POP_DWARF( p_exp );
if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_DEREF ) {
qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_DEREF ];
p_exp->dw_setdata &= (~LIBGOBLIN_DWARF_REQUEST_DEREF);
}
else {
- p_exp->ptr_reference.value = (PtrValue)POP_DWARF( p_exp );
+ p_exp->ptr_reference.value = (PtrValue)qw_pop[0];
p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_DEREF;
qw_remain = 0; // for Loop-Break
}
case DW_OP_deref_size: // 0x94
if( 0 == p_exp->dw_depth )
{ goto goto_DWARF_Expression_Evaluate_post; }
+ qw_pop[0] = POP_DWARF( p_exp );
b_value = *pb_now++;
qw_remain--;
}
else {
p_exp->dw_reqsize = (DWord)b_value;
- p_exp->ptr_reference.value = (PtrValue)POP_DWARF( p_exp );
+ p_exp->ptr_reference.value = (PtrValue)qw_pop[0];
p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_DEREF;
qw_remain = 0; // for Loop-Break
}
case DW_OP_xderef: // 0x18
if( 2 > p_exp->dw_depth )
{ goto goto_DWARF_Expression_Evaluate_post; }
+ qw_pop[0] = POP_DWARF( p_exp );
+ qw_pop[1] = POP_DWARF( p_exp );
if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_XDEREF ) {
qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_XDEREF ];
p_exp->dw_setdata &= (~LIBGOBLIN_DWARF_REQUEST_XDEREF);
}
else {
- p_exp->ptr_reference.value = (PtrValue)POP_DWARF( p_exp );
- p_exp->qw_ident_addrspace = POP_DWARF( p_exp );
+ p_exp->ptr_reference.value = (PtrValue)qw_pop[0];
+ p_exp->qw_ident_addrspace = qw_pop[1];
p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_XDEREF;
qw_remain = 0; // for Loop-Break
}
case DW_OP_xderef_size: // 0x95
if( 2 > p_exp->dw_depth )
{ goto goto_DWARF_Expression_Evaluate_post; }
+ qw_pop[0] = POP_DWARF( p_exp );
+ qw_pop[1] = POP_DWARF( p_exp );
b_value = *pb_now++;
qw_remain--;
}
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->ptr_reference.value = (PtrValue)qw_pop[0];
+ p_exp->qw_ident_addrspace = qw_pop[1];
p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_XDEREF;
qw_remain = 0; // for Loop-Break
}
case DW_OP_form_tls_address: // 0x9b
if( 1 > p_exp->dw_depth )
{ goto goto_DWARF_Expression_Evaluate_post; }
+ qw_pop[0] = POP_DWARF( p_exp );
if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_TLSADDR ) {
qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_TLSADDR ];
p_exp->dw_setdata &= (~LIBGOBLIN_DWARF_REQUEST_TLSADDR);
}
else {
- p_exp->ptr_tlsbase.value = (PtrValue)POP_DWARF( p_exp );
+ p_exp->ptr_tlsbase.value = (PtrValue)qw_pop[0];
p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_TLSADDR;
qw_remain = 0; // for Loop-Break
}
case DW_OP_abs: // 0x19
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 - 1].b_flag ) {
- ii_value = POP_DWARF_SIGN( p_exp );
+ ii_value = POP_DWARF_SIGN( p_exp );
+
+ if( LIBGOBLIN_DWARF_STACK_SIGN == p_exp->t_stack[p_exp->dw_depth].b_flag ) {
if( 0 > ii_value ) { ii_value *= -1; }
PUSH_DWARF_SIGN( p_exp, ii_value );
}
break;
case DW_OP_call2: // 0x98
- // 2019/09/10 (Required TEST!!)
w_value = *((Word *)pb_now);
pb_now += 2;
qw_remain -= 2;
goto goto_DWARF_Expression_Evaluate_post;
break; // NOT reach.
case DW_OP_call4: // 0x99
- // 2019/09/10 (Required TEST!!)
dw_value = *((DWord *)pb_now);
pb_now += 4;
qw_remain -= 4;
LIBGOBLIN_DWARF_STATUS_EVALUATED,
LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->result.qw_value == 0xabcdef );
- CU_ASSERT( 2 == p_exp->dw_depth );
+ CU_ASSERT( 1 == p_exp->dw_depth );
// DW_OP_deref_size -------------
b_data[0] = DW_OP_deref_size;
LIBGOBLIN_DWARF_STATUS_EVALUATED,
LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->result.qw_value == 0xabcd );
- CU_ASSERT( 2 == p_exp->dw_depth );
+ CU_ASSERT( 1 == p_exp->dw_depth );
// DW_OP_xderef -----------------
b_data[0] = DW_OP_xderef;
LIBGOBLIN_DWARF_STATUS_EVALUATED,
LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->result.qw_value == 0xabcdef );
- CU_ASSERT( 3 == p_exp->dw_depth );
+ CU_ASSERT( 1 == p_exp->dw_depth );
// DW_OP_xderef_size ------------
b_data[0] = DW_OP_xderef_size;
LIBGOBLIN_DWARF_STATUS_EVALUATED,
LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->result.qw_value == 0xabcd );
- CU_ASSERT( 3 == p_exp->dw_depth );
+ CU_ASSERT( 1 == p_exp->dw_depth );
// DW_OP_push_object_address ----
b_data[0] = DW_OP_push_object_address;
LIBGOBLIN_DWARF_STATUS_EVALUATED,
LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->result.qw_value == 0xabcdef );
- CU_ASSERT( 2 == p_exp->dw_depth );
+ CU_ASSERT( 1 == p_exp->dw_depth );
// DW_OP_call_frame_cfa ---------
b_data[0] = DW_OP_call_frame_cfa;
b_data1[4] = DW_OP_call2;
b_data1[5] = 0x81;
b_data1[6] = 0x01; // value = 129 (0x81 0x01)
- b_data2[7] = DW_OP_deref;
+ b_data1[7] = DW_OP_deref;
DWARF_Expression_ClearValue( p_exp );
dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 8 );
Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
LIBGOBLIN_DWARF_STATUS_REQUESTED,
LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
+ CU_ASSERT( p_exp->dw_depth == 1 );
p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_FRAME_BASE ] = 0x80000000;
p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_FRAME_BASE;
LIBGOBLIN_DWARF_STATUS_CALLING,
LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->result.qw_value == 0x00 );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
CU_ASSERT( p_exp->dw_depth == 2 );
LIBGOBLIN_DWARF_REQUEST_XDEREF, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->ptr_reference.value == 0x1234567890abcdef );
CU_ASSERT( p_exp->dw_reqsize == 2 );
- CU_ASSERT( 3 == p_exp->dw_depth );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
+ CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+ CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 7 );
+ CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 24 );
+ CU_ASSERT( p_exp->t_stack[ 4 ].value.qw_value == 0x1234567890abcdef );
+ CU_ASSERT( 5 == p_exp->dw_depth );
CU_ASSERT( p_exp->resume.pb_resume == b_data2 + 11 );
CU_ASSERT( p_exp->resume.qw_remain == 2 );
LIBGOBLIN_DWARF_STATUS_RETCALL,
LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->result.qw_value == 0x00 );
- CU_ASSERT( 4 == p_exp->dw_depth );
CU_ASSERT( p_exp->b_callers == 1 );
CU_ASSERT( p_exp->caller[ 0 ].pb_return == b_data1 + 7 );
CU_ASSERT( p_exp->caller[ 0 ].qw_retremain == 1 );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
+ CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+ CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 7 );
+ CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcd );
+ CU_ASSERT( 4 == p_exp->dw_depth );
-/* XXX
dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 8 );
Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
LIBGOBLIN_DWARF_STATUS_REQUESTED,
LIBGOBLIN_DWARF_REQUEST_DEREF, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->b_callers == 0 );
-
CU_ASSERT( p_exp->resume.pb_resume == b_data1 + 7 );
CU_ASSERT( p_exp->resume.qw_remain == 1 );
-*/
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
+ CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+ CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 7 );
+ CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcd );
+ CU_ASSERT( 4 == p_exp->dw_depth );
-/*
+
+ p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_DEREF ] = 0xabcdef0123456789;
+ p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_DEREF;
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 8 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_EVALUATED,
+ LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+ CU_ASSERT( p_exp->result.qw_value == 0xabcdef0123456789 );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
+ CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+ CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 7 );
+ CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcdef0123456789 );
+ CU_ASSERT( 4 == p_exp->dw_depth );
+
+
+ // DW_OP_call4: // 0x99
+ b_data1[0] = DW_OP_lit25;
+ b_data1[1] = DW_OP_fbreg;
+ b_data1[2] = 0x81;
+ b_data1[3] = 0x01; // value = 129 (0x81 0x01)
+ b_data1[4] = DW_OP_call4;
+ b_data1[5] = 0x78;
+ b_data1[6] = 0x56;
+ b_data1[7] = 0x34;
+ b_data1[8] = 0x12;
+ b_data1[9] = DW_OP_deref;
+ DWARF_Expression_ClearValue( p_exp );
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 10 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_REQUESTED,
+ LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+ CU_ASSERT( p_exp->dw_depth == 1 );
+
+ p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_FRAME_BASE ] = 0x80000000;
+ p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_FRAME_BASE;
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 10 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_CALLING,
+ LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
CU_ASSERT( p_exp->result.qw_value == 0x00 );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
CU_ASSERT( p_exp->dw_depth == 2 );
+ CU_ASSERT( p_exp->qw_calloffset == 0x12345678 );
+ CU_ASSERT( p_exp->b_callers == 1 );
+ CU_ASSERT( p_exp->caller[ 0 ].pb_return == b_data1 + 9 );
+ CU_ASSERT( p_exp->caller[ 0 ].qw_retremain == 1 );
- CU_ASSERT( p_exp->qw_calloffset == 0x181 );
+
+ b_data2[0] = DW_OP_lit26;
+ b_data2[1] = DW_OP_lit27;
+ b_data2[2] = DW_OP_const8u;
+ b_data2[3] = 0xef;
+ b_data2[4] = 0xcd;
+ b_data2[5] = 0xab;
+ b_data2[6] = 0x90;
+ b_data2[7] = 0x78;
+ b_data2[8] = 0x56;
+ b_data2[9] = 0x34;
+ b_data2[10] = 0x12;
+ b_data2[11] = DW_OP_xderef_size;
+ b_data2[12] = 2;
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data2, 13 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_REQUESTED,
+ LIBGOBLIN_DWARF_REQUEST_XDEREF, LIBGOBLIN_DWARF_REQUEST_NONE );
+ CU_ASSERT( p_exp->ptr_reference.value == 0x1234567890abcdef );
+ CU_ASSERT( p_exp->dw_reqsize == 2 );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+ CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+ CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 26 );
+ CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 27 );
+ CU_ASSERT( p_exp->t_stack[ 4 ].value.qw_value == 0x1234567890abcdef );
+ CU_ASSERT( 5 == p_exp->dw_depth );
+
+ CU_ASSERT( p_exp->resume.pb_resume == b_data2 + 11 );
+ CU_ASSERT( p_exp->resume.qw_remain == 2 );
+
+
+ p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_XDEREF ] = 0xabcd;
+ p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_XDEREF;
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data2, 13 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_RETCALL,
+ LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+ CU_ASSERT( p_exp->result.qw_value == 0x00 );
CU_ASSERT( p_exp->b_callers == 1 );
- CU_ASSERT( p_exp->caller[ 0 ].pb_return == b_data1 + 7 );
+ CU_ASSERT( p_exp->caller[ 0 ].pb_return == b_data1 + 9 );
CU_ASSERT( p_exp->caller[ 0 ].qw_retremain == 1 );
-*/
- // DW_OP_call4: // 0x99
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+ CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+ CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 26 );
+ CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcd );
+ CU_ASSERT( 4 == p_exp->dw_depth );
+
+
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 10 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_REQUESTED,
+ LIBGOBLIN_DWARF_REQUEST_DEREF, LIBGOBLIN_DWARF_REQUEST_NONE );
+ CU_ASSERT( p_exp->b_callers == 0 );
+ CU_ASSERT( p_exp->resume.pb_resume == b_data1 + 9 );
+ CU_ASSERT( p_exp->resume.qw_remain == 1 );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+ CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+ CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 26 );
+ CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcd );
+ CU_ASSERT( 4 == p_exp->dw_depth );
+
+
+ p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_DEREF ] = 0xabcdef0123456789;
+ p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_DEREF;
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 10 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_EVALUATED,
+ LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+ CU_ASSERT( p_exp->b_callers == 0 );
+ CU_ASSERT( p_exp->result.qw_value == 0xabcdef0123456789 );
+ CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+ CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+ CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 26 );
+ CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcdef0123456789 );
+ CU_ASSERT( 4 == p_exp->dw_depth );
+
+
// DW_OP_call_ref: // 0x9a