OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 2 Sep 2019 13:10:35 +0000 (22:10 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 2 Sep 2019 13:10:35 +0000 (22:10 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/test_libgoblin_dwarf_expression.c

index dafd3c2..ceeefd8 100644 (file)
@@ -94,6 +94,7 @@ DWord
        Byte    *pb_now;
        QWord   qw_remain;
        DWord   dw_depth;
+       DWord   dw_value;
        QWord   qw_value;
        Int64   ii_value;
        LibGoblin_DWARF_Expression_Stack
@@ -197,26 +198,28 @@ DWord
                                break;
 
                        case DW_OP_dup:                                 // 0x12
-                               // 2019/09/02 Lunch-Coding (Required TEST!!)
-                               qw_value        = t_stack[dw_depth].value.qw_value;
+                               if( 0 == dw_depth )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               qw_value        = t_stack[dw_depth - 1].value.qw_value;
                                PUSH_DWARF( qw_value );
                                break;
                        case DW_OP_drop:                                // 0x13
-                               // 2019/09/02 Lunch-Coding (Required TEST!!)
+                               if( 0 == dw_depth )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_value        = POP_DWARF();
                                break;
                        case DW_OP_over:                                // 0x14
-                               // 2019/09/02 Lunch-Coding (Required TEST!!)
-                               if( dw_depth < 1 )
+                               if( 2 > dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
-                               dw_value        = dw_depth - (DWord)1;
+                               dw_value        = dw_depth - 2;
                                qw_value        = t_stack[dw_value].value.qw_value;
                                PUSH_DWARF( qw_value );
                                break;
                        case DW_OP_pick:                                // 0x15
                                // 2019/09/02 Lunch-Coding (Required TEST!!)
-                               b_value = *pb_now++
+                               b_value = *pb_now++;
                                qw_remain--;
 
                                if( dw_depth < (DWord)b_value )
@@ -445,7 +448,6 @@ DWord
 
                                break;
                        case DW_OP_bregx:                               // 0x92
-                               // 2019/09/02 Lunch-Coding (Required TEST!!)
                                // Get RegID
                                pb_now  = DWARF_Common_DecodeULEB128( &qw_value, pb_now, &qw_remain );
                                b_reg   = (Byte)(qw_value & 0x1f);
@@ -528,9 +530,9 @@ DWord
 
        if( LIBGOBLIN_DWARF_DATA_NONE != p_exp->dw_requested )
                { p_exp->dw_status      = LIBGOBLIN_DWARF_STATUS_REQUESTED; }
-       else if( 1 == dw_depth )        {
+       else if( 0 < dw_depth ) {
                p_exp->dw_status                = LIBGOBLIN_DWARF_STATUS_EVALUATED;
-               p_exp->result.qw_value  = t_stack[ 0 ].value.qw_value;
+               p_exp->result.qw_value  = t_stack[ dw_depth - 1 ].value.qw_value;
        }
 
 goto_DWARF_Expression_Evaluate_post:
index 4152ecc..e861b28 100644 (file)
@@ -383,9 +383,148 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void )
        Test_LibGoblin_DWARF_Expression_RegBase_bregX( DW_OP_breg30 );
        Test_LibGoblin_DWARF_Expression_RegBase_bregX( DW_OP_breg31 );
 
+
+       // DW_OP_bregx --------------
+       b_data[0]       = DW_OP_bregx;
+       b_data[1]       = 0x0a;
+       b_data[2]       = 0x81;
+       b_data[3]       = 0x01;         // value = 129 (0x81 0x01)
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 4 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_REQUESTED,
+                               (LIBGOBLIN_DWARF_DATA_REG | 0x0a), LIBGOBLIN_DWARF_DATA_NONE );
+
+       t_exp.qw_reg[0x0a]      = 0x80000000;
+       t_exp.dw_setdata        |= (LIBGOBLIN_DWARF_DATA_REG | 0x0a );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 4 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_EVALUATED,
+                               LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | 0x0a) );
+       CU_ASSERT( t_exp.result.qw_value == (0x80000000 + 129) );
+
+
+       b_data[0]       = DW_OP_bregx;
+       b_data[1]       = 0x1f;
+       b_data[2]       = 0xff;
+       b_data[3]       = 0x7e;         // value = -129 (0xff 0x7e)
+       DWARF_Expression_ClearValue( &t_exp );
+       t_exp.qw_reg[0x1f]      = 0x80000000;
+       t_exp.dw_setdata        |= (LIBGOBLIN_DWARF_DATA_REG | 0x1f );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 4 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_EVALUATED,
+                               LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | 0x1f ) );
+       CU_ASSERT( t_exp.result.qw_value == (0x80000000 - 129) );
+
+
+       return;
+}
+
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
+{
+       Byte    b_data[16];
+       DWord   dw_result;
+       LibGoblin_DWARF_Expression      t_exp;
+
+       // DW_OP_dup ---------------
+       b_data[0]       = DW_OP_dup;
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_ERROR,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+
+       b_data[0]       = DW_OP_lit10;
+       b_data[1]       = DW_OP_dup;
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 2 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_EVALUATED,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+       CU_ASSERT( t_exp.result.qw_value == 10 );
+
+       // DW_OP_drop ---------------
+       b_data[0]       = DW_OP_drop;
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_ERROR,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+
+       b_data[0]       = DW_OP_lit10;
+       b_data[1]       = DW_OP_drop;
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 2 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_ERROR,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+
+       b_data[0]       = DW_OP_lit31;
+       b_data[1]       = DW_OP_lit10;
+       b_data[2]       = DW_OP_drop;
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_EVALUATED,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+       CU_ASSERT( t_exp.result.qw_value == 31 );
+
+       // DW_OP_over ---------------
+       b_data[0]       = DW_OP_over;
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_ERROR,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+
+       b_data[0]       = DW_OP_lit10;
+       b_data[1]       = DW_OP_over;
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 2 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_ERROR,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+
+       b_data[0]       = DW_OP_lit30;
+       b_data[1]       = DW_OP_lit11;
+       b_data[2]       = DW_OP_drop;
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_EVALUATED,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+       CU_ASSERT( t_exp.result.qw_value == 30 );
+
+       // DW_OP_pick ---------------
+
+
+       // DW_OP_fbreg --------------
+/*
+       b_data[0]       = DW_OP_fbreg;
+       b_data[1]       = 0x81;
+       b_data[2]       = 0x01;         // value = 129 (0x81 0x01)
+       DWARF_Expression_ClearValue( &t_exp );
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_REQUESTED,
+                               LIBGOBLIN_DWARF_DATA_FRAME_BASE, LIBGOBLIN_DWARF_DATA_NONE );
+
+       t_exp.qw_frame_base     = 0x80000000;
+       t_exp.dw_setdata        |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
+       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+                               LIBGOBLIN_DWARF_STATUS_EVALUATED,
+                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE );
+       CU_ASSERT( t_exp.result.qw_value == (0x80000000 + 129) );
+*/
+
        return;
 }
 
+
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 DRD64_TEST_LIBGOBLIN_DWARF_EXPRESSION_EXTERN
@@ -401,6 +540,8 @@ int
                                                                 Test_LibGoblin_DWARF_Expression_Constant_test00_001 );
        CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_RegBase_test01_001",
                                                                 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 );
 
 
        return 0x00;
@@ -409,22 +550,7 @@ int
 
 /* EOF of drd64_.c ----------------------------------- */
 /*
-       DW_OP_addr:                             // 0x03
        DW_OP_deref:                    // 0x06
-       DW_OP_const1u:                  // 0x08
-       DW_OP_const1s:                  // 0x09
-       DW_OP_const2u:                  // 0x0a
-       DW_OP_const2s:                  // 0x0b
-       DW_OP_const4u:                  // 0x0c
-       DW_OP_const4s:                  // 0x0d
-       DW_OP_const8u:                  // 0x0e
-       DW_OP_const8s:                  // 0x0f
-       DW_OP_constu:                   // 0x10
-       DW_OP_consts:                   // 0x11
-       DW_OP_dup:                              // 0x12
-       DW_OP_drop:                             // 0x13
-       DW_OP_over:                             // 0x14
-       DW_OP_pick:                             // 0x15
        DW_OP_swap:                             // 0x16
        DW_OP_rot:                              // 0x17
        DW_OP_xderef:                   // 0x18
@@ -483,41 +609,7 @@ int
        DW_OP_reg29:                    // 0x6d
        DW_OP_reg30:                    // 0x6e
        DW_OP_reg31:                    // 0x6f
-       DW_OP_breg0:                    // 0x70
-       DW_OP_breg1:                    // 0x71
-       DW_OP_breg2:                    // 0x72
-       DW_OP_breg3:                    // 0x73
-       DW_OP_breg4:                    // 0x74
-       DW_OP_breg5:                    // 0x75
-       DW_OP_breg6:                    // 0x76
-       DW_OP_breg7:                    // 0x77
-       DW_OP_breg8:                    // 0x78
-       DW_OP_breg9:                    // 0x79
-       DW_OP_breg10:                   // 0x7a
-       DW_OP_breg11:                   // 0x7b
-       DW_OP_breg12:                   // 0x7c
-       DW_OP_breg13:                   // 0x7d
-       DW_OP_breg14:                   // 0x7e
-       DW_OP_breg15:                   // 0x7f
-       DW_OP_breg16:                   // 0x80
-       DW_OP_breg17:                   // 0x81
-       DW_OP_breg18:                   // 0x82
-       DW_OP_breg19:                   // 0x83
-       DW_OP_breg20:                   // 0x84
-       DW_OP_breg21:                   // 0x85
-       DW_OP_breg22:                   // 0x86
-       DW_OP_breg23:                   // 0x87
-       DW_OP_breg24:                   // 0x88
-       DW_OP_breg25:                   // 0x89
-       DW_OP_breg26:                   // 0x8a
-       DW_OP_breg27:                   // 0x8b
-       DW_OP_breg28:                   // 0x8c
-       DW_OP_breg29:                   // 0x8d
-       DW_OP_breg30:                   // 0x8e
-       DW_OP_breg31:                   // 0x8f
        DW_OP_regx:                             // 0x90
-       DW_OP_fbreg:                    // 0x91
-       DW_OP_bregx:                    // 0x92
        DW_OP_piece:                    // 0x93
        DW_OP_deref_size:               // 0x94
        DW_OP_xderef_size:              // 0x95