* unwind-dw2.c (execute_cfa_program): Fix DW_CFA_restore handling.
authorJakub Jelinek <jakub@redhat.com>
Tue, 11 Dec 2001 17:27:14 +0000 (18:27 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Dec 2001 17:27:14 +0000 (18:27 +0100)
From-SVN: r47881

gcc/ChangeLog
gcc/unwind-dw2.c

index a2ec53c90053a8543c26f5d236561b5a44683c38..4fe21250d76e0d34124044e4a803e9af8f39f31a 100644 (file)
@@ -1,3 +1,7 @@
+2001-12-11  Jakub Jelinek  <jakub@redhat.com>
+
+       * unwind-dw2.c (execute_cfa_program): Fix DW_CFA_restore handling.
+
 2001-12-10  Roger Sayle <roger@eyesopen.com>
 
        * builtins.c (expand_builtin): Use a switch statement to list
index a5ac36830306354164d108afd54883e5d41bbb83..c2619bd88985d6c5b6deeb1e4a877ffdf1741c60 100644 (file)
@@ -711,9 +711,9 @@ execute_cfa_program (const unsigned char *insn_ptr,
       _Unwind_Word reg, utmp;
       _Unwind_Sword offset, stmp;
 
-      if (insn & DW_CFA_advance_loc)
+      if ((insn & 0xc0) == DW_CFA_advance_loc)
        fs->pc += (insn & 0x3f) * fs->code_align;
-      else if (insn & DW_CFA_offset)
+      else if ((insn & 0xc0) == DW_CFA_offset)
        {
          reg = insn & 0x3f;
          insn_ptr = read_uleb128 (insn_ptr, &utmp);
@@ -721,7 +721,7 @@ execute_cfa_program (const unsigned char *insn_ptr,
          fs->regs.reg[reg].how = REG_SAVED_OFFSET;
          fs->regs.reg[reg].loc.offset = offset;
        }
-      else if (insn & DW_CFA_restore)
+      else if ((insn & 0xc0) == DW_CFA_restore)
        {
          reg = insn & 0x3f;
          fs->regs.reg[reg].how = REG_UNSAVED;