OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 23 Sep 2019 08:51:36 +0000 (17:51 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 23 Sep 2019 08:51:36 +0000 (17:51 +0900)
  * WorkBackup(Correct DW_OP_addr proc.)

libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/test_libgoblin_dwarf_expression.c

index 51d5e35..531acc4 100644 (file)
@@ -144,6 +144,9 @@ DWord
        }
 
        if( 0 == p_exp->b_dwsize )      { p_exp->b_dwsize       = 8; }
+       if((4 != p_exp->b_dwsize) && (8 != p_exp->b_dwsize))    {
+               return  (LIBGOBLIN_DWARF_STATUS_ERROR | 0x03);
+       }
 
        // ------------------------
        if( NULL != p_exp->resume.pb_resume )   {
@@ -232,14 +235,16 @@ DWord
                                break;
 
                        case DW_OP_addr:                                // 0x03
-                               if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_ADDRSIZE )      {
-                                       PUSH_DWARF( p_exp,  p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ] );
-                                       p_exp->dw_setdata       &= (~LIBGOBLIN_DWARF_REQUEST_ADDRSIZE);
-                               }
-                               else    {
-                                       p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_ADDRSIZE;
-                                       qw_remain       = 0;    // for Loop-Break
-                               }
+                               if( p_exp->b_dwsize > qw_remain )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               if( 8 == p_exp->b_dwsize )
+                                       { qw_value      = (QWord)*((QWord *)pb_now); }
+                               else if( 4 == p_exp->b_dwsize )
+                                       { qw_value      = (QWord)*((DWord *)pb_now); }
+                               pb_now          += p_exp->b_dwsize;
+                               qw_remain       -= p_exp->b_dwsize;
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
 
                        case DW_OP_const1u:                             // 0x08
index e2c0984..4bfa2ee 100644 (file)
@@ -222,20 +222,15 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
 
        // DW_OP_addr ------------------
        b_data[0]       = DW_OP_addr;
+       pqw_value       = (QWord *)&(b_data[1]);
+       *pqw_value      = 0x1234567890abcdef;
        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_REQUESTED,
-                               LIBGOBLIN_DWARF_REQUEST_ADDRSIZE, LIBGOBLIN_DWARF_REQUEST_NONE );
-
-       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 );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 9 );
        Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
-       CU_ASSERT( p_exp->result[0].value.qw_value == 8 );
-       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 8 );
+       CU_ASSERT( p_exp->result[0].value.qw_value ==  0x1234567890abcdef );
+       CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x1234567890abcdef );
        CU_ASSERT( p_exp->dw_depth == 1 );
 
        // DW_OP_const1u --------------