Welcome to mirror list, hosted at ThFree Co, Russian Federation.

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