OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 16 Sep 2019 02:21:25 +0000 (11:21 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 16 Sep 2019 02:21:25 +0000 (11:21 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/test_libgoblin_dwarf_expression.c

index 85874e7..37c1e0d 100644 (file)
@@ -113,6 +113,7 @@ DWord
        QWord   qw_remain;
        QWord   qw_value;
        QWord   qw_temp;
+       QWord   qw_pop[4];
        Int64   ii_value;
        Int64   ii_temp;
 
@@ -163,9 +164,12 @@ DWord
        else    {
                pb_now                                  = pb_data;
                qw_remain                               = (QWord)dw_size;
-               p_exp->dw_depth                 = 0;
-               memset( &((p_exp)->t_stack), 0x00,
-                       sizeof( LibGoblin_DWARF_Expression_Stack ) * LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH );
+               
+               if( 0 == p_exp->b_callers )     {
+                       p_exp->dw_depth                 = 0;
+                       memset( &((p_exp)->t_stack), 0x00,
+                               sizeof( LibGoblin_DWARF_Expression_Stack ) * LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH );
+               }
        }
        qw_value                                = 0x00000000;
        p_exp->result.qw_value  = 0x00000000;
@@ -393,7 +397,7 @@ DWord
                        case DW_OP_drop:                                // 0x13
                                if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
-                               qw_value        = POP_DWARF( p_exp );
+                               qw_pop[0]       = POP_DWARF( p_exp );
                                break;
                        case DW_OP_pick:                                // 0x15
                                b_value = *pb_now++;
@@ -435,6 +439,7 @@ DWord
                        case DW_OP_deref:                               // 0x06
                                if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
+                               qw_pop[0]       = POP_DWARF( p_exp );
 
                                if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_DEREF ) {
                                        qw_value        = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_DEREF ];
@@ -442,7 +447,7 @@ DWord
                                        p_exp->dw_setdata       &= (~LIBGOBLIN_DWARF_REQUEST_DEREF);
                                }
                                else    {
-                                       p_exp->ptr_reference.value      = (PtrValue)POP_DWARF( p_exp );
+                                       p_exp->ptr_reference.value      = (PtrValue)qw_pop[0];
                                        p_exp->dw_requested             |= LIBGOBLIN_DWARF_REQUEST_DEREF;
                                        qw_remain       = 0;    // for Loop-Break
                                }
@@ -450,6 +455,7 @@ DWord
                        case DW_OP_deref_size:                  // 0x94
                                if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
+                               qw_pop[0]       = POP_DWARF( p_exp );
 
                                b_value = *pb_now++;
                                qw_remain--;
@@ -461,7 +467,7 @@ DWord
                                }
                                else    {
                                        p_exp->dw_reqsize                       = (DWord)b_value;
-                                       p_exp->ptr_reference.value      = (PtrValue)POP_DWARF( p_exp );
+                                       p_exp->ptr_reference.value      = (PtrValue)qw_pop[0];
                                        p_exp->dw_requested             |= LIBGOBLIN_DWARF_REQUEST_DEREF;
                                        qw_remain       = 0;    // for Loop-Break
                                }
@@ -469,6 +475,8 @@ DWord
                        case DW_OP_xderef:                              // 0x18
                                if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
+                               qw_pop[0]       = POP_DWARF( p_exp );
+                               qw_pop[1]       = POP_DWARF( p_exp );
 
                                if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_XDEREF )        {
                                        qw_value        = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_XDEREF ];
@@ -476,8 +484,8 @@ DWord
                                        p_exp->dw_setdata       &= (~LIBGOBLIN_DWARF_REQUEST_XDEREF);
                                }
                                else    {
-                                       p_exp->ptr_reference.value      = (PtrValue)POP_DWARF( p_exp );
-                                       p_exp->qw_ident_addrspace       = POP_DWARF( p_exp );
+                                       p_exp->ptr_reference.value      = (PtrValue)qw_pop[0];
+                                       p_exp->qw_ident_addrspace       = qw_pop[1];
                                        p_exp->dw_requested             |= LIBGOBLIN_DWARF_REQUEST_XDEREF;
                                        qw_remain       = 0;    // for Loop-Break
                                }
@@ -485,6 +493,8 @@ DWord
                        case DW_OP_xderef_size:                 // 0x95
                                if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
+                               qw_pop[0]       = POP_DWARF( p_exp );
+                               qw_pop[1]       = POP_DWARF( p_exp );
 
                                b_value = *pb_now++;
                                qw_remain--;
@@ -496,8 +506,8 @@ DWord
                                }
                                else    {
                                        p_exp->dw_reqsize                       = (DWord)b_value;
-                                       p_exp->ptr_reference.value      = (PtrValue)POP_DWARF( p_exp );
-                                       p_exp->qw_ident_addrspace       = POP_DWARF( p_exp );
+                                       p_exp->ptr_reference.value      = (PtrValue)qw_pop[0];
+                                       p_exp->qw_ident_addrspace       = qw_pop[1];
                                        p_exp->dw_requested             |= LIBGOBLIN_DWARF_REQUEST_XDEREF;
                                        qw_remain       = 0;    // for Loop-Break
                                }
@@ -516,6 +526,7 @@ DWord
                        case DW_OP_form_tls_address:    // 0x9b
                                if( 1 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
+                               qw_pop[0]       = POP_DWARF( p_exp );
 
                                if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_TLSADDR )       {
                                        qw_value        = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_TLSADDR ];
@@ -523,7 +534,7 @@ DWord
                                        p_exp->dw_setdata       &= (~LIBGOBLIN_DWARF_REQUEST_TLSADDR);
                                }
                                else    {
-                                       p_exp->ptr_tlsbase.value        = (PtrValue)POP_DWARF( p_exp );
+                                       p_exp->ptr_tlsbase.value        = (PtrValue)qw_pop[0];
                                        p_exp->dw_requested                     |= LIBGOBLIN_DWARF_REQUEST_TLSADDR;
                                        qw_remain       = 0;    // for Loop-Break
                                }
@@ -544,8 +555,9 @@ DWord
                        case DW_OP_abs:                                 // 0x19
                                if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
-                               if( LIBGOBLIN_DWARF_STACK_SIGN == p_exp->t_stack[p_exp->dw_depth - 1].b_flag )  {
-                                       ii_value        = POP_DWARF_SIGN( p_exp );
+                               ii_value        = POP_DWARF_SIGN( p_exp );
+
+                               if( LIBGOBLIN_DWARF_STACK_SIGN == p_exp->t_stack[p_exp->dw_depth].b_flag )      {
                                        if( 0 > ii_value )      { ii_value      *= -1; }
                                        PUSH_DWARF_SIGN( p_exp, ii_value );
                                }
@@ -774,7 +786,6 @@ DWord
                                break;
 
                        case DW_OP_call2:                               // 0x98
-                               // 2019/09/10 (Required TEST!!)
                                w_value = *((Word *)pb_now);
                                pb_now          += 2;
                                qw_remain       -= 2;
@@ -788,7 +799,6 @@ DWord
                                goto    goto_DWARF_Expression_Evaluate_post;
                                break;  // NOT reach.
                        case DW_OP_call4:                               // 0x99
-                               // 2019/09/10 (Required TEST!!)
                                dw_value        = *((DWord *)pb_now);
                                pb_now          += 4;
                                qw_remain       -= 4;
index 5fa31bc..cb5440b 100644 (file)
@@ -777,7 +777,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 0xabcdef );
-       CU_ASSERT( 2 == p_exp->dw_depth );
+       CU_ASSERT( 1 == p_exp->dw_depth );
 
        // DW_OP_deref_size -------------
        b_data[0]       = DW_OP_deref_size;
@@ -815,7 +815,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 0xabcd );
-       CU_ASSERT( 2 == p_exp->dw_depth );
+       CU_ASSERT( 1 == p_exp->dw_depth );
 
        // DW_OP_xderef -----------------
        b_data[0]       = DW_OP_xderef;
@@ -851,7 +851,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 0xabcdef );
-       CU_ASSERT( 3 == p_exp->dw_depth );
+       CU_ASSERT( 1 == p_exp->dw_depth );
 
        // DW_OP_xderef_size ------------
        b_data[0]       = DW_OP_xderef_size;
@@ -890,7 +890,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 0xabcd );
-       CU_ASSERT( 3 == p_exp->dw_depth );
+       CU_ASSERT( 1 == p_exp->dw_depth );
 
        // DW_OP_push_object_address ----
        b_data[0]       = DW_OP_push_object_address;
@@ -959,7 +959,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 0xabcdef );
-       CU_ASSERT( 2 == p_exp->dw_depth );
+       CU_ASSERT( 1 == p_exp->dw_depth );
 
        // DW_OP_call_frame_cfa ---------
        b_data[0]       = DW_OP_call_frame_cfa;
@@ -1595,12 +1595,14 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void )
        b_data1[4]      = DW_OP_call2;
        b_data1[5]      = 0x81;
        b_data1[6]      = 0x01;         // value = 129 (0x81 0x01)
-       b_data2[7]      = DW_OP_deref;
+       b_data1[7]      = DW_OP_deref;
        DWARF_Expression_ClearValue( p_exp );
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data1, 8 );
        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 == 13 );
+       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;
@@ -1609,6 +1611,7 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void )
                                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 == 13 );
        CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
        CU_ASSERT( p_exp->dw_depth == 2 );
 
@@ -1637,7 +1640,12 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void )
                                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 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 7 );
+       CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 24 );
+       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 );
@@ -1650,34 +1658,155 @@ void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void )
                                LIBGOBLIN_DWARF_STATUS_RETCALL,
                                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 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 7 );
+       CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcd );
+       CU_ASSERT( 4 == p_exp->dw_depth );
 
 
-/* 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_NONE );
        CU_ASSERT( p_exp->b_callers == 0 );
-
        CU_ASSERT( p_exp->resume.pb_resume == b_data1 + 7 );
        CU_ASSERT( p_exp->resume.qw_remain == 1 );
-*/
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 7 );
+       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, 8 );
+       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 == 0xabcdef0123456789 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 13 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 7 );
+       CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 0xabcdef0123456789 );
+       CU_ASSERT( 4 == p_exp->dw_depth );
+
+
+       // DW_OP_call4:                 // 0x99
+       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_call4;
+       b_data1[5]      = 0x78;
+       b_data1[6]      = 0x56;
+       b_data1[7]      = 0x34;
+       b_data1[8]      = 0x12;
+       b_data1[9]      = DW_OP_deref;
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data1, 10 );
+       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_data1, 10 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+                               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 == 0x12345678 );
+       CU_ASSERT( p_exp->b_callers == 1 );
+       CU_ASSERT( p_exp->caller[ 0 ].pb_return == b_data1 + 9 );
+       CU_ASSERT( p_exp->caller[ 0 ].qw_retremain == 1 );
 
-       CU_ASSERT( p_exp->qw_calloffset == 0x181 );
+
+       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_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 + 7 );
+       CU_ASSERT( p_exp->caller[ 0 ].pb_return == b_data1 + 9 );
        CU_ASSERT( p_exp->caller[ 0 ].qw_retremain == 1 );
-*/
-       // DW_OP_call4:                 // 0x99
+       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, 10 );
+       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 + 9 );
+       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, 10 );
+       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 );
+
+
        // DW_OP_call_ref:                      // 0x9a