From: Koine Yuusuke(koinec) Date: Sun, 15 Sep 2019 12:52:14 +0000 (+0900) Subject: (LibGoblin) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=fc11c81fab285f185268a916a882b60e73b4a57e;p=drdeamon64%2Fdrdeamon64.git (LibGoblin) * WorkBackup --- diff --git a/libgoblin/drd64_libgoblin_dwarf_expression.c b/libgoblin/drd64_libgoblin_dwarf_expression.c index 040c852..85874e7 100644 --- a/libgoblin/drd64_libgoblin_dwarf_expression.c +++ b/libgoblin/drd64_libgoblin_dwarf_expression.c @@ -755,7 +755,22 @@ DWord } break; case DW_OP_bra: // 0x28 - // XXX Todo. + qw_temp = POP_DWARF( p_exp ); + + s_value = *((short *)pb_now); + pb_now += 2; + qw_remain -= 2; + + if( 0 != qw_temp ) { + if( 0 > s_value ) { + pb_now -= (-1 * s_value); + qw_remain += (-1 * s_value); + } + else { + pb_now += s_value; + qw_remain -= s_value; + } + } break; case DW_OP_call2: // 0x98 diff --git a/libgoblin/test_libgoblin_dwarf_expression.c b/libgoblin/test_libgoblin_dwarf_expression.c index 1ea50c4..5fa31bc 100644 --- a/libgoblin/test_libgoblin_dwarf_expression.c +++ b/libgoblin/test_libgoblin_dwarf_expression.c @@ -1540,64 +1540,26 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test01_001( void ) CU_ASSERT( p_exp->dw_depth == 4 ); // DW_OP_bra // 0x28 - -/* - b_data[0] = DW_OP_const4u; - b_data[1] = 0xff; - 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; + b_data[0] = DW_OP_lit0; + b_data[1] = DW_OP_bra; + b_data[2] = 0x06; + b_data[3] = 0x00; // for b_data[10] + b_data[4] = DW_OP_lit18; + b_data[5] = DW_OP_lit19; + b_data[6] = DW_OP_lit21; + b_data[7] = DW_OP_bra; + b_data[8] = 0xf7; + b_data[9] = 0xff; // for b_data[1] + b_data[10] = DW_OP_lit22; 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 == 0xff00ff00 ); - CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0xff00ff00 ); - CU_ASSERT( p_exp->dw_depth == 1 ); -*/ -/* - 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 ); -*/ - + CU_ASSERT( p_exp->result.qw_value == 22 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 18 ); + CU_ASSERT( p_exp->t_stack[ 1 ].value.ii_value == 22 ); + CU_ASSERT( p_exp->dw_depth == 2 ); i_result = DWARF_Expression_Free( p_exp ); @@ -1645,7 +1607,7 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void ) 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 ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); 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 ); @@ -1669,11 +1631,10 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void ) 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 ); + 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 ); @@ -1681,31 +1642,31 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void ) 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 ); + 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 ); -// TODO: xderef & deref requst value (reference.value) is seperating !! -/* + +/* 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_XDEREF | LIBGOBLIN_DWARF_REQUEST_FRAME_BASE ); + LIBGOBLIN_DWARF_REQUEST_DEREF, LIBGOBLIN_DWARF_REQUEST_NONE ); 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->resume.pb_resume == b_data1 + 7 ); + CU_ASSERT( p_exp->resume.qw_remain == 1 ); */ + /* CU_ASSERT( p_exp->result.qw_value == 0x00 ); CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) ); @@ -1794,10 +1755,8 @@ int 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; }