OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sat, 7 Sep 2019 08:04:46 +0000 (17:04 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sat, 7 Sep 2019 08:04:46 +0000 (17:04 +0900)
  * WorkBackup

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

index e493dab..4fe9afa 100644 (file)
@@ -75,13 +75,13 @@ int
                return -0x02;
        }
 
-       p_exp->dw_setdata       = LIBGOBLIN_DWARF_DATA_NONE;
+       p_exp->dw_setdata       = LIBGOBLIN_DWARF_REQUEST_NONE;
 
        if( LIBGOBLIN_BINFO_TYPE_ELF32 == p_binfo->b_type )
-               { p_exp->dw_addrsize    = 4; }
+               { p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ]  = 4; }
        else    // LIBGOBLIN_BINFO_TYPE_ELF64 
-               { p_exp->dw_addrsize    = 8; }
-       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_ADDRSIZE;
+               { p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ]  = 8; }
+       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_REQUEST_ADDRSIZE;
 
        return 0x00;
 }
@@ -130,7 +130,7 @@ DWord
        qw_remain                               = (( 0 == dw_size ) ? 512 : (QWord)dw_size );
        qw_value                                = 0x00000000;
        p_exp->result.qw_value  = 0x00000000;
-       p_exp->dw_requested             = LIBGOBLIN_DWARF_DATA_NONE;
+       p_exp->dw_requested             = LIBGOBLIN_DWARF_REQUEST_NONE;
        p_exp->dw_status                = LIBGOBLIN_DWARF_STATUS_ERROR;
        p_exp->dw_depth                 = 0;
        memset( &((p_exp)->t_stack), 0x00,
@@ -141,14 +141,50 @@ DWord
                qw_remain--;
 
                switch( b_opcode )      {
+                       // Constant Opcodes ----
+                       case DW_OP_lit0:                                // 0x30
+                       case DW_OP_lit1:                                // 0x31
+                       case DW_OP_lit2:                                // 0x32
+                       case DW_OP_lit3:                                // 0x33
+                       case DW_OP_lit4:                                // 0x34
+                       case DW_OP_lit5:                                // 0x35
+                       case DW_OP_lit6:                                // 0x36
+                       case DW_OP_lit7:                                // 0x37
+                       case DW_OP_lit8:                                // 0x38
+                       case DW_OP_lit9:                                // 0x39
+                       case DW_OP_lit10:                               // 0x3a
+                       case DW_OP_lit11:                               // 0x3b
+                       case DW_OP_lit12:                               // 0x3c
+                       case DW_OP_lit13:                               // 0x3d
+                       case DW_OP_lit14:                               // 0x3e
+                       case DW_OP_lit15:                               // 0x3f
+                       case DW_OP_lit16:                               // 0x40
+                       case DW_OP_lit17:                               // 0x41
+                       case DW_OP_lit18:                               // 0x42
+                       case DW_OP_lit19:                               // 0x43
+                       case DW_OP_lit20:                               // 0x44
+                       case DW_OP_lit21:                               // 0x45
+                       case DW_OP_lit22:                               // 0x46
+                       case DW_OP_lit23:                               // 0x47
+                       case DW_OP_lit24:                               // 0x48
+                       case DW_OP_lit25:                               // 0x49
+                       case DW_OP_lit26:                               // 0x4a
+                       case DW_OP_lit27:                               // 0x4b
+                       case DW_OP_lit28:                               // 0x4c
+                       case DW_OP_lit29:                               // 0x4d
+                       case DW_OP_lit30:                               // 0x4e
+                       case DW_OP_lit31:                               // 0x4f
+                               b_value = b_opcode - DW_OP_lit0;
+                               PUSH_DWARF( p_exp, (QWord)b_value );
+                               break;
+
                        case DW_OP_addr:                                // 0x03
-                               if( p_exp->dw_setdata & LIBGOBLIN_DWARF_DATA_ADDRSIZE )
-                                       { PUSH_DWARF( p_exp,  p_exp->dw_addrsize ); }
+                               if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_ADDRSIZE )
+                                       { PUSH_DWARF( p_exp,  p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ] ); }
                                else
-                                       { p_exp->dw_requested |= LIBGOBLIN_DWARF_DATA_ADDRSIZE; }
-                               break;
-                       case DW_OP_deref:                               // 0x06
+                                       { p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_ADDRSIZE; }
                                break;
+
                        case DW_OP_const1u:                             // 0x08
                                qw_value        = (QWord)*pb_now++;
                                qw_remain--;
@@ -205,6 +241,94 @@ DWord
                                PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
 
+                       // Register-Base Opcodes ----
+                       case DW_OP_fbreg:                               // 0x91
+                               pb_now  = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain );
+                               if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_FRAME_BASE )    {
+
+                                       if( 0 > ii_value )      {
+                                               qw_value        = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_FRAME_BASE ]
+                                                                                       - (QWord)(-1 * ii_value);
+                                       }
+                                       else    {
+                                               qw_value        = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_FRAME_BASE ]
+                                                                                       + (QWord)ii_value;
+                                       }
+
+                                       PUSH_DWARF( p_exp, qw_value );
+                               }
+                               else
+                                       { p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_FRAME_BASE; }
+
+                               break;
+                       case DW_OP_breg0:                               // 0x70
+                       case DW_OP_breg1:                               // 0x71
+                       case DW_OP_breg2:                               // 0x72
+                       case DW_OP_breg3:                               // 0x73
+                       case DW_OP_breg4:                               // 0x74
+                       case DW_OP_breg5:                               // 0x75
+                       case DW_OP_breg6:                               // 0x76
+                       case DW_OP_breg7:                               // 0x77
+                       case DW_OP_breg8:                               // 0x78
+                       case DW_OP_breg9:                               // 0x79
+                       case DW_OP_breg10:                              // 0x7a
+                       case DW_OP_breg11:                              // 0x7b
+                       case DW_OP_breg12:                              // 0x7c
+                       case DW_OP_breg13:                              // 0x7d
+                       case DW_OP_breg14:                              // 0x7e
+                       case DW_OP_breg15:                              // 0x7f
+                       case DW_OP_breg16:                              // 0x80
+                       case DW_OP_breg17:                              // 0x81
+                       case DW_OP_breg18:                              // 0x82
+                       case DW_OP_breg19:                              // 0x83
+                       case DW_OP_breg20:                              // 0x84
+                       case DW_OP_breg21:                              // 0x85
+                       case DW_OP_breg22:                              // 0x86
+                       case DW_OP_breg23:                              // 0x87
+                       case DW_OP_breg24:                              // 0x88
+                       case DW_OP_breg25:                              // 0x89
+                       case DW_OP_breg26:                              // 0x8a
+                       case DW_OP_breg27:                              // 0x8b
+                       case DW_OP_breg28:                              // 0x8c
+                       case DW_OP_breg29:                              // 0x8d
+                       case DW_OP_breg30:                              // 0x8e
+                       case DW_OP_breg31:                              // 0x8f
+                               b_reg   = b_opcode - DW_OP_breg0;
+                               pb_now  = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain );
+
+                               if( p_exp->dw_setdata & (LIBGOBLIN_DWARF_REQUEST_REG | b_reg) ) {
+                                       if( 0 > ii_value )
+                                               { qw_value      = p_exp->qw_reqdata[b_reg] - (QWord)(-1 * ii_value); }
+                                       else
+                                               { qw_value      = p_exp->qw_reqdata[b_reg] + (QWord)ii_value; }
+
+                                       PUSH_DWARF( p_exp, qw_value );
+                               }
+                               else
+                                       { p_exp->dw_requested |= (LIBGOBLIN_DWARF_REQUEST_REG | b_reg); }
+                               break;
+                       case DW_OP_bregx:                               // 0x92
+                               // Get RegID
+                               pb_now  = DWARF_Common_DecodeULEB128( &qw_value, pb_now, &qw_remain );
+                               b_reg   = (Byte)(qw_value & 0x1f);
+
+                               // Get Offset
+                               pb_now  = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain );
+
+                               if( p_exp->dw_setdata & (LIBGOBLIN_DWARF_REQUEST_REG | b_reg) ) {
+                                       if( 0 > ii_value )
+                                               { qw_value      = p_exp->qw_reqdata[b_reg] - (QWord)(-1 * ii_value); }
+                                       else
+                                               { qw_value      = p_exp->qw_reqdata[b_reg] + (QWord)ii_value; }
+
+                                       PUSH_DWARF( p_exp, qw_value );
+                               }
+                               else
+                                       { p_exp->dw_requested |= (LIBGOBLIN_DWARF_REQUEST_REG | b_reg); }
+                               break;
+
+
+                       // Stack Opcodes ----
                        case DW_OP_dup:                                 // 0x12
                                if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
@@ -212,37 +336,31 @@ DWord
                                qw_value        = p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value;
                                PUSH_DWARF( p_exp, qw_value );
                                break;
-
                        case DW_OP_drop:                                // 0x13
                                if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_value        = POP_DWARF( p_exp );
                                break;
+                       case DW_OP_pick:                                // 0x15
+                               b_value = *pb_now++;
+                               qw_remain--;
 
-                       case DW_OP_over:                                // 0x14
-                               if( 2 > p_exp->dw_depth )
+                               if( p_exp->dw_depth <= (DWord)b_value )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
-                               dw_value        = p_exp->dw_depth - 2;
+                               dw_value        = p_exp->dw_depth - (DWord)b_value - 1;
                                qw_value        = p_exp->t_stack[dw_value].value.qw_value;
                                PUSH_DWARF( p_exp, qw_value );
                                break;
-
-                       case DW_OP_pick:                                // 0x15
-                               // 2019/09/02 Lunch-Coding (Required TEST!!)
-                               b_value = *pb_now++;
-                               qw_remain--;
-
-                               if( p_exp->dw_depth < (DWord)b_value )
+                       case DW_OP_over:                                // 0x14
+                               if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
-                               dw_value        = p_exp->dw_depth - (DWord)b_value;
+                               dw_value        = p_exp->dw_depth - 2;
                                qw_value        = p_exp->t_stack[dw_value].value.qw_value;
                                PUSH_DWARF( p_exp, qw_value );
                                break;
-
                        case DW_OP_swap:                                // 0x16
-                               // 2019/09/03 Lunch-Coding (Required TEST!!)
                                if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_value        = p_exp->t_stack[p_exp->dw_depth - 2].value.qw_value;
@@ -250,9 +368,7 @@ DWord
                                                        = p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value;
                                p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value      = qw_value;
                                break;
-
                        case DW_OP_rot:                                 // 0x17
-                               // 2019/09/03 Lunch-Coding (Required TEST!!)
                                if( 3 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_value        = p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value;
@@ -263,8 +379,20 @@ DWord
                                p_exp->t_stack[p_exp->dw_depth - 3].value.qw_value      = qw_value;
                                break;
 
+                       case DW_OP_deref:                               // 0x06
+                               break;
+                       case DW_OP_deref_size:                  // 0x94
+                               break;
                        case DW_OP_xderef:                              // 0x18
                                break;
+                       case DW_OP_xderef_size:                 // 0x95
+                               break;
+                       case DW_OP_push_object_address: // 0x97
+                               break;
+                       case DW_OP_form_tls_address:    // 0x9b
+                               break;
+                       case DW_OP_call_frame_cfa:              // 0x9c
+                               break;
 
                        case DW_OP_abs:                                 // 0x19
                                // 2019/09/03 Lunch-Coding (Required TEST!!)
@@ -352,42 +480,6 @@ DWord
                        case DW_OP_skip:                                // 0x2f
                                break;
 
-                       case DW_OP_lit0:                                // 0x30
-                       case DW_OP_lit1:                                // 0x31
-                       case DW_OP_lit2:                                // 0x32
-                       case DW_OP_lit3:                                // 0x33
-                       case DW_OP_lit4:                                // 0x34
-                       case DW_OP_lit5:                                // 0x35
-                       case DW_OP_lit6:                                // 0x36
-                       case DW_OP_lit7:                                // 0x37
-                       case DW_OP_lit8:                                // 0x38
-                       case DW_OP_lit9:                                // 0x39
-                       case DW_OP_lit10:                               // 0x3a
-                       case DW_OP_lit11:                               // 0x3b
-                       case DW_OP_lit12:                               // 0x3c
-                       case DW_OP_lit13:                               // 0x3d
-                       case DW_OP_lit14:                               // 0x3e
-                       case DW_OP_lit15:                               // 0x3f
-                       case DW_OP_lit16:                               // 0x40
-                       case DW_OP_lit17:                               // 0x41
-                       case DW_OP_lit18:                               // 0x42
-                       case DW_OP_lit19:                               // 0x43
-                       case DW_OP_lit20:                               // 0x44
-                       case DW_OP_lit21:                               // 0x45
-                       case DW_OP_lit22:                               // 0x46
-                       case DW_OP_lit23:                               // 0x47
-                       case DW_OP_lit24:                               // 0x48
-                       case DW_OP_lit25:                               // 0x49
-                       case DW_OP_lit26:                               // 0x4a
-                       case DW_OP_lit27:                               // 0x4b
-                       case DW_OP_lit28:                               // 0x4c
-                       case DW_OP_lit29:                               // 0x4d
-                       case DW_OP_lit30:                               // 0x4e
-                       case DW_OP_lit31:                               // 0x4f
-                               b_value = b_opcode - DW_OP_lit0;
-                               PUSH_DWARF( p_exp, (QWord)b_value );
-                               break;
-
                        case DW_OP_reg0:                                // 0x50
                                break;
                        case DW_OP_reg1:                                // 0x51
@@ -452,110 +544,18 @@ DWord
                                break;
                        case DW_OP_reg31:                               // 0x6f
                                break;
-
-                       case DW_OP_breg0:                               // 0x70
-                       case DW_OP_breg1:                               // 0x71
-                       case DW_OP_breg2:                               // 0x72
-                       case DW_OP_breg3:                               // 0x73
-                       case DW_OP_breg4:                               // 0x74
-                       case DW_OP_breg5:                               // 0x75
-                       case DW_OP_breg6:                               // 0x76
-                       case DW_OP_breg7:                               // 0x77
-                       case DW_OP_breg8:                               // 0x78
-                       case DW_OP_breg9:                               // 0x79
-                       case DW_OP_breg10:                              // 0x7a
-                       case DW_OP_breg11:                              // 0x7b
-                       case DW_OP_breg12:                              // 0x7c
-                       case DW_OP_breg13:                              // 0x7d
-                       case DW_OP_breg14:                              // 0x7e
-                       case DW_OP_breg15:                              // 0x7f
-                       case DW_OP_breg16:                              // 0x80
-                       case DW_OP_breg17:                              // 0x81
-                       case DW_OP_breg18:                              // 0x82
-                       case DW_OP_breg19:                              // 0x83
-                       case DW_OP_breg20:                              // 0x84
-                       case DW_OP_breg21:                              // 0x85
-                       case DW_OP_breg22:                              // 0x86
-                       case DW_OP_breg23:                              // 0x87
-                       case DW_OP_breg24:                              // 0x88
-                       case DW_OP_breg25:                              // 0x89
-                       case DW_OP_breg26:                              // 0x8a
-                       case DW_OP_breg27:                              // 0x8b
-                       case DW_OP_breg28:                              // 0x8c
-                       case DW_OP_breg29:                              // 0x8d
-                       case DW_OP_breg30:                              // 0x8e
-                       case DW_OP_breg31:                              // 0x8f
-                               b_reg   = b_opcode - DW_OP_breg0;
-                               pb_now  = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain );
-
-                               if( p_exp->dw_setdata & (LIBGOBLIN_DWARF_DATA_REG | b_reg) )    {
-                                       if( 0 > ii_value )
-                                               { qw_value      = p_exp->qw_reg[b_reg] - (QWord)(-1 * ii_value); }
-                                       else
-                                               { qw_value      = p_exp->qw_reg[b_reg] + (QWord)ii_value; }
-
-                                       PUSH_DWARF( p_exp, qw_value );
-                               }
-                               else
-                                       { p_exp->dw_requested |= (LIBGOBLIN_DWARF_DATA_REG | b_reg); }
-                               break;
-
                        case DW_OP_regx:                                // 0x90
                                break;
-                       case DW_OP_fbreg:                               // 0x91
-                               pb_now  = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain );
-                               if( p_exp->dw_setdata & LIBGOBLIN_DWARF_DATA_FRAME_BASE )       {
-
-                                       if( 0 > ii_value )
-                                               { qw_value      = p_exp->qw_frame_base - (QWord)(-1 * ii_value); }
-                                       else
-                                               { qw_value      = p_exp->qw_frame_base + (QWord)ii_value; }
-
-                                       PUSH_DWARF( p_exp, qw_value );
-                               }
-                               else
-                                       { p_exp->dw_requested |= LIBGOBLIN_DWARF_DATA_FRAME_BASE; }
-
-                               break;
-                       case DW_OP_bregx:                               // 0x92
-                               // Get RegID
-                               pb_now  = DWARF_Common_DecodeULEB128( &qw_value, pb_now, &qw_remain );
-                               b_reg   = (Byte)(qw_value & 0x1f);
-
-                               // Get Offset
-                               pb_now  = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain );
-
-                               if( p_exp->dw_setdata & (LIBGOBLIN_DWARF_DATA_REG | b_reg) )    {
-                                       if( 0 > ii_value )
-                                               { qw_value      = p_exp->qw_reg[b_reg] - (QWord)(-1 * ii_value); }
-                                       else
-                                               { qw_value      = p_exp->qw_reg[b_reg] + (QWord)ii_value; }
-
-                                       PUSH_DWARF( p_exp, qw_value );
-                               }
-                               else
-                                       { p_exp->dw_requested |= (LIBGOBLIN_DWARF_DATA_REG | b_reg); }
-                               break;
                        case DW_OP_piece:                               // 0x93
                                break;
-                       case DW_OP_deref_size:                  // 0x94
-                               break;
-                       case DW_OP_xderef_size:                 // 0x95
-                               break;
                        case DW_OP_nop:                                 // 0x96
                                break;
-                       case DW_OP_push_object_address: // 0x97
-                               break;
                        case DW_OP_call2:                               // 0x98
                                break;
                        case DW_OP_call4:                               // 0x99
                                break;
                        case DW_OP_call_ref:                    // 0x9a
                                break;
-                       case DW_OP_form_tls_address:    // 0x9b
-                               break;
-                       case DW_OP_call_frame_cfa:              // 0x9c
-                               break;
                        case DW_OP_bit_piece:                   // 0x9d
                                break;
                        case DW_OP_implicit_value:              // 0x9e
@@ -598,7 +598,7 @@ DWord
 
        }while( 0 < qw_remain );
 
-       if( LIBGOBLIN_DWARF_DATA_NONE != p_exp->dw_requested )
+       if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_requested )
                { p_exp->dw_status      = LIBGOBLIN_DWARF_STATUS_REQUESTED; }
        else if( 0 < p_exp->dw_depth )  {
                p_exp->dw_status                = LIBGOBLIN_DWARF_STATUS_EVALUATED;
index 685cafc..3292e8c 100644 (file)
@@ -45,10 +45,16 @@ Comment:
 #define        LIBGOBLIN_DWARF_STATUS_ERROR            0x10
 
 // bit 4-0 is REG num. (MASK: 0x1f)
-#define        LIBGOBLIN_DWARF_DATA_NONE                       0x00000000
-#define        LIBGOBLIN_DWARF_DATA_REG                        0x00000100
-#define        LIBGOBLIN_DWARF_DATA_ADDRSIZE           0x00000200
-#define        LIBGOBLIN_DWARF_DATA_FRAME_BASE         0x00000400
+#define        LIBGOBLIN_DWARF_REQUEST_NONE                    0x00000000
+#define        LIBGOBLIN_DWARF_REQUEST_REG                             0x00000100
+#define        LIBGOBLIN_DWARF_REQUEST_ADDRSIZE                0x00000200
+#define        LIBGOBLIN_DWARF_REQUEST_FRAME_BASE              0x00000400
+
+#define        LIBGOBLIN_DWARF_REQDATA_MAX                                       0x40
+#define        LIBGOBLIN_DWARF_DATAID_REG                              0x0000001f      // 0x00 - 0x1f
+#define        LIBGOBLIN_DWARF_DATAID_ADDRSIZE                 0x00000020
+#define        LIBGOBLIN_DWARF_DATAID_FRAME_BASE               0x00000021
+
 
 /*=====================================================================*/
 #define        LIBGOBLIN_DWARF_STACK_SIGN      0x01
@@ -76,10 +82,7 @@ typedef      struct  {
                Int64   ii_value;
        } result;
 
-       QWord   qw_reg[32];             // for DW_OP_bregX
-       DWord   dw_addrsize;    // for DW_OP_addr
-       QWord   qw_frame_base;  // for DW_OP_fbreg (value is DW_AT_frame_base)
-
+       QWord   qw_reqdata[LIBGOBLIN_DWARF_REQDATA_MAX];
 
        DWord   dw_depth;
        LibGoblin_DWARF_Expression_Stack        t_stack[ LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH ];
index 18b23a5..69b915c 100644 (file)
@@ -151,8 +151,10 @@ void Test_LibGoblin_DWARF_Expression_CheckLitX(
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == qw_value );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == qw_value );
+       CU_ASSERT( p_exp->dw_depth == 1 );
 
        i_result        = DWARF_Expression_Free( p_exp );
        CU_ASSERT( 0x00 == i_result );
@@ -224,15 +226,17 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
-                               LIBGOBLIN_DWARF_DATA_ADDRSIZE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_ADDRSIZE, LIBGOBLIN_DWARF_REQUEST_NONE );
 
-       p_exp->dw_addrsize      = 8;
-       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_ADDRSIZE;
+       p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ]    = 8;
+       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_REQUEST_ADDRSIZE;
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_ADDRSIZE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_ADDRSIZE );
        CU_ASSERT( p_exp->result.qw_value == 8 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 8 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
 
        // DW_OP_const1u --------------
        b_data[0]       = DW_OP_const1u;
@@ -241,8 +245,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 0x12 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x12 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
        
        // DW_OP_const1s --------------
        b_data[0]       = DW_OP_const1s;
@@ -251,8 +257,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.ii_value == -1 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -1 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
        
        // DW_OP_const2u --------------
        b_data[0]       = DW_OP_const2u;
@@ -262,8 +270,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 0x1234 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x1234 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
        
        // DW_OP_const2s --------------
        b_data[0]       = DW_OP_const2s;
@@ -273,8 +283,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.ii_value == -12345 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -12345 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
 
        // DW_OP_const4u --------------
        b_data[0]       = DW_OP_const4u;
@@ -284,8 +296,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 5 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 0x12345678 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x12345678 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
        
        // DW_OP_const4s --------------
        b_data[0]       = DW_OP_const4s;
@@ -295,8 +309,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 5 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.ii_value == -1234567890 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -1234567890 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
 
        // DW_OP_const8u --------------
        b_data[0]       = DW_OP_const8u;
@@ -306,8 +322,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 9 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value ==  0x1234567890abcdef );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x1234567890abcdef );
+       CU_ASSERT( p_exp->dw_depth == 1 );
        
        // DW_OP_const8s --------------
        b_data[0]       = DW_OP_const8s;
@@ -317,8 +335,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 9 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.ii_value == -123456789012345 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -123456789012345 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
 
        // DW_OP_constu --------------
        b_data[0]       = DW_OP_constu;
@@ -328,8 +348,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 12857 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 12857 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
        
        // DW_OP_consts --------------
        b_data[0]       = DW_OP_consts;
@@ -339,8 +361,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.ii_value == -129 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -129 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
        
 
        i_result        = DWARF_Expression_Free( p_exp );
@@ -375,28 +399,32 @@ void Test_LibGoblin_DWARF_Expression_RegBase_bregX( Byte b_opcode )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
-                               (LIBGOBLIN_DWARF_DATA_REG | b_reg), LIBGOBLIN_DWARF_DATA_NONE );
+                               (LIBGOBLIN_DWARF_REQUEST_REG | b_reg), LIBGOBLIN_DWARF_REQUEST_NONE );
 
-       p_exp->qw_reg[b_reg]    = 0x80000000;
-       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_DATA_REG | b_reg);
+       p_exp->qw_reqdata[b_reg]        = 0x80000000;
+       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_REQUEST_REG | b_reg);
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | b_reg) );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | b_reg) );
        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]       = b_opcode;
        b_data[1]       = 0xff;
        b_data[2]       = 0x7e;         // value = -129 (0xff 0x7e)
        DWARF_Expression_ClearValue( p_exp );
-       p_exp->qw_reg[b_reg]    = 0x80000000;
-       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_DATA_REG | b_reg);
+       p_exp->qw_reqdata[b_reg]        = 0x80000000;
+       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_REQUEST_REG | b_reg);
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | b_reg) );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | b_reg) );
        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 );
@@ -426,28 +454,32 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
-                               LIBGOBLIN_DWARF_DATA_FRAME_BASE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE );
 
-       p_exp->qw_frame_base    = 0x80000000;
-       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
+       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_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE );
+                               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_frame_base    = 0x80000000;
-       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
+       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_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE );
+                               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 );
 
 
        // DW_OP_bregX --------------
@@ -494,15 +526,17 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 4 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
-                               (LIBGOBLIN_DWARF_DATA_REG | 0x0a), LIBGOBLIN_DWARF_DATA_NONE );
+                               (LIBGOBLIN_DWARF_REQUEST_REG | 0x0a), LIBGOBLIN_DWARF_REQUEST_NONE );
 
-       p_exp->qw_reg[0x0a]     = 0x80000000;
-       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_DATA_REG | 0x0a );
+       p_exp->qw_reqdata[0x0a] = 0x80000000;
+       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_REQUEST_REG | 0x0a );
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 4 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | 0x0a) );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | 0x0a) );
        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_bregx;
@@ -510,13 +544,15 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void )
        b_data[2]       = 0xff;
        b_data[3]       = 0x7e;         // value = -129 (0xff 0x7e)
        DWARF_Expression_ClearValue( p_exp );
-       p_exp->qw_reg[0x1f]     = 0x80000000;
-       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_DATA_REG | 0x1f );
+       p_exp->qw_reqdata[0x1f] = 0x80000000;
+       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_REQUEST_REG | 0x1f );
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 4 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | 0x1f ) );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | 0x1f ) );
        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 );
@@ -551,7 +587,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
 
        b_data[0]       = DW_OP_lit10;
        b_data[1]       = DW_OP_dup;
@@ -559,8 +595,11 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 10 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 10 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 10 );
+       CU_ASSERT( p_exp->dw_depth == 2 );
 
        // DW_OP_drop ---------------
        b_data[0]       = DW_OP_drop;
@@ -568,7 +607,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
 
        b_data[0]       = DW_OP_lit10;
        b_data[1]       = DW_OP_drop;
@@ -576,7 +615,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
 
        b_data[0]       = DW_OP_lit31;
        b_data[1]       = DW_OP_lit10;
@@ -585,8 +624,46 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 31 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 31 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 10 );
+       CU_ASSERT( p_exp->dw_depth == 1 );
+
+       // DW_OP_pick ---------------
+       b_data[0]       = DW_OP_pick;
+       b_data[1]       = 2;
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+                               LIBGOBLIN_DWARF_STATUS_ERROR,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+
+       b_data[0]       = DW_OP_lit10;
+       b_data[1]       = DW_OP_pick;
+       b_data[2]       = 2;
+       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_ERROR,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+
+       b_data[0]       = DW_OP_lit10;
+       b_data[1]       = DW_OP_lit20;
+       b_data[2]       = DW_OP_lit30;
+       b_data[3]       = DW_OP_pick;
+       b_data[4]       = 2;
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 5 );
+       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 == 10 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 10 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 20 );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 30 );
+       CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 10 );
+       CU_ASSERT( p_exp->dw_depth == 4 );
 
        // DW_OP_over ---------------
        b_data[0]       = DW_OP_over;
@@ -594,7 +671,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
 
        b_data[0]       = DW_OP_lit10;
        b_data[1]       = DW_OP_over;
@@ -602,20 +679,79 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
-                               LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
 
        b_data[0]       = DW_OP_lit30;
        b_data[1]       = DW_OP_lit11;
-       b_data[2]       = DW_OP_drop;
+       b_data[2]       = DW_OP_over;
        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_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
        CU_ASSERT( p_exp->result.qw_value == 30 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 30 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 11 );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 30 );
+       CU_ASSERT( p_exp->dw_depth == 3 );
 
-       // DW_OP_pick ---------------
+       // DW_OP_swap ---------------
+       b_data[0]       = DW_OP_lit10;
+       b_data[1]       = DW_OP_swap;
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
+                               LIBGOBLIN_DWARF_STATUS_ERROR,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+
+       b_data[0]       = DW_OP_lit10;
+       b_data[1]       = DW_OP_lit20;
+       b_data[2]       = DW_OP_lit30;
+       b_data[3]       = DW_OP_swap;
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 4 );
+       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 == 20 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 10 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 30 );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 20 );
+       CU_ASSERT( p_exp->dw_depth == 3 );
+
+       // DW_OP_rot ---------------
+       b_data[0]       = DW_OP_lit10;
+       b_data[1]       = DW_OP_lit20;
+       b_data[2]       = DW_OP_rot;
+       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_ERROR,
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
 
+       b_data[0]       = DW_OP_lit10;
+       b_data[1]       = DW_OP_lit20;
+       b_data[2]       = DW_OP_lit30;
+       b_data[3]       = DW_OP_rot;
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 4 );
+       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 == 20 );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 30 );
+       CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 10 );
+       CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 20 );
+       CU_ASSERT( p_exp->dw_depth == 3 );
+
+       // DW_OP_deref ------------------
+       // DW_OP_deref_size -------------
+       // DW_OP_xderef -----------------
+       // DW_OP_xderef_size ------------
+       // DW_OP_push_object_address ----
+       // DW_OP_form_tls_address -------
+       // DW_OP_call_frame_cfa ---------
+       
 
        // DW_OP_fbreg --------------
 /*
@@ -626,14 +762,14 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
        dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
-                               LIBGOBLIN_DWARF_DATA_FRAME_BASE, LIBGOBLIN_DWARF_DATA_NONE );
+                               LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE );
 
        p_exp->qw_frame_base    = 0x80000000;
-       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
+       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_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE );
+                               LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_FRAME_BASE );
        CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) );
 */