dbghelp: Implement some Arithmetic and Logical dwarf opcodes

André Hentschel nerv at dawncrow.de
Tue Dec 22 12:33:34 CST 2009


...and make a fixme more clear, as there were two times the same sentences
---
 dlls/dbghelp/dwarf.c |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c
index d9e52d3..282f48b 100644
--- a/dlls/dbghelp/dwarf.c
+++ b/dlls/dbghelp/dwarf.c
@@ -704,6 +704,20 @@ compute_location(dwarf2_traverse_context_t* ctx, struct location* loc,
         case DW_OP_consts:  stack[++stk] = dwarf2_leb128_as_signed(ctx); break;
         case DW_OP_plus_uconst:
             stack[stk] += dwarf2_leb128_as_unsigned(ctx); break;
+        case DW_OP_abs:     stack[stk]   = labs(stack[stk]); break;
+        case DW_OP_and:     stack[stk-1] &= stack[stk]; stk--; break;
+        case DW_OP_div:     stack[stk-1] = (LONG_PTR)stack[stk-1] / (LONG_PTR)stack[stk]; stk--; break;
+        case DW_OP_minus:   stack[stk-1] -= stack[stk]; stk--; break;
+        case DW_OP_mod:     stack[stk-1] = (LONG_PTR)stack[stk-1] % (LONG_PTR)stack[stk]; stk--; break;
+        case DW_OP_mul:     stack[stk-1] *= stack[stk]; stk--; break;
+        case DW_OP_neg:     stack[stk]   = -stack[stk]; break;
+        case DW_OP_not:     stack[stk]   = ~stack[stk]; break;
+        case DW_OP_or:      stack[stk-1] |= stack[stk]; stk--; break;
+        case DW_OP_plus:    stack[stk-1] += stack[stk]; stk--; break;
+        case DW_OP_shl:     stack[stk-1] <<= stack[stk]; stk--; break;
+        case DW_OP_shr:     stack[stk-1] >>= stack[stk]; stk--; break;
+        case DW_OP_shra:    stack[stk-1] = (LONG_PTR)stack[stk-1] / (1 << stack[stk]); stk--; break;
+        case DW_OP_xor:     stack[stk-1] ^= stack[stk]; stk--; break;
         case DW_OP_reg0:  case DW_OP_reg1:  case DW_OP_reg2:  case DW_OP_reg3:
         case DW_OP_reg4:  case DW_OP_reg5:  case DW_OP_reg6:  case DW_OP_reg7:
         case DW_OP_reg8:  case DW_OP_reg9:  case DW_OP_reg10: case DW_OP_reg11:
@@ -740,7 +754,7 @@ compute_location(dwarf2_traverse_context_t* ctx, struct location* loc,
             if (!piece_found)
             {
                 if (loc->reg != Wine_DW_no_register)
-                    FIXME("Only supporting one reg (%d -> %d)\n",
+                    FIXME("Only supporting one breg (%d -> %d)\n",
                           loc->reg, dwarf2_map_register(op - DW_OP_breg0));
                 loc->reg = dwarf2_map_register(op - DW_OP_breg0);
             }
-- 

Best Regards, André Hentschel



More information about the wine-patches mailing list