* dwarf2.h (DW_CFA_GNU_negative_offset_extended): New constant.
authorgeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Feb 2000 01:57:21 +0000 (01:57 +0000)
committergeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Feb 2000 01:57:21 +0000 (01:57 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31858 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 5020e42..4aab454 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 ddbe1b8..d0ca245 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 5e09e4b..c363869 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 dc5d3a9..79ba78a 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 ();
     }