From: Koine Yuusuke(koinec) Date: Sat, 14 Sep 2019 11:55:36 +0000 (+0900) Subject: (LibGoblin) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=37c850c539c34cab3694344786202c77e317c6df;p=drdeamon64%2Fdrdeamon64.git (LibGoblin) * WorkBackup (Tested DWARF_Expression Arithmetic & Logical Calc Op.) --- diff --git a/libgoblin/drd64_libgoblin_dwarf_expression.c b/libgoblin/drd64_libgoblin_dwarf_expression.c index bdbb61c..2f71e91 100644 --- a/libgoblin/drd64_libgoblin_dwarf_expression.c +++ b/libgoblin/drd64_libgoblin_dwarf_expression.c @@ -542,7 +542,6 @@ DWord // Arithmetic & Logical Operation ---- case DW_OP_abs: // 0x19 - // 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 - 1].b_flag ) { @@ -553,7 +552,6 @@ DWord break; case DW_OP_and: // 0x1a - // 2019/09/03 Lunch-Coding (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -564,7 +562,6 @@ DWord break; case DW_OP_div: // 0x1b - // 2019/09/03 Lunch-Coding (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -578,7 +575,6 @@ DWord break; case DW_OP_minus: // 0x1c - // 2019/09/08 (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -588,17 +584,18 @@ DWord PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_mod: // 0x1d - // 2019/09/08 (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } - qw_temp = POP_DWARF( p_exp ); - qw_value = POP_DWARF( p_exp ); - qw_value %= qw_temp; - PUSH_DWARF( p_exp, qw_value ); + ii_temp = POP_DWARF_SIGN( p_exp ); + ii_value = POP_DWARF_SIGN( p_exp ); + if( 0 == ii_temp ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_value %= ii_temp; + PUSH_DWARF_SIGN( p_exp, ii_value ); break; case DW_OP_mul: // 0x1e - // 2019/09/08 (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -608,7 +605,6 @@ DWord PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_neg: // 0x1f - // 2019/09/08 (Required TEST!!) if( 1 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -617,7 +613,6 @@ DWord PUSH_DWARF_SIGN( p_exp, ii_value ); break; case DW_OP_not: // 0x20 - // 2019/09/08 (Required TEST!!) if( 1 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -626,7 +621,6 @@ DWord PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_or: // 0x21 - // 2019/09/03 Lunch-Coding (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -636,7 +630,6 @@ DWord PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_plus: // 0x22 - // 2019/09/08 (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -646,7 +639,6 @@ DWord PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_plus_uconst: // 0x23 - // 2019/09/08 (Required TEST!!) if( 1 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -657,7 +649,6 @@ DWord PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_shl: // 0x24 - // 2019/09/08 (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -667,7 +658,6 @@ DWord PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_shr: // 0x25 - // 2019/09/08 (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -677,7 +667,6 @@ DWord PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_shra: // 0x26 - // 2019/09/08 (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -687,7 +676,6 @@ DWord PUSH_DWARF_SIGN( p_exp, ii_value ); break; case DW_OP_xor: // 0x27 - // 2019/09/08 (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } diff --git a/libgoblin/test_libgoblin_dwarf_expression.c b/libgoblin/test_libgoblin_dwarf_expression.c index 27be41f..3eb8ea8 100644 --- a/libgoblin/test_libgoblin_dwarf_expression.c +++ b/libgoblin/test_libgoblin_dwarf_expression.c @@ -233,7 +233,7 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 1 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_ADDRSIZE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 8 ); CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 8 ); CU_ASSERT( p_exp->dw_depth == 1 ); @@ -406,7 +406,7 @@ void Test_LibGoblin_DWARF_Expression_RegBase_bregX( Byte b_opcode ) 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_REG | b_reg) ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); 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 ); @@ -421,7 +421,7 @@ void Test_LibGoblin_DWARF_Expression_RegBase_bregX( Byte b_opcode ) 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_REG | b_reg) ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); 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 ); @@ -461,7 +461,7 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void ) 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 ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); 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 ); @@ -476,7 +476,7 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void ) 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 ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); 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 ); @@ -533,7 +533,7 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 4 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | 0x0a) ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); 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 ); @@ -549,7 +549,7 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 4 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | 0x1f ) ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); 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 ); @@ -775,7 +775,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 10 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_DEREF ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0xabcdef ); CU_ASSERT( 2 == p_exp->dw_depth ); @@ -813,7 +813,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 11 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_DEREF ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0xabcd ); CU_ASSERT( 2 == p_exp->dw_depth ); @@ -849,7 +849,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 11 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_XDEREF ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0xabcdef ); CU_ASSERT( 3 == p_exp->dw_depth ); @@ -888,7 +888,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 12 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_XDEREF ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0xabcd ); CU_ASSERT( 3 == p_exp->dw_depth ); @@ -922,7 +922,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 10 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_OBJADDR ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0xab01cd23 ); CU_ASSERT( 2 == p_exp->dw_depth ); @@ -957,7 +957,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 10 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_TLSADDR ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0xabcdef ); CU_ASSERT( 2 == p_exp->dw_depth ); @@ -991,7 +991,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 10 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_CFAADDR ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0xab01cd23 ); CU_ASSERT( 2 == p_exp->dw_depth ); @@ -1031,160 +1031,264 @@ void Test_LibGoblin_DWARF_Expression_ArithmeticLogical_test01_001( void ) LIBGOBLIN_DWARF_STATUS_EVALUATED, LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.ii_value == 129 ); - CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = 129 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 129 ); CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_and: // 0x1a b_data[0] = DW_OP_const4u; b_data[1] = 0xff; - b_data[2] = 0xff; + b_data[2] = 0xff; b_data[3] = 0x55; - b_data[4] = 0x55; // 0xffff5555 + b_data[4] = 0x55; // 0x5555ffff b_data[5] = DW_OP_const4u; b_data[6] = 0xff; - b_data[7] = 0x00; + b_data[7] = 0x00; b_data[8] = 0x55; - b_data[9] = 0xaa; // 0xff0055aa + b_data[9] = 0xaa; // 0xaa5500ff b_data[10] = DW_OP_and; DWARF_Expression_ClearValue( p_exp ); dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 11 ); 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 == 0xff005500 ); - CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = 0xff005500 ); + CU_ASSERT( p_exp->result.qw_value == 0x005500ff ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x005500ff ); CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_div: // 0x1b + b_data[0] = DW_OP_consts; + b_data[1] = 0xff; + b_data[2] = 0x7e; // value = -129 (0xff 0x7e) + b_data[3] = DW_OP_consts; + b_data[4] = 0x81; + b_data[5] = 0x01; // value = 129 (0x81 0x01) + b_data[6] = DW_OP_div; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 7 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.ii_value == -1 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == -1 ); + CU_ASSERT( p_exp->dw_depth == 1 ); + // DW_OP_minus: // 0x1c + b_data[0] = DW_OP_consts; + b_data[1] = 0xff; + b_data[2] = 0x7e; // value = -129 (0xff 0x7e) + b_data[3] = DW_OP_consts; + b_data[4] = 0x81; + b_data[5] = 0x01; // value = 129 (0x81 0x01) + b_data[6] = DW_OP_minus; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 7 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.ii_value == -258 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == -258 ); + CU_ASSERT( p_exp->dw_depth == 1 ); + // DW_OP_mod: // 0x1d + b_data[0] = DW_OP_consts; + b_data[1] = 0xff; + b_data[2] = 0x7e; // value = -129 (0xff 0x7e) + b_data[3] = DW_OP_consts; + b_data[4] = 0x81; + b_data[5] = 0x01; // value = 129 (0x81 0x01) + b_data[6] = DW_OP_mod; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 7 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.ii_value == 0 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0 ); + CU_ASSERT( p_exp->dw_depth == 1 ); + // DW_OP_mul: // 0x1e + b_data[0] = DW_OP_consts; + b_data[1] = 0xff; + b_data[2] = 0x7e; // value = -129 (0xff 0x7e) + b_data[3] = DW_OP_consts; + b_data[4] = 0x81; + b_data[5] = 0x01; // value = 129 (0x81 0x01) + b_data[6] = DW_OP_mul; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 7 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.ii_value == -16641 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == -16641 ); + CU_ASSERT( p_exp->dw_depth == 1 ); + // DW_OP_neg: // 0x1f + b_data[0] = DW_OP_consts; + b_data[1] = 0x81; + b_data[2] = 0x01; // value = 129 (0x81 0x01) + b_data[3] = DW_OP_neg; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 4 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.ii_value == -129 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == -129 ); + CU_ASSERT( p_exp->dw_depth == 1 ); + + b_data[0] = DW_OP_consts; + b_data[1] = 0xff; + b_data[2] = 0x7e; // value = -129 (0xff 0x7e) + b_data[3] = DW_OP_neg; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 4 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.ii_value == 129 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 129 ); + CU_ASSERT( p_exp->dw_depth == 1 ); + // DW_OP_not: // 0x20 + b_data[0] = DW_OP_const4u; + b_data[1] = 0xff; + b_data[2] = 0xaa; + b_data[3] = 0x55; + b_data[4] = 0x00; // 0x0055aaff + b_data[5] = DW_OP_not; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 6 ); + 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 == 0xffffffffffaa5500 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0xffffffffffaa5500 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_or: // 0x21 b_data[0] = DW_OP_const4u; b_data[1] = 0xff; - b_data[2] = 0xff; + b_data[2] = 0xff; b_data[3] = 0x55; - b_data[4] = 0x55; // 0xffff5555 + b_data[4] = 0x55; // 0x5555ffff b_data[5] = DW_OP_const4u; b_data[6] = 0xff; - b_data[7] = 0x00; + b_data[7] = 0x00; b_data[8] = 0x55; - b_data[9] = 0xaa; // 0xff0055aa + b_data[9] = 0xaa; // 0xaa5500ff b_data[10] = DW_OP_or; DWARF_Expression_ClearValue( p_exp ); dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 11 ); 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 == 0xffff55ff ); - CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = 0xffff55ff ); + CU_ASSERT( p_exp->result.qw_value == 0xff55ffff ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0xff55ffff ); CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_plus: // 0x22 + b_data[0] = DW_OP_consts; + b_data[1] = 0xff; + b_data[2] = 0x7e; // value = -129 (0xff 0x7e) + b_data[3] = DW_OP_consts; + b_data[4] = 0x81; + b_data[5] = 0x01; // value = 129 (0x81 0x01) + b_data[6] = DW_OP_plus; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 7 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.ii_value == 0 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0 ); + CU_ASSERT( p_exp->dw_depth == 1 ); + // DW_OP_plus_uconst: // 0x23 + b_data[0] = DW_OP_constu; + b_data[1] = 0xb9; + b_data[2] = 0x64; // value = 12857 (0xb9 0x64) + b_data[3] = DW_OP_plus_uconst; + b_data[4] = 0xb9; + b_data[5] = 0x64; // value = 12857 (0xb9 0x64) + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 6 ); + 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 == 25714 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25714 ); + CU_ASSERT( p_exp->dw_depth == 1 ); + // DW_OP_shl: // 0x24 - b_data[0] = DW_OP_lit4; - b_data[1] = DW_OP_const4u; - b_data[2] = 0xff; - b_data[3] = 0xff; - b_data[4] = 0x55; - b_data[5] = 0xaa; // 0xffff55aa + b_data[0] = DW_OP_const4u; + b_data[1] = 0xff; + b_data[2] = 0xaa; + b_data[3] = 0x55; + b_data[4] = 0x00; // 0x0055aaff + b_data[5] = DW_OP_lit8; b_data[6] = DW_OP_shl; DWARF_Expression_ClearValue( p_exp ); dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 7 ); 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 == 0xff55aa00 ); - CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = 0xff55aa00 ); + CU_ASSERT( p_exp->result.qw_value == 0x55aaff00 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x55aaff00 ); CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_shr: // 0x25 - // DW_OP_shra: // 0x26 - - // DW_OP_xor: // 0x27 b_data[0] = DW_OP_const4u; b_data[1] = 0xff; - b_data[2] = 0xff; + b_data[2] = 0xaa; b_data[3] = 0x55; - b_data[4] = 0x55; // 0xffff5555 - b_data[5] = DW_OP_const4u; - b_data[6] = 0xff; - b_data[7] = 0x00; - b_data[8] = 0x55; - b_data[9] = 0xaa; // 0xff0055aa - b_data[10] = DW_OP_xor; + b_data[4] = 0x00; // 0x0055aaff + b_data[5] = DW_OP_lit8; + b_data[6] = DW_OP_shl; DWARF_Expression_ClearValue( p_exp ); - dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 11 ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 7 ); 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 == 0x00ff00ff ); - CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = 0x00ff00ff ); + CU_ASSERT( p_exp->result.qw_value == 0x55aaff00 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x55aaff00 ); CU_ASSERT( p_exp->dw_depth == 1 ); - -/* + // DW_OP_shra: // 0x26 b_data[0] = DW_OP_consts; - b_data[1] = 0xef; - b_data[2] = 0xcd; - b_data[3] = 0xab; - b_data[4] = 0x90; - b_data[5] = 0x78; - b_data[6] = 0x56; - b_data[7] = 0x34; - b_data[8] = 0x12; - b_data[9] = DW_OP_deref_size; - b_data[10] = 2; - DWARF_Expression_ClearValue( p_exp ); - dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 11 ); - Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, - LIBGOBLIN_DWARF_STATUS_REQUESTED, - LIBGOBLIN_DWARF_REQUEST_DEREF, LIBGOBLIN_DWARF_REQUEST_NONE ); - CU_ASSERT( p_exp->ptr_reference.value == 0x1234567890abcdef ); - CU_ASSERT( p_exp->dw_reqsize == 2 ); - CU_ASSERT( 1 == p_exp->dw_depth ); -*/ - -/* - b_data[0] = DW_OP_fbreg; - b_data[1] = 0x81; - b_data[2] = 0x01; // value = 129 (0x81 0x01) + b_data[1] = 0xff; + b_data[2] = 0x7e; // value = -129 (0xff 0x7e) + b_data[3] = DW_OP_lit1; + b_data[4] = DW_OP_shra; 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 ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 5 ); 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) ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.ii_value == -65 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == -65 ); CU_ASSERT( p_exp->dw_depth == 1 ); - - - b_data[0] = DW_OP_fbreg; + + // DW_OP_xor: // 0x27 + b_data[0] = DW_OP_const4u; b_data[1] = 0xff; - b_data[2] = 0x7e; // value = -129 (0xff 0x7e) + b_data[2] = 0xff; + b_data[3] = 0x55; + b_data[4] = 0x55; // 0x5555ffff + b_data[5] = DW_OP_const4u; + b_data[6] = 0xff; + b_data[7] = 0x00; + b_data[8] = 0x55; + b_data[9] = 0xaa; // 0xaa5500ff + b_data[10] = DW_OP_xor; 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 ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 11 ); 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) ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.qw_value == 0xff00ff00 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0xff00ff00 ); CU_ASSERT( p_exp->dw_depth == 1 ); -*/ - i_result = DWARF_Expression_Free( p_exp ); @@ -1440,6 +1544,7 @@ int Test_LibGoblin_DWARF_Expression_InitTerm_test00_001 ); CU_add_test( pt_goblin, "Test_LibGoblin_DWARF_Expression_AllocFree_test00_001", Test_LibGoblin_DWARF_Expression_AllocFree_test00_001 ); + CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_Constant_test00_001", Test_LibGoblin_DWARF_Expression_Constant_test00_001 ); CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_RegBase_test01_001", @@ -1449,10 +1554,12 @@ int 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; }