OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 18 Sep 2019 12:22:23 +0000 (21:22 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 18 Sep 2019 12:22:23 +0000 (21:22 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/drd64_libgoblin_type_dwarf.h

index db5df24..73b28fe 100644 (file)
@@ -109,6 +109,7 @@ DWord
        Word    w_value;
        DWord   dw_depth_resume;
        DWord   dw_value;
+       DWord   dw_bitoffset;
        QWord   qw_resume;
        QWord   qw_remain;
        QWord   qw_value;
@@ -178,7 +179,7 @@ DWord
                }
        }
        qw_value                                = 0x00000000;
-       //p_exp->result.qw_value        = 0x00000000;
+       dw_bitoffset                    = 0;
        p_exp->dw_requested             = LIBGOBLIN_DWARF_REQUEST_NONE;
        p_exp->dw_status                = LIBGOBLIN_DWARF_STATUS_ERROR;
        if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_setdata )
@@ -904,7 +905,8 @@ DWord
                        case DW_OP_reg31:                               // 0x6f
                                // XXX: Not TESTED!!
                                b_reg   = b_opcode - DW_OP_reg0;
-                               p_exp->result[ p_exp->b_results ].b_type        = b_reg;
+                               p_exp->result[ p_exp->b_results ].b_type                        = b_reg;
+                               p_exp->result[ p_exp->b_results ].value.qw_value        = b_reg;        // reg.id
                                //p_exp->b_results++;
                                break;
                        case DW_OP_regx:                                // 0x90
@@ -935,6 +937,33 @@ DWord
                                
                                break;
                        case DW_OP_bit_piece:                   // 0x9d
+                               // XXX: Not TESTED!!
+                               // 1st Operand: bit size
+                               pb_now  = DWARF_Common_DecodeULEB128( &qw_temp, pb_now, &qw_remain );
+                               // 2nd Operand: bit offset from prev-bit-piece (under-bits)
+                               pb_now  = DWARF_Common_DecodeULEB128( &qw_value, pb_now, &qw_remain );
+                               dw_bitoffset    += (DWord)(qw_value & 0xffffffff);
+
+                               b_value         = p_exp->result[ p_exp->b_results ].b_type;
+                               if( (LIBGOBLIN_DWARF_FLAG_REG & b_value)
+                                                       || (LIBGOBLIN_DWARF_FLAG_REGX & b_value) )      {
+
+                                       p_exp->result[ p_exp->b_results ].dw_bit_offset = dw_bitoffset;
+                                       p_exp->result[ p_exp->b_results ].dw_bit_size   = (DWord)(qw_temp & 0xffffffff);
+                                       p_exp->result[p_exp->b_results].dw_bytes                = 0;
+                                       p_exp->b_results++;
+                               }
+                               else if( 0 < p_exp->dw_depth )  {
+                                       p_exp->result[p_exp->b_results].b_type
+                                                               = p_exp->t_stack[ p_exp->dw_depth - 1 ].b_flag;
+                                       p_exp->result[p_exp->b_results].value.qw_value
+                                                               = p_exp->t_stack[ p_exp->dw_depth - 1 ].value.qw_value;
+
+                                       p_exp->result[ p_exp->b_results ].dw_bit_offset = dw_bitoffset;
+                                       p_exp->result[ p_exp->b_results ].dw_bit_size   = (DWord)(qw_temp & 0xffffffff);
+                                       p_exp->result[p_exp->b_results].dw_bytes                = 0;
+                                       p_exp->b_results++;
+                               }
                                break;
                        case DW_OP_implicit_value:              // 0x9e
                                break;
index f72b032..5e52f3e 100644 (file)
@@ -116,6 +116,8 @@ typedef     struct  {
        struct  {
                Byte    b_type;
                DWord   dw_bytes;
+               DWord   dw_bit_offset;
+               DWord   dw_bit_size;
                union   {
                        QWord   qw_value;
                        Int64   ii_value;