patches/gdb/6.3/640-debian_dwarf2-frame-signal-unwinder.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Thu May 17 16:22:51 2007 +0000 (2007-05-17)
changeset 96 aa1a9fbd6eb8
permissions -rw-r--r--
Debug facilities:
- add a framework to easily add new ones
- add gdb as a first debug facility
- add patches for gdb
After the kernel checked its installed headers, clean up the mess of .checked.* files.
Reorder scripts/crosstool.sh:
- dump the configuration early
- renice early
- get info about build system early, when setting up the environment
- when in cross or native, the host tools are those of the build system, and only in this case
- elapsed time calculations moved to scripts/functions
Remove handling of the color: it's gone once and for all.
Update tools/addToolVersion.sh:
- handle debug facilities
- commonalise some code
- remove dead tools (cygwin, tcc)
Point to my address for bug reports.
yann@96
     1
Status: Checked in to HEAD after 6.3.
yann@96
     2
yann@96
     3
2004-11-07  Daniel Jacobowitz  <dan@debian.org>
yann@96
     4
yann@96
     5
	* dwarf2-frame.c (struct dwarf2_frame_ops): Add signal_frame_p.
yann@96
     6
	(dwarf2_frame_set_signal_frame_p, dwarf2_frame_signal_frame_p)
yann@96
     7
	(dwarf2_signal_frame_unwind): New.
yann@96
     8
	(dwarf2_frame_sniffer): Use dwarf2_frame_signal_frame_p.
yann@96
     9
	* dwarf2-frame.h (dwarf2_frame_set_signal_frame_p): New prototype.
yann@96
    10
yann@96
    11
Index: src/gdb/dwarf2-frame.c
yann@96
    12
===================================================================
yann@96
    13
RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.c,v
yann@96
    14
retrieving revision 1.41
yann@96
    15
diff -u -p -r1.41 dwarf2-frame.c
yann@96
    16
--- src/gdb/dwarf2-frame.c	4 Nov 2004 21:15:15 -0000	1.41
yann@96
    17
+++ src/gdb/dwarf2-frame.c	7 Nov 2004 17:41:58 -0000
yann@96
    18
@@ -471,6 +471,10 @@ struct dwarf2_frame_ops
yann@96
    19
 {
yann@96
    20
   /* Pre-initialize the register state REG for register REGNUM.  */
yann@96
    21
   void (*init_reg) (struct gdbarch *, int, struct dwarf2_frame_state_reg *);
yann@96
    22
+
yann@96
    23
+  /* Check whether the frame preceding NEXT_FRAME will be a signal
yann@96
    24
+     trampoline.  */
yann@96
    25
+  int (*signal_frame_p) (struct gdbarch *, struct frame_info *);
yann@96
    26
 };
yann@96
    27
 
yann@96
    28
 /* Default architecture-specific register state initialization
yann@96
    29
@@ -547,6 +551,33 @@ dwarf2_frame_init_reg (struct gdbarch *g
yann@96
    30
 
yann@96
    31
   ops->init_reg (gdbarch, regnum, reg);
yann@96
    32
 }
yann@96
    33
+
yann@96
    34
+/* Set the architecture-specific signal trampoline recognition
yann@96
    35
+   function for GDBARCH to SIGNAL_FRAME_P.  */
yann@96
    36
+
yann@96
    37
+void
yann@96
    38
+dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch,
yann@96
    39
+				 int (*signal_frame_p) (struct gdbarch *,
yann@96
    40
+							struct frame_info *))
yann@96
    41
+{
yann@96
    42
+  struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data);
yann@96
    43
+
yann@96
    44
+  ops->signal_frame_p = signal_frame_p;
yann@96
    45
+}
yann@96
    46
+
yann@96
    47
+/* Query the architecture-specific signal frame recognizer for
yann@96
    48
+   NEXT_FRAME.  */
yann@96
    49
+
yann@96
    50
+static int
yann@96
    51
+dwarf2_frame_signal_frame_p (struct gdbarch *gdbarch,
yann@96
    52
+			     struct frame_info *next_frame)
yann@96
    53
+{
yann@96
    54
+  struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data);
yann@96
    55
+
yann@96
    56
+  if (ops->signal_frame_p == NULL)
yann@96
    57
+    return 0;
yann@96
    58
+  return ops->signal_frame_p (gdbarch, next_frame);
yann@96
    59
+}
yann@96
    60
 
yann@96
    61
 
yann@96
    62
 struct dwarf2_frame_cache
yann@96
    63
@@ -841,6 +872,13 @@ static const struct frame_unwind dwarf2_
yann@96
    64
   dwarf2_frame_prev_register
yann@96
    65
 };
yann@96
    66
 
yann@96
    67
+static const struct frame_unwind dwarf2_signal_frame_unwind =
yann@96
    68
+{
yann@96
    69
+  SIGTRAMP_FRAME,
yann@96
    70
+  dwarf2_frame_this_id,
yann@96
    71
+  dwarf2_frame_prev_register
yann@96
    72
+};
yann@96
    73
+
yann@96
    74
 const struct frame_unwind *
yann@96
    75
 dwarf2_frame_sniffer (struct frame_info *next_frame)
yann@96
    76
 {
yann@96
    77
@@ -848,10 +886,18 @@ dwarf2_frame_sniffer (struct frame_info 
yann@96
    78
      function.  frame_pc_unwind(), for a no-return next function, can
yann@96
    79
      end up returning something past the end of this function's body.  */
yann@96
    80
   CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame);
yann@96
    81
-  if (dwarf2_frame_find_fde (&block_addr))
yann@96
    82
-    return &dwarf2_frame_unwind;
yann@96
    83
+  if (!dwarf2_frame_find_fde (&block_addr))
yann@96
    84
+    return NULL;
yann@96
    85
 
yann@96
    86
-  return NULL;
yann@96
    87
+  /* On some targets, signal trampolines may have unwind information.
yann@96
    88
+     We need to recognize them so that we set the frame type
yann@96
    89
+     correctly.  */
yann@96
    90
+
yann@96
    91
+  if (dwarf2_frame_signal_frame_p (get_frame_arch (next_frame),
yann@96
    92
+				   next_frame))
yann@96
    93
+    return &dwarf2_signal_frame_unwind;
yann@96
    94
+
yann@96
    95
+  return &dwarf2_frame_unwind;
yann@96
    96
 }
yann@96
    97
 
yann@96
    98
 
yann@96
    99
Index: src/gdb/dwarf2-frame.h
yann@96
   100
===================================================================
yann@96
   101
RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.h,v
yann@96
   102
retrieving revision 1.6
yann@96
   103
diff -u -p -r1.6 dwarf2-frame.h
yann@96
   104
--- src/gdb/dwarf2-frame.h	28 Feb 2004 16:59:32 -0000	1.6
yann@96
   105
+++ src/gdb/dwarf2-frame.h	7 Nov 2004 17:40:41 -0000
yann@96
   106
@@ -79,6 +79,14 @@ extern void dwarf2_frame_set_init_reg (s
yann@96
   107
 				       void (*init_reg) (struct gdbarch *, int,
yann@96
   108
 					     struct dwarf2_frame_state_reg *));
yann@96
   109
 
yann@96
   110
+/* Set the architecture-specific signal trampoline recognition
yann@96
   111
+   function for GDBARCH to SIGNAL_FRAME_P.  */
yann@96
   112
+
yann@96
   113
+extern void
yann@96
   114
+  dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch,
yann@96
   115
+				   int (*signal_frame_p) (struct gdbarch *,
yann@96
   116
+							  struct frame_info *));
yann@96
   117
+
yann@96
   118
 /* Return the frame unwind methods for the function that contains PC,
yann@96
   119
    or NULL if it can't be handled by DWARF CFI frame unwinder.  */
yann@96
   120