|
1 // -*- mode: C++ -*- |
|
2 |
|
3 // Copyright (c) 2010 Google Inc. All Rights Reserved. |
|
4 // |
|
5 // Redistribution and use in source and binary forms, with or without |
|
6 // modification, are permitted provided that the following conditions are |
|
7 // met: |
|
8 // |
|
9 // * Redistributions of source code must retain the above copyright |
|
10 // notice, this list of conditions and the following disclaimer. |
|
11 // * Redistributions in binary form must reproduce the above |
|
12 // copyright notice, this list of conditions and the following disclaimer |
|
13 // in the documentation and/or other materials provided with the |
|
14 // distribution. |
|
15 // * Neither the name of Google Inc. nor the names of its |
|
16 // contributors may be used to endorse or promote products derived from |
|
17 // this software without specific prior written permission. |
|
18 // |
|
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
30 |
|
31 // CFI reader author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com> |
|
32 |
|
33 // This file contains definitions related to the DWARF2/3 reader and |
|
34 // it's handler interfaces. |
|
35 // The DWARF2/3 specification can be found at |
|
36 // http://dwarf.freestandards.org and should be considered required |
|
37 // reading if you wish to modify the implementation. |
|
38 // Only a cursory attempt is made to explain terminology that is |
|
39 // used here, as it is much better explained in the standard documents |
|
40 #ifndef COMMON_DWARF_DWARF2READER_H__ |
|
41 #define COMMON_DWARF_DWARF2READER_H__ |
|
42 |
|
43 #include <list> |
|
44 #include <map> |
|
45 #include <string> |
|
46 #include <utility> |
|
47 #include <vector> |
|
48 |
|
49 #include "common/dwarf/bytereader.h" |
|
50 #include "common/dwarf/dwarf2enums.h" |
|
51 #include "common/dwarf/types.h" |
|
52 #include "common/using_std_string.h" |
|
53 |
|
54 namespace dwarf2reader { |
|
55 struct LineStateMachine; |
|
56 class Dwarf2Handler; |
|
57 class LineInfoHandler; |
|
58 |
|
59 // This maps from a string naming a section to a pair containing a |
|
60 // the data for the section, and the size of the section. |
|
61 typedef std::map<string, std::pair<const char*, uint64> > SectionMap; |
|
62 typedef std::list<std::pair<enum DwarfAttribute, enum DwarfForm> > |
|
63 AttributeList; |
|
64 typedef AttributeList::iterator AttributeIterator; |
|
65 typedef AttributeList::const_iterator ConstAttributeIterator; |
|
66 |
|
67 struct LineInfoHeader { |
|
68 uint64 total_length; |
|
69 uint16 version; |
|
70 uint64 prologue_length; |
|
71 uint8 min_insn_length; // insn stands for instructin |
|
72 bool default_is_stmt; // stmt stands for statement |
|
73 int8 line_base; |
|
74 uint8 line_range; |
|
75 uint8 opcode_base; |
|
76 // Use a pointer so that signalsafe_addr2line is able to use this structure |
|
77 // without heap allocation problem. |
|
78 std::vector<unsigned char> *std_opcode_lengths; |
|
79 }; |
|
80 |
|
81 class LineInfo { |
|
82 public: |
|
83 |
|
84 // Initializes a .debug_line reader. Buffer and buffer length point |
|
85 // to the beginning and length of the line information to read. |
|
86 // Reader is a ByteReader class that has the endianness set |
|
87 // properly. |
|
88 LineInfo(const char* buffer_, uint64 buffer_length, |
|
89 ByteReader* reader, LineInfoHandler* handler); |
|
90 |
|
91 virtual ~LineInfo() { |
|
92 if (header_.std_opcode_lengths) { |
|
93 delete header_.std_opcode_lengths; |
|
94 } |
|
95 } |
|
96 |
|
97 // Start processing line info, and calling callbacks in the handler. |
|
98 // Consumes the line number information for a single compilation unit. |
|
99 // Returns the number of bytes processed. |
|
100 uint64 Start(); |
|
101 |
|
102 // Process a single line info opcode at START using the state |
|
103 // machine at LSM. Return true if we should define a line using the |
|
104 // current state of the line state machine. Place the length of the |
|
105 // opcode in LEN. |
|
106 // If LSM_PASSES_PC is non-NULL, this function also checks if the lsm |
|
107 // passes the address of PC. In other words, LSM_PASSES_PC will be |
|
108 // set to true, if the following condition is met. |
|
109 // |
|
110 // lsm's old address < PC <= lsm's new address |
|
111 static bool ProcessOneOpcode(ByteReader* reader, |
|
112 LineInfoHandler* handler, |
|
113 const struct LineInfoHeader &header, |
|
114 const char* start, |
|
115 struct LineStateMachine* lsm, |
|
116 size_t* len, |
|
117 uintptr pc, |
|
118 bool *lsm_passes_pc); |
|
119 |
|
120 private: |
|
121 // Reads the DWARF2/3 header for this line info. |
|
122 void ReadHeader(); |
|
123 |
|
124 // Reads the DWARF2/3 line information |
|
125 void ReadLines(); |
|
126 |
|
127 // The associated handler to call processing functions in |
|
128 LineInfoHandler* handler_; |
|
129 |
|
130 // The associated ByteReader that handles endianness issues for us |
|
131 ByteReader* reader_; |
|
132 |
|
133 // A DWARF2/3 line info header. This is not the same size as |
|
134 // in the actual file, as the one in the file may have a 32 bit or |
|
135 // 64 bit lengths |
|
136 |
|
137 struct LineInfoHeader header_; |
|
138 |
|
139 // buffer is the buffer for our line info, starting at exactly where |
|
140 // the line info to read is. after_header is the place right after |
|
141 // the end of the line information header. |
|
142 const char* buffer_; |
|
143 uint64 buffer_length_; |
|
144 const char* after_header_; |
|
145 }; |
|
146 |
|
147 // This class is the main interface between the line info reader and |
|
148 // the client. The virtual functions inside this get called for |
|
149 // interesting events that happen during line info reading. The |
|
150 // default implementation does nothing |
|
151 |
|
152 class LineInfoHandler { |
|
153 public: |
|
154 LineInfoHandler() { } |
|
155 |
|
156 virtual ~LineInfoHandler() { } |
|
157 |
|
158 // Called when we define a directory. NAME is the directory name, |
|
159 // DIR_NUM is the directory number |
|
160 virtual void DefineDir(const string& name, uint32 dir_num) { } |
|
161 |
|
162 // Called when we define a filename. NAME is the filename, FILE_NUM |
|
163 // is the file number which is -1 if the file index is the next |
|
164 // index after the last numbered index (this happens when files are |
|
165 // dynamically defined by the line program), DIR_NUM is the |
|
166 // directory index for the directory name of this file, MOD_TIME is |
|
167 // the modification time of the file, and LENGTH is the length of |
|
168 // the file |
|
169 virtual void DefineFile(const string& name, int32 file_num, |
|
170 uint32 dir_num, uint64 mod_time, |
|
171 uint64 length) { } |
|
172 |
|
173 // Called when the line info reader has a new line, address pair |
|
174 // ready for us. ADDRESS is the address of the code, LENGTH is the |
|
175 // length of its machine code in bytes, FILE_NUM is the file number |
|
176 // containing the code, LINE_NUM is the line number in that file for |
|
177 // the code, and COLUMN_NUM is the column number the code starts at, |
|
178 // if we know it (0 otherwise). |
|
179 virtual void AddLine(uint64 address, uint64 length, |
|
180 uint32 file_num, uint32 line_num, uint32 column_num) { } |
|
181 }; |
|
182 |
|
183 // The base of DWARF2/3 debug info is a DIE (Debugging Information |
|
184 // Entry. |
|
185 // DWARF groups DIE's into a tree and calls the root of this tree a |
|
186 // "compilation unit". Most of the time, there is one compilation |
|
187 // unit in the .debug_info section for each file that had debug info |
|
188 // generated. |
|
189 // Each DIE consists of |
|
190 |
|
191 // 1. a tag specifying a thing that is being described (ie |
|
192 // DW_TAG_subprogram for functions, DW_TAG_variable for variables, etc |
|
193 // 2. attributes (such as DW_AT_location for location in memory, |
|
194 // DW_AT_name for name), and data for each attribute. |
|
195 // 3. A flag saying whether the DIE has children or not |
|
196 |
|
197 // In order to gain some amount of compression, the format of |
|
198 // each DIE (tag name, attributes and data forms for the attributes) |
|
199 // are stored in a separate table called the "abbreviation table". |
|
200 // This is done because a large number of DIEs have the exact same tag |
|
201 // and list of attributes, but different data for those attributes. |
|
202 // As a result, the .debug_info section is just a stream of data, and |
|
203 // requires reading of the .debug_abbrev section to say what the data |
|
204 // means. |
|
205 |
|
206 // As a warning to the user, it should be noted that the reason for |
|
207 // using absolute offsets from the beginning of .debug_info is that |
|
208 // DWARF2/3 supports referencing DIE's from other DIE's by their offset |
|
209 // from either the current compilation unit start, *or* the beginning |
|
210 // of the .debug_info section. This means it is possible to reference |
|
211 // a DIE in one compilation unit from a DIE in another compilation |
|
212 // unit. This style of reference is usually used to eliminate |
|
213 // duplicated information that occurs across compilation |
|
214 // units, such as base types, etc. GCC 3.4+ support this with |
|
215 // -feliminate-dwarf2-dups. Other toolchains will sometimes do |
|
216 // duplicate elimination in the linker. |
|
217 |
|
218 class CompilationUnit { |
|
219 public: |
|
220 |
|
221 // Initialize a compilation unit. This requires a map of sections, |
|
222 // the offset of this compilation unit in the .debug_info section, a |
|
223 // ByteReader, and a Dwarf2Handler class to call callbacks in. |
|
224 CompilationUnit(const SectionMap& sections, uint64 offset, |
|
225 ByteReader* reader, Dwarf2Handler* handler); |
|
226 virtual ~CompilationUnit() { |
|
227 if (abbrevs_) delete abbrevs_; |
|
228 } |
|
229 |
|
230 // Begin reading a Dwarf2 compilation unit, and calling the |
|
231 // callbacks in the Dwarf2Handler |
|
232 |
|
233 // Return the full length of the compilation unit, including |
|
234 // headers. This plus the starting offset passed to the constructor |
|
235 // is the offset of the end of the compilation unit --- and the |
|
236 // start of the next compilation unit, if there is one. |
|
237 uint64 Start(); |
|
238 |
|
239 private: |
|
240 |
|
241 // This struct represents a single DWARF2/3 abbreviation |
|
242 // The abbreviation tells how to read a DWARF2/3 DIE, and consist of a |
|
243 // tag and a list of attributes, as well as the data form of each attribute. |
|
244 struct Abbrev { |
|
245 uint64 number; |
|
246 enum DwarfTag tag; |
|
247 bool has_children; |
|
248 AttributeList attributes; |
|
249 }; |
|
250 |
|
251 // A DWARF2/3 compilation unit header. This is not the same size as |
|
252 // in the actual file, as the one in the file may have a 32 bit or |
|
253 // 64 bit length. |
|
254 struct CompilationUnitHeader { |
|
255 uint64 length; |
|
256 uint16 version; |
|
257 uint64 abbrev_offset; |
|
258 uint8 address_size; |
|
259 } header_; |
|
260 |
|
261 // Reads the DWARF2/3 header for this compilation unit. |
|
262 void ReadHeader(); |
|
263 |
|
264 // Reads the DWARF2/3 abbreviations for this compilation unit |
|
265 void ReadAbbrevs(); |
|
266 |
|
267 // Processes a single DIE for this compilation unit and return a new |
|
268 // pointer just past the end of it |
|
269 const char* ProcessDIE(uint64 dieoffset, |
|
270 const char* start, |
|
271 const Abbrev& abbrev); |
|
272 |
|
273 // Processes a single attribute and return a new pointer just past the |
|
274 // end of it |
|
275 const char* ProcessAttribute(uint64 dieoffset, |
|
276 const char* start, |
|
277 enum DwarfAttribute attr, |
|
278 enum DwarfForm form); |
|
279 |
|
280 // Processes all DIEs for this compilation unit |
|
281 void ProcessDIEs(); |
|
282 |
|
283 // Skips the die with attributes specified in ABBREV starting at |
|
284 // START, and return the new place to position the stream to. |
|
285 const char* SkipDIE(const char* start, |
|
286 const Abbrev& abbrev); |
|
287 |
|
288 // Skips the attribute starting at START, with FORM, and return the |
|
289 // new place to position the stream to. |
|
290 const char* SkipAttribute(const char* start, |
|
291 enum DwarfForm form); |
|
292 |
|
293 // Offset from section start is the offset of this compilation unit |
|
294 // from the beginning of the .debug_info section. |
|
295 uint64 offset_from_section_start_; |
|
296 |
|
297 // buffer is the buffer for our CU, starting at .debug_info + offset |
|
298 // passed in from constructor. |
|
299 // after_header points to right after the compilation unit header. |
|
300 const char* buffer_; |
|
301 uint64 buffer_length_; |
|
302 const char* after_header_; |
|
303 |
|
304 // The associated ByteReader that handles endianness issues for us |
|
305 ByteReader* reader_; |
|
306 |
|
307 // The map of sections in our file to buffers containing their data |
|
308 const SectionMap& sections_; |
|
309 |
|
310 // The associated handler to call processing functions in |
|
311 Dwarf2Handler* handler_; |
|
312 |
|
313 // Set of DWARF2/3 abbreviations for this compilation unit. Indexed |
|
314 // by abbreviation number, which means that abbrevs_[0] is not |
|
315 // valid. |
|
316 std::vector<Abbrev>* abbrevs_; |
|
317 |
|
318 // String section buffer and length, if we have a string section. |
|
319 // This is here to avoid doing a section lookup for strings in |
|
320 // ProcessAttribute, which is in the hot path for DWARF2 reading. |
|
321 const char* string_buffer_; |
|
322 uint64 string_buffer_length_; |
|
323 }; |
|
324 |
|
325 // This class is the main interface between the reader and the |
|
326 // client. The virtual functions inside this get called for |
|
327 // interesting events that happen during DWARF2 reading. |
|
328 // The default implementation skips everything. |
|
329 |
|
330 class Dwarf2Handler { |
|
331 public: |
|
332 Dwarf2Handler() { } |
|
333 |
|
334 virtual ~Dwarf2Handler() { } |
|
335 |
|
336 // Start to process a compilation unit at OFFSET from the beginning of the |
|
337 // .debug_info section. Return false if you would like to skip this |
|
338 // compilation unit. |
|
339 virtual bool StartCompilationUnit(uint64 offset, uint8 address_size, |
|
340 uint8 offset_size, uint64 cu_length, |
|
341 uint8 dwarf_version) { return false; } |
|
342 |
|
343 // Start to process a DIE at OFFSET from the beginning of the .debug_info |
|
344 // section. Return false if you would like to skip this DIE. |
|
345 virtual bool StartDIE(uint64 offset, enum DwarfTag tag) { return false; } |
|
346 |
|
347 // Called when we have an attribute with unsigned data to give to our |
|
348 // handler. The attribute is for the DIE at OFFSET from the beginning of the |
|
349 // .debug_info section. Its name is ATTR, its form is FORM, and its value is |
|
350 // DATA. |
|
351 virtual void ProcessAttributeUnsigned(uint64 offset, |
|
352 enum DwarfAttribute attr, |
|
353 enum DwarfForm form, |
|
354 uint64 data) { } |
|
355 |
|
356 // Called when we have an attribute with signed data to give to our handler. |
|
357 // The attribute is for the DIE at OFFSET from the beginning of the |
|
358 // .debug_info section. Its name is ATTR, its form is FORM, and its value is |
|
359 // DATA. |
|
360 virtual void ProcessAttributeSigned(uint64 offset, |
|
361 enum DwarfAttribute attr, |
|
362 enum DwarfForm form, |
|
363 int64 data) { } |
|
364 |
|
365 // Called when we have an attribute whose value is a reference to |
|
366 // another DIE. The attribute belongs to the DIE at OFFSET from the |
|
367 // beginning of the .debug_info section. Its name is ATTR, its form |
|
368 // is FORM, and the offset of the DIE being referred to from the |
|
369 // beginning of the .debug_info section is DATA. |
|
370 virtual void ProcessAttributeReference(uint64 offset, |
|
371 enum DwarfAttribute attr, |
|
372 enum DwarfForm form, |
|
373 uint64 data) { } |
|
374 |
|
375 // Called when we have an attribute with a buffer of data to give to our |
|
376 // handler. The attribute is for the DIE at OFFSET from the beginning of the |
|
377 // .debug_info section. Its name is ATTR, its form is FORM, DATA points to |
|
378 // the buffer's contents, and its length in bytes is LENGTH. The buffer is |
|
379 // owned by the caller, not the callee, and may not persist for very long. |
|
380 // If you want the data to be available later, it needs to be copied. |
|
381 virtual void ProcessAttributeBuffer(uint64 offset, |
|
382 enum DwarfAttribute attr, |
|
383 enum DwarfForm form, |
|
384 const char* data, |
|
385 uint64 len) { } |
|
386 |
|
387 // Called when we have an attribute with string data to give to our handler. |
|
388 // The attribute is for the DIE at OFFSET from the beginning of the |
|
389 // .debug_info section. Its name is ATTR, its form is FORM, and its value is |
|
390 // DATA. |
|
391 virtual void ProcessAttributeString(uint64 offset, |
|
392 enum DwarfAttribute attr, |
|
393 enum DwarfForm form, |
|
394 const string& data) { } |
|
395 |
|
396 // Called when we have an attribute whose value is the 64-bit signature |
|
397 // of a type unit in the .debug_types section. OFFSET is the offset of |
|
398 // the DIE whose attribute we're reporting. ATTR and FORM are the |
|
399 // attribute's name and form. SIGNATURE is the type unit's signature. |
|
400 virtual void ProcessAttributeSignature(uint64 offset, |
|
401 enum DwarfAttribute attr, |
|
402 enum DwarfForm form, |
|
403 uint64 signature) { } |
|
404 |
|
405 // Called when finished processing the DIE at OFFSET. |
|
406 // Because DWARF2/3 specifies a tree of DIEs, you may get starts |
|
407 // before ends of the previous DIE, as we process children before |
|
408 // ending the parent. |
|
409 virtual void EndDIE(uint64 offset) { } |
|
410 |
|
411 }; |
|
412 |
|
413 // This class is a reader for DWARF's Call Frame Information. CFI |
|
414 // describes how to unwind stack frames --- even for functions that do |
|
415 // not follow fixed conventions for saving registers, whose frame size |
|
416 // varies as they execute, etc. |
|
417 // |
|
418 // CFI describes, at each machine instruction, how to compute the |
|
419 // stack frame's base address, how to find the return address, and |
|
420 // where to find the saved values of the caller's registers (if the |
|
421 // callee has stashed them somewhere to free up the registers for its |
|
422 // own use). |
|
423 // |
|
424 // For example, suppose we have a function whose machine code looks |
|
425 // like this (imagine an assembly language that looks like C, for a |
|
426 // machine with 32-bit registers, and a stack that grows towards lower |
|
427 // addresses): |
|
428 // |
|
429 // func: ; entry point; return address at sp |
|
430 // func+0: sp = sp - 16 ; allocate space for stack frame |
|
431 // func+1: sp[12] = r0 ; save r0 at sp+12 |
|
432 // ... ; other code, not frame-related |
|
433 // func+10: sp -= 4; *sp = x ; push some x on the stack |
|
434 // ... ; other code, not frame-related |
|
435 // func+20: r0 = sp[16] ; restore saved r0 |
|
436 // func+21: sp += 20 ; pop whole stack frame |
|
437 // func+22: pc = *sp; sp += 4 ; pop return address and jump to it |
|
438 // |
|
439 // DWARF CFI is (a very compressed representation of) a table with a |
|
440 // row for each machine instruction address and a column for each |
|
441 // register showing how to restore it, if possible. |
|
442 // |
|
443 // A special column named "CFA", for "Canonical Frame Address", tells how |
|
444 // to compute the base address of the frame; registers' entries may |
|
445 // refer to the CFA in describing where the registers are saved. |
|
446 // |
|
447 // Another special column, named "RA", represents the return address. |
|
448 // |
|
449 // For example, here is a complete (uncompressed) table describing the |
|
450 // function above: |
|
451 // |
|
452 // insn cfa r0 r1 ... ra |
|
453 // ======================================= |
|
454 // func+0: sp cfa[0] |
|
455 // func+1: sp+16 cfa[0] |
|
456 // func+2: sp+16 cfa[-4] cfa[0] |
|
457 // func+11: sp+20 cfa[-4] cfa[0] |
|
458 // func+21: sp+20 cfa[0] |
|
459 // func+22: sp cfa[0] |
|
460 // |
|
461 // Some things to note here: |
|
462 // |
|
463 // - Each row describes the state of affairs *before* executing the |
|
464 // instruction at the given address. Thus, the row for func+0 |
|
465 // describes the state before we allocate the stack frame. In the |
|
466 // next row, the formula for computing the CFA has changed, |
|
467 // reflecting that allocation. |
|
468 // |
|
469 // - The other entries are written in terms of the CFA; this allows |
|
470 // them to remain unchanged as the stack pointer gets bumped around. |
|
471 // For example, the rule for recovering the return address (the "ra" |
|
472 // column) remains unchanged throughout the function, even as the |
|
473 // stack pointer takes on three different offsets from the return |
|
474 // address. |
|
475 // |
|
476 // - Although we haven't shown it, most calling conventions designate |
|
477 // "callee-saves" and "caller-saves" registers. The callee must |
|
478 // preserve the values of callee-saves registers; if it uses them, |
|
479 // it must save their original values somewhere, and restore them |
|
480 // before it returns. In contrast, the callee is free to trash |
|
481 // caller-saves registers; if the callee uses these, it will |
|
482 // probably not bother to save them anywhere, and the CFI will |
|
483 // probably mark their values as "unrecoverable". |
|
484 // |
|
485 // (However, since the caller cannot assume the callee was going to |
|
486 // save them, caller-saves registers are probably dead in the caller |
|
487 // anyway, so compilers usually don't generate CFA for caller-saves |
|
488 // registers.) |
|
489 // |
|
490 // - Exactly where the CFA points is a matter of convention that |
|
491 // depends on the architecture and ABI in use. In the example, the |
|
492 // CFA is the value the stack pointer had upon entry to the |
|
493 // function, pointing at the saved return address. But on the x86, |
|
494 // the call frame information generated by GCC follows the |
|
495 // convention that the CFA is the address *after* the saved return |
|
496 // address. |
|
497 // |
|
498 // But by definition, the CFA remains constant throughout the |
|
499 // lifetime of the frame. This makes it a useful value for other |
|
500 // columns to refer to. It is also gives debuggers a useful handle |
|
501 // for identifying a frame. |
|
502 // |
|
503 // If you look at the table above, you'll notice that a given entry is |
|
504 // often the same as the one immediately above it: most instructions |
|
505 // change only one or two aspects of the stack frame, if they affect |
|
506 // it at all. The DWARF format takes advantage of this fact, and |
|
507 // reduces the size of the data by mentioning only the addresses and |
|
508 // columns at which changes take place. So for the above, DWARF CFI |
|
509 // data would only actually mention the following: |
|
510 // |
|
511 // insn cfa r0 r1 ... ra |
|
512 // ======================================= |
|
513 // func+0: sp cfa[0] |
|
514 // func+1: sp+16 |
|
515 // func+2: cfa[-4] |
|
516 // func+11: sp+20 |
|
517 // func+21: r0 |
|
518 // func+22: sp |
|
519 // |
|
520 // In fact, this is the way the parser reports CFI to the consumer: as |
|
521 // a series of statements of the form, "At address X, column Y changed |
|
522 // to Z," and related conventions for describing the initial state. |
|
523 // |
|
524 // Naturally, it would be impractical to have to scan the entire |
|
525 // program's CFI, noting changes as we go, just to recover the |
|
526 // unwinding rules in effect at one particular instruction. To avoid |
|
527 // this, CFI data is grouped into "entries", each of which covers a |
|
528 // specified range of addresses and begins with a complete statement |
|
529 // of the rules for all recoverable registers at that starting |
|
530 // address. Each entry typically covers a single function. |
|
531 // |
|
532 // Thus, to compute the contents of a given row of the table --- that |
|
533 // is, rules for recovering the CFA, RA, and registers at a given |
|
534 // instruction --- the consumer should find the entry that covers that |
|
535 // instruction's address, start with the initial state supplied at the |
|
536 // beginning of the entry, and work forward until it has processed all |
|
537 // the changes up to and including those for the present instruction. |
|
538 // |
|
539 // There are seven kinds of rules that can appear in an entry of the |
|
540 // table: |
|
541 // |
|
542 // - "undefined": The given register is not preserved by the callee; |
|
543 // its value cannot be recovered. |
|
544 // |
|
545 // - "same value": This register has the same value it did in the callee. |
|
546 // |
|
547 // - offset(N): The register is saved at offset N from the CFA. |
|
548 // |
|
549 // - val_offset(N): The value the register had in the caller is the |
|
550 // CFA plus offset N. (This is usually only useful for describing |
|
551 // the stack pointer.) |
|
552 // |
|
553 // - register(R): The register's value was saved in another register R. |
|
554 // |
|
555 // - expression(E): Evaluating the DWARF expression E using the |
|
556 // current frame's registers' values yields the address at which the |
|
557 // register was saved. |
|
558 // |
|
559 // - val_expression(E): Evaluating the DWARF expression E using the |
|
560 // current frame's registers' values yields the value the register |
|
561 // had in the caller. |
|
562 |
|
563 class CallFrameInfo { |
|
564 public: |
|
565 // The different kinds of entries one finds in CFI. Used internally, |
|
566 // and for error reporting. |
|
567 enum EntryKind { kUnknown, kCIE, kFDE, kTerminator }; |
|
568 |
|
569 // The handler class to which the parser hands the parsed call frame |
|
570 // information. Defined below. |
|
571 class Handler; |
|
572 |
|
573 // A reporter class, which CallFrameInfo uses to report errors |
|
574 // encountered while parsing call frame information. Defined below. |
|
575 class Reporter; |
|
576 |
|
577 // Create a DWARF CFI parser. BUFFER points to the contents of the |
|
578 // .debug_frame section to parse; BUFFER_LENGTH is its length in bytes. |
|
579 // REPORTER is an error reporter the parser should use to report |
|
580 // problems. READER is a ByteReader instance that has the endianness and |
|
581 // address size set properly. Report the data we find to HANDLER. |
|
582 // |
|
583 // This class can also parse Linux C++ exception handling data, as found |
|
584 // in '.eh_frame' sections. This data is a variant of DWARF CFI that is |
|
585 // placed in loadable segments so that it is present in the program's |
|
586 // address space, and is interpreted by the C++ runtime to search the |
|
587 // call stack for a handler interested in the exception being thrown, |
|
588 // actually pop the frames, and find cleanup code to run. |
|
589 // |
|
590 // There are two differences between the call frame information described |
|
591 // in the DWARF standard and the exception handling data Linux places in |
|
592 // the .eh_frame section: |
|
593 // |
|
594 // - Exception handling data uses uses a different format for call frame |
|
595 // information entry headers. The distinguished CIE id, the way FDEs |
|
596 // refer to their CIEs, and the way the end of the series of entries is |
|
597 // determined are all slightly different. |
|
598 // |
|
599 // If the constructor's EH_FRAME argument is true, then the |
|
600 // CallFrameInfo parses the entry headers as Linux C++ exception |
|
601 // handling data. If EH_FRAME is false or omitted, the CallFrameInfo |
|
602 // parses standard DWARF call frame information. |
|
603 // |
|
604 // - Linux C++ exception handling data uses CIE augmentation strings |
|
605 // beginning with 'z' to specify the presence of additional data after |
|
606 // the CIE and FDE headers and special encodings used for addresses in |
|
607 // frame description entries. |
|
608 // |
|
609 // CallFrameInfo can handle 'z' augmentations in either DWARF CFI or |
|
610 // exception handling data if you have supplied READER with the base |
|
611 // addresses needed to interpret the pointer encodings that 'z' |
|
612 // augmentations can specify. See the ByteReader interface for details |
|
613 // about the base addresses. See the CallFrameInfo::Handler interface |
|
614 // for details about the additional information one might find in |
|
615 // 'z'-augmented data. |
|
616 // |
|
617 // Thus: |
|
618 // |
|
619 // - If you are parsing standard DWARF CFI, as found in a .debug_frame |
|
620 // section, you should pass false for the EH_FRAME argument, or omit |
|
621 // it, and you need not worry about providing READER with the |
|
622 // additional base addresses. |
|
623 // |
|
624 // - If you want to parse Linux C++ exception handling data from a |
|
625 // .eh_frame section, you should pass EH_FRAME as true, and call |
|
626 // READER's Set*Base member functions before calling our Start method. |
|
627 // |
|
628 // - If you want to parse DWARF CFI that uses the 'z' augmentations |
|
629 // (although I don't think any toolchain ever emits such data), you |
|
630 // could pass false for EH_FRAME, but call READER's Set*Base members. |
|
631 // |
|
632 // The extensions the Linux C++ ABI makes to DWARF for exception |
|
633 // handling are described here, rather poorly: |
|
634 // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html |
|
635 // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html |
|
636 // |
|
637 // The mechanics of C++ exception handling, personality routines, |
|
638 // and language-specific data areas are described here, rather nicely: |
|
639 // http://www.codesourcery.com/public/cxx-abi/abi-eh.html |
|
640 CallFrameInfo(const char *buffer, size_t buffer_length, |
|
641 ByteReader *reader, Handler *handler, Reporter *reporter, |
|
642 bool eh_frame = false) |
|
643 : buffer_(buffer), buffer_length_(buffer_length), |
|
644 reader_(reader), handler_(handler), reporter_(reporter), |
|
645 eh_frame_(eh_frame) { } |
|
646 |
|
647 ~CallFrameInfo() { } |
|
648 |
|
649 // Parse the entries in BUFFER, reporting what we find to HANDLER. |
|
650 // Return true if we reach the end of the section successfully, or |
|
651 // false if we encounter an error. |
|
652 bool Start(); |
|
653 |
|
654 // Return the textual name of KIND. For error reporting. |
|
655 static const char *KindName(EntryKind kind); |
|
656 |
|
657 private: |
|
658 |
|
659 struct CIE; |
|
660 |
|
661 // A CFI entry, either an FDE or a CIE. |
|
662 struct Entry { |
|
663 // The starting offset of the entry in the section, for error |
|
664 // reporting. |
|
665 size_t offset; |
|
666 |
|
667 // The start of this entry in the buffer. |
|
668 const char *start; |
|
669 |
|
670 // Which kind of entry this is. |
|
671 // |
|
672 // We want to be able to use this for error reporting even while we're |
|
673 // in the midst of parsing. Error reporting code may assume that kind, |
|
674 // offset, and start fields are valid, although kind may be kUnknown. |
|
675 EntryKind kind; |
|
676 |
|
677 // The end of this entry's common prologue (initial length and id), and |
|
678 // the start of this entry's kind-specific fields. |
|
679 const char *fields; |
|
680 |
|
681 // The start of this entry's instructions. |
|
682 const char *instructions; |
|
683 |
|
684 // The address past the entry's last byte in the buffer. (Note that |
|
685 // since offset points to the entry's initial length field, and the |
|
686 // length field is the number of bytes after that field, this is not |
|
687 // simply buffer_ + offset + length.) |
|
688 const char *end; |
|
689 |
|
690 // For both DWARF CFI and .eh_frame sections, this is the CIE id in a |
|
691 // CIE, and the offset of the associated CIE in an FDE. |
|
692 uint64 id; |
|
693 |
|
694 // The CIE that applies to this entry, if we've parsed it. If this is a |
|
695 // CIE, then this field points to this structure. |
|
696 CIE *cie; |
|
697 }; |
|
698 |
|
699 // A common information entry (CIE). |
|
700 struct CIE: public Entry { |
|
701 uint8 version; // CFI data version number |
|
702 string augmentation; // vendor format extension markers |
|
703 uint64 code_alignment_factor; // scale for code address adjustments |
|
704 int data_alignment_factor; // scale for stack pointer adjustments |
|
705 unsigned return_address_register; // which register holds the return addr |
|
706 |
|
707 // True if this CIE includes Linux C++ ABI 'z' augmentation data. |
|
708 bool has_z_augmentation; |
|
709 |
|
710 // Parsed 'z' augmentation data. These are meaningful only if |
|
711 // has_z_augmentation is true. |
|
712 bool has_z_lsda; // The 'z' augmentation included 'L'. |
|
713 bool has_z_personality; // The 'z' augmentation included 'P'. |
|
714 bool has_z_signal_frame; // The 'z' augmentation included 'S'. |
|
715 |
|
716 // If has_z_lsda is true, this is the encoding to be used for language- |
|
717 // specific data area pointers in FDEs. |
|
718 DwarfPointerEncoding lsda_encoding; |
|
719 |
|
720 // If has_z_personality is true, this is the encoding used for the |
|
721 // personality routine pointer in the augmentation data. |
|
722 DwarfPointerEncoding personality_encoding; |
|
723 |
|
724 // If has_z_personality is true, this is the address of the personality |
|
725 // routine --- or, if personality_encoding & DW_EH_PE_indirect, the |
|
726 // address where the personality routine's address is stored. |
|
727 uint64 personality_address; |
|
728 |
|
729 // This is the encoding used for addresses in the FDE header and |
|
730 // in DW_CFA_set_loc instructions. This is always valid, whether |
|
731 // or not we saw a 'z' augmentation string; its default value is |
|
732 // DW_EH_PE_absptr, which is what normal DWARF CFI uses. |
|
733 DwarfPointerEncoding pointer_encoding; |
|
734 }; |
|
735 |
|
736 // A frame description entry (FDE). |
|
737 struct FDE: public Entry { |
|
738 uint64 address; // start address of described code |
|
739 uint64 size; // size of described code, in bytes |
|
740 |
|
741 // If cie->has_z_lsda is true, then this is the language-specific data |
|
742 // area's address --- or its address's address, if cie->lsda_encoding |
|
743 // has the DW_EH_PE_indirect bit set. |
|
744 uint64 lsda_address; |
|
745 }; |
|
746 |
|
747 // Internal use. |
|
748 class Rule; |
|
749 class UndefinedRule; |
|
750 class SameValueRule; |
|
751 class OffsetRule; |
|
752 class ValOffsetRule; |
|
753 class RegisterRule; |
|
754 class ExpressionRule; |
|
755 class ValExpressionRule; |
|
756 class RuleMap; |
|
757 class State; |
|
758 |
|
759 // Parse the initial length and id of a CFI entry, either a CIE, an FDE, |
|
760 // or a .eh_frame end-of-data mark. CURSOR points to the beginning of the |
|
761 // data to parse. On success, populate ENTRY as appropriate, and return |
|
762 // true. On failure, report the problem, and return false. Even if we |
|
763 // return false, set ENTRY->end to the first byte after the entry if we |
|
764 // were able to figure that out, or NULL if we weren't. |
|
765 bool ReadEntryPrologue(const char *cursor, Entry *entry); |
|
766 |
|
767 // Parse the fields of a CIE after the entry prologue, including any 'z' |
|
768 // augmentation data. Assume that the 'Entry' fields of CIE are |
|
769 // populated; use CIE->fields and CIE->end as the start and limit for |
|
770 // parsing. On success, populate the rest of *CIE, and return true; on |
|
771 // failure, report the problem and return false. |
|
772 bool ReadCIEFields(CIE *cie); |
|
773 |
|
774 // Parse the fields of an FDE after the entry prologue, including any 'z' |
|
775 // augmentation data. Assume that the 'Entry' fields of *FDE are |
|
776 // initialized; use FDE->fields and FDE->end as the start and limit for |
|
777 // parsing. Assume that FDE->cie is fully initialized. On success, |
|
778 // populate the rest of *FDE, and return true; on failure, report the |
|
779 // problem and return false. |
|
780 bool ReadFDEFields(FDE *fde); |
|
781 |
|
782 // Report that ENTRY is incomplete, and return false. This is just a |
|
783 // trivial wrapper for invoking reporter_->Incomplete; it provides a |
|
784 // little brevity. |
|
785 bool ReportIncomplete(Entry *entry); |
|
786 |
|
787 // Return true if ENCODING has the DW_EH_PE_indirect bit set. |
|
788 static bool IsIndirectEncoding(DwarfPointerEncoding encoding) { |
|
789 return encoding & DW_EH_PE_indirect; |
|
790 } |
|
791 |
|
792 // The contents of the DWARF .debug_info section we're parsing. |
|
793 const char *buffer_; |
|
794 size_t buffer_length_; |
|
795 |
|
796 // For reading multi-byte values with the appropriate endianness. |
|
797 ByteReader *reader_; |
|
798 |
|
799 // The handler to which we should report the data we find. |
|
800 Handler *handler_; |
|
801 |
|
802 // For reporting problems in the info we're parsing. |
|
803 Reporter *reporter_; |
|
804 |
|
805 // True if we are processing .eh_frame-format data. |
|
806 bool eh_frame_; |
|
807 }; |
|
808 |
|
809 // The handler class for CallFrameInfo. The a CFI parser calls the |
|
810 // member functions of a handler object to report the data it finds. |
|
811 class CallFrameInfo::Handler { |
|
812 public: |
|
813 // The pseudo-register number for the canonical frame address. |
|
814 enum { kCFARegister = -1 }; |
|
815 |
|
816 Handler() { } |
|
817 virtual ~Handler() { } |
|
818 |
|
819 // The parser has found CFI for the machine code at ADDRESS, |
|
820 // extending for LENGTH bytes. OFFSET is the offset of the frame |
|
821 // description entry in the section, for use in error messages. |
|
822 // VERSION is the version number of the CFI format. AUGMENTATION is |
|
823 // a string describing any producer-specific extensions present in |
|
824 // the data. RETURN_ADDRESS is the number of the register that holds |
|
825 // the address to which the function should return. |
|
826 // |
|
827 // Entry should return true to process this CFI, or false to skip to |
|
828 // the next entry. |
|
829 // |
|
830 // The parser invokes Entry for each Frame Description Entry (FDE) |
|
831 // it finds. The parser doesn't report Common Information Entries |
|
832 // to the handler explicitly; instead, if the handler elects to |
|
833 // process a given FDE, the parser reiterates the appropriate CIE's |
|
834 // contents at the beginning of the FDE's rules. |
|
835 virtual bool Entry(size_t offset, uint64 address, uint64 length, |
|
836 uint8 version, const string &augmentation, |
|
837 unsigned return_address) = 0; |
|
838 |
|
839 // When the Entry function returns true, the parser calls these |
|
840 // handler functions repeatedly to describe the rules for recovering |
|
841 // registers at each instruction in the given range of machine code. |
|
842 // Immediately after a call to Entry, the handler should assume that |
|
843 // the rule for each callee-saves register is "unchanged" --- that |
|
844 // is, that the register still has the value it had in the caller. |
|
845 // |
|
846 // If a *Rule function returns true, we continue processing this entry's |
|
847 // instructions. If a *Rule function returns false, we stop evaluating |
|
848 // instructions, and skip to the next entry. Either way, we call End |
|
849 // before going on to the next entry. |
|
850 // |
|
851 // In all of these functions, if the REG parameter is kCFARegister, then |
|
852 // the rule describes how to find the canonical frame address. |
|
853 // kCFARegister may be passed as a BASE_REGISTER argument, meaning that |
|
854 // the canonical frame address should be used as the base address for the |
|
855 // computation. All other REG values will be positive. |
|
856 |
|
857 // At ADDRESS, register REG's value is not recoverable. |
|
858 virtual bool UndefinedRule(uint64 address, int reg) = 0; |
|
859 |
|
860 // At ADDRESS, register REG's value is the same as that it had in |
|
861 // the caller. |
|
862 virtual bool SameValueRule(uint64 address, int reg) = 0; |
|
863 |
|
864 // At ADDRESS, register REG has been saved at offset OFFSET from |
|
865 // BASE_REGISTER. |
|
866 virtual bool OffsetRule(uint64 address, int reg, |
|
867 int base_register, long offset) = 0; |
|
868 |
|
869 // At ADDRESS, the caller's value of register REG is the current |
|
870 // value of BASE_REGISTER plus OFFSET. (This rule doesn't provide an |
|
871 // address at which the register's value is saved.) |
|
872 virtual bool ValOffsetRule(uint64 address, int reg, |
|
873 int base_register, long offset) = 0; |
|
874 |
|
875 // At ADDRESS, register REG has been saved in BASE_REGISTER. This differs |
|
876 // from ValOffsetRule(ADDRESS, REG, BASE_REGISTER, 0), in that |
|
877 // BASE_REGISTER is the "home" for REG's saved value: if you want to |
|
878 // assign to a variable whose home is REG in the calling frame, you |
|
879 // should put the value in BASE_REGISTER. |
|
880 virtual bool RegisterRule(uint64 address, int reg, int base_register) = 0; |
|
881 |
|
882 // At ADDRESS, the DWARF expression EXPRESSION yields the address at |
|
883 // which REG was saved. |
|
884 virtual bool ExpressionRule(uint64 address, int reg, |
|
885 const string &expression) = 0; |
|
886 |
|
887 // At ADDRESS, the DWARF expression EXPRESSION yields the caller's |
|
888 // value for REG. (This rule doesn't provide an address at which the |
|
889 // register's value is saved.) |
|
890 virtual bool ValExpressionRule(uint64 address, int reg, |
|
891 const string &expression) = 0; |
|
892 |
|
893 // Indicate that the rules for the address range reported by the |
|
894 // last call to Entry are complete. End should return true if |
|
895 // everything is okay, or false if an error has occurred and parsing |
|
896 // should stop. |
|
897 virtual bool End() = 0; |
|
898 |
|
899 // Handler functions for Linux C++ exception handling data. These are |
|
900 // only called if the data includes 'z' augmentation strings. |
|
901 |
|
902 // The Linux C++ ABI uses an extension of the DWARF CFI format to |
|
903 // walk the stack to propagate exceptions from the throw to the |
|
904 // appropriate catch, and do the appropriate cleanups along the way. |
|
905 // CFI entries used for exception handling have two additional data |
|
906 // associated with them: |
|
907 // |
|
908 // - The "language-specific data area" describes which exception |
|
909 // types the function has 'catch' clauses for, and indicates how |
|
910 // to go about re-entering the function at the appropriate catch |
|
911 // clause. If the exception is not caught, it describes the |
|
912 // destructors that must run before the frame is popped. |
|
913 // |
|
914 // - The "personality routine" is responsible for interpreting the |
|
915 // language-specific data area's contents, and deciding whether |
|
916 // the exception should continue to propagate down the stack, |
|
917 // perhaps after doing some cleanup for this frame, or whether the |
|
918 // exception will be caught here. |
|
919 // |
|
920 // In principle, the language-specific data area is opaque to |
|
921 // everybody but the personality routine. In practice, these values |
|
922 // may be useful or interesting to readers with extra context, and |
|
923 // we have to at least skip them anyway, so we might as well report |
|
924 // them to the handler. |
|
925 |
|
926 // This entry's exception handling personality routine's address is |
|
927 // ADDRESS. If INDIRECT is true, then ADDRESS is the address at |
|
928 // which the routine's address is stored. The default definition for |
|
929 // this handler function simply returns true, allowing parsing of |
|
930 // the entry to continue. |
|
931 virtual bool PersonalityRoutine(uint64 address, bool indirect) { |
|
932 return true; |
|
933 } |
|
934 |
|
935 // This entry's language-specific data area (LSDA) is located at |
|
936 // ADDRESS. If INDIRECT is true, then ADDRESS is the address at |
|
937 // which the area's address is stored. The default definition for |
|
938 // this handler function simply returns true, allowing parsing of |
|
939 // the entry to continue. |
|
940 virtual bool LanguageSpecificDataArea(uint64 address, bool indirect) { |
|
941 return true; |
|
942 } |
|
943 |
|
944 // This entry describes a signal trampoline --- this frame is the |
|
945 // caller of a signal handler. The default definition for this |
|
946 // handler function simply returns true, allowing parsing of the |
|
947 // entry to continue. |
|
948 // |
|
949 // The best description of the rationale for and meaning of signal |
|
950 // trampoline CFI entries seems to be in the GCC bug database: |
|
951 // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26208 |
|
952 virtual bool SignalHandler() { return true; } |
|
953 }; |
|
954 |
|
955 // The CallFrameInfo class makes calls on an instance of this class to |
|
956 // report errors or warn about problems in the data it is parsing. The |
|
957 // default definitions of these methods print a message to stderr, but |
|
958 // you can make a derived class that overrides them. |
|
959 class CallFrameInfo::Reporter { |
|
960 public: |
|
961 // Create an error reporter which attributes troubles to the section |
|
962 // named SECTION in FILENAME. |
|
963 // |
|
964 // Normally SECTION would be .debug_frame, but the Mac puts CFI data |
|
965 // in a Mach-O section named __debug_frame. If we support |
|
966 // Linux-style exception handling data, we could be reading an |
|
967 // .eh_frame section. |
|
968 Reporter(const string &filename, |
|
969 const string §ion = ".debug_frame") |
|
970 : filename_(filename), section_(section) { } |
|
971 virtual ~Reporter() { } |
|
972 |
|
973 // The CFI entry at OFFSET ends too early to be well-formed. KIND |
|
974 // indicates what kind of entry it is; KIND can be kUnknown if we |
|
975 // haven't parsed enough of the entry to tell yet. |
|
976 virtual void Incomplete(uint64 offset, CallFrameInfo::EntryKind kind); |
|
977 |
|
978 // The .eh_frame data has a four-byte zero at OFFSET where the next |
|
979 // entry's length would be; this is a terminator. However, the buffer |
|
980 // length as given to the CallFrameInfo constructor says there should be |
|
981 // more data. |
|
982 virtual void EarlyEHTerminator(uint64 offset); |
|
983 |
|
984 // The FDE at OFFSET refers to the CIE at CIE_OFFSET, but the |
|
985 // section is not that large. |
|
986 virtual void CIEPointerOutOfRange(uint64 offset, uint64 cie_offset); |
|
987 |
|
988 // The FDE at OFFSET refers to the CIE at CIE_OFFSET, but the entry |
|
989 // there is not a CIE. |
|
990 virtual void BadCIEId(uint64 offset, uint64 cie_offset); |
|
991 |
|
992 // The FDE at OFFSET refers to a CIE with version number VERSION, |
|
993 // which we don't recognize. We cannot parse DWARF CFI if it uses |
|
994 // a version number we don't recognize. |
|
995 virtual void UnrecognizedVersion(uint64 offset, int version); |
|
996 |
|
997 // The FDE at OFFSET refers to a CIE with augmentation AUGMENTATION, |
|
998 // which we don't recognize. We cannot parse DWARF CFI if it uses |
|
999 // augmentations we don't recognize. |
|
1000 virtual void UnrecognizedAugmentation(uint64 offset, |
|
1001 const string &augmentation); |
|
1002 |
|
1003 // The pointer encoding ENCODING, specified by the CIE at OFFSET, is not |
|
1004 // a valid encoding. |
|
1005 virtual void InvalidPointerEncoding(uint64 offset, uint8 encoding); |
|
1006 |
|
1007 // The pointer encoding ENCODING, specified by the CIE at OFFSET, depends |
|
1008 // on a base address which has not been supplied. |
|
1009 virtual void UnusablePointerEncoding(uint64 offset, uint8 encoding); |
|
1010 |
|
1011 // The CIE at OFFSET contains a DW_CFA_restore instruction at |
|
1012 // INSN_OFFSET, which may not appear in a CIE. |
|
1013 virtual void RestoreInCIE(uint64 offset, uint64 insn_offset); |
|
1014 |
|
1015 // The entry at OFFSET, of kind KIND, has an unrecognized |
|
1016 // instruction at INSN_OFFSET. |
|
1017 virtual void BadInstruction(uint64 offset, CallFrameInfo::EntryKind kind, |
|
1018 uint64 insn_offset); |
|
1019 |
|
1020 // The instruction at INSN_OFFSET in the entry at OFFSET, of kind |
|
1021 // KIND, establishes a rule that cites the CFA, but we have not |
|
1022 // established a CFA rule yet. |
|
1023 virtual void NoCFARule(uint64 offset, CallFrameInfo::EntryKind kind, |
|
1024 uint64 insn_offset); |
|
1025 |
|
1026 // The instruction at INSN_OFFSET in the entry at OFFSET, of kind |
|
1027 // KIND, is a DW_CFA_restore_state instruction, but the stack of |
|
1028 // saved states is empty. |
|
1029 virtual void EmptyStateStack(uint64 offset, CallFrameInfo::EntryKind kind, |
|
1030 uint64 insn_offset); |
|
1031 |
|
1032 // The DW_CFA_remember_state instruction at INSN_OFFSET in the entry |
|
1033 // at OFFSET, of kind KIND, would restore a state that has no CFA |
|
1034 // rule, whereas the current state does have a CFA rule. This is |
|
1035 // bogus input, which the CallFrameInfo::Handler interface doesn't |
|
1036 // (and shouldn't) have any way to report. |
|
1037 virtual void ClearingCFARule(uint64 offset, CallFrameInfo::EntryKind kind, |
|
1038 uint64 insn_offset); |
|
1039 |
|
1040 protected: |
|
1041 // The name of the file whose CFI we're reading. |
|
1042 string filename_; |
|
1043 |
|
1044 // The name of the CFI section in that file. |
|
1045 string section_; |
|
1046 }; |
|
1047 |
|
1048 } // namespace dwarf2reader |
|
1049 |
|
1050 #endif // UTIL_DEBUGINFO_DWARF2READER_H__ |