OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 15 Sep 2019 12:52:14 +0000 (21:52 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 15 Sep 2019 12:52:14 +0000 (21:52 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/test_libgoblin_dwarf_expression.c

index 040c852..85874e7 100644 (file)
@@ -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
index 1ea50c4..5fa31bc 100644 (file)
@@ -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;
 }