OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Thu, 12 Sep 2019 20:49:27 +0000 (05:49 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Thu, 12 Sep 2019 20:49:27 +0000 (05:49 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/test_libgoblin_dwarf_expression.c

index 4057019..b9fac76 100644 (file)
@@ -146,10 +146,14 @@ DWord
                p_exp->resume.pb_resume = NULL;
                p_exp->resume.qw_remain = 0;
        }
-       else if( NULL != p_exp->caller[ p_exp->b_callers ].pb_return )  {
+       else if( LIBGOBLIN_DWARF_STATUS_RETCALL == p_exp->dw_status )   {
                // XXX Position Check!!
-               if( 0 < p_exp->b_callers )      { p_exp->b_callers--; }
+               if( 0 == p_exp->b_callers )
+                       { goto  goto_DWARF_Expression_Evaluate_post; }
 
+               p_exp->b_callers--;
+
+               assert(  NULL != p_exp->caller[ p_exp->b_callers ].pb_return );
                pb_now          = p_exp->caller[ p_exp->b_callers ].pb_return;
                qw_remain       = p_exp->caller[ p_exp->b_callers ].qw_retremain;
 
@@ -761,10 +765,9 @@ DWord
                                qw_remain       -= 2;
                                
                                p_exp->qw_calloffset    = (QWord)w_value;
-                               p_exp->caller[ p_exp->b_callers ].pb_return             = pb_resume;
-                               p_exp->caller[ p_exp->b_callers ].qw_retremain  = qw_resume;
+                               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_depth         = dw_depth_resume;
                                p_exp->dw_status        = LIBGOBLIN_DWARF_STATUS_CALLING;
 
                                goto    goto_DWARF_Expression_Evaluate_post;
@@ -776,10 +779,9 @@ DWord
                                qw_remain       -= 4;
                                
                                p_exp->qw_calloffset    = (QWord)dw_value;
-                               p_exp->caller[ p_exp->b_callers ].pb_return             = pb_resume;
-                               p_exp->caller[ p_exp->b_callers ].qw_retremain  = qw_resume;
+                               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_depth         = dw_depth_resume;
                                p_exp->dw_status        = LIBGOBLIN_DWARF_STATUS_CALLING;
 
                                goto    goto_DWARF_Expression_Evaluate_post;
@@ -881,13 +883,16 @@ DWord
                p_exp->resume.qw_remain = qw_resume;
                p_exp->dw_depth                 = dw_depth_resume;
                p_exp->dw_status                = LIBGOBLIN_DWARF_STATUS_REQUESTED;
+               goto    goto_DWARF_Expression_Evaluate_post;
        }
-/*
-       else if( NULL != p_exp->resume.pb_resume )      {
+
+       if( 0 < p_exp->b_callers )      {
+               assert( NULL != p_exp->caller[ p_exp->b_callers - 1 ].pb_return );
                p_exp->dw_status        = LIBGOBLIN_DWARF_STATUS_RETCALL;
+               goto    goto_DWARF_Expression_Evaluate_post;
        }
-*/
-       else if( 0 < p_exp->dw_depth )  {
+
+       if( 0 < p_exp->dw_depth )       {
                p_exp->dw_status                = LIBGOBLIN_DWARF_STATUS_EVALUATED;
                p_exp->result.qw_value  = p_exp->t_stack[ p_exp->dw_depth - 1 ].value.qw_value;
        }
index aee0497..e08c74a 100644 (file)
@@ -1006,6 +1006,313 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
 }
 
 
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_ArithmeticLogical_test01_001( void )
+{
+       int             i_result;
+       Byte    b_data[16];
+       DWord   dw_result;
+       LibGoblin_DWARF_Expression      *p_exp;
+
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       p_exp           = DWARF_Expression_Alloc();
+       CU_ASSERT( NULL != p_exp );
+
+       // DW_OP_abs:                           // 0x19
+       // DW_OP_and:                           // 0x1a
+       // DW_OP_div:                           // 0x1b
+       // DW_OP_minus:                 // 0x1c
+       // DW_OP_mod:                           // 0x1d
+       // DW_OP_mul:                           // 0x1e
+       // DW_OP_neg:                           // 0x1f
+       // \9bjDW_OP_not:                         // 0x20
+       // DW_OP_or:                            // 0x21
+       // DW_OP_plus:                          // 0x22
+       // DW_OP_plus_uconst:           // 0x23
+       // DW_OP_shl:                           // 0x24
+       // DW_OP_shr:                           // 0x25
+       // DW_OP_shra:                          // 0x26
+       // DW_OP_xor:                           // 0x27
+
+/*
+       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 );
+*/
+
+
+
+       i_result        = DWARF_Expression_Free( p_exp );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = DWARF_Expression_Term();
+       CU_ASSERT( 0x00 == i_result );
+
+       return;
+}
+
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_FlowControl_test01_001( void )
+{
+       int             i_result;
+       Byte    b_data[16];
+       DWord   dw_result;
+       LibGoblin_DWARF_Expression      *p_exp;
+
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       p_exp           = DWARF_Expression_Alloc();
+       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
+       // DW_OP_ne:                            // 0x2e
+       // DW_OP_skip:                          // 0x2f
+       // DW_OP_bra:                           // 0x28
+
+/*
+       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 );
+*/
+
+
+
+       i_result        = DWARF_Expression_Free( p_exp );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = DWARF_Expression_Term();
+       CU_ASSERT( 0x00 == i_result );
+
+       return;
+}
+
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_FlowControl_test02_001( void )
+{
+       int             i_result;
+       Byte    b_data1[16];
+       Byte    b_data2[16];
+       DWord   dw_result;
+       LibGoblin_DWARF_Expression      *p_exp;
+
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       p_exp           = DWARF_Expression_Alloc();
+       CU_ASSERT( NULL != p_exp );
+
+       // DW_OP_call2:                 // 0x98
+       b_data1[0]      = DW_OP_lit13;
+       b_data1[1]      = DW_OP_fbreg;
+       b_data1[2]      = 0x81;
+       b_data1[3]      = 0x01;         // value = 129 (0x81 0x01)
+       b_data1[4]      = DW_OP_call2;
+       b_data1[5]      = 0x81;
+       b_data1[6]      = 0x01;         // value = 129 (0x81 0x01)
+       b_data2[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 );
+
+       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, 8 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+                               LIBGOBLIN_DWARF_STATUS_CALLING,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_FRAME_BASE );
+       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 );
+
+       CU_ASSERT( p_exp->qw_calloffset == 0x181 );
+       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 );
+
+
+       b_data2[0]      = DW_OP_lit7;
+       b_data2[1]      = DW_OP_lit24;
+       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;
+       //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 );
+       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->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 );
+       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 !! 
+/*
+       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 );
+       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->result.qw_value == 0x00 );
+       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 == 0x181 );
+       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 );
+*/
+       // DW_OP_call4:                 // 0x99
+       // 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 );
+       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 );
+*/
+
+
+
+       i_result        = DWARF_Expression_Free( p_exp );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = DWARF_Expression_Term();
+       CU_ASSERT( 0x00 == i_result );
+
+       return;
+}
+
+
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 DRD64_TEST_LIBGOBLIN_DWARF_EXPRESSION_EXTERN
@@ -1026,37 +1333,19 @@ int
                                                                 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 );
+
+       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 );
        return 0x00;
 }
 
 
 /* EOF of drd64_.c ----------------------------------- */
 /*
-       DW_OP_swap:                             // 0x16
-       DW_OP_rot:                              // 0x17
-       DW_OP_abs:                              // 0x19
-       DW_OP_and:                              // 0x1a
-       DW_OP_div:                              // 0x1b
-       DW_OP_minus:                    // 0x1c
-       DW_OP_mod:                              // 0x1d
-       DW_OP_mul:                              // 0x1e
-       DW_OP_neg:                              // 0x1f
-       DW_OP_not:                              // 0x20
-       DW_OP_or:                               // 0x21
-       DW_OP_plus:                             // 0x22
-       DW_OP_plus_uconst:              // 0x23
-       DW_OP_shl:                              // 0x24
-       DW_OP_shr:                              // 0x25
-       DW_OP_shra:                             // 0x26
-       DW_OP_xor:                              // 0x27
-       DW_OP_bra:                              // 0x28
-       DW_OP_eq:                               // 0x29
-       DW_OP_ge:                               // 0x2a
-       DW_OP_gt:                               // 0x2b
-       DW_OP_le:                               // 0x2c
-       DW_OP_lt:                               // 0x2d
-       DW_OP_ne:                               // 0x2e
-       DW_OP_skip:                             // 0x2f
        DW_OP_reg0:                             // 0x50
        DW_OP_reg1:                             // 0x51
        DW_OP_reg2:                             // 0x52
@@ -1091,13 +1380,10 @@ int
        DW_OP_reg31:                    // 0x6f
        DW_OP_regx:                             // 0x90
        DW_OP_piece:                    // 0x93
-       DW_OP_nop:                              // 0x96
-       DW_OP_call2:                    // 0x98
-       DW_OP_call4:                    // 0x99
-       DW_OP_call_ref:                 // 0x9a
        DW_OP_bit_piece:                // 0x9d
        DW_OP_implicit_value:   // 0x9e
        DW_OP_stack_value:              // 0x9f
+       DW_OP_nop:                              // 0x96
        DW_OP_lo_user:                  // 0xe0
        DW_OP_hi_user:                  // 0xff
        DW_OP_GNU_push_tls_address:     // 0xe0