OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sat, 7 Sep 2019 11:57:20 +0000 (20:57 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sat, 7 Sep 2019 11:57:20 +0000 (20:57 +0900)
  * WorkBackup

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

index 4fe9afa..5ee8724 100644 (file)
@@ -133,6 +133,8 @@ DWord
        p_exp->dw_requested             = LIBGOBLIN_DWARF_REQUEST_NONE;
        p_exp->dw_status                = LIBGOBLIN_DWARF_STATUS_ERROR;
        p_exp->dw_depth                 = 0;
+       if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_setdata )
+               { p_exp->dw_reqsize             = 0; }
        memset( &((p_exp)->t_stack), 0x00,
                sizeof( LibGoblin_DWARF_Expression_Stack ) * LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH );
 
@@ -378,14 +380,71 @@ DWord
                                                        = p_exp->t_stack[p_exp->dw_depth - 3].value.qw_value;
                                p_exp->t_stack[p_exp->dw_depth - 3].value.qw_value      = qw_value;
                                break;
-
                        case DW_OP_deref:                               // 0x06
+                               // Required TEST!!
+                               if( 0 == p_exp->dw_depth )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_DEREF ) {
+                                       qw_value        = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_DEREF ];
+                                       PUSH_DWARF( p_exp, qw_value );
+                               }
+                               else    {
+                                       p_exp->ptr_reference.value      = (PtrValue)POP_DWARF( p_exp );
+                                       p_exp->dw_requested             |= LIBGOBLIN_DWARF_REQUEST_DEREF;
+                               }
                                break;
                        case DW_OP_deref_size:                  // 0x94
+                               // Required TEST!!
+                               if( 0 == p_exp->dw_depth )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               b_value = *pb_now++;
+                               qw_remain--;
+
+                               if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_DEREF ) {
+                                       qw_value        = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_DEREF ];
+                                       PUSH_DWARF( p_exp, qw_value );
+                               }
+                               else    {
+                                       p_exp->dw_reqsize                       = (DWord)b_value;
+                                       p_exp->ptr_reference.value      = (PtrValue)POP_DWARF( p_exp );
+                                       p_exp->dw_requested             |= LIBGOBLIN_DWARF_REQUEST_DEREF;
+                               }
                                break;
                        case DW_OP_xderef:                              // 0x18
+                               // Required TEST!!
+                               if( 2 > p_exp->dw_depth )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_XDEREF )        {
+                                       qw_value        = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_XDEREF ];
+                                       PUSH_DWARF( p_exp, qw_value );
+                               }
+                               else    {
+                                       p_exp->ptr_reference.value      = (PtrValue)POP_DWARF( p_exp );
+                                       p_exp->qw_ident_addrspace       = POP_DWARF( p_exp );
+                                       p_exp->dw_requested             |= LIBGOBLIN_DWARF_REQUEST_XDEREF;
+                               }
                                break;
                        case DW_OP_xderef_size:                 // 0x95
+                               // Required TEST!!
+                               if( 2 > p_exp->dw_depth )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               b_value = *pb_now++;
+                               qw_remain--;
+
+                               if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_XDEREF )        {
+                                       qw_value        = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_XDEREF ];
+                                       PUSH_DWARF( p_exp, qw_value );
+                               }
+                               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->dw_requested             |= LIBGOBLIN_DWARF_REQUEST_XDEREF;
+                               }
                                break;
                        case DW_OP_push_object_address: // 0x97
                                break;
@@ -398,7 +457,7 @@ DWord
                                // 2019/09/03 Lunch-Coding (Required TEST!!)
                                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].b_flag )      {
+                               if( LIBGOBLIN_DWARF_STACK_SIGN == p_exp->t_stack[p_exp->dw_depth].b_flag )      {
                                        ii_value        = POP_DWARF_SIGN( p_exp );
                                        if( 0 > ii_value )      { ii_value      *= -1; }
                                        PUSH_DWARF_SIGN( p_exp, ii_value );
@@ -598,8 +657,14 @@ DWord
 
        }while( 0 < qw_remain );
 
-       if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_requested )
-               { p_exp->dw_status      = LIBGOBLIN_DWARF_STATUS_REQUESTED; }
+       if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_requested )       {
+               if( 0 == p_exp->dw_reqsize )    {
+                       if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_ADDRSIZE )
+                               { p_exp->dw_reqsize     = (DWord)p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ]; }
+                       else    { p_exp->dw_reqsize     = 8; }
+               }
+               p_exp->dw_status        = LIBGOBLIN_DWARF_STATUS_REQUESTED;
+       }
        else 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 3292e8c..6eb56d4 100644 (file)
@@ -49,11 +49,15 @@ Comment:
 #define        LIBGOBLIN_DWARF_REQUEST_REG                             0x00000100
 #define        LIBGOBLIN_DWARF_REQUEST_ADDRSIZE                0x00000200
 #define        LIBGOBLIN_DWARF_REQUEST_FRAME_BASE              0x00000400
+#define        LIBGOBLIN_DWARF_REQUEST_DEREF                   0x00000800
+#define        LIBGOBLIN_DWARF_REQUEST_XDEREF                  0x00001000
 
 #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_DATAID_DEREF                    0x00000022
+#define        LIBGOBLIN_DWARF_DATAID_XDEREF                   0x00000023
 
 
 /*=====================================================================*/
@@ -82,6 +86,9 @@ typedef       struct  {
                Int64   ii_value;
        } result;
 
+       DWord   dw_reqsize;
+       Ptr             ptr_reference;
+       QWord   qw_ident_addrspace;
        QWord   qw_reqdata[LIBGOBLIN_DWARF_REQDATA_MAX];
 
        DWord   dw_depth;
index 69b915c..18c254a 100644 (file)
@@ -803,7 +803,6 @@ 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 );
-
        return 0x00;
 }