return (LIBGOBLIN_DWARF_STATUS_ERROR | 0x02);
}
+ if( 0 == p_exp->b_dwsize ) { p_exp->b_dwsize = 8; }
+
// ------------------------
if( NULL != p_exp->resume.pb_resume ) {
// XXX Position Check!!
break;
case DW_OP_const1u: // 0x08
+ if( 1 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
qw_value = (QWord)*pb_now++;
qw_remain--;
PUSH_DWARF( p_exp, qw_value );
break;
case DW_OP_const1s: // 0x09
+ if( 1 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
ii_value = (Int64)*((char *)pb_now);
pb_now++;
qw_remain--;
PUSH_DWARF_SIGN( p_exp, ii_value );
break;
case DW_OP_const2u: // 0x0a
+ if( 2 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
qw_value = (QWord)*((Word *)pb_now);
pb_now += 2;
qw_remain -= 2;
PUSH_DWARF( p_exp, qw_value );
break;
case DW_OP_const2s: // 0x0b
+ if( 2 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
ii_value = (Int64)*((short *)pb_now);
pb_now += 2;
qw_remain -= 2;
PUSH_DWARF_SIGN( p_exp, ii_value );
break;
case DW_OP_const4u: // 0x0c
+ if( 4 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
qw_value = (QWord)*((DWord *)pb_now);
pb_now += 4;
qw_remain -= 4;
PUSH_DWARF( p_exp, qw_value );
break;
case DW_OP_const4s: // 0x0d
+ if( 4 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
ii_value = (Int64)*((int *)pb_now);
pb_now += 4;
qw_remain -= 4;
PUSH_DWARF_SIGN( p_exp, ii_value );
break;
case DW_OP_const8u: // 0x0e
+ if( 8 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
qw_value = (QWord)*((QWord *)pb_now);
pb_now += 8;
qw_remain -= 8;
PUSH_DWARF( p_exp, qw_value );
break;
case DW_OP_const8s: // 0x0f
+ if( 8 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
ii_value = (Int64)*((Int64 *)pb_now);
pb_now += 8;
qw_remain -= 8;
qw_pop[0] = POP_DWARF( p_exp );
break;
case DW_OP_pick: // 0x15
+ if( 1 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
b_value = *pb_now++;
qw_remain--;
case DW_OP_deref_size: // 0x94
if( 0 == p_exp->dw_depth )
{ goto goto_DWARF_Expression_Evaluate_post; }
+ if( 1 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
qw_pop[0] = POP_DWARF( p_exp );
b_value = *pb_now++;
else { PUSH_DWARF( p_exp, 0x00 ); }
break;
case DW_OP_skip: // 0x2f
+ if( 2 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
s_value = *((short *)pb_now);
pb_now += 2;
qw_remain -= 2;
}
break;
case DW_OP_bra: // 0x28
+ if( 2 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
qw_temp = POP_DWARF( p_exp );
s_value = *((short *)pb_now);
break;
case DW_OP_call2: // 0x98
+ if( 2 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
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
+ if( 4 > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
dw_value = *((DWord *)pb_now);
pb_now += 4;
qw_remain -= 4;
goto goto_DWARF_Expression_Evaluate_post;
break; // NOT reach.
case DW_OP_call_ref: // 0x9a
- break;
+ if( p_exp->b_dwsize > qw_remain )
+ { goto goto_DWARF_Expression_Evaluate_post; }
+ if( 8 == p_exp->b_dwsize ) { qw_value = *((QWord *)pb_now); }
+ else { qw_value = (QWord)(*((DWord *)pb_now)); }
+ pb_now += p_exp->b_dwsize;
+ qw_remain -= p_exp->b_dwsize;
+
+ p_exp->qw_calloffset = qw_value;
+ p_exp->caller[ p_exp->b_callers ].pb_return = pb_now;
+ p_exp->caller[ p_exp->b_callers ].qw_retremain = qw_remain;
+ p_exp->b_callers++;
+ p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_CALLING;
+
+ goto goto_DWARF_Expression_Evaluate_post;
+ break; // NOT reach.
// Special Operation ----
case DW_OP_nop: // 0x96
+ // NONE operation .
break;
case DW_OP_reg0: // 0x50
// DW_OP_call_ref: // 0x9a
-
-
-/*
- b_data[0] = DW_OP_fbreg;
- b_data[1] = 0x81;
- b_data[2] = 0x01; // value = 129 (0x81 0x01)
- DWARF_Expression_ClearValue( p_exp );
- dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+ 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_call_ref;
+ b_data1[5] = 0xef;
+ b_data1[6] = 0xcd;
+ b_data1[7] = 0xab;
+ b_data1[8] = 0x90;
+ b_data1[9] = 0x78;
+ b_data1[10] = 0x56;
+ b_data1[11] = 0x34;
+ b_data1[12] = 0x12;
+ b_data1[13] = DW_OP_deref;
+ DWARF_Expression_ClearValue( p_exp );
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 14 );
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_data, 3 );
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 14 );
Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
- LIBGOBLIN_DWARF_STATUS_EVALUATED,
- LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_FRAME_BASE );
- CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) );
- CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == (0x80000000 + 129) );
- CU_ASSERT( p_exp->dw_depth == 1 );
+ 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 == 0x1234567890abcdef );
+ CU_ASSERT( p_exp->b_callers == 1 );
+ CU_ASSERT( p_exp->caller[ 0 ].pb_return == b_data1 + 13 );
+ CU_ASSERT( p_exp->caller[ 0 ].qw_retremain == 1 );
- b_data[0] = DW_OP_fbreg;
- b_data[1] = 0xff;
- b_data[2] = 0x7e; // value = -129 (0xff 0x7e)
- DWARF_Expression_ClearValue( p_exp );
- 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_data, 3 );
+ 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_EVALUATED,
- LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_FRAME_BASE );
- CU_ASSERT( p_exp->result.qw_value == (0x80000000 - 129) );
- CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == (0x80000000 - 129) );
- CU_ASSERT( p_exp->dw_depth == 1 );
-*/
+ 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 + 13 );
+ CU_ASSERT( p_exp->caller[ 0 ].qw_retremain == 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 );
+
+
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data1, 14 );
+ 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 + 13 );
+ 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, 14 );
+ 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 );
i_result = DWARF_Expression_Free( p_exp );