OSDN Git Service

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

libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/test_libgoblin_dwarf_expression.c

index 2f71e91..040c852 100644 (file)
@@ -687,7 +687,6 @@ DWord
 
                        // Flow Control Operation ----
                        case DW_OP_eq:                                  // 0x29
-                               // 2019/09/08 (Required TEST!!)
                                if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
@@ -697,7 +696,6 @@ DWord
                                else                                            { PUSH_DWARF( p_exp, 0x00 ); }
                                break;
                        case DW_OP_ge:                                  // 0x2a
-                               // 2019/09/08 (Required TEST!!)
                                if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
@@ -707,7 +705,6 @@ DWord
                                else                                            { PUSH_DWARF( p_exp, 0x00 ); }
                                break;
                        case DW_OP_gt:                                  // 0x2b
-                               // 2019/09/08 (Required TEST!!)
                                if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
@@ -717,7 +714,6 @@ DWord
                                else                                            { PUSH_DWARF( p_exp, 0x00 ); }
                                break;
                        case DW_OP_le:                                  // 0x2c
-                               // 2019/09/08 (Required TEST!!)
                                if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
@@ -727,7 +723,6 @@ DWord
                                else                                            { PUSH_DWARF( p_exp, 0x00 ); }
                                break;
                        case DW_OP_lt:                                  // 0x2d
-                               // 2019/09/08 (Required TEST!!)
                                if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
@@ -737,7 +732,6 @@ DWord
                                else                                            { PUSH_DWARF( p_exp, 0x00 ); }
                                break;
                        case DW_OP_ne:                                  // 0x2e
-                               // 2019/09/08 (Required TEST!!)
                                if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
@@ -747,17 +741,23 @@ DWord
                                else                                            { PUSH_DWARF( p_exp, 0x00 ); }
                                break;
                        case DW_OP_skip:                                // 0x2f
-                               // 2019/09/08 (Required TEST!!)
                                s_value         = *((short *)pb_now);
                                pb_now          += 2;
                                qw_remain       -= 2;
 
-                               pb_skip         = pb_now + s_value;
-                               if( 0 > s_value )       { qw_remain += (-1 * s_value); }
-                               else                            { qw_remain -= s_value; }
+                               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_bra:                                 // 0x28
+                               // XXX Todo.
                                break;
+
                        case DW_OP_call2:                               // 0x98
                                // 2019/09/10 (Required TEST!!)
                                w_value = *((Word *)pb_now);
index 3eb8ea8..1ea50c4 100644 (file)
@@ -1316,15 +1316,253 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test01_001( void )
        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
+       b_data[0]       = DW_OP_lit5;
+       b_data[1]       = DW_OP_lit4;
+       b_data[2]       = DW_OP_eq;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x00 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit3;
+       b_data[1]       = DW_OP_lit3;
+       b_data[2]       = DW_OP_eq;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x01 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x01 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       // DW_OP_ge:                            // 0x2a (second >= first)
+       b_data[0]       = DW_OP_lit2;   // second.
+       b_data[1]       = DW_OP_lit6;   // first.
+       b_data[2]       = DW_OP_ge;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x00 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit6;   // second.
+       b_data[1]       = DW_OP_lit2;   // first.
+       b_data[2]       = DW_OP_ge;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x01 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x01 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit2;
+       b_data[1]       = DW_OP_lit2;
+       b_data[2]       = DW_OP_ge;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x01 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x01 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       // DW_OP_gt:                            // 0x2b (second > first)
+       b_data[0]       = DW_OP_lit2;   // second.
+       b_data[1]       = DW_OP_lit6;   // first.
+       b_data[2]       = DW_OP_gt;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x00 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit6;   // second.
+       b_data[1]       = DW_OP_lit2;   // first.
+       b_data[2]       = DW_OP_gt;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x01 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x01 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit2;
+       b_data[1]       = DW_OP_lit2;
+       b_data[2]       = DW_OP_gt;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x00 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       // DW_OP_le:                            // 0x2c (second <= first)
+       b_data[0]       = DW_OP_lit7;   // second.
+       b_data[1]       = DW_OP_lit8;   // first.
+       b_data[2]       = DW_OP_le;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x01 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x01 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit8;   // second.
+       b_data[1]       = DW_OP_lit7;   // first.
+       b_data[2]       = DW_OP_le;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x00 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit7;
+       b_data[1]       = DW_OP_lit7;
+       b_data[2]       = DW_OP_le;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x01 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x01 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       // DW_OP_lt:                            // 0x2d (second < first)
+       b_data[0]       = DW_OP_lit7;   // second.
+       b_data[1]       = DW_OP_lit8;   // first.
+       b_data[2]       = DW_OP_lt;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x01 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x01 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit8;   // second.
+       b_data[1]       = DW_OP_lit7;   // first.
+       b_data[2]       = DW_OP_lt;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x00 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit7;
+       b_data[1]       = DW_OP_lit7;
+       b_data[2]       = DW_OP_lt;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x00 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
        // DW_OP_ne:                            // 0x2e
+       b_data[0]       = DW_OP_lit12;
+       b_data[1]       = DW_OP_lit14;
+       b_data[2]       = DW_OP_ne;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x01 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x01 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       b_data[0]       = DW_OP_lit13;
+       b_data[1]       = DW_OP_lit13;
+       b_data[2]       = DW_OP_ne;
+       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_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 0x00 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
        // DW_OP_skip:                          // 0x2f
-       // DW_OP_bra:                           // 0x28
+       b_data[0]       = DW_OP_lit15;
+       b_data[1]       = DW_OP_skip;
+       b_data[2]       = 0x04;
+       b_data[3]       = 0x00;                 // for b_data[8]
+       b_data[4]       = DW_OP_lit17;
+       b_data[5]       = DW_OP_skip;
+       b_data[6]       = 0x04;
+       b_data[7]       = 0x00;                 // for b_data[12]
+       b_data[8]       = DW_OP_lit16;
+       b_data[9]       = DW_OP_skip;
+       b_data[10]      = 0xf8;
+       b_data[11]      = 0xff;                 // for b_data[4]
+       b_data[12]      = DW_OP_lit18;
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 13 );
+       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 == 18 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value == 15 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.ii_value == 16 );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.ii_value == 17 );
+       CU_ASSERT( p_exp->t_stack[ 3 ].value.ii_value == 18 );
+       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;
+       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)
@@ -1554,9 +1792,9 @@ 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 );
 */