Word w_value;
DWord dw_depth_resume;
DWord dw_value;
+ DWord dw_bitoffset;
QWord qw_resume;
QWord qw_remain;
QWord qw_value;
}
}
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 )
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
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;