From 59b9e2fd2ea1098ed0c71615cbf8e7b08900223b Mon Sep 17 00:00:00 2001 From: Koine Yuusuke Date: Tue, 3 Sep 2019 12:45:25 +0900 Subject: [PATCH] (LibGoblin) * Implement: DW_OP_swap/rot/abs/and/or/div (NOT Tested!!) --- libgoblin/drd64_libgoblin_dwarf_expression.c | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/libgoblin/drd64_libgoblin_dwarf_expression.c b/libgoblin/drd64_libgoblin_dwarf_expression.c index ceeefd8..32fd3e0 100644 --- a/libgoblin/drd64_libgoblin_dwarf_expression.c +++ b/libgoblin/drd64_libgoblin_dwarf_expression.c @@ -96,7 +96,9 @@ DWord DWord dw_depth; DWord dw_value; QWord qw_value; + QWord qw_temp; Int64 ii_value; + Int64 ii_temp; LibGoblin_DWARF_Expression_Stack t_stack[LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH]; @@ -106,6 +108,7 @@ DWord t_stack[dw_depth].b_flag = LIBGOBLIN_DWARF_STACK_SIGN; \ dw_depth++; } #define POP_DWARF() t_stack[dw_depth--].value.qw_value +#define POP_DWARF_SIGN() t_stack[dw_depth--].value.ii_value // ------------------------ if( NULL == p_exp ) { @@ -204,11 +207,13 @@ DWord qw_value = t_stack[dw_depth - 1].value.qw_value; PUSH_DWARF( qw_value ); break; + case DW_OP_drop: // 0x13 if( 0 == dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } qw_value = POP_DWARF(); break; + case DW_OP_over: // 0x14 if( 2 > dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } @@ -217,6 +222,7 @@ DWord qw_value = t_stack[dw_value].value.qw_value; PUSH_DWARF( qw_value ); break; + case DW_OP_pick: // 0x15 // 2019/09/02 Lunch-Coding (Required TEST!!) b_value = *pb_now++; @@ -229,18 +235,68 @@ DWord qw_value = t_stack[dw_value].value.qw_value; PUSH_DWARF( qw_value ); break; + case DW_OP_swap: // 0x16 + // 2019/09/03 Lunch-Coding (Required TEST!!) + if( 2 > dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + qw_value = t_stack[dw_depth - 2].value.qw_value; + t_stack[dw_depth - 2].value.qw_value + = t_stack[dw_depth - 1].value.qw_value; + t_stack[dw_depth - 1].value.qw_value = qw_value; break; + case DW_OP_rot: // 0x17 + // 2019/09/03 Lunch-Coding (Required TEST!!) + if( 3 > dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + qw_value = t_stack[dw_depth - 1].value.qw_value; + t_stack[dw_depth - 1].value.qw_value + = t_stack[dw_depth - 2].value.qw_value; + t_stack[dw_depth - 2].value.qw_value + = t_stack[dw_depth - 3].value.qw_value; + t_stack[dw_depth - 3].value.qw_value = qw_value; break; + case DW_OP_xderef: // 0x18 break; + case DW_OP_abs: // 0x19 + // 2019/09/03 Lunch-Coding (Required TEST!!) + if( 0 == dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + if( LIBGOBLIN_DWARF_STACK_SIGN == t_stack[dw_depth].b_flag ) { + ii_value = POP_DWARF_SIGN(); + if( 0 > ii_value ) { ii_value *= -1; } + PUSH_DWARF_SIGN( ii_value ); + } break; + case DW_OP_and: // 0x1a + // 2019/09/03 Lunch-Coding (Required TEST!!) + if( 2 > dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_value = POP_DWARF(); + qw_temp = POP_DWARF(); + qw_value &= qw_temp; + PUSH_DWARF( qw_value ); break; + case DW_OP_div: // 0x1b + // 2019/09/03 Lunch-Coding (Required TEST!!) + if( 2 > dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_temp = POP_DWARF_SIGN(); + ii_value = POP_DWARF_SIGN(); + if( 0 == ii_temp ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_value /= ii_temp; + PUSH_DWARF_SIGN( ii_value ); break; + case DW_OP_minus: // 0x1c break; case DW_OP_mod: // 0x1d @@ -252,7 +308,16 @@ DWord case DW_OP_not: // 0x20 break; case DW_OP_or: // 0x21 + // 2019/09/03 Lunch-Coding (Required TEST!!) + if( 2 > dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_value = POP_DWARF(); + qw_temp = POP_DWARF(); + qw_value |= qw_temp; + PUSH_DWARF( qw_value ); break; + case DW_OP_plus: // 0x22 break; case DW_OP_plus_uconst: // 0x23 -- 2.11.0