Word w_value;
DWord dw_depth_resume;
DWord dw_value;
+ DWord dw_flag;
DWord dw_bitoffset;
QWord qw_resume;
QWord qw_remain;
#define PUSH_DWARF(m,n) \
{ (m)->t_stack[(m)->dw_depth].value.qw_value = (n); \
- (m)->t_stack[(m)->dw_depth].b_flag = LIBGOBLIN_DWARF_FLAG_LOCATION; \
+ (m)->t_stack[(m)->dw_depth].dw_flag = LIBGOBLIN_DWARF_FLAG_LOCATION; \
(m)->dw_depth++; }
#define PUSH_DWARF_SIGN(m,n) \
{ (m)->t_stack[(m)->dw_depth].value.ii_value = (n); \
- (m)->t_stack[(m)->dw_depth].b_flag \
+ (m)->t_stack[(m)->dw_depth].dw_flag \
= (LIBGOBLIN_DWARF_FLAG_SIGN | LIBGOBLIN_DWARF_FLAG_LOCATION); \
(m)->dw_depth++; }
#define POP_DWARF(m) (m)->t_stack[--((m)->dw_depth)].value.qw_value
{ goto goto_DWARF_Expression_Evaluate_post; }
ii_value = POP_DWARF_SIGN( p_exp );
- if( LIBGOBLIN_DWARF_FLAG_SIGN & p_exp->t_stack[p_exp->dw_depth].b_flag ) {
+ if( LIBGOBLIN_DWARF_FLAG_SIGN & p_exp->t_stack[p_exp->dw_depth].dw_flag ) {
if( 0 > ii_value ) { ii_value *= -1; }
PUSH_DWARF_SIGN( p_exp, ii_value );
}
case DW_OP_reg29: // 0x6d
case DW_OP_reg30: // 0x6e
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 ].dw_flag = (LIBGOBLIN_DWARF_FLAG_REG | 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
- // XXX: Not TESTED!!
pb_now = DWARF_Common_DecodeULEB128( &qw_temp, pb_now, &qw_remain );
- p_exp->result[ p_exp->b_results ].b_type = LIBGOBLIN_DWARF_FLAG_REGX;
+ p_exp->result[ p_exp->b_results ].dw_flag = LIBGOBLIN_DWARF_FLAG_REGX;
p_exp->result[ p_exp->b_results ].value.qw_value = qw_temp; // reg.id
- //p_exp->b_results++;
break;
case DW_OP_piece: // 0x93
pb_now = DWARF_Common_DecodeULEB128( &qw_temp, pb_now, &qw_remain );
dw_value = (DWord)(qw_temp & 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)) {
+ //b_value = p_exp->result[ p_exp->b_results ].b_type;
+ dw_flag = p_exp->result[ p_exp->b_results ].dw_flag;
+ if( !(LIBGOBLIN_DWARF_FLAG_REG & dw_flag)
+ && !(LIBGOBLIN_DWARF_FLAG_REGX & dw_flag)) {
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].dw_flag
+ = p_exp->t_stack[ p_exp->dw_depth - 1 ].dw_flag;
p_exp->result[p_exp->b_results].value.qw_value
= p_exp->t_stack[ p_exp->dw_depth - 1 ].value.qw_value;
}
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) ) {
+ //b_value = p_exp->result[ p_exp->b_results ].b_type;
+ dw_flag = p_exp->result[ p_exp->b_results ].dw_flag;
+ if( (LIBGOBLIN_DWARF_FLAG_REG & dw_flag)
+ || (LIBGOBLIN_DWARF_FLAG_REGX & dw_flag) ) {
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->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].dw_flag
+ = p_exp->t_stack[ p_exp->dw_depth - 1 ].dw_flag;
p_exp->result[p_exp->b_results].value.qw_value
= p_exp->t_stack[ p_exp->dw_depth - 1 ].value.qw_value;
}
break;
case DW_OP_implicit_value: // 0x9e
+ // XXX: Not TESTED!!
+ pb_now = DWARF_Common_DecodeULEB128( &qw_temp, pb_now, &qw_remain );
+ if( 8 == p_exp->b_dwsize ) { qw_value = *((QWord *)pb_now); }
+ else { qw_value = (QWord)(*((DWord *)pb_now)); }
+ pb_now += p_exp->b_dwsize;
+ qw_remain -= p_exp->b_dwsize;
+
+ p_exp->result[ p_exp->b_results ].dw_flag = LIBGOBLIN_DWARF_FLAG_LOCATION;
+ p_exp->result[ p_exp->b_results ].value.qw_value = qw_value;
+ p_exp->result[ p_exp->b_results ].dw_bytes = (DWord)qw_temp;
break;
case DW_OP_stack_value: // 0x9f
- break;
- // case DW_OP_lo_user: // 0xe0
- // break;
- // case DW_OP_hi_user: // 0xff
- // break;
+ // XXX: Not TESTED!!
+ if( 1 > p_exp->dw_depth )
+ { goto goto_DWARF_Expression_Evaluate_post; }
+
+ p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_EVALUATED;
+ p_exp->result[p_exp->b_results].dw_flag = LIBGOBLIN_DWARF_FLAG_IMMEDIATE;;
+ p_exp->result[p_exp->b_results].value.qw_value
+ = p_exp->t_stack[ p_exp->dw_depth - 1 ].value.qw_value;
+ p_exp->b_results++;
+ goto goto_DWARF_Expression_Evaluate_post;
+ break; // NOT reach.
+
+ //case DW_OP_lo_user: // 0xe0
+ //case DW_OP_hi_user: // 0xff
case DW_OP_GNU_push_tls_address: // 0xe0
+ // XXX: Not TESTED!!
+ if( 1 > p_exp->dw_depth )
+ { goto goto_DWARF_Expression_Evaluate_post; }
+ qw_pop[0] = POP_DWARF( p_exp );
+
+ if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_GNUTLS ) {
+ qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_GNUTLS ];
+ PUSH_DWARF( p_exp, qw_value );
+ p_exp->dw_setdata &= (~LIBGOBLIN_DWARF_REQUEST_GNUTLS);
+ qw_remain = 0; // for Loop-Break
+ }
+ else {
+ p_exp->ptr_tlsbase.value = (PtrValue)qw_pop[0];
+ p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_TLSADDR;
+ qw_remain = 0; // for Loop-Break
+ }
break;
case DW_OP_GNU_uninit: // 0xf0
break;
goto goto_DWARF_Expression_Evaluate_post;
}
+ if( ( p_exp->result[ p_exp->b_results ].dw_flag & LIBGOBLIN_DWARF_FLAG_REG )
+ || ( p_exp->result[ p_exp->b_results ].dw_flag & LIBGOBLIN_DWARF_FLAG_REGX )) {
+ p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_EVALUATED;
+ p_exp->b_results++;
+ goto goto_DWARF_Expression_Evaluate_post;
+ }
+
if( 0 < p_exp->dw_depth ) {
p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_EVALUATED;
- 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].dw_flag
+ = p_exp->t_stack[ p_exp->dw_depth - 1 ].dw_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->b_results++;
#define LIBGOBLIN_DWARF_REQUEST_TLSADDR 0x00004000
#define LIBGOBLIN_DWARF_REQUEST_CFAADDR 0x00008000
#define LIBGOBLIN_DWARF_REQUEST_REGX 0x00010000
+#define LIBGOBLIN_DWARF_REQUEST_GNUTLS 0x00020000
#define LIBGOBLIN_DWARF_REQDATA_MAX 0x40
#define LIBGOBLIN_DWARF_DATAID_REG 0x0000001f // 0x00 - 0x1f
#define LIBGOBLIN_DWARF_DATAID_TLSADDR 0x00000025
#define LIBGOBLIN_DWARF_DATAID_CFAADDR 0x00000026
#define LIBGOBLIN_DWARF_DATAID_REGX 0x00000027
+#define LIBGOBLIN_DWARF_DATAID_GNUTLS 0x00000028
-#define LIBGOBLIN_DWARF_FLAG_REG 0x1f // 0x00 - 0x1f
-#define LIBGOBLIN_DWARF_FLAG_REGX 0x20
-#define LIBGOBLIN_DWARF_FLAG_LOCATION 0x30
-#define LIBGOBLIN_DWARF_FLAG_IMMEDIATE 0x40
-//#define LIBGOBLIN_DWARF_FLAG_NOUSE 0x50
-//#define LIBGOBLIN_DWARF_FLAG_NOUSE 0x60
-//#define LIBGOBLIN_DWARF_FLAG_NOUSE 0x70
-#define LIBGOBLIN_DWARF_FLAG_SIGN 0x80 // First bit is sign-flag
+#define LIBGOBLIN_DWARF_FLAG_NONE 0x00000000
+#define LIBGOBLIN_DWARF_FLAG_REGMASK 0x0000001f // 0x00 - 0x1f
+#define LIBGOBLIN_DWARF_FLAG_REG 0x00000020
+#define LIBGOBLIN_DWARF_FLAG_REGX 0x00000100
+#define LIBGOBLIN_DWARF_FLAG_LOCATION 0x00000200
+#define LIBGOBLIN_DWARF_FLAG_IMMEDIATE 0x00000400
+#define LIBGOBLIN_DWARF_FLAG_SIGN 0x80000000 // First bit is sign-flag
/*=====================================================================*/
typedef struct {
- Byte b_flag;
+ //Byte b_flag;
+ DWord dw_flag;
union {
QWord qw_value;
Int64 ii_value;
Byte b_results;
struct {
- Byte b_type;
+ //Byte b_type;
+ DWord dw_flag;
DWord dw_bytes;
DWord dw_bit_offset;
DWord dw_bit_size;
return;
}
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_CheckReg( Byte b_regop )
+{
+ int i_result;
+ Byte b_data[8];
+ DWord dw_result;
+ LibGoblin_DWARF_Expression *p_exp;
+
+ p_exp = DWARF_Expression_Alloc();
+ CU_ASSERT( NULL != p_exp );
+
+ //DW_OP_reg0 - 31: // 0x50 - 0x6f
+ b_data[0] = b_regop;
+ 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_EVALUATED,
+ LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE );
+ CU_ASSERT( p_exp->result[0].dw_flag == (LIBGOBLIN_DWARF_FLAG_REG | (b_regop - DW_OP_reg0)) );
+ CU_ASSERT( p_exp->result[0].value.qw_value == (b_regop - DW_OP_reg0) );
+ CU_ASSERT( p_exp->b_results == 1 );
+ CU_ASSERT( p_exp->dw_depth == 0 );
+
+ i_result = DWARF_Expression_Free( p_exp );
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
+
+void Test_LibGoblin_DWARF_Expression_RegLocation_test01_001( void )
+{
+ int i_result;
+ Byte b_data[16];
+ DWord dw_result;
+ LibGoblin_DWARF_Expression *p_exp;
+
+ i_result = DWARF_Expression_Init();
+ CU_ASSERT( 0x00 == i_result );
+
+ p_exp = DWARF_Expression_Alloc();
+ CU_ASSERT( NULL != p_exp );
+
+ //DW_OP_reg0 - 31: // 0x50 - 0x6f
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg0 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg1 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg2 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg3 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg4 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg5 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg6 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg7 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg8 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg9 );
+
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg10 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg11 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg12 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg13 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg14 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg15 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg16 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg17 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg18 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg19 );
+
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg20 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg21 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg22 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg23 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg24 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg25 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg26 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg27 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg28 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg29 );
+
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg30 );
+ Test_LibGoblin_DWARF_Expression_CheckReg( DW_OP_reg31 );
+
+ //DW_OP_regx: // 0x90
+ b_data[0] = DW_OP_regx;
+ b_data[1] = 0x81;
+ b_data[2] = 0x01; // value = 129 (0x81 0x01)
+ DWARF_Expression_ClearValue( p_exp );
+ dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+ 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].dw_flag == LIBGOBLIN_DWARF_FLAG_REGX );
+ CU_ASSERT( p_exp->result[0].value.qw_value == 129 );
+ CU_ASSERT( p_exp->b_results == 1 );
+ CU_ASSERT( p_exp->dw_depth == 0 );
+
+ i_result = DWARF_Expression_Free( p_exp );
+ CU_ASSERT( 0x00 == i_result );
+
+ i_result = DWARF_Expression_Term();
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_Special_test01_001( void )
+{
+ int i_result;
+ Byte b_data[16];
+ DWord dw_result;
+ LibGoblin_DWARF_Expression *p_exp;
+
+ i_result = DWARF_Expression_Init();
+ CU_ASSERT( 0x00 == i_result );
+
+ p_exp = DWARF_Expression_Alloc();
+ CU_ASSERT( NULL != p_exp );
+
+ // DW_OP_piece: // 0x93
+ // DW_OP_bit_piece: // 0x9d
+ // DW_OP_implicit_value: // 0x9e
+ // DW_OP_stack_value: // 0x9f
+ // DW_OP_nop: // 0x96
+ // DW_OP_GNU_push_tls_address: // 0xe0
+
+/*
+ DW_OP_GNU_uninit: // 0xf0
+ DW_OP_GNU_encoded_addr: // 0xf1
+ DW_OP_GNU_implicit_pointer: // 0xf2
+ DW_OP_GNU_entry_value: // 0xf3
+ DW_OP_GNU_const_type: // 0xf4
+ DW_OP_GNU_regval_type: // 0xf5
+ DW_OP_GNU_deref_type: // 0xf6
+ DW_OP_GNU_convert: // 0xf7
+ DW_OP_GNU_reinterpret: // 0xf9
+ DW_OP_GNU_parameter_ref: // 0xfa
+ DW_OP_GNU_addr_index: // 0xfb
+ DW_OP_GNU_const_index: // 0xfc
+*/
+
+ i_result = DWARF_Expression_Free( p_exp );
+ CU_ASSERT( 0x00 == i_result );
+
+ i_result = DWARF_Expression_Term();
+ CU_ASSERT( 0x00 == i_result );
+
+ return;
+}
+
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
Test_LibGoblin_DWARF_Expression_FlowControl_test01_001 );
CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_FlowControl_test02_001",
Test_LibGoblin_DWARF_Expression_FlowControl_test02_001 );
+
+ CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_RegLocation_test01_001",
+ Test_LibGoblin_DWARF_Expression_RegLocation_test01_001 );
+ CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_Special_test01_001",
+ Test_LibGoblin_DWARF_Expression_Special_test01_001 );
+
return 0x00;
}
/* EOF of drd64_.c ----------------------------------- */
-/*
- DW_OP_reg0: // 0x50
- DW_OP_reg1: // 0x51
- DW_OP_reg2: // 0x52
- DW_OP_reg3: // 0x53
- DW_OP_reg4: // 0x54
- DW_OP_reg5: // 0x55
- DW_OP_reg6: // 0x56
- DW_OP_reg7: // 0x57
- DW_OP_reg8: // 0x58
- DW_OP_reg9: // 0x59
- DW_OP_reg10: // 0x5a
- DW_OP_reg11: // 0x5b
- DW_OP_reg12: // 0x5c
- DW_OP_reg13: // 0x5d
- DW_OP_reg14: // 0x5e
- DW_OP_reg15: // 0x5f
- DW_OP_reg16: // 0x60
- DW_OP_reg17: // 0x61
- DW_OP_reg18: // 0x62
- DW_OP_reg19: // 0x63
- DW_OP_reg20: // 0x64
- DW_OP_reg21: // 0x65
- DW_OP_reg22: // 0x66
- DW_OP_reg23: // 0x67
- DW_OP_reg24: // 0x68
- DW_OP_reg25: // 0x69
- DW_OP_reg26: // 0x6a
- DW_OP_reg27: // 0x6b
- DW_OP_reg28: // 0x6c
- DW_OP_reg29: // 0x6d
- DW_OP_reg30: // 0x6e
- DW_OP_reg31: // 0x6f
- DW_OP_regx: // 0x90
- DW_OP_piece: // 0x93
- DW_OP_bit_piece: // 0x9d
- DW_OP_implicit_value: // 0x9e
- DW_OP_stack_value: // 0x9f
- DW_OP_nop: // 0x96
- DW_OP_lo_user: // 0xe0
- DW_OP_hi_user: // 0xff
- DW_OP_GNU_push_tls_address: // 0xe0
- DW_OP_GNU_uninit: // 0xf0
- DW_OP_GNU_encoded_addr: // 0xf1
- DW_OP_GNU_implicit_pointer: // 0xf2
- DW_OP_GNU_entry_value: // 0xf3
- DW_OP_GNU_const_type: // 0xf4
- DW_OP_GNU_regval_type: // 0xf5
- DW_OP_GNU_deref_type: // 0xf6
- DW_OP_GNU_convert: // 0xf7
- DW_OP_GNU_reinterpret: // 0xf9
- DW_OP_GNU_parameter_ref: // 0xfa
- DW_OP_GNU_addr_index: // 0xfb
- DW_OP_GNU_const_index: // 0xfc
-*/