}
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_ArithmeticLogical_test01_001( void )
+{
+ int i_result;
+ Byte b_data[16];
+ DWord dw_result;
+ LibGoblin_DWARF_Expression *p_exp;
+
+ i_result = DWARF_Expression_Init();
+ CU_ASSERT( 0x00 == i_result );
+
+ p_exp = DWARF_Expression_Alloc();
+ CU_ASSERT( NULL != p_exp );
+
+ // DW_OP_abs: // 0x19
+ // DW_OP_and: // 0x1a
+ // DW_OP_div: // 0x1b
+ // DW_OP_minus: // 0x1c
+ // DW_OP_mod: // 0x1d
+ // DW_OP_mul: // 0x1e
+ // DW_OP_neg: // 0x1f
+ // \9bjDW_OP_not: // 0x20
+ // DW_OP_or: // 0x21
+ // DW_OP_plus: // 0x22
+ // DW_OP_plus_uconst: // 0x23
+ // DW_OP_shl: // 0x24
+ // DW_OP_shr: // 0x25
+ // DW_OP_shra: // 0x26
+ // DW_OP_xor: // 0x27
+
+/*
+ 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 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_REQUESTED,
+ LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE );
+
+ 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 );
+ 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 );
+
+
+ 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 );
+ 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 );
+*/
+
+
+
+ i_result = DWARF_Expression_Free( p_exp );
+ CU_ASSERT( 0x00 == i_result );
+
+ i_result = DWARF_Expression_Term();
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_FlowControl_test01_001( void )
+{
+ int i_result;
+ Byte b_data[16];
+ DWord dw_result;
+ LibGoblin_DWARF_Expression *p_exp;
+
+ i_result = DWARF_Expression_Init();
+ CU_ASSERT( 0x00 == i_result );
+
+ p_exp = DWARF_Expression_Alloc();
+ CU_ASSERT( NULL != p_exp );
+
+ // DW_OP_eq: // 0x29
+ // DW_OP_ge: // 0x2a
+ // DW_OP_gt: // 0x2b
+ // DW_OP_le: // 0x2c
+ // DW_OP_lt: // 0x2d
+ // DW_OP_ne: // 0x2e
+ // DW_OP_skip: // 0x2f
+ // DW_OP_bra: // 0x28
+
+/*
+ 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 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_REQUESTED,
+ LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE );
+
+ 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 );
+ 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 );
+
+
+ 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 );
+ 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 );
+*/
+
+
+
+ i_result = DWARF_Expression_Free( p_exp );
+ CU_ASSERT( 0x00 == i_result );
+
+ i_result = DWARF_Expression_Term();
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void )
+{
+ int i_result;
+ Byte b_data1[16];
+ Byte b_data2[16];
+ DWord dw_result;
+ LibGoblin_DWARF_Expression *p_exp;
+
+ i_result = DWARF_Expression_Init();
+ CU_ASSERT( 0x00 == i_result );
+
+ p_exp = DWARF_Expression_Alloc();
+ CU_ASSERT( NULL != p_exp );
+
+ // DW_OP_call2: // 0x98
+ b_data1[0] = DW_OP_lit13;
+ b_data1[1] = DW_OP_fbreg;
+ b_data1[2] = 0x81;
+ b_data1[3] = 0x01; // value = 129 (0x81 0x01)
+ b_data1[4] = DW_OP_call2;
+ b_data1[5] = 0x81;
+ b_data1[6] = 0x01; // value = 129 (0x81 0x01)
+ b_data2[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 );
+
+ 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, 8 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_CALLING,
+ LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_FRAME_BASE );
+ CU_ASSERT( p_exp->result.qw_value == 0x00 );
+ 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 == 0x181 );
+ 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 );
+
+
+ b_data2[0] = DW_OP_lit7;
+ b_data2[1] = DW_OP_lit24;
+ 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;
+ //DWARF_Expression_ClearValue( p_exp );
+ 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_FRAME_BASE );
+ 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->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_XDEREF | LIBGOBLIN_DWARF_REQUEST_FRAME_BASE );
+ 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 );
+
+// TODO: xderef & deref requst value (reference.value) is seperating !!
+/*
+ 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_XDEREF | LIBGOBLIN_DWARF_REQUEST_FRAME_BASE );
+ CU_ASSERT( p_exp->b_callers == 0 );
+
+ CU_ASSERT( p_exp->resume.pb_resume == NULL );
+ CU_ASSERT( p_exp->resume.qw_remain == 4 );
+*/
+/*
+ CU_ASSERT( p_exp->result.qw_value == 0x00 );
+ 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 == 0x181 );
+ 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 );
+*/
+ // DW_OP_call4: // 0x99
+ // 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 );
+ Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+ LIBGOBLIN_DWARF_STATUS_REQUESTED,
+ LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE );
+
+ 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 );
+ 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 );
+
+
+ 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 );
+ 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 );
+*/
+
+
+
+ i_result = DWARF_Expression_Free( p_exp );
+ CU_ASSERT( 0x00 == i_result );
+
+ i_result = DWARF_Expression_Term();
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
+
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
DRD64_TEST_LIBGOBLIN_DWARF_EXPRESSION_EXTERN
Test_LibGoblin_DWARF_Expression_RegBase_test01_001 );
CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_StackOperation_test02_001",
Test_LibGoblin_DWARF_Expression_StackOperation_test02_001 );
+
+ CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_ArithmeticLogical_test01_001",
+ Test_LibGoblin_DWARF_Expression_ArithmeticLogical_test01_001 );
+ CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_FlowControl_test01_001",
+ Test_LibGoblin_DWARF_Expression_FlowControl_test01_001 );
+ CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_FlowControl_test02_001",
+ Test_LibGoblin_DWARF_Expression_FlowControl_test02_001 );
return 0x00;
}
/* EOF of drd64_.c ----------------------------------- */
/*
- DW_OP_swap: // 0x16
- DW_OP_rot: // 0x17
- DW_OP_abs: // 0x19
- DW_OP_and: // 0x1a
- DW_OP_div: // 0x1b
- DW_OP_minus: // 0x1c
- DW_OP_mod: // 0x1d
- DW_OP_mul: // 0x1e
- DW_OP_neg: // 0x1f
- DW_OP_not: // 0x20
- DW_OP_or: // 0x21
- DW_OP_plus: // 0x22
- DW_OP_plus_uconst: // 0x23
- DW_OP_shl: // 0x24
- DW_OP_shr: // 0x25
- DW_OP_shra: // 0x26
- DW_OP_xor: // 0x27
- DW_OP_bra: // 0x28
- DW_OP_eq: // 0x29
- DW_OP_ge: // 0x2a
- DW_OP_gt: // 0x2b
- DW_OP_le: // 0x2c
- DW_OP_lt: // 0x2d
- DW_OP_ne: // 0x2e
- DW_OP_skip: // 0x2f
DW_OP_reg0: // 0x50
DW_OP_reg1: // 0x51
DW_OP_reg2: // 0x52
DW_OP_reg31: // 0x6f
DW_OP_regx: // 0x90
DW_OP_piece: // 0x93
- DW_OP_nop: // 0x96
- DW_OP_call2: // 0x98
- DW_OP_call4: // 0x99
- DW_OP_call_ref: // 0x9a
DW_OP_bit_piece: // 0x9d
DW_OP_implicit_value: // 0x9e
DW_OP_stack_value: // 0x9f
+ DW_OP_nop: // 0x96
DW_OP_lo_user: // 0xe0
DW_OP_hi_user: // 0xff
DW_OP_GNU_push_tls_address: // 0xe0