gdbhelpers 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. # Don't forget to rebuild sparse with uncommented debug options
  2. # in the Makefile. Also, gcc 3 is known to screw up with the
  3. # cpp macros in the debugging info.
  4. # If a gdb_show_* function is running at a non-zero recursion
  5. # level, only a short summary is shown, preventing further
  6. # recursion. Also note that gdb has only one, global, scope
  7. # for variables, so we need to be careful with recursions.
  8. set $showing_token = 0
  9. set $showing_ident = 0
  10. set $showing_symbol = 0
  11. set $ntabs = 0
  12. define gdb_tabs
  13. set $tmp = $ntabs
  14. while ($tmp--)
  15. printf "\t"
  16. end
  17. end
  18. # Ptr list handling
  19. define ptr_entry
  20. set $ptr = $arg0
  21. set $index = $arg1
  22. set $entry = &($arg2)
  23. set *($entry) = (void *) (~3UL & (unsigned long)$ptr->list[$index])
  24. end
  25. # Ptr list looping skeleton
  26. define gdb_ptr_list_for_each
  27. set $my_head = (struct ptr_list *) $arg0
  28. set $my_list = $my_head
  29. if ($my_head)
  30. while (1)
  31. set $my_nr = 0
  32. while ($my_nr < $my_list->nr)
  33. # Put your iterator code here
  34. set $my_nr++
  35. end
  36. if (($my_list = $my_list->next) == $my_head)
  37. loop_break
  38. end
  39. end
  40. end
  41. end
  42. # Show symbols in a symbol_list. Non-recursive
  43. define gdb_ptr_list_for_each_show_symbol
  44. set $my_head = (struct ptr_list *) $arg0
  45. set $my_list = $my_head
  46. if ($my_head)
  47. while (1)
  48. set $my_nr = 0
  49. while ($my_nr < ($my_list)->nr)
  50. set $my_symbol = (struct symbol *) ((~3UL) & (unsigned long)($my_list)->list[$my_nr])
  51. gdb_show_symbol($my_symbol)
  52. set $my_nr++
  53. end
  54. set $my_list = ($my_list)->next
  55. if ($my_list == $my_head)
  56. loop_break
  57. end
  58. end
  59. end
  60. end
  61. #define gdb_show_statement
  62. # Recursive
  63. define gdb_show_ctype
  64. printf "modifiers: "
  65. if ($arg0->modifiers & MOD_AUTO)
  66. printf "MOD_AUTO "
  67. end
  68. if ($arg0->modifiers & MOD_REGISTER)
  69. printf "MOD_REGISTER "
  70. end
  71. if ($arg0->modifiers & MOD_STATIC)
  72. printf "MOD_STATIC "
  73. end
  74. if ($arg0->modifiers & MOD_EXTERN)
  75. printf "MOD_EXTERN "
  76. end
  77. if ($arg0->modifiers & MOD_CONST)
  78. printf "MOD_CONST "
  79. end
  80. if ($arg0->modifiers & MOD_VOLATILE)
  81. printf "MOD_VOLATILE "
  82. end
  83. if ($arg0->modifiers & MOD_RESTRICT)
  84. printf "MOD_RESTRICT "
  85. end
  86. if ($arg0->modifiers & MOD_ATOMIC)
  87. printf "MOD_ATOMIC "
  88. end
  89. if ($arg0->modifiers & MOD_SIGNED)
  90. printf "MOD_SIGNED "
  91. end
  92. if ($arg0->modifiers & MOD_UNSIGNED)
  93. printf "MOD_UNSIGNED "
  94. end
  95. if ($arg0->modifiers & MOD_INLINE)
  96. printf "MOD_INLINE "
  97. end
  98. if ($arg0->modifiers & MOD_ADDRESSABLE)
  99. printf "MOD_ADDRESSABLE "
  100. end
  101. if ($arg0->modifiers & MOD_NOCAST)
  102. printf "MOD_NOCAST "
  103. end
  104. if ($arg0->modifiers & MOD_NODEREF)
  105. printf "MOD_NODEREF "
  106. end
  107. if ($arg0->modifiers & MOD_TOPLEVEL)
  108. printf "MOD_TOPLEVEL "
  109. end
  110. if ($arg0->modifiers & MOD_ASSIGNED)
  111. printf "MOD_ASSIGNED "
  112. end
  113. if ($arg0->modifiers & MOD_SAFE)
  114. printf "MOD_SAFE "
  115. end
  116. if ($arg0->modifiers & MOD_USERTYPE)
  117. printf "MOD_USERTYPE "
  118. end
  119. if ($arg0->modifiers & MOD_EXPLICITLY_SIGNED)
  120. printf "MOD_EXPLICITLY_SIGNED"
  121. end
  122. if ($arg0->modifiers & MOD_BITWISE)
  123. printf "MOD_BITWISE "
  124. end
  125. if (!$arg0->modifiers)
  126. printf "0"
  127. end
  128. printf ", alignment = %d", $arg0->alignment
  129. if ($arg0->as)
  130. printf ", address_space = %d", $arg0->as
  131. end
  132. printf "\n"
  133. set $ntabs++
  134. if ($arg0->base_type)
  135. gdb_tabs
  136. printf "base_type = "
  137. gdb_show_symbol($arg0->base_type)
  138. end
  139. set $ntabs--
  140. end
  141. define gdb_show_symbol
  142. printf "(%x) type = ", $arg0
  143. output $arg0->type
  144. printf ", namespace = "
  145. output $arg0->namespace
  146. if ($arg0->ident)
  147. printf ", ident = %s\n", show_ident($arg0->ident)
  148. else
  149. printf ", ident = NULL\n"
  150. end
  151. # print "zz"
  152. gdb_tabs
  153. printf "dump:\n"
  154. call show_symbol($arg0)
  155. set $ntabs++
  156. if ($arg0->namespace == NS_SYMBOL)
  157. gdb_tabs
  158. printf "ctype = "
  159. gdb_show_ctype(&($arg0->ctype))
  160. end
  161. set $ntabs--
  162. end
  163. # non-recursive
  164. define gdb_show_symbols_next_id
  165. set $sym = $arg0
  166. printf "{\n"
  167. set $ntabs++
  168. while ($sym)
  169. gdb_tabs
  170. printf "symbol = "
  171. gdb_show_symbol($sym)
  172. set $sym = $sym->next_id
  173. end
  174. set $ntabs--
  175. gdb_tabs
  176. printf "}\n"
  177. end
  178. define gdb_show_ident
  179. if ($arg0)
  180. printf "(%p) '%s'\n", $arg0, show_ident($arg0)
  181. else
  182. printf "NULL\n"
  183. end
  184. if (! $showing_ident)
  185. set $showing_ident = 1
  186. set $ntabs++
  187. set $ident = $arg0
  188. if ($ident->symbols)
  189. gdb_tabs
  190. printf "symbols = "
  191. gdb_show_symbols_next_id($ident->symbols)
  192. end
  193. set $ntabs--
  194. set $showing_ident = 0
  195. end
  196. end
  197. define gdb_show_token
  198. printf "%p: '%s', type = ", $arg0, show_token($arg0)
  199. output (enum token_type) ($arg0)->pos.type
  200. printf "\n"
  201. if (! $showing_token)
  202. set $showing_token = 1
  203. set $ntabs++
  204. set $token = $arg0
  205. if ($token->pos.type == TOKEN_IDENT)
  206. gdb_tabs
  207. printf "ident = "
  208. gdb_show_ident $token.ident
  209. end
  210. if ($token->pos.type == TOKEN_MACRO_ARGUMENT)
  211. gdb_tabs
  212. printf "argnum = %d\n", $token->argnum
  213. end
  214. if ($token->pos.type == TOKEN_SPECIAL)
  215. gdb_tabs
  216. printf "special = \"%s\"\n", show_special($token.special)
  217. end
  218. set $ntabs--
  219. set $showing_token = 0
  220. end
  221. end
  222. # non-recursive
  223. define gdb_show_tokens
  224. set $t = $arg0
  225. printf "{\n"
  226. set $ntabs++
  227. while ($t != &eof_token_entry)
  228. gdb_tabs
  229. printf "token = "
  230. gdb_show_token($t)
  231. set $t = ($t)->next
  232. end
  233. set $ntabs--
  234. gdb_tabs
  235. printf "}\n"
  236. end