dwarf2.h (DW_CFA_GNU_negative_offset_extended): New constant.
authorGeoff Keating <geoffk@cygnus.com>
Wed, 9 Feb 2000 01:57:21 +0000 (01:57 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Wed, 9 Feb 2000 01:57:21 +0000 (01:57 +0000)
* dwarf2.h (DW_CFA_GNU_negative_offset_extended): New constant.
* dwarf2out.c (dwarf_cfi_name): Print name of new constant.
(reg_save): Use DW_CFA_GNU_negative_offset_extended when needed.
(output_cfi): Handle output of DW_CFA_GNU_negative_offset_extended.
* frame.c (execute_cfa_insn): Handle
DW_CFA_GNU_negative_offset_extended.

From-SVN: r31858

gcc/ChangeLog
gcc/dwarf2.h
gcc/dwarf2out.c
gcc/frame.c

index 5020e42b4e3ac38ea2acb35e18a169f9fd7889ed..4aab454f101758a30342579e22feeb947ee06f8c 100644 (file)
@@ -1,3 +1,12 @@
+2000-02-08  Geoff Keating  <geoffk@cygnus.com>
+
+       * dwarf2.h (DW_CFA_GNU_negative_offset_extended): New constant.
+       * dwarf2out.c (dwarf_cfi_name): Print name of new constant.
+       (reg_save): Use DW_CFA_GNU_negative_offset_extended when needed.
+       (output_cfi): Handle output of DW_CFA_GNU_negative_offset_extended.
+       * frame.c (execute_cfa_insn): Handle 
+       DW_CFA_GNU_negative_offset_extended.
+
 2000-02-08  Richard Henderson  <rth@cygnus.com>
 
        * flow.c (tidy_fallthru_edges): Split out from ...
index ddbe1b823bba5880dcb31da8e5b57f88c274b065..d0ca2451b7697ea903568f599327ce1766be6bc9 100644 (file)
@@ -1,6 +1,7 @@
 /* Declarations and definitions of codes relating to the DWARF2 symbolic
    debugging information format.
-   Copyright (C) 1992, 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1995, 1996, 1997, 2000 
+   Free Software Foundation, Inc.
    Contributed by Gary Funck (gary@intrepid.com).  Derived from the
    DWARF 1 implementation written by Ron Guilmette (rfg@monkeys.com).
 
@@ -501,7 +502,8 @@ enum dwarf_call_frame_info
 
     /* GNU extensions */
     DW_CFA_GNU_window_save = 0x2d,
-    DW_CFA_GNU_args_size = 0x2e
+    DW_CFA_GNU_args_size = 0x2e,
+    DW_CFA_GNU_negative_offset_extended = 0x2f
   };
 
 #define DW_CIE_ID        0xffffffff
index 5e09e4b9b2f17fac8624abcbf8ec86b2d9be52c0..c363869a26becfb67f25d1457fe12ea6468f14fd 100644 (file)
@@ -643,6 +643,8 @@ dwarf_cfi_name (cfi_opc)
       return "DW_CFA_GNU_window_save";
     case DW_CFA_GNU_args_size:
       return "DW_CFA_GNU_args_size";
+    case DW_CFA_GNU_negative_offset_extended:
+      return "DW_CFA_GNU_negative_offset_extended";
 
     default:
       return "DW_CFA_<unknown>";
@@ -872,7 +874,10 @@ reg_save (label, reg, sreg, offset)
 
       offset /= DWARF_CIE_DATA_ALIGNMENT;
       if (offset < 0)
-       abort ();
+       {
+         cfi->dw_cfi_opc = DW_CFA_GNU_negative_offset_extended;
+         offset = -offset;
+       }
       cfi->dw_cfi_oprnd2.dw_cfi_offset = offset;
     }
   else
@@ -1559,6 +1564,7 @@ output_cfi (cfi, fde)
          break;
 #endif
        case DW_CFA_offset_extended:
+       case DW_CFA_GNU_negative_offset_extended:
        case DW_CFA_def_cfa:
          output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_reg_num);
           fputc ('\n', asm_out_file);
index dc5d3a9c9ade8a7a783ac97c4945f646e9cb18ad..79ba78ac149a9706cf3a385fe1701e8cf694f25d 100644 (file)
@@ -795,6 +795,14 @@ execute_cfa_insn (void *p, struct frame_state_internal *state,
       state->s.args_size = offset;
       break;
 
+    case DW_CFA_GNU_negative_offset_extended:
+      p = decode_uleb128 (p, &reg);
+      p = decode_uleb128 (p, &offset);
+      offset *= info->data_align;
+      state->s.saved[reg] = REG_SAVED_OFFSET;
+      state->s.reg_or_offset[reg] = -offset;
+      break;
+
     default:
       abort ();
     }