From fd55ceda8f6f79a15072e24cb834ff55b56ab459 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Sat, 7 Sep 2019 17:04:46 +0900 Subject: [PATCH] (LibGoblin) * WorkBackup --- libgoblin/drd64_libgoblin_dwarf_expression.c | 310 +++++++++++++-------------- libgoblin/drd64_libgoblin_type_dwarf.h | 19 +- libgoblin/test_libgoblin_dwarf_expression.c | 234 +++++++++++++++----- 3 files changed, 351 insertions(+), 212 deletions(-) diff --git a/libgoblin/drd64_libgoblin_dwarf_expression.c b/libgoblin/drd64_libgoblin_dwarf_expression.c index e493dab..4fe9afa 100644 --- a/libgoblin/drd64_libgoblin_dwarf_expression.c +++ b/libgoblin/drd64_libgoblin_dwarf_expression.c @@ -75,13 +75,13 @@ int return -0x02; } - p_exp->dw_setdata = LIBGOBLIN_DWARF_DATA_NONE; + p_exp->dw_setdata = LIBGOBLIN_DWARF_REQUEST_NONE; if( LIBGOBLIN_BINFO_TYPE_ELF32 == p_binfo->b_type ) - { p_exp->dw_addrsize = 4; } + { p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ] = 4; } else // LIBGOBLIN_BINFO_TYPE_ELF64 - { p_exp->dw_addrsize = 8; } - p_exp->dw_setdata |= LIBGOBLIN_DWARF_DATA_ADDRSIZE; + { p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ] = 8; } + p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_ADDRSIZE; return 0x00; } @@ -130,7 +130,7 @@ DWord qw_remain = (( 0 == dw_size ) ? 512 : (QWord)dw_size ); qw_value = 0x00000000; p_exp->result.qw_value = 0x00000000; - p_exp->dw_requested = LIBGOBLIN_DWARF_DATA_NONE; + p_exp->dw_requested = LIBGOBLIN_DWARF_REQUEST_NONE; p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_ERROR; p_exp->dw_depth = 0; memset( &((p_exp)->t_stack), 0x00, @@ -141,14 +141,50 @@ DWord qw_remain--; switch( b_opcode ) { + // Constant Opcodes ---- + case DW_OP_lit0: // 0x30 + case DW_OP_lit1: // 0x31 + case DW_OP_lit2: // 0x32 + case DW_OP_lit3: // 0x33 + case DW_OP_lit4: // 0x34 + case DW_OP_lit5: // 0x35 + case DW_OP_lit6: // 0x36 + case DW_OP_lit7: // 0x37 + case DW_OP_lit8: // 0x38 + case DW_OP_lit9: // 0x39 + case DW_OP_lit10: // 0x3a + case DW_OP_lit11: // 0x3b + case DW_OP_lit12: // 0x3c + case DW_OP_lit13: // 0x3d + case DW_OP_lit14: // 0x3e + case DW_OP_lit15: // 0x3f + case DW_OP_lit16: // 0x40 + case DW_OP_lit17: // 0x41 + case DW_OP_lit18: // 0x42 + case DW_OP_lit19: // 0x43 + case DW_OP_lit20: // 0x44 + case DW_OP_lit21: // 0x45 + case DW_OP_lit22: // 0x46 + case DW_OP_lit23: // 0x47 + case DW_OP_lit24: // 0x48 + case DW_OP_lit25: // 0x49 + case DW_OP_lit26: // 0x4a + case DW_OP_lit27: // 0x4b + case DW_OP_lit28: // 0x4c + case DW_OP_lit29: // 0x4d + case DW_OP_lit30: // 0x4e + case DW_OP_lit31: // 0x4f + b_value = b_opcode - DW_OP_lit0; + PUSH_DWARF( p_exp, (QWord)b_value ); + break; + case DW_OP_addr: // 0x03 - if( p_exp->dw_setdata & LIBGOBLIN_DWARF_DATA_ADDRSIZE ) - { PUSH_DWARF( p_exp, p_exp->dw_addrsize ); } + if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_ADDRSIZE ) + { PUSH_DWARF( p_exp, p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ] ); } else - { p_exp->dw_requested |= LIBGOBLIN_DWARF_DATA_ADDRSIZE; } - break; - case DW_OP_deref: // 0x06 + { p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_ADDRSIZE; } break; + case DW_OP_const1u: // 0x08 qw_value = (QWord)*pb_now++; qw_remain--; @@ -205,6 +241,94 @@ DWord PUSH_DWARF_SIGN( p_exp, ii_value ); break; + // Register-Base Opcodes ---- + case DW_OP_fbreg: // 0x91 + pb_now = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain ); + if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_FRAME_BASE ) { + + if( 0 > ii_value ) { + qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_FRAME_BASE ] + - (QWord)(-1 * ii_value); + } + else { + qw_value = p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_FRAME_BASE ] + + (QWord)ii_value; + } + + PUSH_DWARF( p_exp, qw_value ); + } + else + { p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_FRAME_BASE; } + + break; + case DW_OP_breg0: // 0x70 + case DW_OP_breg1: // 0x71 + case DW_OP_breg2: // 0x72 + case DW_OP_breg3: // 0x73 + case DW_OP_breg4: // 0x74 + case DW_OP_breg5: // 0x75 + case DW_OP_breg6: // 0x76 + case DW_OP_breg7: // 0x77 + case DW_OP_breg8: // 0x78 + case DW_OP_breg9: // 0x79 + case DW_OP_breg10: // 0x7a + case DW_OP_breg11: // 0x7b + case DW_OP_breg12: // 0x7c + case DW_OP_breg13: // 0x7d + case DW_OP_breg14: // 0x7e + case DW_OP_breg15: // 0x7f + case DW_OP_breg16: // 0x80 + case DW_OP_breg17: // 0x81 + case DW_OP_breg18: // 0x82 + case DW_OP_breg19: // 0x83 + case DW_OP_breg20: // 0x84 + case DW_OP_breg21: // 0x85 + case DW_OP_breg22: // 0x86 + case DW_OP_breg23: // 0x87 + case DW_OP_breg24: // 0x88 + case DW_OP_breg25: // 0x89 + case DW_OP_breg26: // 0x8a + case DW_OP_breg27: // 0x8b + case DW_OP_breg28: // 0x8c + case DW_OP_breg29: // 0x8d + case DW_OP_breg30: // 0x8e + case DW_OP_breg31: // 0x8f + b_reg = b_opcode - DW_OP_breg0; + pb_now = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain ); + + if( p_exp->dw_setdata & (LIBGOBLIN_DWARF_REQUEST_REG | b_reg) ) { + if( 0 > ii_value ) + { qw_value = p_exp->qw_reqdata[b_reg] - (QWord)(-1 * ii_value); } + else + { qw_value = p_exp->qw_reqdata[b_reg] + (QWord)ii_value; } + + PUSH_DWARF( p_exp, qw_value ); + } + else + { p_exp->dw_requested |= (LIBGOBLIN_DWARF_REQUEST_REG | b_reg); } + break; + case DW_OP_bregx: // 0x92 + // Get RegID + pb_now = DWARF_Common_DecodeULEB128( &qw_value, pb_now, &qw_remain ); + b_reg = (Byte)(qw_value & 0x1f); + + // Get Offset + pb_now = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain ); + + if( p_exp->dw_setdata & (LIBGOBLIN_DWARF_REQUEST_REG | b_reg) ) { + if( 0 > ii_value ) + { qw_value = p_exp->qw_reqdata[b_reg] - (QWord)(-1 * ii_value); } + else + { qw_value = p_exp->qw_reqdata[b_reg] + (QWord)ii_value; } + + PUSH_DWARF( p_exp, qw_value ); + } + else + { p_exp->dw_requested |= (LIBGOBLIN_DWARF_REQUEST_REG | b_reg); } + break; + + + // Stack Opcodes ---- case DW_OP_dup: // 0x12 if( 0 == p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -212,37 +336,31 @@ DWord qw_value = p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value; PUSH_DWARF( p_exp, qw_value ); break; - case DW_OP_drop: // 0x13 if( 0 == p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } qw_value = POP_DWARF( p_exp ); break; + case DW_OP_pick: // 0x15 + b_value = *pb_now++; + qw_remain--; - case DW_OP_over: // 0x14 - if( 2 > p_exp->dw_depth ) + if( p_exp->dw_depth <= (DWord)b_value ) { goto goto_DWARF_Expression_Evaluate_post; } - dw_value = p_exp->dw_depth - 2; + dw_value = p_exp->dw_depth - (DWord)b_value - 1; qw_value = p_exp->t_stack[dw_value].value.qw_value; PUSH_DWARF( p_exp, qw_value ); break; - - case DW_OP_pick: // 0x15 - // 2019/09/02 Lunch-Coding (Required TEST!!) - b_value = *pb_now++; - qw_remain--; - - if( p_exp->dw_depth < (DWord)b_value ) + case DW_OP_over: // 0x14 + if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } - dw_value = p_exp->dw_depth - (DWord)b_value; + dw_value = p_exp->dw_depth - 2; qw_value = p_exp->t_stack[dw_value].value.qw_value; PUSH_DWARF( p_exp, qw_value ); break; - case DW_OP_swap: // 0x16 - // 2019/09/03 Lunch-Coding (Required TEST!!) if( 2 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } qw_value = p_exp->t_stack[p_exp->dw_depth - 2].value.qw_value; @@ -250,9 +368,7 @@ DWord = p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value; p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value = qw_value; break; - case DW_OP_rot: // 0x17 - // 2019/09/03 Lunch-Coding (Required TEST!!) if( 3 > p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } qw_value = p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value; @@ -263,8 +379,20 @@ DWord p_exp->t_stack[p_exp->dw_depth - 3].value.qw_value = qw_value; break; + case DW_OP_deref: // 0x06 + break; + case DW_OP_deref_size: // 0x94 + break; case DW_OP_xderef: // 0x18 break; + case DW_OP_xderef_size: // 0x95 + break; + case DW_OP_push_object_address: // 0x97 + break; + case DW_OP_form_tls_address: // 0x9b + break; + case DW_OP_call_frame_cfa: // 0x9c + break; case DW_OP_abs: // 0x19 // 2019/09/03 Lunch-Coding (Required TEST!!) @@ -352,42 +480,6 @@ DWord case DW_OP_skip: // 0x2f break; - case DW_OP_lit0: // 0x30 - case DW_OP_lit1: // 0x31 - case DW_OP_lit2: // 0x32 - case DW_OP_lit3: // 0x33 - case DW_OP_lit4: // 0x34 - case DW_OP_lit5: // 0x35 - case DW_OP_lit6: // 0x36 - case DW_OP_lit7: // 0x37 - case DW_OP_lit8: // 0x38 - case DW_OP_lit9: // 0x39 - case DW_OP_lit10: // 0x3a - case DW_OP_lit11: // 0x3b - case DW_OP_lit12: // 0x3c - case DW_OP_lit13: // 0x3d - case DW_OP_lit14: // 0x3e - case DW_OP_lit15: // 0x3f - case DW_OP_lit16: // 0x40 - case DW_OP_lit17: // 0x41 - case DW_OP_lit18: // 0x42 - case DW_OP_lit19: // 0x43 - case DW_OP_lit20: // 0x44 - case DW_OP_lit21: // 0x45 - case DW_OP_lit22: // 0x46 - case DW_OP_lit23: // 0x47 - case DW_OP_lit24: // 0x48 - case DW_OP_lit25: // 0x49 - case DW_OP_lit26: // 0x4a - case DW_OP_lit27: // 0x4b - case DW_OP_lit28: // 0x4c - case DW_OP_lit29: // 0x4d - case DW_OP_lit30: // 0x4e - case DW_OP_lit31: // 0x4f - b_value = b_opcode - DW_OP_lit0; - PUSH_DWARF( p_exp, (QWord)b_value ); - break; - case DW_OP_reg0: // 0x50 break; case DW_OP_reg1: // 0x51 @@ -452,110 +544,18 @@ DWord break; case DW_OP_reg31: // 0x6f break; - - case DW_OP_breg0: // 0x70 - case DW_OP_breg1: // 0x71 - case DW_OP_breg2: // 0x72 - case DW_OP_breg3: // 0x73 - case DW_OP_breg4: // 0x74 - case DW_OP_breg5: // 0x75 - case DW_OP_breg6: // 0x76 - case DW_OP_breg7: // 0x77 - case DW_OP_breg8: // 0x78 - case DW_OP_breg9: // 0x79 - case DW_OP_breg10: // 0x7a - case DW_OP_breg11: // 0x7b - case DW_OP_breg12: // 0x7c - case DW_OP_breg13: // 0x7d - case DW_OP_breg14: // 0x7e - case DW_OP_breg15: // 0x7f - case DW_OP_breg16: // 0x80 - case DW_OP_breg17: // 0x81 - case DW_OP_breg18: // 0x82 - case DW_OP_breg19: // 0x83 - case DW_OP_breg20: // 0x84 - case DW_OP_breg21: // 0x85 - case DW_OP_breg22: // 0x86 - case DW_OP_breg23: // 0x87 - case DW_OP_breg24: // 0x88 - case DW_OP_breg25: // 0x89 - case DW_OP_breg26: // 0x8a - case DW_OP_breg27: // 0x8b - case DW_OP_breg28: // 0x8c - case DW_OP_breg29: // 0x8d - case DW_OP_breg30: // 0x8e - case DW_OP_breg31: // 0x8f - b_reg = b_opcode - DW_OP_breg0; - pb_now = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain ); - - if( p_exp->dw_setdata & (LIBGOBLIN_DWARF_DATA_REG | b_reg) ) { - if( 0 > ii_value ) - { qw_value = p_exp->qw_reg[b_reg] - (QWord)(-1 * ii_value); } - else - { qw_value = p_exp->qw_reg[b_reg] + (QWord)ii_value; } - - PUSH_DWARF( p_exp, qw_value ); - } - else - { p_exp->dw_requested |= (LIBGOBLIN_DWARF_DATA_REG | b_reg); } - break; - case DW_OP_regx: // 0x90 break; - case DW_OP_fbreg: // 0x91 - pb_now = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain ); - if( p_exp->dw_setdata & LIBGOBLIN_DWARF_DATA_FRAME_BASE ) { - - if( 0 > ii_value ) - { qw_value = p_exp->qw_frame_base - (QWord)(-1 * ii_value); } - else - { qw_value = p_exp->qw_frame_base + (QWord)ii_value; } - - PUSH_DWARF( p_exp, qw_value ); - } - else - { p_exp->dw_requested |= LIBGOBLIN_DWARF_DATA_FRAME_BASE; } - - break; - case DW_OP_bregx: // 0x92 - // Get RegID - pb_now = DWARF_Common_DecodeULEB128( &qw_value, pb_now, &qw_remain ); - b_reg = (Byte)(qw_value & 0x1f); - - // Get Offset - pb_now = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain ); - - if( p_exp->dw_setdata & (LIBGOBLIN_DWARF_DATA_REG | b_reg) ) { - if( 0 > ii_value ) - { qw_value = p_exp->qw_reg[b_reg] - (QWord)(-1 * ii_value); } - else - { qw_value = p_exp->qw_reg[b_reg] + (QWord)ii_value; } - - PUSH_DWARF( p_exp, qw_value ); - } - else - { p_exp->dw_requested |= (LIBGOBLIN_DWARF_DATA_REG | b_reg); } - break; case DW_OP_piece: // 0x93 break; - case DW_OP_deref_size: // 0x94 - break; - case DW_OP_xderef_size: // 0x95 - break; case DW_OP_nop: // 0x96 break; - case DW_OP_push_object_address: // 0x97 - break; case DW_OP_call2: // 0x98 break; case DW_OP_call4: // 0x99 break; case DW_OP_call_ref: // 0x9a break; - case DW_OP_form_tls_address: // 0x9b - break; - case DW_OP_call_frame_cfa: // 0x9c - break; case DW_OP_bit_piece: // 0x9d break; case DW_OP_implicit_value: // 0x9e @@ -598,7 +598,7 @@ DWord }while( 0 < qw_remain ); - if( LIBGOBLIN_DWARF_DATA_NONE != p_exp->dw_requested ) + if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_requested ) { p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_REQUESTED; } else if( 0 < p_exp->dw_depth ) { p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_EVALUATED; diff --git a/libgoblin/drd64_libgoblin_type_dwarf.h b/libgoblin/drd64_libgoblin_type_dwarf.h index 685cafc..3292e8c 100644 --- a/libgoblin/drd64_libgoblin_type_dwarf.h +++ b/libgoblin/drd64_libgoblin_type_dwarf.h @@ -45,10 +45,16 @@ Comment: #define LIBGOBLIN_DWARF_STATUS_ERROR 0x10 // bit 4-0 is REG num. (MASK: 0x1f) -#define LIBGOBLIN_DWARF_DATA_NONE 0x00000000 -#define LIBGOBLIN_DWARF_DATA_REG 0x00000100 -#define LIBGOBLIN_DWARF_DATA_ADDRSIZE 0x00000200 -#define LIBGOBLIN_DWARF_DATA_FRAME_BASE 0x00000400 +#define LIBGOBLIN_DWARF_REQUEST_NONE 0x00000000 +#define LIBGOBLIN_DWARF_REQUEST_REG 0x00000100 +#define LIBGOBLIN_DWARF_REQUEST_ADDRSIZE 0x00000200 +#define LIBGOBLIN_DWARF_REQUEST_FRAME_BASE 0x00000400 + +#define LIBGOBLIN_DWARF_REQDATA_MAX 0x40 +#define LIBGOBLIN_DWARF_DATAID_REG 0x0000001f // 0x00 - 0x1f +#define LIBGOBLIN_DWARF_DATAID_ADDRSIZE 0x00000020 +#define LIBGOBLIN_DWARF_DATAID_FRAME_BASE 0x00000021 + /*=====================================================================*/ #define LIBGOBLIN_DWARF_STACK_SIGN 0x01 @@ -76,10 +82,7 @@ typedef struct { Int64 ii_value; } result; - QWord qw_reg[32]; // for DW_OP_bregX - DWord dw_addrsize; // for DW_OP_addr - QWord qw_frame_base; // for DW_OP_fbreg (value is DW_AT_frame_base) - + QWord qw_reqdata[LIBGOBLIN_DWARF_REQDATA_MAX]; DWord dw_depth; LibGoblin_DWARF_Expression_Stack t_stack[ LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH ]; diff --git a/libgoblin/test_libgoblin_dwarf_expression.c b/libgoblin/test_libgoblin_dwarf_expression.c index 18b23a5..69b915c 100644 --- a/libgoblin/test_libgoblin_dwarf_expression.c +++ b/libgoblin/test_libgoblin_dwarf_expression.c @@ -151,8 +151,10 @@ void Test_LibGoblin_DWARF_Expression_CheckLitX( dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 1 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == qw_value ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == qw_value ); + CU_ASSERT( p_exp->dw_depth == 1 ); i_result = DWARF_Expression_Free( p_exp ); CU_ASSERT( 0x00 == i_result ); @@ -224,15 +226,17 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 1 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_REQUESTED, - LIBGOBLIN_DWARF_DATA_ADDRSIZE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_ADDRSIZE, LIBGOBLIN_DWARF_REQUEST_NONE ); - p_exp->dw_addrsize = 8; - p_exp->dw_setdata |= LIBGOBLIN_DWARF_DATA_ADDRSIZE; + 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 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_ADDRSIZE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_ADDRSIZE ); CU_ASSERT( p_exp->result.qw_value == 8 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 8 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_const1u -------------- b_data[0] = DW_OP_const1u; @@ -241,8 +245,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 2 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0x12 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x12 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_const1s -------------- b_data[0] = DW_OP_const1s; @@ -251,8 +257,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 2 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.ii_value == -1 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -1 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_const2u -------------- b_data[0] = DW_OP_const2u; @@ -262,8 +270,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0x1234 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x1234 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_const2s -------------- b_data[0] = DW_OP_const2s; @@ -273,8 +283,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.ii_value == -12345 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -12345 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_const4u -------------- b_data[0] = DW_OP_const4u; @@ -284,8 +296,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 5 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0x12345678 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x12345678 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_const4s -------------- b_data[0] = DW_OP_const4s; @@ -295,8 +309,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 5 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.ii_value == -1234567890 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -1234567890 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_const8u -------------- b_data[0] = DW_OP_const8u; @@ -306,8 +322,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 9 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 0x1234567890abcdef ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x1234567890abcdef ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_const8s -------------- b_data[0] = DW_OP_const8s; @@ -317,8 +335,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 9 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.ii_value == -123456789012345 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -123456789012345 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_constu -------------- b_data[0] = DW_OP_constu; @@ -328,8 +348,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 12857 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 12857 ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_consts -------------- b_data[0] = DW_OP_consts; @@ -339,8 +361,10 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.ii_value == -129 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.ii_value = -129 ); + CU_ASSERT( p_exp->dw_depth == 1 ); i_result = DWARF_Expression_Free( p_exp ); @@ -375,28 +399,32 @@ void Test_LibGoblin_DWARF_Expression_RegBase_bregX( Byte b_opcode ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_REQUESTED, - (LIBGOBLIN_DWARF_DATA_REG | b_reg), LIBGOBLIN_DWARF_DATA_NONE ); + (LIBGOBLIN_DWARF_REQUEST_REG | b_reg), LIBGOBLIN_DWARF_REQUEST_NONE ); - p_exp->qw_reg[b_reg] = 0x80000000; - p_exp->dw_setdata |= (LIBGOBLIN_DWARF_DATA_REG | b_reg); + p_exp->qw_reqdata[b_reg] = 0x80000000; + p_exp->dw_setdata |= (LIBGOBLIN_DWARF_REQUEST_REG | b_reg); dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | b_reg) ); + LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | b_reg) ); CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == (0x80000000 + 129) ); + CU_ASSERT( p_exp->dw_depth == 1 ); b_data[0] = b_opcode; b_data[1] = 0xff; b_data[2] = 0x7e; // value = -129 (0xff 0x7e) DWARF_Expression_ClearValue( p_exp ); - p_exp->qw_reg[b_reg] = 0x80000000; - p_exp->dw_setdata |= (LIBGOBLIN_DWARF_DATA_REG | b_reg); + p_exp->qw_reqdata[b_reg] = 0x80000000; + p_exp->dw_setdata |= (LIBGOBLIN_DWARF_REQUEST_REG | b_reg); dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | b_reg) ); + LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | b_reg) ); CU_ASSERT( p_exp->result.qw_value == (0x80000000 - 129) ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == (0x80000000 - 129) ); + CU_ASSERT( p_exp->dw_depth == 1 ); i_result = DWARF_Expression_Free( p_exp ); CU_ASSERT( 0x00 == i_result ); @@ -426,28 +454,32 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_REQUESTED, - LIBGOBLIN_DWARF_DATA_FRAME_BASE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE ); - p_exp->qw_frame_base = 0x80000000; - p_exp->dw_setdata |= LIBGOBLIN_DWARF_DATA_FRAME_BASE; + p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_FRAME_BASE ] = 0x80000000; + p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_FRAME_BASE; dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_FRAME_BASE ); CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == (0x80000000 + 129) ); + CU_ASSERT( p_exp->dw_depth == 1 ); b_data[0] = DW_OP_fbreg; b_data[1] = 0xff; b_data[2] = 0x7e; // value = -129 (0xff 0x7e) DWARF_Expression_ClearValue( p_exp ); - p_exp->qw_frame_base = 0x80000000; - p_exp->dw_setdata |= LIBGOBLIN_DWARF_DATA_FRAME_BASE; + p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_FRAME_BASE ] = 0x80000000; + p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_FRAME_BASE; dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_FRAME_BASE ); CU_ASSERT( p_exp->result.qw_value == (0x80000000 - 129) ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == (0x80000000 - 129) ); + CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_bregX -------------- @@ -494,15 +526,17 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 4 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_REQUESTED, - (LIBGOBLIN_DWARF_DATA_REG | 0x0a), LIBGOBLIN_DWARF_DATA_NONE ); + (LIBGOBLIN_DWARF_REQUEST_REG | 0x0a), LIBGOBLIN_DWARF_REQUEST_NONE ); - p_exp->qw_reg[0x0a] = 0x80000000; - p_exp->dw_setdata |= (LIBGOBLIN_DWARF_DATA_REG | 0x0a ); + p_exp->qw_reqdata[0x0a] = 0x80000000; + p_exp->dw_setdata |= (LIBGOBLIN_DWARF_REQUEST_REG | 0x0a ); dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 4 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | 0x0a) ); + LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | 0x0a) ); CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == (0x80000000 + 129) ); + CU_ASSERT( p_exp->dw_depth == 1 ); b_data[0] = DW_OP_bregx; @@ -510,13 +544,15 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void ) b_data[2] = 0xff; b_data[3] = 0x7e; // value = -129 (0xff 0x7e) DWARF_Expression_ClearValue( p_exp ); - p_exp->qw_reg[0x1f] = 0x80000000; - p_exp->dw_setdata |= (LIBGOBLIN_DWARF_DATA_REG | 0x1f ); + p_exp->qw_reqdata[0x1f] = 0x80000000; + p_exp->dw_setdata |= (LIBGOBLIN_DWARF_REQUEST_REG | 0x1f ); dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 4 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | 0x1f ) ); + LIBGOBLIN_DWARF_REQUEST_NONE, (LIBGOBLIN_DWARF_REQUEST_REG | 0x1f ) ); CU_ASSERT( p_exp->result.qw_value == (0x80000000 - 129) ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == (0x80000000 - 129) ); + CU_ASSERT( p_exp->dw_depth == 1 ); i_result = DWARF_Expression_Free( p_exp ); @@ -551,7 +587,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 1 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_ERROR, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); b_data[0] = DW_OP_lit10; b_data[1] = DW_OP_dup; @@ -559,8 +595,11 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 2 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 10 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 10 ); + CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 10 ); + CU_ASSERT( p_exp->dw_depth == 2 ); // DW_OP_drop --------------- b_data[0] = DW_OP_drop; @@ -568,7 +607,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 1 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_ERROR, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); b_data[0] = DW_OP_lit10; b_data[1] = DW_OP_drop; @@ -576,7 +615,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 2 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_ERROR, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); b_data[0] = DW_OP_lit31; b_data[1] = DW_OP_lit10; @@ -585,8 +624,46 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 31 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 31 ); + CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 10 ); + CU_ASSERT( p_exp->dw_depth == 1 ); + + // DW_OP_pick --------------- + b_data[0] = DW_OP_pick; + b_data[1] = 2; + 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_ERROR, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + + b_data[0] = DW_OP_lit10; + b_data[1] = DW_OP_pick; + b_data[2] = 2; + 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_ERROR, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + + b_data[0] = DW_OP_lit10; + b_data[1] = DW_OP_lit20; + b_data[2] = DW_OP_lit30; + b_data[3] = DW_OP_pick; + b_data[4] = 2; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 5 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.qw_value == 10 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 10 ); + CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 20 ); + CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 30 ); + CU_ASSERT( p_exp->t_stack[ 3 ].value.qw_value == 10 ); + CU_ASSERT( p_exp->dw_depth == 4 ); // DW_OP_over --------------- b_data[0] = DW_OP_over; @@ -594,7 +671,7 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 1 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_ERROR, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); b_data[0] = DW_OP_lit10; b_data[1] = DW_OP_over; @@ -602,20 +679,79 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 2 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_ERROR, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); b_data[0] = DW_OP_lit30; b_data[1] = DW_OP_lit11; - b_data[2] = DW_OP_drop; + b_data[2] = DW_OP_over; 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_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); CU_ASSERT( p_exp->result.qw_value == 30 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 30 ); + CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 11 ); + CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 30 ); + CU_ASSERT( p_exp->dw_depth == 3 ); - // DW_OP_pick --------------- + // DW_OP_swap --------------- + b_data[0] = DW_OP_lit10; + b_data[1] = DW_OP_swap; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 2 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_ERROR, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + + b_data[0] = DW_OP_lit10; + b_data[1] = DW_OP_lit20; + b_data[2] = DW_OP_lit30; + b_data[3] = DW_OP_swap; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 4 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.qw_value == 20 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 10 ); + CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 30 ); + CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 20 ); + CU_ASSERT( p_exp->dw_depth == 3 ); + + // DW_OP_rot --------------- + b_data[0] = DW_OP_lit10; + b_data[1] = DW_OP_lit20; + b_data[2] = DW_OP_rot; + 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_ERROR, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + b_data[0] = DW_OP_lit10; + b_data[1] = DW_OP_lit20; + b_data[2] = DW_OP_lit30; + b_data[3] = DW_OP_rot; + DWARF_Expression_ClearValue( p_exp ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 4 ); + Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, + LIBGOBLIN_DWARF_STATUS_EVALUATED, + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); + CU_ASSERT( p_exp->result.qw_value == 20 ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 30 ); + CU_ASSERT( p_exp->t_stack[ 1 ].value.qw_value == 10 ); + CU_ASSERT( p_exp->t_stack[ 2 ].value.qw_value == 20 ); + CU_ASSERT( p_exp->dw_depth == 3 ); + + // DW_OP_deref ------------------ + // DW_OP_deref_size ------------- + // DW_OP_xderef ----------------- + // DW_OP_xderef_size ------------ + // DW_OP_push_object_address ---- + // DW_OP_form_tls_address ------- + // DW_OP_call_frame_cfa --------- + // DW_OP_fbreg -------------- /* @@ -626,14 +762,14 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void ) dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_REQUESTED, - LIBGOBLIN_DWARF_DATA_FRAME_BASE, LIBGOBLIN_DWARF_DATA_NONE ); + LIBGOBLIN_DWARF_REQUEST_FRAME_BASE, LIBGOBLIN_DWARF_REQUEST_NONE ); p_exp->qw_frame_base = 0x80000000; - p_exp->dw_setdata |= LIBGOBLIN_DWARF_DATA_FRAME_BASE; + p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_FRAME_BASE; dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 3 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, - LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE ); + LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_FRAME_BASE ); CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) ); */ -- 2.11.0