Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/tools/profiler/lul/LulDwarfExt.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
4
// Copyright 2006, 2010 Google Inc. All Rights Reserved.
5
//
6
// Redistribution and use in source and binary forms, with or without
7
// modification, are permitted provided that the following conditions are
8
// met:
9
//
10
//     * Redistributions of source code must retain the above copyright
11
// notice, this list of conditions and the following disclaimer.
12
//     * Redistributions in binary form must reproduce the above
13
// copyright notice, this list of conditions and the following disclaimer
14
// in the documentation and/or other materials provided with the
15
// distribution.
16
//     * Neither the name of Google Inc. nor the names of its
17
// contributors may be used to endorse or promote products derived from
18
// this software without specific prior written permission.
19
//
20
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
33
34
// This file is derived from the following files in
35
// toolkit/crashreporter/google-breakpad:
36
//   src/common/dwarf/types.h
37
//   src/common/dwarf/dwarf2enums.h
38
//   src/common/dwarf/bytereader.h
39
//   src/common/dwarf_cfi_to_module.h
40
//   src/common/dwarf/dwarf2reader.h
41
42
#ifndef LulDwarfExt_h
43
#define LulDwarfExt_h
44
45
#include <stdint.h>
46
47
#include "mozilla/Assertions.h"
48
49
#include "LulDwarfSummariser.h"
50
51
typedef signed char         int8;
52
typedef short               int16;
53
typedef int                 int32;
54
typedef long long           int64;
55
56
typedef unsigned char      uint8;
57
typedef unsigned short     uint16;
58
typedef unsigned int       uint32;
59
typedef unsigned long long uint64;
60
61
#ifdef __PTRDIFF_TYPE__
62
typedef          __PTRDIFF_TYPE__ intptr;
63
typedef unsigned __PTRDIFF_TYPE__ uintptr;
64
#else
65
#error "Can't find pointer-sized integral types."
66
#endif
67
68
69
namespace lul {
70
71
// Exception handling frame description pointer formats, as described
72
// by the Linux Standard Base Core Specification 4.0, section 11.5,
73
// DWARF Extensions.
74
enum DwarfPointerEncoding
75
  {
76
    DW_EH_PE_absptr = 0x00,
77
    DW_EH_PE_omit = 0xff,
78
    DW_EH_PE_uleb128    = 0x01,
79
    DW_EH_PE_udata2 = 0x02,
80
    DW_EH_PE_udata4 = 0x03,
81
    DW_EH_PE_udata8 = 0x04,
82
    DW_EH_PE_sleb128    = 0x09,
83
    DW_EH_PE_sdata2 = 0x0A,
84
    DW_EH_PE_sdata4 = 0x0B,
85
    DW_EH_PE_sdata8 = 0x0C,
86
    DW_EH_PE_pcrel  = 0x10,
87
    DW_EH_PE_textrel  = 0x20,
88
    DW_EH_PE_datarel  = 0x30,
89
    DW_EH_PE_funcrel  = 0x40,
90
    DW_EH_PE_aligned  = 0x50,
91
92
    // The GNU toolchain sources define this enum value as well,
93
    // simply to help classify the lower nybble values into signed and
94
    // unsigned groups.
95
    DW_EH_PE_signed = 0x08,
96
97
    // This is not documented in LSB 4.0, but it is used in both the
98
    // Linux and OS X toolchains. It can be added to any other
99
    // encoding (except DW_EH_PE_aligned), and indicates that the
100
    // encoded value represents the address at which the true address
101
    // is stored, not the true address itself.
102
    DW_EH_PE_indirect = 0x80
103
  };
104
105
106
// We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN
107
// because it conflicts with a macro
108
enum Endianness {
109
  ENDIANNESS_BIG,
110
  ENDIANNESS_LITTLE
111
};
112
113
// A ByteReader knows how to read single- and multi-byte values of
114
// various endiannesses, sizes, and encodings, as used in DWARF
115
// debugging information and Linux C++ exception handling data.
116
class ByteReader {
117
 public:
118
  // Construct a ByteReader capable of reading one-, two-, four-, and
119
  // eight-byte values according to ENDIANNESS, absolute machine-sized
120
  // addresses, DWARF-style "initial length" values, signed and
121
  // unsigned LEB128 numbers, and Linux C++ exception handling data's
122
  // encoded pointers.
123
  explicit ByteReader(enum Endianness endianness);
124
  virtual ~ByteReader();
125
126
  // Read a single byte from BUFFER and return it as an unsigned 8 bit
127
  // number.
128
  uint8 ReadOneByte(const char* buffer) const;
129
130
  // Read two bytes from BUFFER and return them as an unsigned 16 bit
131
  // number, using this ByteReader's endianness.
132
  uint16 ReadTwoBytes(const char* buffer) const;
133
134
  // Read four bytes from BUFFER and return them as an unsigned 32 bit
135
  // number, using this ByteReader's endianness. This function returns
136
  // a uint64 so that it is compatible with ReadAddress and
137
  // ReadOffset. The number it returns will never be outside the range
138
  // of an unsigned 32 bit integer.
139
  uint64 ReadFourBytes(const char* buffer) const;
140
141
  // Read eight bytes from BUFFER and return them as an unsigned 64
142
  // bit number, using this ByteReader's endianness.
143
  uint64 ReadEightBytes(const char* buffer) const;
144
145
  // Read an unsigned LEB128 (Little Endian Base 128) number from
146
  // BUFFER and return it as an unsigned 64 bit integer. Set LEN to
147
  // the number of bytes read.
148
  //
149
  // The unsigned LEB128 representation of an integer N is a variable
150
  // number of bytes:
151
  //
152
  // - If N is between 0 and 0x7f, then its unsigned LEB128
153
  //   representation is a single byte whose value is N.
154
  //
155
  // - Otherwise, its unsigned LEB128 representation is (N & 0x7f) |
156
  //   0x80, followed by the unsigned LEB128 representation of N /
157
  //   128, rounded towards negative infinity.
158
  //
159
  // In other words, we break VALUE into groups of seven bits, put
160
  // them in little-endian order, and then write them as eight-bit
161
  // bytes with the high bit on all but the last.
162
  uint64 ReadUnsignedLEB128(const char* buffer, size_t* len) const;
163
164
  // Read a signed LEB128 number from BUFFER and return it as an
165
  // signed 64 bit integer. Set LEN to the number of bytes read.
166
  //
167
  // The signed LEB128 representation of an integer N is a variable
168
  // number of bytes:
169
  //
170
  // - If N is between -0x40 and 0x3f, then its signed LEB128
171
  //   representation is a single byte whose value is N in two's
172
  //   complement.
173
  //
174
  // - Otherwise, its signed LEB128 representation is (N & 0x7f) |
175
  //   0x80, followed by the signed LEB128 representation of N / 128,
176
  //   rounded towards negative infinity.
177
  //
178
  // In other words, we break VALUE into groups of seven bits, put
179
  // them in little-endian order, and then write them as eight-bit
180
  // bytes with the high bit on all but the last.
181
  int64 ReadSignedLEB128(const char* buffer, size_t* len) const;
182
183
  // Indicate that addresses on this architecture are SIZE bytes long. SIZE
184
  // must be either 4 or 8. (DWARF allows addresses to be any number of
185
  // bytes in length from 1 to 255, but we only support 32- and 64-bit
186
  // addresses at the moment.) You must call this before using the
187
  // ReadAddress member function.
188
  //
189
  // For data in a .debug_info section, or something that .debug_info
190
  // refers to like line number or macro data, the compilation unit
191
  // header's address_size field indicates the address size to use. Call
192
  // frame information doesn't indicate its address size (a shortcoming of
193
  // the spec); you must supply the appropriate size based on the
194
  // architecture of the target machine.
195
  void SetAddressSize(uint8 size);
196
197
  // Return the current address size, in bytes. This is either 4,
198
  // indicating 32-bit addresses, or 8, indicating 64-bit addresses.
199
0
  uint8 AddressSize() const { return address_size_; }
200
201
  // Read an address from BUFFER and return it as an unsigned 64 bit
202
  // integer, respecting this ByteReader's endianness and address size. You
203
  // must call SetAddressSize before calling this function.
204
  uint64 ReadAddress(const char* buffer) const;
205
206
  // DWARF actually defines two slightly different formats: 32-bit DWARF
207
  // and 64-bit DWARF. This is *not* related to the size of registers or
208
  // addresses on the target machine; it refers only to the size of section
209
  // offsets and data lengths appearing in the DWARF data. One only needs
210
  // 64-bit DWARF when the debugging data itself is larger than 4GiB.
211
  // 32-bit DWARF can handle x86_64 or PPC64 code just fine, unless the
212
  // debugging data itself is very large.
213
  //
214
  // DWARF information identifies itself as 32-bit or 64-bit DWARF: each
215
  // compilation unit and call frame information entry begins with an
216
  // "initial length" field, which, in addition to giving the length of the
217
  // data, also indicates the size of section offsets and lengths appearing
218
  // in that data. The ReadInitialLength member function, below, reads an
219
  // initial length and sets the ByteReader's offset size as a side effect.
220
  // Thus, in the normal process of reading DWARF data, the appropriate
221
  // offset size is set automatically. So, you should only need to call
222
  // SetOffsetSize if you are using the same ByteReader to jump from the
223
  // midst of one block of DWARF data into another.
224
225
  // Read a DWARF "initial length" field from START, and return it as
226
  // an unsigned 64 bit integer, respecting this ByteReader's
227
  // endianness. Set *LEN to the length of the initial length in
228
  // bytes, either four or twelve. As a side effect, set this
229
  // ByteReader's offset size to either 4 (if we see a 32-bit DWARF
230
  // initial length) or 8 (if we see a 64-bit DWARF initial length).
231
  //
232
  // A DWARF initial length is either:
233
  //
234
  // - a byte count stored as an unsigned 32-bit value less than
235
  //   0xffffff00, indicating that the data whose length is being
236
  //   measured uses the 32-bit DWARF format, or
237
  //
238
  // - The 32-bit value 0xffffffff, followed by a 64-bit byte count,
239
  //   indicating that the data whose length is being measured uses
240
  //   the 64-bit DWARF format.
241
  uint64 ReadInitialLength(const char* start, size_t* len);
242
243
  // Read an offset from BUFFER and return it as an unsigned 64 bit
244
  // integer, respecting the ByteReader's endianness. In 32-bit DWARF, the
245
  // offset is 4 bytes long; in 64-bit DWARF, the offset is eight bytes
246
  // long. You must call ReadInitialLength or SetOffsetSize before calling
247
  // this function; see the comments above for details.
248
  uint64 ReadOffset(const char* buffer) const;
249
250
  // Return the current offset size, in bytes.
251
  // A return value of 4 indicates that we are reading 32-bit DWARF.
252
  // A return value of 8 indicates that we are reading 64-bit DWARF.
253
0
  uint8 OffsetSize() const { return offset_size_; }
254
255
  // Indicate that section offsets and lengths are SIZE bytes long. SIZE
256
  // must be either 4 (meaning 32-bit DWARF) or 8 (meaning 64-bit DWARF).
257
  // Usually, you should not call this function yourself; instead, let a
258
  // call to ReadInitialLength establish the data's offset size
259
  // automatically.
260
  void SetOffsetSize(uint8 size);
261
262
  // The Linux C++ ABI uses a variant of DWARF call frame information
263
  // for exception handling. This data is included in the program's
264
  // address space as the ".eh_frame" section, and intepreted at
265
  // runtime to walk the stack, find exception handlers, and run
266
  // cleanup code. The format is mostly the same as DWARF CFI, with
267
  // some adjustments made to provide the additional
268
  // exception-handling data, and to make the data easier to work with
269
  // in memory --- for example, to allow it to be placed in read-only
270
  // memory even when describing position-independent code.
271
  //
272
  // In particular, exception handling data can select a number of
273
  // different encodings for pointers that appear in the data, as
274
  // described by the DwarfPointerEncoding enum. There are actually
275
  // four axes(!) to the encoding:
276
  //
277
  // - The pointer size: pointers can be 2, 4, or 8 bytes long, or use
278
  //   the DWARF LEB128 encoding.
279
  //
280
  // - The pointer's signedness: pointers can be signed or unsigned.
281
  //
282
  // - The pointer's base address: the data stored in the exception
283
  //   handling data can be the actual address (that is, an absolute
284
  //   pointer), or relative to one of a number of different base
285
  //   addreses --- including that of the encoded pointer itself, for
286
  //   a form of "pc-relative" addressing.
287
  //
288
  // - The pointer may be indirect: it may be the address where the
289
  //   true pointer is stored. (This is used to refer to things via
290
  //   global offset table entries, program linkage table entries, or
291
  //   other tricks used in position-independent code.)
292
  //
293
  // There are also two options that fall outside that matrix
294
  // altogether: the pointer may be omitted, or it may have padding to
295
  // align it on an appropriate address boundary. (That last option
296
  // may seem like it should be just another axis, but it is not.)
297
298
  // Indicate that the exception handling data is loaded starting at
299
  // SECTION_BASE, and that the start of its buffer in our own memory
300
  // is BUFFER_BASE. This allows us to find the address that a given
301
  // byte in our buffer would have when loaded into the program the
302
  // data describes. We need this to resolve DW_EH_PE_pcrel pointers.
303
  void SetCFIDataBase(uint64 section_base, const char *buffer_base);
304
305
  // Indicate that the base address of the program's ".text" section
306
  // is TEXT_BASE. We need this to resolve DW_EH_PE_textrel pointers.
307
  void SetTextBase(uint64 text_base);
308
309
  // Indicate that the base address for DW_EH_PE_datarel pointers is
310
  // DATA_BASE. The proper value depends on the ABI; it is usually the
311
  // address of the global offset table, held in a designated register in
312
  // position-independent code. You will need to look at the startup code
313
  // for the target system to be sure. I tried; my eyes bled.
314
  void SetDataBase(uint64 data_base);
315
316
  // Indicate that the base address for the FDE we are processing is
317
  // FUNCTION_BASE. This is the start address of DW_EH_PE_funcrel
318
  // pointers. (This encoding does not seem to be used by the GNU
319
  // toolchain.)
320
  void SetFunctionBase(uint64 function_base);
321
322
  // Indicate that we are no longer processing any FDE, so any use of
323
  // a DW_EH_PE_funcrel encoding is an error.
324
  void ClearFunctionBase();
325
326
  // Return true if ENCODING is a valid pointer encoding.
327
  bool ValidEncoding(DwarfPointerEncoding encoding) const;
328
329
  // Return true if we have all the information we need to read a
330
  // pointer that uses ENCODING. This checks that the appropriate
331
  // SetFooBase function for ENCODING has been called.
332
  bool UsableEncoding(DwarfPointerEncoding encoding) const;
333
334
  // Read an encoded pointer from BUFFER using ENCODING; return the
335
  // absolute address it represents, and set *LEN to the pointer's
336
  // length in bytes, including any padding for aligned pointers.
337
  //
338
  // This function calls 'abort' if ENCODING is invalid or refers to a
339
  // base address this reader hasn't been given, so you should check
340
  // with ValidEncoding and UsableEncoding first if you would rather
341
  // die in a more helpful way.
342
  uint64 ReadEncodedPointer(const char *buffer, DwarfPointerEncoding encoding,
343
                            size_t *len) const;
344
345
 private:
346
347
  // Function pointer type for our address and offset readers.
348
  typedef uint64 (ByteReader::*AddressReader)(const char*) const;
349
350
  // Read an offset from BUFFER and return it as an unsigned 64 bit
351
  // integer.  DWARF2/3 define offsets as either 4 or 8 bytes,
352
  // generally depending on the amount of DWARF2/3 info present.
353
  // This function pointer gets set by SetOffsetSize.
354
  AddressReader offset_reader_;
355
356
  // Read an address from BUFFER and return it as an unsigned 64 bit
357
  // integer.  DWARF2/3 allow addresses to be any size from 0-255
358
  // bytes currently.  Internally we support 4 and 8 byte addresses,
359
  // and will CHECK on anything else.
360
  // This function pointer gets set by SetAddressSize.
361
  AddressReader address_reader_;
362
363
  Endianness endian_;
364
  uint8 address_size_;
365
  uint8 offset_size_;
366
367
  // Base addresses for Linux C++ exception handling data's encoded pointers.
368
  bool have_section_base_, have_text_base_, have_data_base_;
369
  bool have_function_base_;
370
  uint64 section_base_;
371
  uint64 text_base_, data_base_, function_base_;
372
  const char *buffer_base_;
373
};
374
375
376
0
inline uint8 ByteReader::ReadOneByte(const char* buffer) const {
377
0
  return buffer[0];
378
0
}
379
380
0
inline uint16 ByteReader::ReadTwoBytes(const char* signed_buffer) const {
381
0
  const unsigned char *buffer
382
0
    = reinterpret_cast<const unsigned char *>(signed_buffer);
383
0
  const uint16 buffer0 = buffer[0];
384
0
  const uint16 buffer1 = buffer[1];
385
0
  if (endian_ == ENDIANNESS_LITTLE) {
386
0
    return buffer0 | buffer1 << 8;
387
0
  } else {
388
0
    return buffer1 | buffer0 << 8;
389
0
  }
390
0
}
391
392
0
inline uint64 ByteReader::ReadFourBytes(const char* signed_buffer) const {
393
0
  const unsigned char *buffer
394
0
    = reinterpret_cast<const unsigned char *>(signed_buffer);
395
0
  const uint32 buffer0 = buffer[0];
396
0
  const uint32 buffer1 = buffer[1];
397
0
  const uint32 buffer2 = buffer[2];
398
0
  const uint32 buffer3 = buffer[3];
399
0
  if (endian_ == ENDIANNESS_LITTLE) {
400
0
    return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24;
401
0
  } else {
402
0
    return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24;
403
0
  }
404
0
}
405
406
0
inline uint64 ByteReader::ReadEightBytes(const char* signed_buffer) const {
407
0
  const unsigned char *buffer
408
0
    = reinterpret_cast<const unsigned char *>(signed_buffer);
409
0
  const uint64 buffer0 = buffer[0];
410
0
  const uint64 buffer1 = buffer[1];
411
0
  const uint64 buffer2 = buffer[2];
412
0
  const uint64 buffer3 = buffer[3];
413
0
  const uint64 buffer4 = buffer[4];
414
0
  const uint64 buffer5 = buffer[5];
415
0
  const uint64 buffer6 = buffer[6];
416
0
  const uint64 buffer7 = buffer[7];
417
0
  if (endian_ == ENDIANNESS_LITTLE) {
418
0
    return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24 |
419
0
      buffer4 << 32 | buffer5 << 40 | buffer6 << 48 | buffer7 << 56;
420
0
  } else {
421
0
    return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 |
422
0
      buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56;
423
0
  }
424
0
}
425
426
// Read an unsigned LEB128 number.  Each byte contains 7 bits of
427
// information, plus one bit saying whether the number continues or
428
// not.
429
430
inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer,
431
0
                                             size_t* len) const {
432
0
  uint64 result = 0;
433
0
  size_t num_read = 0;
434
0
  unsigned int shift = 0;
435
0
  unsigned char byte;
436
0
437
0
  do {
438
0
    byte = *buffer++;
439
0
    num_read++;
440
0
441
0
    result |= (static_cast<uint64>(byte & 0x7f)) << shift;
442
0
443
0
    shift += 7;
444
0
445
0
  } while (byte & 0x80);
446
0
447
0
  *len = num_read;
448
0
449
0
  return result;
450
0
}
451
452
// Read a signed LEB128 number.  These are like regular LEB128
453
// numbers, except the last byte may have a sign bit set.
454
455
inline int64 ByteReader::ReadSignedLEB128(const char* buffer,
456
0
                                          size_t* len) const {
457
0
  int64 result = 0;
458
0
  unsigned int shift = 0;
459
0
  size_t num_read = 0;
460
0
  unsigned char byte;
461
0
462
0
  do {
463
0
      byte = *buffer++;
464
0
      num_read++;
465
0
      result |= (static_cast<uint64>(byte & 0x7f) << shift);
466
0
      shift += 7;
467
0
  } while (byte & 0x80);
468
0
469
0
  if ((shift < 8 * sizeof (result)) && (byte & 0x40))
470
0
    result |= -((static_cast<int64>(1)) << shift);
471
0
  *len = num_read;
472
0
  return result;
473
0
}
474
475
0
inline uint64 ByteReader::ReadOffset(const char* buffer) const {
476
0
  MOZ_ASSERT(this->offset_reader_);
477
0
  return (this->*offset_reader_)(buffer);
478
0
}
479
480
0
inline uint64 ByteReader::ReadAddress(const char* buffer) const {
481
0
  MOZ_ASSERT(this->address_reader_);
482
0
  return (this->*address_reader_)(buffer);
483
0
}
484
485
inline void ByteReader::SetCFIDataBase(uint64 section_base,
486
0
                                       const char *buffer_base) {
487
0
  section_base_ = section_base;
488
0
  buffer_base_ = buffer_base;
489
0
  have_section_base_ = true;
490
0
}
491
492
0
inline void ByteReader::SetTextBase(uint64 text_base) {
493
0
  text_base_ = text_base;
494
0
  have_text_base_ = true;
495
0
}
496
497
0
inline void ByteReader::SetDataBase(uint64 data_base) {
498
0
  data_base_ = data_base;
499
0
  have_data_base_ = true;
500
0
}
501
502
0
inline void ByteReader::SetFunctionBase(uint64 function_base) {
503
0
  function_base_ = function_base;
504
0
  have_function_base_ = true;
505
0
}
506
507
0
inline void ByteReader::ClearFunctionBase() {
508
0
  have_function_base_ = false;
509
0
}
510
511
512
// (derived from)
513
// dwarf_cfi_to_module.h: Define the DwarfCFIToModule class, which
514
// accepts parsed DWARF call frame info and adds it to a Summariser object.
515
516
// This class is a reader for DWARF's Call Frame Information.  CFI
517
// describes how to unwind stack frames --- even for functions that do
518
// not follow fixed conventions for saving registers, whose frame size
519
// varies as they execute, etc.
520
//
521
// CFI describes, at each machine instruction, how to compute the
522
// stack frame's base address, how to find the return address, and
523
// where to find the saved values of the caller's registers (if the
524
// callee has stashed them somewhere to free up the registers for its
525
// own use).
526
//
527
// For example, suppose we have a function whose machine code looks
528
// like this (imagine an assembly language that looks like C, for a
529
// machine with 32-bit registers, and a stack that grows towards lower
530
// addresses):
531
//
532
// func:                                ; entry point; return address at sp
533
// func+0:      sp = sp - 16            ; allocate space for stack frame
534
// func+1:      sp[12] = r0             ; save r0 at sp+12
535
// ...                                  ; other code, not frame-related
536
// func+10:     sp -= 4; *sp = x        ; push some x on the stack
537
// ...                                  ; other code, not frame-related
538
// func+20:     r0 = sp[16]             ; restore saved r0
539
// func+21:     sp += 20                ; pop whole stack frame
540
// func+22:     pc = *sp; sp += 4       ; pop return address and jump to it
541
//
542
// DWARF CFI is (a very compressed representation of) a table with a
543
// row for each machine instruction address and a column for each
544
// register showing how to restore it, if possible.
545
//
546
// A special column named "CFA", for "Canonical Frame Address", tells how
547
// to compute the base address of the frame; registers' entries may
548
// refer to the CFA in describing where the registers are saved.
549
//
550
// Another special column, named "RA", represents the return address.
551
//
552
// For example, here is a complete (uncompressed) table describing the
553
// function above:
554
//
555
//     insn      cfa    r0      r1 ...  ra
556
//     =======================================
557
//     func+0:   sp                     cfa[0]
558
//     func+1:   sp+16                  cfa[0]
559
//     func+2:   sp+16  cfa[-4]         cfa[0]
560
//     func+11:  sp+20  cfa[-4]         cfa[0]
561
//     func+21:  sp+20                  cfa[0]
562
//     func+22:  sp                     cfa[0]
563
//
564
// Some things to note here:
565
//
566
// - Each row describes the state of affairs *before* executing the
567
//   instruction at the given address.  Thus, the row for func+0
568
//   describes the state before we allocate the stack frame.  In the
569
//   next row, the formula for computing the CFA has changed,
570
//   reflecting that allocation.
571
//
572
// - The other entries are written in terms of the CFA; this allows
573
//   them to remain unchanged as the stack pointer gets bumped around.
574
//   For example, the rule for recovering the return address (the "ra"
575
//   column) remains unchanged throughout the function, even as the
576
//   stack pointer takes on three different offsets from the return
577
//   address.
578
//
579
// - Although we haven't shown it, most calling conventions designate
580
//   "callee-saves" and "caller-saves" registers. The callee must
581
//   preserve the values of callee-saves registers; if it uses them,
582
//   it must save their original values somewhere, and restore them
583
//   before it returns. In contrast, the callee is free to trash
584
//   caller-saves registers; if the callee uses these, it will
585
//   probably not bother to save them anywhere, and the CFI will
586
//   probably mark their values as "unrecoverable".
587
//
588
//   (However, since the caller cannot assume the callee was going to
589
//   save them, caller-saves registers are probably dead in the caller
590
//   anyway, so compilers usually don't generate CFA for caller-saves
591
//   registers.)
592
//
593
// - Exactly where the CFA points is a matter of convention that
594
//   depends on the architecture and ABI in use. In the example, the
595
//   CFA is the value the stack pointer had upon entry to the
596
//   function, pointing at the saved return address. But on the x86,
597
//   the call frame information generated by GCC follows the
598
//   convention that the CFA is the address *after* the saved return
599
//   address.
600
//
601
//   But by definition, the CFA remains constant throughout the
602
//   lifetime of the frame. This makes it a useful value for other
603
//   columns to refer to. It is also gives debuggers a useful handle
604
//   for identifying a frame.
605
//
606
// If you look at the table above, you'll notice that a given entry is
607
// often the same as the one immediately above it: most instructions
608
// change only one or two aspects of the stack frame, if they affect
609
// it at all. The DWARF format takes advantage of this fact, and
610
// reduces the size of the data by mentioning only the addresses and
611
// columns at which changes take place. So for the above, DWARF CFI
612
// data would only actually mention the following:
613
//
614
//     insn      cfa    r0      r1 ...  ra
615
//     =======================================
616
//     func+0:   sp                     cfa[0]
617
//     func+1:   sp+16
618
//     func+2:          cfa[-4]
619
//     func+11:  sp+20
620
//     func+21:         r0
621
//     func+22:  sp
622
//
623
// In fact, this is the way the parser reports CFI to the consumer: as
624
// a series of statements of the form, "At address X, column Y changed
625
// to Z," and related conventions for describing the initial state.
626
//
627
// Naturally, it would be impractical to have to scan the entire
628
// program's CFI, noting changes as we go, just to recover the
629
// unwinding rules in effect at one particular instruction. To avoid
630
// this, CFI data is grouped into "entries", each of which covers a
631
// specified range of addresses and begins with a complete statement
632
// of the rules for all recoverable registers at that starting
633
// address. Each entry typically covers a single function.
634
//
635
// Thus, to compute the contents of a given row of the table --- that
636
// is, rules for recovering the CFA, RA, and registers at a given
637
// instruction --- the consumer should find the entry that covers that
638
// instruction's address, start with the initial state supplied at the
639
// beginning of the entry, and work forward until it has processed all
640
// the changes up to and including those for the present instruction.
641
//
642
// There are seven kinds of rules that can appear in an entry of the
643
// table:
644
//
645
// - "undefined": The given register is not preserved by the callee;
646
//   its value cannot be recovered.
647
//
648
// - "same value": This register has the same value it did in the callee.
649
//
650
// - offset(N): The register is saved at offset N from the CFA.
651
//
652
// - val_offset(N): The value the register had in the caller is the
653
//   CFA plus offset N. (This is usually only useful for describing
654
//   the stack pointer.)
655
//
656
// - register(R): The register's value was saved in another register R.
657
//
658
// - expression(E): Evaluating the DWARF expression E using the
659
//   current frame's registers' values yields the address at which the
660
//   register was saved.
661
//
662
// - val_expression(E): Evaluating the DWARF expression E using the
663
//   current frame's registers' values yields the value the register
664
//   had in the caller.
665
666
class CallFrameInfo {
667
 public:
668
  // The different kinds of entries one finds in CFI. Used internally,
669
  // and for error reporting.
670
  enum EntryKind { kUnknown, kCIE, kFDE, kTerminator };
671
672
  // The handler class to which the parser hands the parsed call frame
673
  // information.  Defined below.
674
  class Handler;
675
676
  // A reporter class, which CallFrameInfo uses to report errors
677
  // encountered while parsing call frame information.  Defined below.
678
  class Reporter;
679
680
  // Create a DWARF CFI parser. BUFFER points to the contents of the
681
  // .debug_frame section to parse; BUFFER_LENGTH is its length in bytes.
682
  // REPORTER is an error reporter the parser should use to report
683
  // problems. READER is a ByteReader instance that has the endianness and
684
  // address size set properly. Report the data we find to HANDLER.
685
  //
686
  // This class can also parse Linux C++ exception handling data, as found
687
  // in '.eh_frame' sections. This data is a variant of DWARF CFI that is
688
  // placed in loadable segments so that it is present in the program's
689
  // address space, and is interpreted by the C++ runtime to search the
690
  // call stack for a handler interested in the exception being thrown,
691
  // actually pop the frames, and find cleanup code to run.
692
  //
693
  // There are two differences between the call frame information described
694
  // in the DWARF standard and the exception handling data Linux places in
695
  // the .eh_frame section:
696
  //
697
  // - Exception handling data uses uses a different format for call frame
698
  //   information entry headers. The distinguished CIE id, the way FDEs
699
  //   refer to their CIEs, and the way the end of the series of entries is
700
  //   determined are all slightly different.
701
  //
702
  //   If the constructor's EH_FRAME argument is true, then the
703
  //   CallFrameInfo parses the entry headers as Linux C++ exception
704
  //   handling data. If EH_FRAME is false or omitted, the CallFrameInfo
705
  //   parses standard DWARF call frame information.
706
  //
707
  // - Linux C++ exception handling data uses CIE augmentation strings
708
  //   beginning with 'z' to specify the presence of additional data after
709
  //   the CIE and FDE headers and special encodings used for addresses in
710
  //   frame description entries.
711
  //
712
  //   CallFrameInfo can handle 'z' augmentations in either DWARF CFI or
713
  //   exception handling data if you have supplied READER with the base
714
  //   addresses needed to interpret the pointer encodings that 'z'
715
  //   augmentations can specify. See the ByteReader interface for details
716
  //   about the base addresses. See the CallFrameInfo::Handler interface
717
  //   for details about the additional information one might find in
718
  //   'z'-augmented data.
719
  //
720
  // Thus:
721
  //
722
  // - If you are parsing standard DWARF CFI, as found in a .debug_frame
723
  //   section, you should pass false for the EH_FRAME argument, or omit
724
  //   it, and you need not worry about providing READER with the
725
  //   additional base addresses.
726
  //
727
  // - If you want to parse Linux C++ exception handling data from a
728
  //   .eh_frame section, you should pass EH_FRAME as true, and call
729
  //   READER's Set*Base member functions before calling our Start method.
730
  //
731
  // - If you want to parse DWARF CFI that uses the 'z' augmentations
732
  //   (although I don't think any toolchain ever emits such data), you
733
  //   could pass false for EH_FRAME, but call READER's Set*Base members.
734
  //
735
  // The extensions the Linux C++ ABI makes to DWARF for exception
736
  // handling are described here, rather poorly:
737
  // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html
738
  // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html
739
  //
740
  // The mechanics of C++ exception handling, personality routines,
741
  // and language-specific data areas are described here, rather nicely:
742
  // http://www.codesourcery.com/public/cxx-abi/abi-eh.html
743
744
  CallFrameInfo(const char *buffer, size_t buffer_length,
745
                ByteReader *reader, Handler *handler, Reporter *reporter,
746
                bool eh_frame = false)
747
      : buffer_(buffer), buffer_length_(buffer_length),
748
        reader_(reader), handler_(handler), reporter_(reporter),
749
0
        eh_frame_(eh_frame) { }
750
751
0
  ~CallFrameInfo() { }
752
753
  // Parse the entries in BUFFER, reporting what we find to HANDLER.
754
  // Return true if we reach the end of the section successfully, or
755
  // false if we encounter an error.
756
  bool Start();
757
758
  // Return the textual name of KIND. For error reporting.
759
  static const char *KindName(EntryKind kind);
760
761
 private:
762
763
  struct CIE;
764
765
  // A CFI entry, either an FDE or a CIE.
766
  struct Entry {
767
    // The starting offset of the entry in the section, for error
768
    // reporting.
769
    size_t offset;
770
771
    // The start of this entry in the buffer.
772
    const char *start;
773
774
    // Which kind of entry this is.
775
    //
776
    // We want to be able to use this for error reporting even while we're
777
    // in the midst of parsing. Error reporting code may assume that kind,
778
    // offset, and start fields are valid, although kind may be kUnknown.
779
    EntryKind kind;
780
781
    // The end of this entry's common prologue (initial length and id), and
782
    // the start of this entry's kind-specific fields.
783
    const char *fields;
784
785
    // The start of this entry's instructions.
786
    const char *instructions;
787
788
    // The address past the entry's last byte in the buffer. (Note that
789
    // since offset points to the entry's initial length field, and the
790
    // length field is the number of bytes after that field, this is not
791
    // simply buffer_ + offset + length.)
792
    const char *end;
793
794
    // For both DWARF CFI and .eh_frame sections, this is the CIE id in a
795
    // CIE, and the offset of the associated CIE in an FDE.
796
    uint64 id;
797
798
    // The CIE that applies to this entry, if we've parsed it. If this is a
799
    // CIE, then this field points to this structure.
800
    CIE *cie;
801
  };
802
803
  // A common information entry (CIE).
804
  struct CIE: public Entry {
805
    uint8 version;                      // CFI data version number
806
    std::string augmentation;           // vendor format extension markers
807
    uint64 code_alignment_factor;       // scale for code address adjustments
808
    int data_alignment_factor;          // scale for stack pointer adjustments
809
    unsigned return_address_register;   // which register holds the return addr
810
811
    // True if this CIE includes Linux C++ ABI 'z' augmentation data.
812
    bool has_z_augmentation;
813
814
    // Parsed 'z' augmentation data. These are meaningful only if
815
    // has_z_augmentation is true.
816
    bool has_z_lsda;                    // The 'z' augmentation included 'L'.
817
    bool has_z_personality;             // The 'z' augmentation included 'P'.
818
    bool has_z_signal_frame;            // The 'z' augmentation included 'S'.
819
820
    // If has_z_lsda is true, this is the encoding to be used for language-
821
    // specific data area pointers in FDEs.
822
    DwarfPointerEncoding lsda_encoding;
823
824
    // If has_z_personality is true, this is the encoding used for the
825
    // personality routine pointer in the augmentation data.
826
    DwarfPointerEncoding personality_encoding;
827
828
    // If has_z_personality is true, this is the address of the personality
829
    // routine --- or, if personality_encoding & DW_EH_PE_indirect, the
830
    // address where the personality routine's address is stored.
831
    uint64 personality_address;
832
833
    // This is the encoding used for addresses in the FDE header and
834
    // in DW_CFA_set_loc instructions. This is always valid, whether
835
    // or not we saw a 'z' augmentation string; its default value is
836
    // DW_EH_PE_absptr, which is what normal DWARF CFI uses.
837
    DwarfPointerEncoding pointer_encoding;
838
  };
839
840
  // A frame description entry (FDE).
841
  struct FDE: public Entry {
842
    uint64 address;                     // start address of described code
843
    uint64 size;                        // size of described code, in bytes
844
845
    // If cie->has_z_lsda is true, then this is the language-specific data
846
    // area's address --- or its address's address, if cie->lsda_encoding
847
    // has the DW_EH_PE_indirect bit set.
848
    uint64 lsda_address;
849
  };
850
851
  // Internal use.
852
  class Rule;
853
  class UndefinedRule;
854
  class SameValueRule;
855
  class OffsetRule;
856
  class ValOffsetRule;
857
  class RegisterRule;
858
  class ExpressionRule;
859
  class ValExpressionRule;
860
  class RuleMap;
861
  class State;
862
863
  // Parse the initial length and id of a CFI entry, either a CIE, an FDE,
864
  // or a .eh_frame end-of-data mark. CURSOR points to the beginning of the
865
  // data to parse. On success, populate ENTRY as appropriate, and return
866
  // true. On failure, report the problem, and return false. Even if we
867
  // return false, set ENTRY->end to the first byte after the entry if we
868
  // were able to figure that out, or NULL if we weren't.
869
  bool ReadEntryPrologue(const char *cursor, Entry *entry);
870
871
  // Parse the fields of a CIE after the entry prologue, including any 'z'
872
  // augmentation data. Assume that the 'Entry' fields of CIE are
873
  // populated; use CIE->fields and CIE->end as the start and limit for
874
  // parsing. On success, populate the rest of *CIE, and return true; on
875
  // failure, report the problem and return false.
876
  bool ReadCIEFields(CIE *cie);
877
878
  // Parse the fields of an FDE after the entry prologue, including any 'z'
879
  // augmentation data. Assume that the 'Entry' fields of *FDE are
880
  // initialized; use FDE->fields and FDE->end as the start and limit for
881
  // parsing. Assume that FDE->cie is fully initialized. On success,
882
  // populate the rest of *FDE, and return true; on failure, report the
883
  // problem and return false.
884
  bool ReadFDEFields(FDE *fde);
885
886
  // Report that ENTRY is incomplete, and return false. This is just a
887
  // trivial wrapper for invoking reporter_->Incomplete; it provides a
888
  // little brevity.
889
  bool ReportIncomplete(Entry *entry);
890
891
  // Return true if ENCODING has the DW_EH_PE_indirect bit set.
892
0
  static bool IsIndirectEncoding(DwarfPointerEncoding encoding) {
893
0
    return encoding & DW_EH_PE_indirect;
894
0
  }
895
896
  // The contents of the DWARF .debug_info section we're parsing.
897
  const char *buffer_;
898
  size_t buffer_length_;
899
900
  // For reading multi-byte values with the appropriate endianness.
901
  ByteReader *reader_;
902
903
  // The handler to which we should report the data we find.
904
  Handler *handler_;
905
906
  // For reporting problems in the info we're parsing.
907
  Reporter *reporter_;
908
909
  // True if we are processing .eh_frame-format data.
910
  bool eh_frame_;
911
};
912
913
914
// The handler class for CallFrameInfo.  The a CFI parser calls the
915
// member functions of a handler object to report the data it finds.
916
class CallFrameInfo::Handler {
917
 public:
918
  // The pseudo-register number for the canonical frame address.
919
  enum { kCFARegister = DW_REG_CFA };
920
921
0
  Handler() { }
922
0
  virtual ~Handler() { }
923
924
  // The parser has found CFI for the machine code at ADDRESS,
925
  // extending for LENGTH bytes. OFFSET is the offset of the frame
926
  // description entry in the section, for use in error messages.
927
  // VERSION is the version number of the CFI format. AUGMENTATION is
928
  // a string describing any producer-specific extensions present in
929
  // the data. RETURN_ADDRESS is the number of the register that holds
930
  // the address to which the function should return.
931
  //
932
  // Entry should return true to process this CFI, or false to skip to
933
  // the next entry.
934
  //
935
  // The parser invokes Entry for each Frame Description Entry (FDE)
936
  // it finds.  The parser doesn't report Common Information Entries
937
  // to the handler explicitly; instead, if the handler elects to
938
  // process a given FDE, the parser reiterates the appropriate CIE's
939
  // contents at the beginning of the FDE's rules.
940
  virtual bool Entry(size_t offset, uint64 address, uint64 length,
941
                     uint8 version, const std::string &augmentation,
942
                     unsigned return_address) = 0;
943
944
  // When the Entry function returns true, the parser calls these
945
  // handler functions repeatedly to describe the rules for recovering
946
  // registers at each instruction in the given range of machine code.
947
  // Immediately after a call to Entry, the handler should assume that
948
  // the rule for each callee-saves register is "unchanged" --- that
949
  // is, that the register still has the value it had in the caller.
950
  //
951
  // If a *Rule function returns true, we continue processing this entry's
952
  // instructions. If a *Rule function returns false, we stop evaluating
953
  // instructions, and skip to the next entry. Either way, we call End
954
  // before going on to the next entry.
955
  //
956
  // In all of these functions, if the REG parameter is kCFARegister, then
957
  // the rule describes how to find the canonical frame address.
958
  // kCFARegister may be passed as a BASE_REGISTER argument, meaning that
959
  // the canonical frame address should be used as the base address for the
960
  // computation. All other REG values will be positive.
961
962
  // At ADDRESS, register REG's value is not recoverable.
963
  virtual bool UndefinedRule(uint64 address, int reg) = 0;
964
965
  // At ADDRESS, register REG's value is the same as that it had in
966
  // the caller.
967
  virtual bool SameValueRule(uint64 address, int reg) = 0;
968
969
  // At ADDRESS, register REG has been saved at offset OFFSET from
970
  // BASE_REGISTER.
971
  virtual bool OffsetRule(uint64 address, int reg,
972
                          int base_register, long offset) = 0;
973
974
  // At ADDRESS, the caller's value of register REG is the current
975
  // value of BASE_REGISTER plus OFFSET. (This rule doesn't provide an
976
  // address at which the register's value is saved.)
977
  virtual bool ValOffsetRule(uint64 address, int reg,
978
                             int base_register, long offset) = 0;
979
980
  // At ADDRESS, register REG has been saved in BASE_REGISTER. This differs
981
  // from ValOffsetRule(ADDRESS, REG, BASE_REGISTER, 0), in that
982
  // BASE_REGISTER is the "home" for REG's saved value: if you want to
983
  // assign to a variable whose home is REG in the calling frame, you
984
  // should put the value in BASE_REGISTER.
985
  virtual bool RegisterRule(uint64 address, int reg, int base_register) = 0;
986
987
  // At ADDRESS, the DWARF expression EXPRESSION yields the address at
988
  // which REG was saved.
989
  virtual bool ExpressionRule(uint64 address, int reg,
990
                              const std::string &expression) = 0;
991
992
  // At ADDRESS, the DWARF expression EXPRESSION yields the caller's
993
  // value for REG. (This rule doesn't provide an address at which the
994
  // register's value is saved.)
995
  virtual bool ValExpressionRule(uint64 address, int reg,
996
                                 const std::string &expression) = 0;
997
998
  // Indicate that the rules for the address range reported by the
999
  // last call to Entry are complete.  End should return true if
1000
  // everything is okay, or false if an error has occurred and parsing
1001
  // should stop.
1002
  virtual bool End() = 0;
1003
1004
  // Handler functions for Linux C++ exception handling data. These are
1005
  // only called if the data includes 'z' augmentation strings.
1006
1007
  // The Linux C++ ABI uses an extension of the DWARF CFI format to
1008
  // walk the stack to propagate exceptions from the throw to the
1009
  // appropriate catch, and do the appropriate cleanups along the way.
1010
  // CFI entries used for exception handling have two additional data
1011
  // associated with them:
1012
  //
1013
  // - The "language-specific data area" describes which exception
1014
  //   types the function has 'catch' clauses for, and indicates how
1015
  //   to go about re-entering the function at the appropriate catch
1016
  //   clause. If the exception is not caught, it describes the
1017
  //   destructors that must run before the frame is popped.
1018
  //
1019
  // - The "personality routine" is responsible for interpreting the
1020
  //   language-specific data area's contents, and deciding whether
1021
  //   the exception should continue to propagate down the stack,
1022
  //   perhaps after doing some cleanup for this frame, or whether the
1023
  //   exception will be caught here.
1024
  //
1025
  // In principle, the language-specific data area is opaque to
1026
  // everybody but the personality routine. In practice, these values
1027
  // may be useful or interesting to readers with extra context, and
1028
  // we have to at least skip them anyway, so we might as well report
1029
  // them to the handler.
1030
1031
  // This entry's exception handling personality routine's address is
1032
  // ADDRESS. If INDIRECT is true, then ADDRESS is the address at
1033
  // which the routine's address is stored. The default definition for
1034
  // this handler function simply returns true, allowing parsing of
1035
  // the entry to continue.
1036
0
  virtual bool PersonalityRoutine(uint64 address, bool indirect) {
1037
0
    return true;
1038
0
  }
1039
1040
  // This entry's language-specific data area (LSDA) is located at
1041
  // ADDRESS. If INDIRECT is true, then ADDRESS is the address at
1042
  // which the area's address is stored. The default definition for
1043
  // this handler function simply returns true, allowing parsing of
1044
  // the entry to continue.
1045
0
  virtual bool LanguageSpecificDataArea(uint64 address, bool indirect) {
1046
0
    return true;
1047
0
  }
1048
1049
  // This entry describes a signal trampoline --- this frame is the
1050
  // caller of a signal handler. The default definition for this
1051
  // handler function simply returns true, allowing parsing of the
1052
  // entry to continue.
1053
  //
1054
  // The best description of the rationale for and meaning of signal
1055
  // trampoline CFI entries seems to be in the GCC bug database:
1056
  // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26208
1057
0
  virtual bool SignalHandler() { return true; }
1058
};
1059
1060
1061
// The CallFrameInfo class makes calls on an instance of this class to
1062
// report errors or warn about problems in the data it is parsing.
1063
// These messages are sent to the message sink |aLog| provided to the
1064
// constructor.
1065
class CallFrameInfo::Reporter {
1066
 public:
1067
  // Create an error reporter which attributes troubles to the section
1068
  // named SECTION in FILENAME.
1069
  //
1070
  // Normally SECTION would be .debug_frame, but the Mac puts CFI data
1071
  // in a Mach-O section named __debug_frame. If we support
1072
  // Linux-style exception handling data, we could be reading an
1073
  // .eh_frame section.
1074
  Reporter(void (*aLog)(const char*),
1075
           const std::string &filename,
1076
           const std::string &section = ".debug_frame")
1077
0
      : log_(aLog), filename_(filename), section_(section) { }
1078
0
  virtual ~Reporter() { }
1079
1080
  // The CFI entry at OFFSET ends too early to be well-formed. KIND
1081
  // indicates what kind of entry it is; KIND can be kUnknown if we
1082
  // haven't parsed enough of the entry to tell yet.
1083
  virtual void Incomplete(uint64 offset, CallFrameInfo::EntryKind kind);
1084
1085
  // The .eh_frame data has a four-byte zero at OFFSET where the next
1086
  // entry's length would be; this is a terminator. However, the buffer
1087
  // length as given to the CallFrameInfo constructor says there should be
1088
  // more data.
1089
  virtual void EarlyEHTerminator(uint64 offset);
1090
1091
  // The FDE at OFFSET refers to the CIE at CIE_OFFSET, but the
1092
  // section is not that large.
1093
  virtual void CIEPointerOutOfRange(uint64 offset, uint64 cie_offset);
1094
1095
  // The FDE at OFFSET refers to the CIE at CIE_OFFSET, but the entry
1096
  // there is not a CIE.
1097
  virtual void BadCIEId(uint64 offset, uint64 cie_offset);
1098
1099
  // The FDE at OFFSET refers to a CIE with version number VERSION,
1100
  // which we don't recognize. We cannot parse DWARF CFI if it uses
1101
  // a version number we don't recognize.
1102
  virtual void UnrecognizedVersion(uint64 offset, int version);
1103
1104
  // The FDE at OFFSET refers to a CIE with augmentation AUGMENTATION,
1105
  // which we don't recognize. We cannot parse DWARF CFI if it uses
1106
  // augmentations we don't recognize.
1107
  virtual void UnrecognizedAugmentation(uint64 offset,
1108
                                        const std::string &augmentation);
1109
1110
  // The FDE at OFFSET contains an invalid or otherwise unusable Dwarf4
1111
  // specific field (currently, only "address_size" or "segment_size").
1112
  // Parsing DWARF CFI with unexpected values here seems dubious at best,
1113
  // so we stop.  WHAT gives a little more information about what is wrong.
1114
  virtual void InvalidDwarf4Artefact(uint64 offset, const char* what);
1115
1116
  // The pointer encoding ENCODING, specified by the CIE at OFFSET, is not
1117
  // a valid encoding.
1118
  virtual void InvalidPointerEncoding(uint64 offset, uint8 encoding);
1119
1120
  // The pointer encoding ENCODING, specified by the CIE at OFFSET, depends
1121
  // on a base address which has not been supplied.
1122
  virtual void UnusablePointerEncoding(uint64 offset, uint8 encoding);
1123
1124
  // The CIE at OFFSET contains a DW_CFA_restore instruction at
1125
  // INSN_OFFSET, which may not appear in a CIE.
1126
  virtual void RestoreInCIE(uint64 offset, uint64 insn_offset);
1127
1128
  // The entry at OFFSET, of kind KIND, has an unrecognized
1129
  // instruction at INSN_OFFSET.
1130
  virtual void BadInstruction(uint64 offset, CallFrameInfo::EntryKind kind,
1131
                              uint64 insn_offset);
1132
1133
  // The instruction at INSN_OFFSET in the entry at OFFSET, of kind
1134
  // KIND, establishes a rule that cites the CFA, but we have not
1135
  // established a CFA rule yet.
1136
  virtual void NoCFARule(uint64 offset, CallFrameInfo::EntryKind kind,
1137
                         uint64 insn_offset);
1138
1139
  // The instruction at INSN_OFFSET in the entry at OFFSET, of kind
1140
  // KIND, is a DW_CFA_restore_state instruction, but the stack of
1141
  // saved states is empty.
1142
  virtual void EmptyStateStack(uint64 offset, CallFrameInfo::EntryKind kind,
1143
                               uint64 insn_offset);
1144
1145
  // The DW_CFA_remember_state instruction at INSN_OFFSET in the entry
1146
  // at OFFSET, of kind KIND, would restore a state that has no CFA
1147
  // rule, whereas the current state does have a CFA rule. This is
1148
  // bogus input, which the CallFrameInfo::Handler interface doesn't
1149
  // (and shouldn't) have any way to report.
1150
  virtual void ClearingCFARule(uint64 offset, CallFrameInfo::EntryKind kind,
1151
                               uint64 insn_offset);
1152
1153
 private:
1154
  // A logging sink function, as supplied by LUL's user.
1155
  void (*log_)(const char*);
1156
1157
 protected:
1158
  // The name of the file whose CFI we're reading.
1159
  std::string filename_;
1160
1161
  // The name of the CFI section in that file.
1162
  std::string section_;
1163
};
1164
1165
1166
using lul::CallFrameInfo;
1167
using lul::Summariser;
1168
1169
// A class that accepts parsed call frame information from the DWARF
1170
// CFI parser and populates a google_breakpad::Module object with the
1171
// contents.
1172
class DwarfCFIToModule: public CallFrameInfo::Handler {
1173
 public:
1174
1175
  // DwarfCFIToModule uses an instance of this class to report errors
1176
  // detected while converting DWARF CFI to Breakpad STACK CFI records.
1177
  class Reporter {
1178
   public:
1179
    // Create a reporter that writes messages to the message sink
1180
    // |aLog|. FILE is the name of the file we're processing, and
1181
    // SECTION is the name of the section within that file that we're
1182
    // looking at (.debug_frame, .eh_frame, etc.).
1183
    Reporter(void (*aLog)(const char*),
1184
             const std::string &file, const std::string &section)
1185
0
      : log_(aLog), file_(file), section_(section) { }
1186
0
    virtual ~Reporter() { }
1187
1188
    // The DWARF CFI entry at OFFSET says that REG is undefined, but the
1189
    // Breakpad symbol file format cannot express this.
1190
    virtual void UndefinedNotSupported(size_t offset,
1191
                                       const UniqueString* reg);
1192
1193
    // The DWARF CFI entry at OFFSET says that REG uses a DWARF
1194
    // expression to find its value, but parseDwarfExpr could not
1195
    // convert it to a sequence of PfxInstrs.
1196
    virtual void ExpressionCouldNotBeSummarised(size_t offset,
1197
                                                const UniqueString* reg);
1198
1199
  private:
1200
    // A logging sink function, as supplied by LUL's user.
1201
    void (*log_)(const char*);
1202
  protected:
1203
    std::string file_, section_;
1204
  };
1205
1206
  // Register name tables. If TABLE is a vector returned by one of these
1207
  // functions, then TABLE[R] is the name of the register numbered R in
1208
  // DWARF call frame information.
1209
  class RegisterNames {
1210
   public:
1211
    // Intel's "x86" or IA-32.
1212
    static unsigned int I386();
1213
1214
    // AMD x86_64, AMD64, Intel EM64T, or Intel 64
1215
    static unsigned int X86_64();
1216
1217
    // ARM.
1218
    static unsigned int ARM();
1219
1220
    // AARCH64.
1221
    static unsigned int ARM64();
1222
1223
    // MIPS.
1224
    static unsigned int MIPS();
1225
  };
1226
1227
  // Create a handler for the dwarf2reader::CallFrameInfo parser that
1228
  // records the stack unwinding information it receives in SUMM.
1229
  //
1230
  // Use REGISTER_NAMES[I] as the name of register number I; *this
1231
  // keeps a reference to the vector, so the vector should remain
1232
  // alive for as long as the DwarfCFIToModule does.
1233
  //
1234
  // Use REPORTER for reporting problems encountered in the conversion
1235
  // process.
1236
  DwarfCFIToModule(const unsigned int num_dw_regs,
1237
                   Reporter *reporter,
1238
                   ByteReader* reader,
1239
                   /*MOD*/UniqueStringUniverse* usu,
1240
                   /*OUT*/Summariser* summ)
1241
      : summ_(summ), usu_(usu), num_dw_regs_(num_dw_regs),
1242
0
        reporter_(reporter), reader_(reader), return_address_(-1) {
1243
0
  }
1244
0
  virtual ~DwarfCFIToModule() {}
1245
1246
  virtual bool Entry(size_t offset, uint64 address, uint64 length,
1247
                     uint8 version, const std::string &augmentation,
1248
                     unsigned return_address) override;
1249
  virtual bool UndefinedRule(uint64 address, int reg) override;
1250
  virtual bool SameValueRule(uint64 address, int reg) override;
1251
  virtual bool OffsetRule(uint64 address, int reg,
1252
                          int base_register, long offset) override;
1253
  virtual bool ValOffsetRule(uint64 address, int reg,
1254
                             int base_register, long offset) override;
1255
  virtual bool RegisterRule(uint64 address, int reg, int base_register) override;
1256
  virtual bool ExpressionRule(uint64 address, int reg,
1257
                              const std::string &expression) override;
1258
  virtual bool ValExpressionRule(uint64 address, int reg,
1259
                                 const std::string &expression) override;
1260
  virtual bool End() override;
1261
1262
 private:
1263
  // Return the name to use for register I.
1264
  const UniqueString* RegisterName(int i);
1265
1266
  // The Summariser to which we should give entries
1267
  Summariser* summ_;
1268
1269
  // Universe for creating UniqueStrings in, should that be necessary.
1270
  UniqueStringUniverse* usu_;
1271
1272
  // The number of Dwarf-defined register names for this architecture.
1273
  const unsigned int num_dw_regs_;
1274
1275
  // The reporter to use to report problems.
1276
  Reporter *reporter_;
1277
1278
  // The ByteReader to use for parsing Dwarf expressions.
1279
  ByteReader* reader_;
1280
1281
  // The section offset of the current frame description entry, for
1282
  // use in error messages.
1283
  size_t entry_offset_;
1284
1285
  // The return address column for that entry.
1286
  unsigned return_address_;
1287
};
1288
1289
1290
// Convert the Dwarf expression in |expr| into PfxInstrs stored in the
1291
// SecMap referred to by |summ|, and return the index of the starting
1292
// PfxInstr added, which must be >= 0.  In case of failure return -1.
1293
int32_t parseDwarfExpr(Summariser* summ, const ByteReader* reader,
1294
                       string expr, bool debug,
1295
                       bool pushCfaAtStart, bool derefAtEnd);
1296
1297
} // namespace lul
1298
1299
#endif // LulDwarfExt_h