gdb-variable-scopes.patch 5.0 KB

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