From 5696589a0a7476d949a10d05e3e27ab904d3b444 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Wed, 18 Sep 2019 21:22:23 +0900 Subject: [PATCH] (LibGoblin) * WorkBackup --- libgoblin/drd64_libgoblin_dwarf_expression.c | 33 ++++++++++++++++++++++++++-- libgoblin/drd64_libgoblin_type_dwarf.h | 2 ++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/libgoblin/drd64_libgoblin_dwarf_expression.c b/libgoblin/drd64_libgoblin_dwarf_expression.c index db5df24..73b28fe 100644 --- a/libgoblin/drd64_libgoblin_dwarf_expression.c +++ b/libgoblin/drd64_libgoblin_dwarf_expression.c @@ -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; diff --git a/libgoblin/drd64_libgoblin_type_dwarf.h b/libgoblin/drd64_libgoblin_type_dwarf.h index f72b032..5e52f3e 100644 --- a/libgoblin/drd64_libgoblin_type_dwarf.h +++ b/libgoblin/drd64_libgoblin_type_dwarf.h @@ -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; -- 2.11.0