rdwarf 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +28 -0
  6. data/README.md +39 -0
  7. data/Rakefile +8 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +7 -0
  10. data/ext/rdwarf/depend +5 -0
  11. data/ext/rdwarf/extconf.rb +29 -0
  12. data/ext/rdwarf/libdwarf/CHANGES +102 -0
  13. data/ext/rdwarf/libdwarf/CODINGSTYLE +71 -0
  14. data/ext/rdwarf/libdwarf/COPYING +28 -0
  15. data/ext/rdwarf/libdwarf/ChangeLog +619 -0
  16. data/ext/rdwarf/libdwarf/ChangeLog2006 +835 -0
  17. data/ext/rdwarf/libdwarf/ChangeLog2007 +217 -0
  18. data/ext/rdwarf/libdwarf/ChangeLog2008 +263 -0
  19. data/ext/rdwarf/libdwarf/ChangeLog2009 +348 -0
  20. data/ext/rdwarf/libdwarf/ChangeLog2010 +175 -0
  21. data/ext/rdwarf/libdwarf/ChangeLog2011 +297 -0
  22. data/ext/rdwarf/libdwarf/ChangeLog2012 +131 -0
  23. data/ext/rdwarf/libdwarf/ChangeLog2013 +238 -0
  24. data/ext/rdwarf/libdwarf/ChangeLog2014 +399 -0
  25. data/ext/rdwarf/libdwarf/LGPL.txt +504 -0
  26. data/ext/rdwarf/libdwarf/LIBDWARFCOPYRIGHT +40 -0
  27. data/ext/rdwarf/libdwarf/Makefile.in +220 -0
  28. data/ext/rdwarf/libdwarf/NEWS +535 -0
  29. data/ext/rdwarf/libdwarf/README +235 -0
  30. data/ext/rdwarf/libdwarf/checkexamples.c +1179 -0
  31. data/ext/rdwarf/libdwarf/cmplrs/dwarf_addr_finder.h +55 -0
  32. data/ext/rdwarf/libdwarf/common.c +62 -0
  33. data/ext/rdwarf/libdwarf/common.h +38 -0
  34. data/ext/rdwarf/libdwarf/config.h.in +146 -0
  35. data/ext/rdwarf/libdwarf/configure +5581 -0
  36. data/ext/rdwarf/libdwarf/configure.in +167 -0
  37. data/ext/rdwarf/libdwarf/dw-linetableheader.txt +39 -0
  38. data/ext/rdwarf/libdwarf/dwarf.h +1342 -0
  39. data/ext/rdwarf/libdwarf/dwarf_abbrev.c +291 -0
  40. data/ext/rdwarf/libdwarf/dwarf_abbrev.h +45 -0
  41. data/ext/rdwarf/libdwarf/dwarf_addr_finder.c +676 -0
  42. data/ext/rdwarf/libdwarf/dwarf_alloc.c +685 -0
  43. data/ext/rdwarf/libdwarf/dwarf_alloc.h +38 -0
  44. data/ext/rdwarf/libdwarf/dwarf_arange.c +595 -0
  45. data/ext/rdwarf/libdwarf/dwarf_arange.h +62 -0
  46. data/ext/rdwarf/libdwarf/dwarf_base_types.h +157 -0
  47. data/ext/rdwarf/libdwarf/dwarf_die_deliv.c +1802 -0
  48. data/ext/rdwarf/libdwarf/dwarf_die_deliv.h +46 -0
  49. data/ext/rdwarf/libdwarf/dwarf_elf_access.c +1348 -0
  50. data/ext/rdwarf/libdwarf/dwarf_elf_access.h +46 -0
  51. data/ext/rdwarf/libdwarf/dwarf_error.c +492 -0
  52. data/ext/rdwarf/libdwarf/dwarf_error.h +53 -0
  53. data/ext/rdwarf/libdwarf/dwarf_form.c +1302 -0
  54. data/ext/rdwarf/libdwarf/dwarf_frame.c +2454 -0
  55. data/ext/rdwarf/libdwarf/dwarf_frame.h +418 -0
  56. data/ext/rdwarf/libdwarf/dwarf_frame2.c +1533 -0
  57. data/ext/rdwarf/libdwarf/dwarf_frame3.c +282 -0
  58. data/ext/rdwarf/libdwarf/dwarf_funcs.c +123 -0
  59. data/ext/rdwarf/libdwarf/dwarf_funcs.h +33 -0
  60. data/ext/rdwarf/libdwarf/dwarf_gdbindex.c +520 -0
  61. data/ext/rdwarf/libdwarf/dwarf_gdbindex.h +97 -0
  62. data/ext/rdwarf/libdwarf/dwarf_global.c +612 -0
  63. data/ext/rdwarf/libdwarf/dwarf_global.h +117 -0
  64. data/ext/rdwarf/libdwarf/dwarf_harmless.c +228 -0
  65. data/ext/rdwarf/libdwarf/dwarf_harmless.h +31 -0
  66. data/ext/rdwarf/libdwarf/dwarf_incl.h +61 -0
  67. data/ext/rdwarf/libdwarf/dwarf_init_finish.c +1263 -0
  68. data/ext/rdwarf/libdwarf/dwarf_leb.c +159 -0
  69. data/ext/rdwarf/libdwarf/dwarf_line.c +1822 -0
  70. data/ext/rdwarf/libdwarf/dwarf_line.h +446 -0
  71. data/ext/rdwarf/libdwarf/dwarf_line2.c +98 -0
  72. data/ext/rdwarf/libdwarf/dwarf_line_table_reader_common.c +1583 -0
  73. data/ext/rdwarf/libdwarf/dwarf_loc.c +1525 -0
  74. data/ext/rdwarf/libdwarf/dwarf_loc.h +149 -0
  75. data/ext/rdwarf/libdwarf/dwarf_loc2.c +833 -0
  76. data/ext/rdwarf/libdwarf/dwarf_macro.c +479 -0
  77. data/ext/rdwarf/libdwarf/dwarf_macro.h +35 -0
  78. data/ext/rdwarf/libdwarf/dwarf_opaque.h +778 -0
  79. data/ext/rdwarf/libdwarf/dwarf_original_elf_init.c +219 -0
  80. data/ext/rdwarf/libdwarf/dwarf_print_lines.c +631 -0
  81. data/ext/rdwarf/libdwarf/dwarf_pubtypes.c +132 -0
  82. data/ext/rdwarf/libdwarf/dwarf_query.c +1594 -0
  83. data/ext/rdwarf/libdwarf/dwarf_ranges.c +194 -0
  84. data/ext/rdwarf/libdwarf/dwarf_reloc_arm.h +308 -0
  85. data/ext/rdwarf/libdwarf/dwarf_reloc_mips.h +117 -0
  86. data/ext/rdwarf/libdwarf/dwarf_reloc_ppc.h +242 -0
  87. data/ext/rdwarf/libdwarf/dwarf_reloc_ppc64.h +272 -0
  88. data/ext/rdwarf/libdwarf/dwarf_reloc_x86_64.h +127 -0
  89. data/ext/rdwarf/libdwarf/dwarf_sort_line.c +665 -0
  90. data/ext/rdwarf/libdwarf/dwarf_string.c +82 -0
  91. data/ext/rdwarf/libdwarf/dwarf_stubs.c +38 -0
  92. data/ext/rdwarf/libdwarf/dwarf_tied.c +423 -0
  93. data/ext/rdwarf/libdwarf/dwarf_tsearch.h +125 -0
  94. data/ext/rdwarf/libdwarf/dwarf_tsearchhash.c +675 -0
  95. data/ext/rdwarf/libdwarf/dwarf_types.c +121 -0
  96. data/ext/rdwarf/libdwarf/dwarf_types.h +32 -0
  97. data/ext/rdwarf/libdwarf/dwarf_util.c +913 -0
  98. data/ext/rdwarf/libdwarf/dwarf_util.h +324 -0
  99. data/ext/rdwarf/libdwarf/dwarf_vars.c +125 -0
  100. data/ext/rdwarf/libdwarf/dwarf_vars.h +29 -0
  101. data/ext/rdwarf/libdwarf/dwarf_weaks.c +123 -0
  102. data/ext/rdwarf/libdwarf/dwarf_weaks.h +29 -0
  103. data/ext/rdwarf/libdwarf/dwarf_xu_index.c +579 -0
  104. data/ext/rdwarf/libdwarf/dwarf_xu_index.h +68 -0
  105. data/ext/rdwarf/libdwarf/dwgetopt.c +181 -0
  106. data/ext/rdwarf/libdwarf/dwgetopt.h +51 -0
  107. data/ext/rdwarf/libdwarf/gennames.c +531 -0
  108. data/ext/rdwarf/libdwarf/install.sh +119 -0
  109. data/ext/rdwarf/libdwarf/libdwarf.h.in +3746 -0
  110. data/ext/rdwarf/libdwarf/libdwarf2.1.mm +9805 -0
  111. data/ext/rdwarf/libdwarf/libdwarf2.1.pdf +0 -0
  112. data/ext/rdwarf/libdwarf/libdwarf2p.1.mm +2807 -0
  113. data/ext/rdwarf/libdwarf/libdwarf2p.1.pdf +0 -0
  114. data/ext/rdwarf/libdwarf/libdwarfdefs.h +81 -0
  115. data/ext/rdwarf/libdwarf/malloc_check.c +327 -0
  116. data/ext/rdwarf/libdwarf/malloc_check.h +52 -0
  117. data/ext/rdwarf/libdwarf/mips_extensions.mm +1266 -0
  118. data/ext/rdwarf/libdwarf/mips_extensions.pdf +0 -0
  119. data/ext/rdwarf/libdwarf/pro_alloc.c +179 -0
  120. data/ext/rdwarf/libdwarf/pro_alloc.h +33 -0
  121. data/ext/rdwarf/libdwarf/pro_arange.c +310 -0
  122. data/ext/rdwarf/libdwarf/pro_arange.h +51 -0
  123. data/ext/rdwarf/libdwarf/pro_die.c +431 -0
  124. data/ext/rdwarf/libdwarf/pro_die.h +59 -0
  125. data/ext/rdwarf/libdwarf/pro_encode_nm.c +108 -0
  126. data/ext/rdwarf/libdwarf/pro_encode_nm.h +39 -0
  127. data/ext/rdwarf/libdwarf/pro_error.c +96 -0
  128. data/ext/rdwarf/libdwarf/pro_error.h +43 -0
  129. data/ext/rdwarf/libdwarf/pro_expr.c +575 -0
  130. data/ext/rdwarf/libdwarf/pro_expr.h +36 -0
  131. data/ext/rdwarf/libdwarf/pro_finish.c +45 -0
  132. data/ext/rdwarf/libdwarf/pro_forms.c +1271 -0
  133. data/ext/rdwarf/libdwarf/pro_frame.c +572 -0
  134. data/ext/rdwarf/libdwarf/pro_frame.h +120 -0
  135. data/ext/rdwarf/libdwarf/pro_funcs.c +50 -0
  136. data/ext/rdwarf/libdwarf/pro_incl.h +91 -0
  137. data/ext/rdwarf/libdwarf/pro_init.c +327 -0
  138. data/ext/rdwarf/libdwarf/pro_line.c +373 -0
  139. data/ext/rdwarf/libdwarf/pro_line.h +112 -0
  140. data/ext/rdwarf/libdwarf/pro_macinfo.c +457 -0
  141. data/ext/rdwarf/libdwarf/pro_macinfo.h +31 -0
  142. data/ext/rdwarf/libdwarf/pro_opaque.h +513 -0
  143. data/ext/rdwarf/libdwarf/pro_pubnames.c +60 -0
  144. data/ext/rdwarf/libdwarf/pro_reloc.c +253 -0
  145. data/ext/rdwarf/libdwarf/pro_reloc.h +38 -0
  146. data/ext/rdwarf/libdwarf/pro_reloc_stream.c +256 -0
  147. data/ext/rdwarf/libdwarf/pro_reloc_stream.h +52 -0
  148. data/ext/rdwarf/libdwarf/pro_reloc_symbolic.c +245 -0
  149. data/ext/rdwarf/libdwarf/pro_reloc_symbolic.h +45 -0
  150. data/ext/rdwarf/libdwarf/pro_section.c +2233 -0
  151. data/ext/rdwarf/libdwarf/pro_section.h +100 -0
  152. data/ext/rdwarf/libdwarf/pro_types.c +274 -0
  153. data/ext/rdwarf/libdwarf/pro_types.h +34 -0
  154. data/ext/rdwarf/libdwarf/pro_util.h +38 -0
  155. data/ext/rdwarf/libdwarf/pro_vars.c +52 -0
  156. data/ext/rdwarf/libdwarf/pro_weaks.c +51 -0
  157. data/ext/rdwarf/rdwarf.c +765 -0
  158. data/ext/rdwarf/rdwarf.h +52 -0
  159. data/ext/rdwarf/rdwarf_names_gen.rb +109 -0
  160. data/lib/rdwarf.rb +181 -0
  161. data/lib/rdwarf/version.rb +3 -0
  162. data/rdwarf.gemspec +30 -0
  163. metadata +251 -0
@@ -0,0 +1,1266 @@
1
+ \."
2
+ \." the following line may be removed if the ff ligature works on your machine
3
+ .lg 0
4
+ \." set up heading formats
5
+ .ds HF 3 3 3 3 3 2 2
6
+ .ds HP +2 +2 +1 +0 +0
7
+ .nr Hs 5
8
+ .nr Hb 5
9
+ \." ==============================================
10
+ \." Put current date in the following at each rev
11
+ .ds vE rev 1.18, 31 March 2005
12
+ \." ==============================================
13
+ \." ==============================================
14
+ .ds | |
15
+ .ds ~ ~
16
+ .ds ' '
17
+ .if t .ds Cw \&\f(CW
18
+ .if n .ds Cw \fB
19
+ .de Cf \" Place every other arg in Cw font, beginning with first
20
+ .if \\n(.$=1 \&\*(Cw\\$1\fP
21
+ .if \\n(.$=2 \&\*(Cw\\$1\fP\\$2
22
+ .if \\n(.$=3 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP
23
+ .if \\n(.$=4 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4
24
+ .if \\n(.$=5 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP
25
+ .if \\n(.$=6 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP\\$6
26
+ .if \\n(.$=7 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP\\$6\*(Cw\\$7\fP
27
+ .if \\n(.$=8 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP\\$6\*(Cw\\$7\fP\\$8
28
+ .if \\n(.$=9 \&\*(Cw\\$1\fP\\$2\*(Cw\\$3\fP\\$4\*(Cw\\$5\fP\\$6\*(Cw\\$7\fP\\$8\
29
+ *(Cw
30
+ ..
31
+ .nr Cl 4
32
+ .SA 1
33
+ .TL
34
+ MIPS Extensions to DWARF Version 2.0
35
+ .AF ""
36
+ .AU "Silicon Graphics Computer Systems"
37
+ .PF "'\*(vE'- \\\\nP -''"
38
+ .AS 1
39
+ This document describes the MIPS/Silicon Graphics extensions
40
+ to the "DWARF Information Format" (version 2.0.0 dated July 27, 1993).
41
+ DWARF3 draft 8 (or draft 9) is out as of 2005, and
42
+ is mentioned below where applicable.
43
+ MIPS/IRIX compilers emit DWARF2 (with extensions).
44
+ .P
45
+ Rather than alter the base documents to describe the extensions
46
+ we provide this separate document.
47
+ .P
48
+ The extensions documented here are subject to change.
49
+ .P
50
+ It also describes known bugs resulting in incorrect dwarf usage.
51
+ .P
52
+ \*(vE
53
+
54
+ .AE
55
+ .MT 4
56
+
57
+ .H 1 "INTRODUCTION"
58
+ .P
59
+ This
60
+ document describes MIPS extensions
61
+ to the DWARF debugging information format.
62
+ The extensions documented here are subject to change at
63
+ any time.
64
+ .H 1 "64 BIT DWARF"
65
+ .P
66
+ The DWARF2 spec has no provision for 64 bit offsets.
67
+ SGI-IRIX/MIPS Elf64 objects contain DWARF 2 with all offsets
68
+ (and addresses) as 64bit values.
69
+ This non-standard extension was adopted in 1992.
70
+ Nothing in the dwarf itself identifies the dwarf as 64bit.
71
+ This extension 64bit-offset dwarf cannot be mixed with 32bit-offset dwarf
72
+ in a single object or executable, and SGI-IRIX/MIPS compilers
73
+ and tools do not mix the sizes.
74
+ .P
75
+ In 2001 DWARF3 adopted a very different 64bit-offset
76
+ format which can be mixed usefully with 32bit-offset DWARF2 or DWARF3.
77
+ It is not very likely SGI-IRIX/MIPS compilers will switch to the
78
+ now-standard
79
+ DWARF3 64bit-offset scheme, but such a switch is theoretically
80
+ possible and would be a good idea.
81
+ .P
82
+ SGI-IRIX/MIPS Elf32 objects
83
+ contain DWARF2 with all offsets (and addresses) 32 bits.
84
+ .H 1 "How much symbol information is emitted"
85
+ The following standard DWARF V2 sections may be emitted:
86
+ .AL
87
+ .LI
88
+ Section .debug_abbrev
89
+ contains
90
+ abbreviations supporting the .debug_info section.
91
+ .LI
92
+ Section .debug_info
93
+ contains
94
+ Debug Information Entries (DIEs).
95
+ .LI
96
+ Section .debug_frame
97
+ contains
98
+ stack frame descriptions.
99
+ .LI
100
+ Section .debug_line
101
+ contains
102
+ line number information.
103
+ .LI
104
+ Section .debug_aranges
105
+ contains
106
+ address range descriptions.
107
+ .LI
108
+ Section .debug_pubnames
109
+ contains
110
+ names of global functions and data.
111
+ .P
112
+ The following
113
+ are MIPS extensions.
114
+ Theses were created to allow debuggers to
115
+ know names without having to look at
116
+ the .debug_info section.
117
+ .LI
118
+ Section .debug_weaknames
119
+ is a MIPS extension
120
+ containing .debug_pubnames-like entries describing weak
121
+ symbols.
122
+ .LI
123
+ Section .debug_funcnames
124
+ is a MIPS extension
125
+ containing .debug_pubnames-like entries describing file-static
126
+ functions (C static functions).
127
+ The gcc extension of nested subprograms (like Pascal)
128
+ adds non-global non-static functions. These should be treated like
129
+ static functions and gcc should add such to this section
130
+ so that IRIX libexc(3C) will work correctly.
131
+ Similarly, Ada functions which are non-global should be here too
132
+ so that libexc(3C) can work.
133
+ Putting it another way, every function (other than inline code)
134
+ belongs either in .debug_pubnames or in .debug_funcnames
135
+ or else libexc(3C) cannot find the function name.
136
+ .LI
137
+ Section .debug_varnames
138
+ is a MIPS extension
139
+ containing .debug_pubnames-like entries describing file-static
140
+ data symbols (C static variables).
141
+ .LI
142
+ Section .debug_typenames
143
+ is a MIPS extension
144
+ containing .debug_pubnames-like entries describing file-level
145
+ types.
146
+ .P
147
+ The following are not currently emitted.
148
+ .LI
149
+ Section .debug_macinfo
150
+ Macro information is not currently emitted.
151
+ .LI
152
+ Section .debug_loc
153
+ Location lists are not currently emitted.
154
+ .LI
155
+ Section .debug_str
156
+ The string section is not currently emitted.
157
+ .LE
158
+ .H 2 "Overview of information emitted"
159
+ We emit debug information in 3 flavors.
160
+ We mention C here.
161
+ The situation is essentially identical for f77, f90, and C++.
162
+ .AL
163
+ .LI
164
+ "default C"
165
+ We emit line information and DIEs for each subprogram.
166
+ But no local symbols and no type information.
167
+ Frame information is output.
168
+ The DW_AT_producer string has the optimization level: for example
169
+ "-O2".
170
+ We put so much in the DW_AT_producer that the string
171
+ is a significant user of space in .debug_info --
172
+ this is perhaps a poor use of space.
173
+ When optimizing the IRIX CC/cc option -DEBUG:optimize_space
174
+ eliminates such wasted space.
175
+ Debuggers only currently use the lack of -g
176
+ of DW_AT_producer
177
+ as a hint as to how a 'step' command should be interpreted, and
178
+ the rest of the string is not used for anything (unless
179
+ a human looks at it for some reason), so if space-on-disk
180
+ is an issue, it is quite appropriate to use -DEBUG:optimize_space
181
+ and save disk space.
182
+ Every function definition (not inline instances though) is mentioned
183
+ in either .debug_pubnames or .debug_funcnames.
184
+ This is crucial to allow libexc(3C) stack-traceback to work and
185
+ show function names (for all languages).
186
+ .LI
187
+ "C with full symbols"
188
+ All possible info is emitted.
189
+ DW_AT_producer string has all options that might be of interest,
190
+ which includes -D's, -U's, and the -g option.
191
+ These options look like they came from the command line.
192
+ We put so much in the DW_AT_producer that the string
193
+ is a significant user of space in .debug_info.
194
+ this is perhaps a poor use of space.
195
+ Debuggers only currently use the -g
196
+ of DW_AT_producer
197
+ as a hint as to how a 'step' command should be interpreted, and
198
+ the rest of the string is not used for anything (unless
199
+ a human looks at it for some reason).
200
+ Every function definition (not inline instances though) is mentioned
201
+ in either .debug_pubnames or .debug_funcnames.
202
+ This is crucial to allow libexc(3C) stack-traceback to work and
203
+ show function names (for all languages).
204
+ .LI
205
+ "Assembler (-g, non -g are the same)"
206
+ Frame information is output.
207
+ No type information is emitted, but DIEs are prepared
208
+ for globals.
209
+ .LE
210
+ .H 2 "Detecting 'full symbols' (-g)"
211
+ The debugger depends on the existence of
212
+ the DW_AT_producer string to determine if the
213
+ compilation unit has full symbols or not.
214
+ It looks for -g or -g[123] and accepts these as
215
+ full symbols but an absent -g or a present -g0
216
+ is taken to mean that only basic symbols are defined and there
217
+ are no local symbols and no type information.
218
+ .P
219
+ In various contexts the debugger will think the program is
220
+ stripped or 'was not compiled with -g' unless the -g
221
+ is in the DW_AT_producer string.
222
+ .H 2 "DWARF and strip(1)"
223
+ The DWARF section ".debug_frame" is marked SHF_MIPS_NOSTRIP
224
+ and is not stripped by the strip(1) program.
225
+ This is because the section is needed for doing
226
+ stack back traces (essential for C++
227
+ and Ada exception handling).
228
+ .P
229
+ All .debug_* sections are marked with elf type
230
+ SHT_MIPS_DWARF.
231
+ Applications needing to access the various DWARF sections
232
+ must use the section name to discriminate between them.
233
+
234
+ .H 2 "Evaluating location expressions"
235
+ When the debugger evaluates location expressions, it does so
236
+ in 2 stages. In stage one it simply looks for the trivial
237
+ location expressions and treats those as special cases.
238
+ .P
239
+ If the location expression is not trivial, it enters stage two.
240
+ In this case it uses a stack to evaluate the expression.
241
+ .P
242
+ If the application is a 32-bit application, it does the operations
243
+ on 32-bit values (address size values). Even though registers
244
+ can be 64 bits in a 32-bit program all evaluations are done in
245
+ 32-bit quantities, so an attempt to calculate a 32-bit quantity
246
+ by taking the difference of 2 64-bit register values will not
247
+ work. The notion is that the stack machine is, by the dwarf
248
+ definition, working in address size units.
249
+ .P
250
+ These values are then expanded to 64-bit values (addresses or
251
+ offsets). This extension does not involve sign-extension.
252
+ .P
253
+ If the application is a 64-bit application, then the stack
254
+ values are all 64 bits and all operations are done on 64 bits.
255
+ .H 3 "The fbreg location op"
256
+ Compilers shipped with IRIX 6.0 and 6.1
257
+ do not emit the fbreg location expression
258
+ and never emit the DW_AT_frame_base attribute that it
259
+ depends on.
260
+ However, this changes
261
+ with release 6.2 and these are now emitted routinely.
262
+
263
+ .H 1 "Frame Information"
264
+ .H 2 "Initial Instructions"
265
+ The DWARF V2 spec
266
+ provides for "initial instructions" in each CIE (page 61,
267
+ section 6.4.1).
268
+ However, it does not say whether there are default
269
+ values for each column (register).
270
+ .P
271
+ Rather than force every CIE to have a long list
272
+ of bytes to initialize all 32 integer registers,
273
+ we define that the default values of all registers
274
+ (as returned by libdwarf in the frame interface)
275
+ are 'same value'.
276
+ This is a good choice for many non-register-windows
277
+ implementations.
278
+ .H 2 "Augmentation string in debug_frame"
279
+ The augmentation string we use in shipped compilers (up thru
280
+ irix6.2) is the empty string.
281
+ IRIX6.2 and later has an augmentation string
282
+ the empty string ("")
283
+ or "z" or "mti v1"
284
+ where the "v1" is a version number (version 1).
285
+ .P
286
+ We do not believe that "mti v1" was emitted as the
287
+ augmentation string in any shipped compiler.
288
+ .P
289
+ .H 3 "CIE processing based on augmentation string:"
290
+ If the augmentation string begins with 'z', then it is followed
291
+ immediately by a unsigned_leb_128 number giving the code alignment factor.
292
+ Next is a signed_leb_128 number giving the data alignment factor.
293
+ Next is a unsigned byte giving the number of the return address register.
294
+ Next is an unsigned_leb_128 number giving the length of the 'augmentation'
295
+ fields (the length of augmentation bytes, not
296
+ including the unsigned_leb_128 length itself).
297
+ As of release 6.2, the length of the CIE augmentation fields is 0.
298
+ What this means is that it is possible to add new
299
+ augmentations, z1, z2, etc and yet an old consumer to
300
+ understand the entire CIE as it can bypass the
301
+ augmentation it does not understand because the
302
+ length of the augmentation fields is present.
303
+ Presuming of course that all augmentation fields are
304
+ simply additional information,
305
+ not some 'changing of the meaning of
306
+ an existing field'.
307
+ Currently there is no CIE data in the augmentation for things
308
+ beginning with 'z'.
309
+ .P
310
+ If the augmentation string is "mti v1" or "" then it is followed
311
+ immediately by a unsigned_leb_128 number giving the code alignment factor.
312
+ Next is a signed_leb_128 number giving the data alignment factor.
313
+ Next is a unsigned byte giving the number of the return address register.
314
+ .P
315
+ If the augmentation string is something else, then the
316
+ code alignment factor is assumed to be 4 and the data alignment
317
+ factor is assumed to be -1 and the return
318
+ address register is assumed to be 31. Arbitrarily.
319
+ The library (libdwarf) assumes it does not understand the rest of the CIE.
320
+ .P
321
+ .H 3 "FDE processing based on augmentation"
322
+ If the CIE augmentation string
323
+ for an fde begins with 'z'
324
+ then the next FDE field after the address_range field
325
+ is an
326
+ unsigned_leb_128 number giving the length of the 'augmentation'
327
+ fields, and those fields follow immediately.
328
+
329
+ .H 4 "FDE augmentation fields"
330
+ .P
331
+ If the CIE augmentation string is "mti v1" or ""
332
+ then the FDE is exactly as described in the Dwarf Document section 6.4.1.
333
+ .P
334
+ Else, if the CIE augmentation string begins with "z"
335
+ then the next field after the FDE augmentation length field
336
+ is a Dwarf_Sword size offset into
337
+ exception tables.
338
+ If the CIE augmentation string does not begin with "z"
339
+ (and is neither "mti v1" nor "")
340
+ the FDE augmentation fields are skipped (not understood).
341
+ Note that libdwarf actually (as of MIPSpro7.3 and earlier)
342
+ only tests that the initial character of the augmentation
343
+ string is 'z', and ignores the rest of the string, if any.
344
+ So in reality the test is for a _prefix_ of 'z'.
345
+ .P
346
+ If the CIE augmentation string neither starts with 'z' nor is ""
347
+ nor is "mti v1" then libdwarf (incorrectly) assumes that the
348
+ table defining instructions start next.
349
+ Processing (in libdwarf) will be incorrect.
350
+ .H 2 "Stack Pointer recovery from debug_frame"
351
+ There is no identifiable means in
352
+ DWARF2 to say that the stack register is
353
+ recovered by any particular operation.
354
+ A 'register rule' works if the caller's
355
+ stack pointer was copied to another
356
+ register.
357
+ An 'offset(N)' rule works if the caller's
358
+ stack pointer was stored on the stack.
359
+ However if the stack pointer is
360
+ some register value plus/minus some offset,
361
+ there is no means to say this in an FDE.
362
+ For MIPS/IRIX, the recovered stack pointer
363
+ of the next frame up the stack (towards main())
364
+ is simply the CFA value of the current
365
+ frame, and the CFA value is
366
+ precisely a register (value of a register)
367
+ or a register plus offset (value of a register
368
+ plus offset). This is a software convention.
369
+ .H 1 "egcs dwarf extensions (egcs-1.1.2 extensions)"
370
+ This and following egcs sections describe
371
+ the extensions currently shown in egcs dwarf2.
372
+ Note that egcs has chosen to adopt tag and
373
+ attribute naming as if their choices were
374
+ standard dwarf, not as if they were extensions.
375
+ However, they are properly numbered as extensions.
376
+
377
+ .H 2 "DW_TAG_format_label 0x4101"
378
+ For FORTRAN 77, Fortran 90.
379
+ Details of use not defined in egcs source, so
380
+ unclear if used.
381
+ .H 2 "DW_TAG_function_template 0x4102"
382
+ For C++.
383
+ Details of use not defined in egcs source, so
384
+ unclear if used.
385
+ .H 2 "DW_TAG_class_template 0x4103"
386
+ For C++.
387
+ Details of use not defined in egcs source, so
388
+ unclear if used.
389
+ .H 2 "DW_AT_sf_names 0x2101"
390
+ Apparently only output in DWARF1, not DWARF2.
391
+ .H 2 "DW_AT_src_info 0x2102"
392
+ Apparently only output in DWARF1, not DWARF2.
393
+ .H 2 "DW_AT_mac_info 0x2103"
394
+ Apparently only output in DWARF1, not DWARF2.
395
+ .H 2 "DW_AT_src_coords 0x2104"
396
+ Apparently only output in DWARF1, not DWARF2.
397
+ .H 2 "DW_AT_body_begin 0x2105"
398
+ Apparently only output in DWARF1, not DWARF2.
399
+ .H 2 "DW_AT_body_end 0x2106"
400
+ Apparently only output in DWARF1, not DWARF2.
401
+
402
+ .H 1 "egcs .eh_frame (non-sgi) (egcs-1.1.2 extensions)"
403
+ egcs-1.1.2 (and earlier egcs)
404
+ emits by default a section named .eh_frame
405
+ for ia32 (and possibly other platforms) which
406
+ is nearly identical to .debug_frame in format and content.
407
+ This section is used for helping handle C++ exceptions.
408
+ .P
409
+ Because after linking there are sometimes zero-ed out bytes
410
+ at the end of the eh_frame section, the reader code in
411
+ dwarf_frame.c considers a zero cie/fde length as an indication
412
+ that it is the end of the section.
413
+ .P
414
+ .H 2 "CIE_id 0"
415
+ The section is an ALLOCATED section in an executable, and
416
+ is therefore mapped into memory at run time.
417
+ The CIE_pointer (aka CIE_id, section 6.4.1
418
+ of the DWARF2 document) is the field that
419
+ distinguishes a CIE from an FDE.
420
+ The designers of the egcs .eh_frame section
421
+ decided to make the CIE_id
422
+ be 0 as the CIE_pointer definition is
423
+ .in +2
424
+ the number of bytes from the CIE-pointer in the FDE back to the
425
+ applicable CIE.
426
+ .in -2
427
+ In a dwarf .debug_frame section, the CIE_pointer is the
428
+ offset in .debug_frame of the CIE for this fde, and
429
+ since an offset can be zero of some CIE, the CIE_id
430
+ cannot be 0, but must be all 1 bits .
431
+ Note that the dwarf2.0 spec does specify the value of CIE_id
432
+ as 0xffffffff
433
+ (see section 7.23 of v2.0.0),
434
+ though earlier versions of this extensions document
435
+ incorrectly said it was not specified in the dwarf
436
+ document.
437
+ .H 2 "augmentation eh"
438
+ The augmentation string in each CIE is "eh"
439
+ which, with its following NUL character, aligns
440
+ the following word to a 32bit boundary.
441
+ Following the augmentation string is a 32bit
442
+ word with the address of the __EXCEPTION_TABLE__,
443
+ part of the exception handling data for egcs.
444
+ .H 2 "DW_CFA_GNU_window_save 0x2d"
445
+ This is effectively a flag for architectures with
446
+ register windows, and tells the unwinder code that
447
+ it must look to a previous frame for the
448
+ correct register window set.
449
+ As of this writing, egcs gcc/frame.c
450
+ indicates this is for SPARC register windows.
451
+ .H 2 "DW_CFA_GNU_args_size 0x2e"
452
+ DW_CFA_GNU_args_size has a single uleb128 argument
453
+ which is the size, in bytes, of the function's stack
454
+ at that point in the function.
455
+ .H 2 "__EXCEPTION_TABLE__"
456
+ A series of 3 32bit word entries by default:
457
+ 0 word: low pc address
458
+ 1 word: high pc address
459
+ 2 word: pointer to exception handler code
460
+ The end of the table is
461
+ signaled by 2 words of -1 (not 3 words!).
462
+ .H 1 "Interpretations of the DWARF V2 spec"
463
+ .H 2 "template TAG spellings"
464
+ The DWARF V2 spec spells two attributes in two ways.
465
+ DW_TAG_template_type_param
466
+ (listed in Figure 1, page 7)
467
+ is spelled DW_TAG_template_type_parameter
468
+ in the body of the document (section 3.3.7, page 28).
469
+ We have adopted the spelling
470
+ DW_TAG_template_type_param.
471
+ .P
472
+ DW_TAG_template_value_param
473
+ (listed in Figure 1, page 7)
474
+ is spelled DW_TAG_template_value_parameter
475
+ in the body of the document (section 3.3.7, page 28).
476
+ We have adopted the spelling
477
+ DW_TAG_template_value_parameter.
478
+ .P
479
+ We recognize that the choices adopted are neither consistently
480
+ the longer nor the shorter name.
481
+ This inconsistency was an accident.
482
+ .H 2 DW_FORM_ref_addr confusing
483
+ Section 7.5.4, Attribute Encodings, describes
484
+ DW_FORM_ref_addr.
485
+ The description says the reference is the size of an address
486
+ on the target architecture.
487
+ This is surely a mistake, because on a 16bit-pointer-architecture
488
+ it would mean that the reference could not exceed
489
+ 16 bits, which makes only
490
+ a limited amount of sense as the reference is from one
491
+ part of the dwarf to another, and could (in theory)
492
+ be *on the disk* and not limited to what fits in memory.
493
+ Since MIPS is 32 bit pointers (at the smallest)
494
+ the restriction is not a problem for MIPS/SGI.
495
+ The 32bit pointer ABIs are limited to 32 bit section sizes
496
+ anyway (as a result of implementation details).
497
+ And the 64bit pointer ABIs currently have the same limit
498
+ as a result of how the compilers and tools are built
499
+ (this has not proven to be a limit in practice, so far).
500
+ .P
501
+ This has been clarified in the DWARF3 spec and the IRIX use
502
+ of DW_FORM_ref_addr being an offset is correct.
503
+ .H 2 "Section .debug_macinfo in a debugger"
504
+ It seems quite difficult, in general, to
505
+ tie specific text(code) addresses to points in the
506
+ stream of macro information for a particular compilation unit.
507
+ So it's been difficult to see how to design a consumer
508
+ interface to libdwarf for macro information.
509
+ .P
510
+ The best (simple to implement, easy for a debugger user to
511
+ understand) candidate seems to be that
512
+ the debugger asks for macros of a given name in a compilation
513
+ unit, and the debugger responds with *all* the macros of that name.
514
+ .H 3 "only a single choice exists"
515
+ If there is exactly one, that is usable in expressions, if the
516
+ debugger is able to evaluate such.
517
+ .H 3 "multiple macros with same name".
518
+ If there are multiple macros with the same name
519
+ in a compilation unit,
520
+ the debugger (and the debugger user and the application
521
+ programmer) have
522
+ a problem: confusion is quite possible.
523
+ If the macros are simple the
524
+ debugger user can simply substitute by hand in an expression.
525
+ If the macros are complicated hand substitution will be
526
+ impractical, and the debugger will have to identify the
527
+ choices and let the debugger user choose an interpretation.
528
+ .H 2 "Section 6.1.2 Lookup by address problem"
529
+ Each entry is a beginning-address followed by a length.
530
+ And the distinguished entry 0,0 is used to denote
531
+ the end of a range of entries.
532
+ .P
533
+ This means that one must be careful not to emit a zero length,
534
+ as in a .o (object file) the beginning address of
535
+ a normal entry might be 0 (it is a section offset after all),
536
+ and the resulting 0,0 would be taken as end-of-range, not
537
+ as a valid entry.
538
+ A dwarf dumper would have trouble with such data
539
+ in an object file.
540
+ .P
541
+ In an a.out or shared object (dynamic shared object, DSO)
542
+ no text will be at address zero so in such this problem does
543
+ not arise.
544
+ .H 2 "Section 5.10 Subrange Type Entries problem"
545
+ It is specified that DW_AT_upper_bound (and lower bound)
546
+ must be signed entries if there is no object type
547
+ info to specify the bound type (Sec 5.10, end of section).
548
+ One cannot tell (with some
549
+ dwarf constant types) what the signedness is from the
550
+ form itself (like DW_FORM_data1), so it is necessary
551
+ to determine the object and type according to the rules
552
+ in 5.10 and then if all that fails, the type is signed.
553
+ It's a bit complicated and earlier versions of mips_extensions
554
+ incorrectly said signedness was not defined.
555
+ .H 2 "Section 5.5.6 Class Template Instantiations problem"
556
+ Lots of room for implementor to canonicalize
557
+ template declarations. Ie various folks won't agree.
558
+ This is not serious since a given compiler
559
+ will be consistent with itself and debuggers
560
+ will have to cope!
561
+ .H 2 "Section 2.4.3.4 # 11. operator spelling"
562
+ DW_OP_add should be DW_OP_plus (page 14)
563
+ (this mistake just one place on the page).
564
+ .H 2 "No clear specification of C++ static funcs"
565
+ There is no clear way to tell if a C++ member function
566
+ is a static member or a non-static member function.
567
+ (dwarf2read.c in gdb 4.18, for example, has this observation)
568
+ .H 2 "Misspelling of DW_AT_const_value"
569
+ Twice in appendix 1, DW_AT_const_value is misspelled
570
+ as DW_AT_constant_value.
571
+ .H 2 "Mistake in Atribute Encodings"
572
+ Section 7.5.4, "Attribute Encodings"
573
+ has a brief discussion of "constant"
574
+ which says there are 6 forms of constants.
575
+ It is incorrect in that it fails to mention (or count)
576
+ the block forms, which are clearly allowed by
577
+ section 4.1 "Data Object Entries" (see entry number 9 in
578
+ the numbered list, on constants).
579
+ .H 2 "DW_OP_bregx"
580
+ The description of DW_OP_bregx in 2.4.3.2 (Register Based
581
+ Addressing) is slightly misleading, in that it
582
+ lists the offset first.
583
+ As section 7.7.1 (Location Expression)
584
+ makes clear, in the encoding the register number
585
+ comes first.
586
+ .H 1 "MIPS attributes"
587
+ .H 2 "DW_AT_MIPS_fde"
588
+ This extension to Dwarf appears only on subprogram TAGs and has as
589
+ its value the offset, in the .debug_frame section, of the fde which
590
+ describes the frame of this function. It is an optimization of
591
+ sorts to have this present.
592
+
593
+ .H 2 "DW_CFA_MIPS_advance_loc8 0x1d"
594
+ This obvious extension to dwarf line tables enables encoding of 8 byte
595
+ advance_loc values (for cases when such must be relocatable,
596
+ and thus must be full length). Applicable only to 64-bit objects.
597
+
598
+ .H 2 "DW_TAG_MIPS_loop 0x4081"
599
+ For future use. Not currently emitted.
600
+ Places to be emitted and attributes that this might own
601
+ not finalized.
602
+
603
+ .H 2 "DW_AT_MIPS_loop_begin 0x2002"
604
+ For future use. Not currently emitted.
605
+ Attribute form and content not finalized.
606
+
607
+ .H 2 "DW_AT_MIPS_tail_loop_begin 0x2003"
608
+ For future use. Not currently emitted.
609
+ Attribute form and content not finalized.
610
+
611
+ .H 2 "DW_AT_MIPS_epilog_begin 0x2004"
612
+ For future use. Not currently emitted.
613
+ Attribute form and content not finalized.
614
+
615
+ .H 2 "DW_AT_MIPS_loop_unroll_factor 0x2005"
616
+ For future use. Not currently emitted.
617
+ Attribute form and content not finalized.
618
+
619
+ .H 2 "DW_AT_MIPS_software_pipeline_depth 0x2006"
620
+ For future use. Not currently emitted.
621
+ Attribute form and content not finalized.
622
+ .H 2 "DW_AT_MIPS_linkage_name 0x2007"
623
+ The rules for mangling C++ names are not part of the
624
+ C++ standard and are different for different versions
625
+ of C++. With this extension, the compiler emits
626
+ both the DW_AT_name for things with mangled names
627
+ (recall that DW_AT_name is NOT the mangled form)
628
+ and also emits DW_AT_MIPS_linkage_name whose value
629
+ is the mangled name.
630
+ .P
631
+ This makes looking for the mangled name in other linker
632
+ information straightforward.
633
+ It also is passed (by the debugger) to the
634
+ libmangle routines to generate names to present to the
635
+ debugger user.
636
+ .H 2 "DW_AT_MIPS_stride 0x2008"
637
+ F90 allows assumed shape arguments and pointers to describe
638
+ non-contiguous memory. A (runtime) descriptor contains address,
639
+ bounds and stride information - rank and element size is known
640
+ during compilation. The extent in each dimension is given by the
641
+ bounds in a DW_TAG_subrange_type, but the stride cannot be
642
+ represented in conventional dwarf. DW_AT_MIPS_stride was added as
643
+ an attribute of a DW_TAG_subrange_type to describe the
644
+ location of the stride.
645
+ Used in the MIPSpro 7.2 (7.2.1 etc) compilers.
646
+ .P
647
+ If the stride is constant (ie: can be inferred from the type in the
648
+ usual manner) DW_AT_MIPS_stride is absent.
649
+ .P
650
+ If DW_AT_MIPS_stride is present, the attribute contains a reference
651
+ to a DIE which describes the location holding the stride, and the
652
+ DW_AT_stride_size field of DW_TAG_array_type is ignored if
653
+ present. The value of the stride is the number of
654
+ 4 byte words between
655
+ elements along that axis.
656
+ .P
657
+ This applies to
658
+ .nf
659
+ a) Intrinsic types whose size is greater
660
+ or equal to 4bytes ie: real*4,integer*8
661
+ complex etc, but not character types.
662
+
663
+ b) Derived types (ie: structs) of any size,
664
+ unless all components are of type character.
665
+ .fi
666
+
667
+ .H 2 "DW_AT_MIPS_abstract_name 0x2009"
668
+ This attribute only appears in a DA_TAG_inlined_subroutine DIE.
669
+ The value of this attribute is a string.
670
+ When IPA inlines a routine and the abstract origin is
671
+ in another compilation unit, there is a problem with putting
672
+ in a reference, since the ordering and timing of the
673
+ creation of references is unpredicatable with reference to
674
+ the DIE and compilation unit the reference refers to.
675
+ .P
676
+ Since there may be NO ordering of the compilation units that
677
+ allows a correct reference to be done without some kind of patching,
678
+ and since even getting the information from one place to another
679
+ is a problem, the compiler simply passes the problem on to the debugger.
680
+ .P
681
+ The debugger must match the DW_AT_MIPS_abstract_name
682
+ in the concrete
683
+ inlined instance DIE
684
+ with the DW_AT_MIPS_abstract_name
685
+ in the abstract inlined subroutine DIE.
686
+ .P
687
+ A dwarf-consumer-centric view of this and other inline
688
+ issues could be expressed as follows:
689
+ .nf
690
+ If DW_TAG_subprogram
691
+ If has DW_AT_inline is abstract instance root
692
+ If has DW_AT_abstract_origin, is out-of-line instance
693
+ of function (need abstract origin for some data)
694
+ (abstract root in same CU (conceptually anywhere
695
+ a ref can reach, but reaching outside of CU is
696
+ a problem for ipa: see DW_AT_MIPS_abstract_name))
697
+ If has DW_AT_MIPS_abstract_name is abstract instance
698
+ root( must have DW_AT_inline) and this name is used to
699
+ match with the abstract root
700
+
701
+ If DW_TAG_inline_subroutine
702
+ Is concrete inlined subprogram instance.
703
+ If has DW_AT_abstract_origin, it is a CU-local inline.
704
+ If it has DW_AT_MIPS_abstract_name it is an
705
+ inline whose abstract root is in another file (CU).
706
+ .fi
707
+
708
+ .H 2 "DW_AT_MIPS_clone_origin 0x200a"
709
+ This attribute appears only in a cloned subroutine.
710
+ The procedure is cloned from the same compilation unit.
711
+ The value of this attribute is a reference to
712
+ the original routine in this compilation unit.
713
+ .P
714
+ The 'original' routine means the routine which has all the
715
+ original code. The cloned routines will always have
716
+ been 'specialized' by IPA.
717
+ A routine with DW_AT_MIPS_clone_origin
718
+ will also have the DW_CC_nocall value of the DW_AT_calling_convention
719
+ attribute.
720
+
721
+ .H 2 "DW_AT_MIPS_has_inlines 0x200b"
722
+ This attribute may appear in a DW_TAG_subprogram DIE.
723
+ If present and it has the value True, then the subprogram
724
+ has inlined functions somewhere in the body.
725
+ .P
726
+ By default, at startup, the debugger may not look for
727
+ inlined functions in scopes inside the outer function.
728
+ .P
729
+ This is a hint to the debugger to look for the inlined functions
730
+ so the debugger can set breakpoints on these in case the user
731
+ requests 'stop in foo' and foo is inlined.
732
+ .H 2 "DW_AT_MIPS_stride_byte 0x200c"
733
+ Created for f90 pointer and assumed shape
734
+ arrays.
735
+ Used in the MIPSpro 7.2 (7.2.1 etc) compilers.
736
+ A variant of DW_AT_MIPS_stride.
737
+ This stride is interpreted as a byte count.
738
+ Used for integer*1 and character arrays
739
+ and arrays of derived type
740
+ whose components are all character.
741
+ .H 2 "DW_AT_MIPS_stride_elem 0x200d"
742
+ Created for f90 pointer and assumed shape
743
+ arrays.
744
+ Used in the MIPSpro 7.2 (7.2.1 etc) compilers.
745
+ A variant of DW_AT_MIPS_stride.
746
+ This stride is interpreted as a byte-pair (2 byte) count.
747
+ Used for integer*2 arrays.
748
+ .H 2 "DW_AT_MIPS_ptr_dopetype 0x200e"
749
+ See following.
750
+ .H 2 "DW_AT_MIPS_allocatable_dopetype 0x200f"
751
+ See following.
752
+ .H 2 "DW_AT_MIPS_assumed_shape_dopetype 0x2010"
753
+ DW_AT_MIPS_assumed_shape_dopetype, DW_AT_MIPS_allocatable_dopetype,
754
+ and DW_AT_MIPS_ptr_dopetype have an attribute value
755
+ which is a reference to a Fortran 90 Dope Vector.
756
+ These attributes are introduced in MIPSpro7.3.
757
+ They only apply to f90 arrays (where they are
758
+ needed to describe arrays never properly described
759
+ before in debug information).
760
+ C, C++, f77, and most f90 arrays continue to be described
761
+ in standard dwarf.
762
+ .P
763
+ The distinction between these three attributes is the f90 syntax
764
+ distinction: keywords 'pointer' and 'allocatable' with the absence
765
+ of these keywords on an assumed shape array being the third case.
766
+ .P
767
+ A "Dope Vector" is a struct (C struct) which describes
768
+ a dynamically-allocatable array.
769
+ In objects with full debugging the C struct will be
770
+ in the dwarf information (of the f90 object, represented like C).
771
+ A debugger will use the link to find the main struct DopeVector
772
+ and will use that information to decode the dope vector.
773
+ At the outer allocatable/assumed-shape/pointer
774
+ the DW_AT_location points at the dope vector (so debugger
775
+ calculations use that as a base).
776
+ .H 2 "Overview of debugger use of dope vectors"
777
+ Fundamentally, we build two distinct
778
+ representations of the arrays and pointers.
779
+ One, in dwarf, represents the statically-representable
780
+ information (the types and
781
+ variable/type-names, without type size information).
782
+ The other, using dope vectors in memory, represents
783
+ the run-time data of sizes.
784
+ A debugger must process the two representations
785
+ in parallel (and merge them) to deal with user expressions in
786
+ a debugger.
787
+ .H 2 "Example f90 code for use in explanation"
788
+ [Note
789
+ We want dwarf output with *exactly*
790
+ this little (arbitrary) example.
791
+ Not yet available.
792
+ end Note]
793
+ Consider the following code.
794
+ .nf
795
+ type array_ptr
796
+ real :: myvar
797
+ real, dimension (:), pointer :: ap
798
+ end type array_ptr
799
+
800
+ type (array_ptr), allocatable, dimension (:) :: arrays
801
+
802
+ allocate (arrays(20))
803
+ do i = 1,20
804
+ allocate (arrays(i)%ap(i))
805
+ end do
806
+ .fi
807
+ arrays is an allocatable array (1 dimension) whose size is
808
+ not known at compile time (it has
809
+ a Dope Vector). At run time, the
810
+ allocate statement creats 20 array_ptr dope vectors
811
+ and marks the base arrays dopevector as allocated.
812
+ The myvar variable is just there to add complexity to
813
+ the example :-)
814
+ .nf
815
+ In the loop, arrays(1)%ap(1)
816
+ is allocated as a single element array of reals.
817
+ In the loop, arrays(2)%ap(2)
818
+ is allocated as an array of two reals.
819
+ ...
820
+ In the loop, arrays(20)%ap(20)
821
+ is allocated as an array of twenty reals.
822
+ .fi
823
+ .H 2 "the problem with standard dwarf and this example"
824
+ .sp
825
+ In dwarf, there is no way to find the array bounds of arrays(3)%ap,
826
+ for example, (which are 1:3 in f90 syntax)
827
+ since any location expression in an ap array lower bound
828
+ attribute cannot involve the 3 (the 3 is known at debug time and
829
+ does not appear in the running binary, so no way for the
830
+ location expression to get to it).
831
+ And of course the 3 must actually index across the array of
832
+ dope vectors in 'arrays' in our implementation, but that is less of
833
+ a problem than the problem with the '3'.
834
+ .sp
835
+ Plus dwarf has no way to find the 'allocated' flag in the
836
+ dope vector (so the debugger can know when the allocate is done
837
+ for a particular arrays(j)%ap).
838
+ .sp
839
+ Consequently, the calculation of array bounds and indices
840
+ for these dynamically created f90 arrays
841
+ is now pushed of into the debugger, which must know the
842
+ field names and usages of the dope vector C structure and
843
+ use the field offsets etc to find data arrays.
844
+ C, C++, f77, and most f90 arrays continue to be described
845
+ in standard dwarf.
846
+ At the outer allocatable/assumed-shape/pointer
847
+ the DW_AT_location points at the dope vector (so debugger
848
+ calculations use that as a base).
849
+ .P
850
+ It would have been nice to design a dwarf extension
851
+ to handle the above problems, but
852
+ the methods considered to date were not
853
+ any more consistent with standard dwarf than
854
+ this dope vector centric approach: essentially just
855
+ as much work in the debugger appeared necessary either way.
856
+ A better (more dwarf-ish)
857
+ design would be welcome information.
858
+
859
+ .H 2 "A simplified sketch of the dwarf information"
860
+ [Note:
861
+ Needs to be written.
862
+ end Note]
863
+
864
+ .H 2 "A simplified sketch of the dope vector information"
865
+ [Note:
866
+ This one is simplified.
867
+ Details left out that should be here. Amplify.
868
+ end Note]
869
+ This is an overly simplified version of a dope vector,
870
+ presented as an initial hint.
871
+ Full details presented later.
872
+ .nf
873
+ struct simplified{
874
+ void *base; // pointer to the data this describes
875
+ long el_len;
876
+ int assoc:1
877
+ int ptr_alloc:1
878
+ int num_dims:3;
879
+ struct dims_s {
880
+ long lb;
881
+ long ext;
882
+ long str_m;
883
+ } dims[7];
884
+ };
885
+ .fi
886
+ Only 'num_dims' elements of dims[] are actually used.
887
+
888
+ .H 2 "The dwarf information"
889
+
890
+ Here is dwarf information from the compiler for
891
+ the example above, as printed by dwarfdump(1)
892
+ .nf
893
+ [Note:
894
+ The following may not be the test.
895
+ Having field names with '.' in the name is
896
+ not such a good idea, as it conflicts with the
897
+ use of '.' in dbx extended naming.
898
+ Something else, like _$, would be much easier
899
+ to work with in dbx (customers won't care about this,
900
+ for the most part,
901
+ but folks working on dbx will, and in those
902
+ rare circumstances when a customer cares,
903
+ the '.' will be a real problem in dbx.).
904
+ Note that to print something about .base., in dbx one
905
+ would have to do
906
+ whatis `.base.`
907
+ where that is the grave accent, or back-quote I am using.
908
+ With extended naming one do
909
+ whatis `.dope.`.`.base.`
910
+ which is hard to type and hard to read.
911
+ end Note]
912
+
913
+ <2>< 388> DW_TAG_array_type
914
+ DW_AT_name .base.
915
+ DW_AT_type <815>
916
+ DW_AT_declaration yes(1)
917
+ <3>< 401> DW_TAG_subrange_type
918
+ DW_AT_lower_bound 0
919
+ DW_AT_upper_bound 0
920
+ <2>< 405> DW_TAG_pointer_type
921
+ DW_AT_type <388>
922
+ DW_AT_byte_size 4
923
+ DW_AT_address_class 0
924
+ <2>< 412> DW_TAG_structure_type
925
+ DW_AT_name .flds.
926
+ DW_AT_byte_size 28
927
+ <3>< 421> DW_TAG_member
928
+ DW_AT_name el_len
929
+ DW_AT_type <815>
930
+ DW_AT_data_member_location DW_OP_consts 0
931
+ <3>< 436> DW_TAG_member
932
+ DW_AT_name assoc
933
+ DW_AT_type <841>
934
+ DW_AT_byte_size 0
935
+ DW_AT_bit_offset 0
936
+ DW_AT_bit_size 1
937
+ DW_AT_data_member_location DW_OP_consts 4
938
+ <3>< 453> DW_TAG_member
939
+ DW_AT_name ptr_alloc
940
+ DW_AT_type <841>
941
+ DW_AT_byte_size 0
942
+ DW_AT_bit_offset 1
943
+ DW_AT_bit_size 1
944
+ DW_AT_data_member_location DW_OP_consts 4
945
+ <3>< 474> DW_TAG_member
946
+ DW_AT_name p_or_a
947
+ DW_AT_type <841>
948
+ DW_AT_byte_size 0
949
+ DW_AT_bit_offset 2
950
+ DW_AT_bit_size 2
951
+ DW_AT_data_member_location DW_OP_consts 4
952
+ <3>< 492> DW_TAG_member
953
+ DW_AT_name a_contig
954
+ DW_AT_type <841>
955
+ DW_AT_byte_size 0
956
+ DW_AT_bit_offset 4
957
+ DW_AT_bit_size 1
958
+ DW_AT_data_member_location DW_OP_consts 4
959
+ <3>< 532> DW_TAG_member
960
+ DW_AT_name num_dims
961
+ DW_AT_type <841>
962
+ DW_AT_byte_size 0
963
+ DW_AT_bit_offset 29
964
+ DW_AT_bit_size 3
965
+ DW_AT_data_member_location DW_OP_consts 8
966
+ <3>< 572> DW_TAG_member
967
+ DW_AT_name type_code
968
+ DW_AT_type <841>
969
+ DW_AT_byte_size 0
970
+ DW_AT_bit_offset 0
971
+ DW_AT_bit_size 32
972
+ DW_AT_data_member_location DW_OP_consts 16
973
+ <3>< 593> DW_TAG_member
974
+ DW_AT_name orig_base
975
+ DW_AT_type <841>
976
+ DW_AT_data_member_location DW_OP_consts 20
977
+ <3>< 611> DW_TAG_member
978
+ DW_AT_name orig_size
979
+ DW_AT_type <815>
980
+ DW_AT_data_member_location DW_OP_consts 24
981
+ <2>< 630> DW_TAG_structure_type
982
+ DW_AT_name .dope_bnd.
983
+ DW_AT_byte_size 12
984
+ <3>< 643> DW_TAG_member
985
+ DW_AT_name lb
986
+ DW_AT_type <815>
987
+ DW_AT_data_member_location DW_OP_consts 0
988
+ <3>< 654> DW_TAG_member
989
+ DW_AT_name ext
990
+ DW_AT_type <815>
991
+ DW_AT_data_member_location DW_OP_consts 4
992
+ <3>< 666> DW_TAG_member
993
+ DW_AT_name str_m
994
+ DW_AT_type <815>
995
+ DW_AT_data_member_location DW_OP_consts 8
996
+ <2>< 681> DW_TAG_array_type
997
+ DW_AT_name .dims.
998
+ DW_AT_type <630>
999
+ DW_AT_declaration yes(1)
1000
+ <3>< 694> DW_TAG_subrange_type
1001
+ DW_AT_lower_bound 0
1002
+ DW_AT_upper_bound 0
1003
+ <2>< 698> DW_TAG_structure_type
1004
+ DW_AT_name .dope.
1005
+ DW_AT_byte_size 44
1006
+ <3>< 707> DW_TAG_member
1007
+ DW_AT_name base
1008
+ DW_AT_type <405>
1009
+ DW_AT_data_member_location DW_OP_consts 0
1010
+ <3>< 720> DW_TAG_member
1011
+ DW_AT_name .flds
1012
+ DW_AT_type <412>
1013
+ DW_AT_data_member_location DW_OP_consts 4
1014
+ <3>< 734> DW_TAG_member
1015
+ DW_AT_name .dims.
1016
+ DW_AT_type <681>
1017
+ DW_AT_data_member_location DW_OP_consts 32
1018
+ <2>< 750> DW_TAG_variable
1019
+ DW_AT_type <815>
1020
+ DW_AT_location DW_OP_fbreg -32
1021
+ DW_AT_artificial yes(1)
1022
+ <2>< 759> DW_TAG_variable
1023
+ DW_AT_type <815>
1024
+ DW_AT_location DW_OP_fbreg -28
1025
+ DW_AT_artificial yes(1)
1026
+ <2>< 768> DW_TAG_variable
1027
+ DW_AT_type <815>
1028
+ DW_AT_location DW_OP_fbreg -24
1029
+ DW_AT_artificial yes(1)
1030
+ <2>< 777> DW_TAG_array_type
1031
+ DW_AT_type <815>
1032
+ DW_AT_declaration yes(1)
1033
+ <3>< 783> DW_TAG_subrange_type
1034
+ DW_AT_lower_bound <750>
1035
+ DW_AT_count <759>
1036
+ DW_AT_MIPS_stride <768>
1037
+ <2>< 797> DW_TAG_variable
1038
+ DW_AT_decl_file 1
1039
+ DW_AT_decl_line 1
1040
+ DW_AT_name ARRAY
1041
+ DW_AT_type <698>
1042
+ DW_AT_location DW_OP_fbreg -64 DW_OP_deref
1043
+ <1>< 815> DW_TAG_base_type
1044
+ DW_AT_name INTEGER_4
1045
+ DW_AT_encoding DW_ATE_signed
1046
+ DW_AT_byte_size 4
1047
+ <1>< 828> DW_TAG_base_type
1048
+ DW_AT_name INTEGER_8
1049
+ DW_AT_encoding DW_ATE_signed
1050
+ DW_AT_byte_size 8
1051
+ <1>< 841> DW_TAG_base_type
1052
+ DW_AT_name INTEGER*4
1053
+ DW_AT_encoding DW_ATE_unsigned
1054
+ DW_AT_byte_size 4
1055
+ <1>< 854> DW_TAG_base_type
1056
+ DW_AT_name INTEGER*8
1057
+ DW_AT_encoding DW_ATE_unsigned
1058
+ DW_AT_byte_size 8
1059
+
1060
+ .fi
1061
+ .H 2 "The dope vector structure details"
1062
+ A dope vector is the following C struct, "dopevec.h".
1063
+ Not all the fields are of use to a debugger.
1064
+ It may be that not all fields will show up
1065
+ in the f90 dwarf (since not all are of interest to debuggers).
1066
+ .nf
1067
+ [Note:
1068
+ Need details on the use of each field.
1069
+ And need to know which are really 32 bits and which
1070
+ are 32 or 64.
1071
+ end Note]
1072
+ The following
1073
+ struct
1074
+ is a representation of all the dope vector fields.
1075
+ It suppresses irrelevant detail and may not
1076
+ exactly match the layout in memory (a debugger must
1077
+ examine the dwarf to find the fields, not
1078
+ compile this structure into the debugger!).
1079
+ .nf
1080
+ struct .dope. {
1081
+ void *base; // pointer to data
1082
+ struct .flds. {
1083
+ long el_len; // length of element in bytes?
1084
+ unsigned int assoc:1; //means?
1085
+ unsigned int ptr_alloc:1; //means?
1086
+ unsigned int p_or_a:2; //means?
1087
+ unsigned int a_contig:1; // means?
1088
+ unsigned int num_dims: 3; // 0 thru 7
1089
+ unsigned int type_code:32; //values?
1090
+ unsigned int orig_base; //void *? means?
1091
+ long orig_size; // means?
1092
+ } .flds;
1093
+
1094
+ struct .dope_bnd. {
1095
+ long lb ; // lower bound
1096
+ long ext ; // means?
1097
+ long str_m; // means?
1098
+ } .dims[7];
1099
+ }
1100
+ .fi
1101
+
1102
+ .H 2 "DW_AT_MIPS_assumed_size 0x2011"
1103
+ This flag was invented to deal with f90 arrays.
1104
+ For example:
1105
+
1106
+ .nf
1107
+ pointer (rptr, axx(1))
1108
+ pointer (iptr, ita(*))
1109
+ rptr = malloc (100*8)
1110
+ iptr = malloc (100*4)
1111
+ .fi
1112
+
1113
+ This flag attribute has the value 'yes' (true, on) if and only if
1114
+ the size is unbounded, as iptr is.
1115
+ Both may show an explicit upper bound of 1 in the dwarf,
1116
+ but this flag notifies the debugger that there is explicitly
1117
+ no user-provided size.
1118
+
1119
+ So if a user asks for a printout of the rptr allocated
1120
+ array, the default will be of a single entry (as
1121
+ there is a user slice bound in the source).
1122
+ In contrast, there is no explicit upper bound on the iptr
1123
+ (ita) array so the default slice will use the current bound
1124
+ (a value calculated from the malloc size, see the dope vector).
1125
+
1126
+ Given explicit requests, more of rptr(axx) can me shown
1127
+ than the default.
1128
+
1129
+ .H 1 "Line information and Source Position"
1130
+ DWARF does not define the meaning of the term 'source statement'.
1131
+ Nor does it define any way to find the first user-written
1132
+ executable code in a function.
1133
+ .P
1134
+ It does define that a source statement has a file name,
1135
+ a line number, and a column position (see Sec 6.2, Line Number
1136
+ Information of the Dwarf Version 2 document).
1137
+ We will call those 3 source coordinates a 'source position'
1138
+ in this document. We'll try not to accidentally call the
1139
+ source position a 'line number' since that is ambiguous
1140
+ as to what it means.
1141
+
1142
+ .H 2 "Definition of Statement"
1143
+ .P
1144
+ A function prolog is a statement.
1145
+ .P
1146
+ A C, C++, Pascal, or Fortran statement is a statement.
1147
+ .P
1148
+ Each initialized local variable in C,C++ is a statement
1149
+ in that its initialization generates a source position.
1150
+ This means that
1151
+ x =3, y=4;
1152
+ is two statements.
1153
+ .P
1154
+ For C, C++:
1155
+ The 3 parts a,b,c in for(a;b;c) {d;} are individual statements.
1156
+ The condition portion of a while() and do {} while() is
1157
+ a statement. (of course d; can be any number of statements)
1158
+ .P
1159
+ For Fortran, the controlling expression of a DO loop is a statement.
1160
+ Is a 'continue' statement in Fortran a DWARF statement?
1161
+ .P
1162
+ Each function return, whether user coded or generated by the
1163
+ compiler, is a statement. This is so one can step over (in
1164
+ a debugger) the final user-coded statement
1165
+ (exclusive of the return statement if any) in a function
1166
+ wile not leaving the function scope.
1167
+ .P
1168
+
1169
+ .H 2 "Finding The First User Code in a Function"
1170
+
1171
+ .nf
1172
+ Consider:
1173
+ int func(int a)
1174
+ { /* source position 1 */
1175
+ float b = a; /* source position 2 */
1176
+ int x;
1177
+ x = b + 2; /* source position 3 */
1178
+ } /* source position 4 */
1179
+ .fi
1180
+ .P
1181
+ The DIE for a function gives the address range of the function,
1182
+ including function prolog(s) and epilog(s)
1183
+ .P
1184
+ Since there is no scope block for the outer user scope of a
1185
+ function (and thus no beginning address range for the outer
1186
+ user scope: the DWARF committee explicitly rejected the idea
1187
+ of having a user scope block)
1188
+ it is necessary to use the source position information to find
1189
+ the first user-executable statement.
1190
+ .P
1191
+ This means that the user code for a function must be presumed
1192
+ to begin at the code location of the second source position in
1193
+ the function address range.
1194
+ .P
1195
+ If a function has exactly one source position, the function
1196
+ presumably consists solely of a return.
1197
+ .P
1198
+ If a function has exactly two source positions, the function
1199
+ may consist of a function prolog and a return or a single user
1200
+ statement and a return (there may be no prolog code needed in a
1201
+ leaf function). In this case, there is no way to be sure which
1202
+ is the first source position of user code, so the rule is to
1203
+ presume that the first address is user code.
1204
+ .P
1205
+ If a function consists of 3 or more source positions, one
1206
+ should assume that the first source position is function prolog and
1207
+ the second is the first user executable code.
1208
+
1209
+ .H 2 "Using debug_frame Information to find first user statement"
1210
+ In addition to the line information, the debug_frame information
1211
+ can be
1212
+ useful in determining the first user source line.
1213
+ .P
1214
+ Given that a function has more than 1 source position,
1215
+ Find the code location of the second source position, then
1216
+ examine the debug_frame information to determine if the Canonical
1217
+ Frame Address (cfa) is updated before the second source position
1218
+ code location.
1219
+ If the cfa is updated, then one can be pretty sure that the
1220
+ code for the first source position is function prolog code.
1221
+ .P
1222
+ Similarly, if the cfa is restored in the code for
1223
+ a source position, the source position is likely to
1224
+ represent a function exit block.
1225
+
1226
+ .H 2 "Debugger Use Of Source Position"
1227
+ Command line debuggers, such as dbx and gdb, will ordinarily
1228
+ want to consider multiple statements on one line to be a single
1229
+ statement: doing otherwise is distressing to users since it
1230
+ causes a 'step' command to appear to have no effect.
1231
+ .P
1232
+ An exception for command line debuggers is in determining the
1233
+ first user statement: as detailed above, there one wants to
1234
+ consider the full source position and will want to consider
1235
+ the function return a separate statement. It is difficult to
1236
+ make the function return a separate statement 'step' reliably
1237
+ however if a function is coded all on one line or if the last
1238
+ line of user code before the return is on the same line as the
1239
+ return.
1240
+ .P
1241
+ A graphical debugger has none of these problems if it simply
1242
+ highlights the portion of the line being executed. In that
1243
+ case, stepping will appear natural even stepping within a
1244
+ line.
1245
+ .H 1 "Known Bugs"
1246
+ Up through at least MIPSpro7.2.1
1247
+ the compiler has been emitting form DW_FORM_DATA1,2, or 4
1248
+ for DW_AT_const_value in DW_TAG_enumerator.
1249
+ And dwarfdump and debuggers have read this with dwarf_formudata()
1250
+ or form_sdata() and gotten some values incorrect.
1251
+ For example, a value of 128 was printed by debuggers as a negative value.
1252
+ Since dwarfdump and the compilers were not written to use the
1253
+ value the same way, their output differed.
1254
+ For negative enumerator values the compiler has been emitting 32bit values
1255
+ in a DW_FORM_DATA4.
1256
+ The compiler should probably be emitting a DW_FORM_sdata for
1257
+ enumerator values.
1258
+ And consumers of enumerator values should then call form_sdata().
1259
+ However, right now, debuggers should call form_udata() and only if
1260
+ it fails, call form_sdata().
1261
+ Anything else will break backward compatibility with
1262
+ the objects produced earlier.
1263
+ .SK
1264
+ .S
1265
+ .TC 1 1 4
1266
+ .CS