OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 16 Sep 2019 06:03:14 +0000 (15:03 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 16 Sep 2019 06:03:14 +0000 (15:03 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/drd64_libgoblin_type_dwarf.h
libgoblin/test_libgoblin_dwarf_expression.c

index 37c1e0d..98a7ef5 100644 (file)
@@ -138,6 +138,8 @@ DWord
                return  (LIBGOBLIN_DWARF_STATUS_ERROR | 0x02);
        }
 
+       if( 0 == p_exp->b_dwsize )      { p_exp->b_dwsize       = 8; }
+
        // ------------------------
        if( NULL != p_exp->resume.pb_resume )   {
                // XXX Position Check!!
@@ -236,47 +238,63 @@ DWord
                                break;
 
                        case DW_OP_const1u:                             // 0x08
+                               if( 1 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_value        = (QWord)*pb_now++;
                                qw_remain--;
                                PUSH_DWARF( p_exp, qw_value );
                                break;
                        case DW_OP_const1s:                             // 0x09
+                               if( 1 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                ii_value        = (Int64)*((char *)pb_now);
                                pb_now++;
                                qw_remain--;
                                PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
                        case DW_OP_const2u:                             // 0x0a
+                               if( 2 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_value        = (QWord)*((Word *)pb_now);
                                pb_now          += 2;
                                qw_remain       -= 2;
                                PUSH_DWARF( p_exp, qw_value );
                                break;
                        case DW_OP_const2s:                             // 0x0b
+                               if( 2 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                ii_value        = (Int64)*((short *)pb_now);
                                pb_now          += 2;
                                qw_remain       -= 2;
                                PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
                        case DW_OP_const4u:                             // 0x0c
+                               if( 4 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_value        = (QWord)*((DWord *)pb_now);
                                pb_now          += 4;
                                qw_remain       -= 4;
                                PUSH_DWARF( p_exp, qw_value );
                                break;
                        case DW_OP_const4s:                             // 0x0d
+                               if( 4 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                ii_value        = (Int64)*((int *)pb_now);
                                pb_now          += 4;
                                qw_remain       -= 4;
                                PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
                        case DW_OP_const8u:                             // 0x0e
+                               if( 8 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_value        = (QWord)*((QWord *)pb_now);
                                pb_now          += 8;
                                qw_remain       -= 8;
                                PUSH_DWARF( p_exp, qw_value );
                                break;
                        case DW_OP_const8s:                             // 0x0f
+                               if( 8 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                ii_value        = (Int64)*((Int64 *)pb_now);
                                pb_now          += 8;
                                qw_remain       -= 8;
@@ -400,6 +418,8 @@ DWord
                                qw_pop[0]       = POP_DWARF( p_exp );
                                break;
                        case DW_OP_pick:                                // 0x15
+                               if( 1 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                b_value = *pb_now++;
                                qw_remain--;
 
@@ -455,6 +475,8 @@ DWord
                        case DW_OP_deref_size:                  // 0x94
                                if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
+                               if( 1 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_pop[0]       = POP_DWARF( p_exp );
 
                                b_value = *pb_now++;
@@ -753,6 +775,8 @@ DWord
                                else                                            { PUSH_DWARF( p_exp, 0x00 ); }
                                break;
                        case DW_OP_skip:                                // 0x2f
+                               if( 2 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                s_value         = *((short *)pb_now);
                                pb_now          += 2;
                                qw_remain       -= 2;
@@ -767,6 +791,8 @@ DWord
                                }
                                break;
                        case DW_OP_bra:                                 // 0x28
+                               if( 2 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_temp         = POP_DWARF( p_exp );
 
                                s_value         = *((short *)pb_now);
@@ -786,6 +812,8 @@ DWord
                                break;
 
                        case DW_OP_call2:                               // 0x98
+                               if( 2 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                w_value = *((Word *)pb_now);
                                pb_now          += 2;
                                qw_remain       -= 2;
@@ -799,6 +827,8 @@ DWord
                                goto    goto_DWARF_Expression_Evaluate_post;
                                break;  // NOT reach.
                        case DW_OP_call4:                               // 0x99
+                               if( 4 > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
                                dw_value        = *((DWord *)pb_now);
                                pb_now          += 4;
                                qw_remain       -= 4;
@@ -812,10 +842,25 @@ DWord
                                goto    goto_DWARF_Expression_Evaluate_post;
                                break;  // NOT reach.
                        case DW_OP_call_ref:                    // 0x9a
-                               break;
+                               if( p_exp->b_dwsize > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+                               if( 8 == p_exp->b_dwsize )      { qw_value      = *((QWord *)pb_now); }
+                               else                                            { qw_value      = (QWord)(*((DWord *)pb_now)); }
+                               pb_now          += p_exp->b_dwsize;
+                               qw_remain       -= p_exp->b_dwsize;
+                               
+                               p_exp->qw_calloffset    = qw_value;
+                               p_exp->caller[ p_exp->b_callers ].pb_return             = pb_now;
+                               p_exp->caller[ p_exp->b_callers ].qw_retremain  = qw_remain;
+                               p_exp->b_callers++;
+                               p_exp->dw_status        = LIBGOBLIN_DWARF_STATUS_CALLING;
+
+                               goto    goto_DWARF_Expression_Evaluate_post;
+                               break;  // NOT reach.
 
                        // Special Operation ----
                        case DW_OP_nop:                                 // 0x96
+                               // NONE operation .
                                break;
 
                        case DW_OP_reg0:                                // 0x50
index 1f55933..486d8f2 100644 (file)
@@ -106,6 +106,7 @@ typedef     struct  {
        } caller[4];
        Byte    b_callers;
 
+       Byte    b_dwsize;
        QWord   qw_calloffset;
        DWord   dw_reqsize;                     // for DW_OP_deref_size & DW_OP_xderef_size
        Ptr             ptr_reference;          // for DW_OP_deref(_size) & DW_OP_xderef(_size)
index cb5440b..bdb0811 100644 (file)
@@ -1808,44 +1808,118 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void )
 
 
        // DW_OP_call_ref:                      // 0x9a
-
-
-/*
-       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 );
+       b_data1[0]      = DW_OP_lit25;
+       b_data1[1]      = DW_OP_fbreg;
+       b_data1[2]      = 0x81;
+       b_data1[3]      = 0x01;         // value = 129 (0x81 0x01)
+       b_data1[4]      = DW_OP_call_ref;
+       b_data1[5]      = 0xef;
+       b_data1[6]      = 0xcd;
+       b_data1[7]      = 0xab;
+       b_data1[8]      = 0x90;
+       b_data1[9]      = 0x78;
+       b_data1[10]     = 0x56;
+       b_data1[11]     = 0x34;
+       b_data1[12]     = 0x12;
+       b_data1[13]     = DW_OP_deref;
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data1, 14 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
                                LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
 
        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_data1, 14 );
        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 );
+                               LIBGOBLIN_DWARF_STATUS_CALLING,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->dw_depth == 2 );
+       CU_ASSERT( p_exp->qw_calloffset == 0x1234567890abcdef );
+       CU_ASSERT( p_exp->b_callers == 1 );
+       CU_ASSERT( p_exp->caller[ 0 ].pb_return == b_data1 + 13 );
+       CU_ASSERT( p_exp->caller[ 0 ].qw_retremain == 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 );
+       b_data2[0]      = DW_OP_lit26;
+       b_data2[1]      = DW_OP_lit27;
+       b_data2[2]      = DW_OP_const8u;
+       b_data2[3]      = 0xef;
+       b_data2[4]      = 0xcd;
+       b_data2[5]      = 0xab;
+       b_data2[6]      = 0x90;
+       b_data2[7]      = 0x78;
+       b_data2[8]      = 0x56;
+       b_data2[9]      = 0x34;
+       b_data2[10]     = 0x12;
+       b_data2[11]     = DW_OP_xderef_size;
+       b_data2[12]     = 2;
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data2, 13 );
        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 );
-*/
+                               LIBGOBLIN_DWARF_STATUS_REQUESTED,
+                               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( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 26 );
+       CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 27 );
+       CU_ASSERT( p_exp->t_stack[ 4 ].value.qw_value == 0x1234567890abcdef );
+       CU_ASSERT( 5 == p_exp->dw_depth );
 
+       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_NONE );
+       CU_ASSERT( p_exp->result.qw_value == 0x00 );
+       CU_ASSERT( p_exp->b_callers == 1 );
+       CU_ASSERT( p_exp->caller[ 0 ].pb_return == b_data1 + 13 );
+       CU_ASSERT( p_exp->caller[ 0 ].qw_retremain == 1 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 26 );
+       CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcd );
+       CU_ASSERT( 4 == p_exp->dw_depth );
+
+
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data1, 14 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+                               LIBGOBLIN_DWARF_STATUS_REQUESTED,
+                               LIBGOBLIN_DWARF_REQUEST_DEREF, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->b_callers == 0 );
+       CU_ASSERT( p_exp->resume.pb_resume == b_data1 + 13 );
+       CU_ASSERT( p_exp->resume.qw_remain == 1 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 26 );
+       CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcd );
+       CU_ASSERT( 4 == p_exp->dw_depth );
+
+
+       p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_DEREF ]       = 0xabcdef0123456789;
+       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_REQUEST_DEREF;
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data1, 14 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+                               LIBGOBLIN_DWARF_STATUS_EVALUATED,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+       CU_ASSERT( p_exp->b_callers == 0 );
+       CU_ASSERT( p_exp->result.qw_value == 0xabcdef0123456789 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 25 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 26 );
+       CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcdef0123456789 );
+       CU_ASSERT( 4 == p_exp->dw_depth );
 
 
        i_result        = DWARF_Expression_Free( p_exp );