2002-07-31 Duncan Mak <duncan@ximian.com>
[mono.git] / mcs / class / Mono.CSharp.Debugger / gdb-variable-scopes.patch
1 Index: include/elf/ChangeLog
2 ===================================================================
3 RCS file: /cvs/src/src/include/elf/ChangeLog,v
4 retrieving revision 1.121
5 diff -u -u -p -r1.121 ChangeLog
6 --- include/elf/ChangeLog       13 Feb 2002 18:14:48 -0000      1.121
7 +++ include/elf/ChangeLog       12 Apr 2002 19:50:31 -0000
8 @@ -1,3 +1,7 @@
9 +2002-04-12  Martin Baulig  <martin@gnome.org>
10 +
11 +       * dwarf2.h (DW_AT_end_scope): Added as GNU extension.
12 +
13  2002-02-13  Matt Fredette  <fredette@netbsd.org>
14  
15         * m68k.h (EF_M68000): Define.
16 Index: include/elf/dwarf2.h
17 ===================================================================
18 RCS file: /cvs/src/src/include/elf/dwarf2.h,v
19 retrieving revision 1.8
20 diff -u -u -p -r1.8 dwarf2.h
21 --- include/elf/dwarf2.h        28 Jan 2002 23:26:53 -0000      1.8
22 +++ include/elf/dwarf2.h        12 Apr 2002 19:50:32 -0000
23 @@ -328,6 +328,8 @@ enum dwarf_attribute
24      DW_AT_src_coords = 0x2104,
25      DW_AT_body_begin = 0x2105,
26      DW_AT_body_end   = 0x2106,
27 +    DW_AT_end_scope  = 0x2121,
28 +    
29      /* VMS Extensions.  */
30      DW_AT_VMS_rtnbeg_pd_address = 0x2201
31    };
32 Index: gdb/ChangeLog
33 ===================================================================
34 RCS file: /cvs/src/src/gdb/ChangeLog,v
35 retrieving revision 1.2421
36 diff -u -u -p -r1.2421 ChangeLog
37 --- gdb/ChangeLog       12 Apr 2002 07:37:17 -0000      1.2421
38 +++ gdb/ChangeLog       12 Apr 2002 19:50:38 -0000
39 @@ -1,3 +1,14 @@
40 +2002-04-12  Martin Baulig  <martin@gnome.org>
41 +
42 +       * dwarf2read.c (new_symbol): If DW_AT_start_scope and DW_AT_end_scope
43 +       are specified, set SYMBOL_RANGES().
44 +
45 +       * findvar.c (read_var_value): Check whether the current PC is within
46 +       the SYMBOL_RANGES(), return NULL if not.
47 +
48 +       * stack.c (print_block_frame_locals): Only print vars if the current PC
49 +       is in their SYMBOL_RANGES().
50 +
51  2002-04-12  Kevin Buettner  <kevinb@redhat.com>
52  
53         From Jimi X <jimix@watson.ibm.com>:
54 Index: gdb/dwarf2read.c
55 ===================================================================
56 RCS file: /cvs/src/src/gdb/dwarf2read.c,v
57 retrieving revision 1.52
58 diff -u -u -p -r1.52 dwarf2read.c
59 --- gdb/dwarf2read.c    4 Apr 2002 22:26:43 -0000       1.52
60 +++ gdb/dwarf2read.c    12 Apr 2002 19:50:44 -0000
61 @@ -4394,6 +4394,19 @@ new_symbol (struct die_info *die, struct
62                 add_symbol_to_list (sym, list_in_scope);
63               break;
64             }
65 +         attr = dwarf_attr (die, DW_AT_start_scope);
66 +         attr2 = dwarf_attr (die, DW_AT_end_scope);
67 +         if (attr && attr2)
68 +           {
69 +             struct range_list *r = (struct range_list *)
70 +               obstack_alloc (&objfile->type_obstack,
71 +                              sizeof (struct range_list));
72 +
73 +             r->start = DW_ADDR (attr);
74 +             r->end = DW_ADDR (attr2);
75 +
76 +             SYMBOL_RANGES (sym) = r;
77 +           }
78           attr = dwarf_attr (die, DW_AT_location);
79           if (attr)
80             {
81 Index: gdb/findvar.c
82 ===================================================================
83 RCS file: /cvs/src/src/gdb/findvar.c,v
84 retrieving revision 1.31
85 diff -u -u -p -r1.31 findvar.c
86 --- gdb/findvar.c       9 Apr 2002 03:06:13 -0000       1.31
87 +++ gdb/findvar.c       12 Apr 2002 19:50:45 -0000
88 @@ -417,9 +417,11 @@ struct value *
89  read_var_value (register struct symbol *var, struct frame_info *frame)
90  {
91    register struct value *v;
92 +  register struct range_list *r;
93    struct type *type = SYMBOL_TYPE (var);
94    CORE_ADDR addr;
95    register int len;
96 +  int range_ok = 0;
97  
98    v = allocate_value (type);
99    VALUE_LVAL (v) = lval_memory;        /* The most likely possibility.  */
100 @@ -429,6 +431,23 @@ read_var_value (register struct symbol *
101  
102    if (frame == NULL)
103      frame = selected_frame;
104 +
105 +  if (!SYMBOL_RANGES (var))
106 +    range_ok = 1;
107 +  else
108 +    {
109 +      for (r = SYMBOL_RANGES (var); r; r = r->next)
110 +       {
111 +         if (r->start <= frame->pc && r->end > frame->pc)
112 +           {
113 +             range_ok = 1;
114 +             break;
115 +           }
116 +       }
117 +    }
118 +
119 +  if (!range_ok)
120 +    return NULL;
121  
122    switch (SYMBOL_CLASS (var))
123      {
124 Index: gdb/stack.c
125 ===================================================================
126 RCS file: /cvs/src/src/gdb/stack.c,v
127 retrieving revision 1.33
128 diff -u -u -p -r1.33 stack.c
129 --- gdb/stack.c 10 Apr 2002 23:32:33 -0000      1.33
130 +++ gdb/stack.c 12 Apr 2002 19:50:47 -0000
131 @@ -1173,14 +1173,36 @@ print_block_frame_locals (struct block *
132         case LOC_REGISTER:
133         case LOC_STATIC:
134         case LOC_BASEREG:
135 -         values_printed = 1;
136 -         for (j = 0; j < num_tabs; j++)
137 -           fputs_filtered ("\t", stream);
138 -         fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
139 -         fputs_filtered (" = ", stream);
140 -         print_variable_value (sym, fi, stream);
141 -         fprintf_filtered (stream, "\n");
142 -         break;
143 +         {
144 +           struct range_list *r;
145 +           int range_ok = 0;
146 +
147 +           if (!SYMBOL_RANGES (sym))
148 +             range_ok = 1;
149 +           else
150 +             {
151 +               for (r = SYMBOL_RANGES (sym); r; r = r->next)
152 +                 {
153 +                   if (r->start <= fi->pc && r->end > fi->pc)
154 +                     {
155 +                       range_ok = 1;
156 +                       break;
157 +                     }
158 +                 }
159 +             }
160 +
161 +           if (range_ok)
162 +             {
163 +               values_printed = 1;
164 +               for (j = 0; j < num_tabs; j++)
165 +                 fputs_filtered ("\t", stream);
166 +               fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
167 +               fputs_filtered (" = ", stream);
168 +               print_variable_value (sym, fi, stream);
169 +               fprintf_filtered (stream, "\n");
170 +             }
171 +           break;
172 +         }
173  
174         default:
175           /* Ignore symbols which are not locals.  */