LCOV - code coverage report
Current view: top level - tools/profiler/lul - LulDwarfExt.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 113 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 36 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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             : }
     379             : 
     380           0 : inline uint16 ByteReader::ReadTwoBytes(const char* signed_buffer) const {
     381             :   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             :   } else {
     388           0 :     return buffer1 | buffer0 << 8;
     389             :   }
     390             : }
     391             : 
     392           0 : inline uint64 ByteReader::ReadFourBytes(const char* signed_buffer) const {
     393             :   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             :   } else {
     402           0 :     return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24;
     403             :   }
     404             : }
     405             : 
     406           0 : inline uint64 ByteReader::ReadEightBytes(const char* signed_buffer) const {
     407             :   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             :   } else {
     421           0 :     return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 |
     422           0 :       buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56;
     423             :   }
     424             : }
     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           0 : inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer,
     431             :                                              size_t* len) const {
     432           0 :   uint64 result = 0;
     433           0 :   size_t num_read = 0;
     434           0 :   unsigned int shift = 0;
     435             :   unsigned char byte;
     436             : 
     437           0 :   do {
     438           0 :     byte = *buffer++;
     439           0 :     num_read++;
     440             : 
     441           0 :     result |= (static_cast<uint64>(byte & 0x7f)) << shift;
     442             : 
     443           0 :     shift += 7;
     444             : 
     445           0 :   } while (byte & 0x80);
     446             : 
     447           0 :   *len = num_read;
     448             : 
     449           0 :   return result;
     450             : }
     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           0 : inline int64 ByteReader::ReadSignedLEB128(const char* buffer,
     456             :                                           size_t* len) const {
     457           0 :   int64 result = 0;
     458           0 :   unsigned int shift = 0;
     459           0 :   size_t num_read = 0;
     460             :   unsigned char byte;
     461             : 
     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             : 
     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             : }
     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             : }
     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             : }
     484             : 
     485           0 : inline void ByteReader::SetCFIDataBase(uint64 section_base,
     486             :                                        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           0 :   CallFrameInfo(const char *buffer, size_t buffer_length,
     745             :                 ByteReader *reader, Handler *handler, Reporter *reporter,
     746             :                 bool eh_frame = false)
     747           0 :       : 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           0 :   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           0 :   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             :   }
     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             :   }
    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             :   }
    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           0 :   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 pointer encoding ENCODING, specified by the CIE at OFFSET, is not
    1111             :   // a valid encoding.
    1112             :   virtual void InvalidPointerEncoding(uint64 offset, uint8 encoding);
    1113             : 
    1114             :   // The pointer encoding ENCODING, specified by the CIE at OFFSET, depends
    1115             :   // on a base address which has not been supplied.
    1116             :   virtual void UnusablePointerEncoding(uint64 offset, uint8 encoding);
    1117             : 
    1118             :   // The CIE at OFFSET contains a DW_CFA_restore instruction at
    1119             :   // INSN_OFFSET, which may not appear in a CIE.
    1120             :   virtual void RestoreInCIE(uint64 offset, uint64 insn_offset);
    1121             : 
    1122             :   // The entry at OFFSET, of kind KIND, has an unrecognized
    1123             :   // instruction at INSN_OFFSET.
    1124             :   virtual void BadInstruction(uint64 offset, CallFrameInfo::EntryKind kind,
    1125             :                               uint64 insn_offset);
    1126             : 
    1127             :   // The instruction at INSN_OFFSET in the entry at OFFSET, of kind
    1128             :   // KIND, establishes a rule that cites the CFA, but we have not
    1129             :   // established a CFA rule yet.
    1130             :   virtual void NoCFARule(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, is a DW_CFA_restore_state instruction, but the stack of
    1135             :   // saved states is empty.
    1136             :   virtual void EmptyStateStack(uint64 offset, CallFrameInfo::EntryKind kind,
    1137             :                                uint64 insn_offset);
    1138             : 
    1139             :   // The DW_CFA_remember_state instruction at INSN_OFFSET in the entry
    1140             :   // at OFFSET, of kind KIND, would restore a state that has no CFA
    1141             :   // rule, whereas the current state does have a CFA rule. This is
    1142             :   // bogus input, which the CallFrameInfo::Handler interface doesn't
    1143             :   // (and shouldn't) have any way to report.
    1144             :   virtual void ClearingCFARule(uint64 offset, CallFrameInfo::EntryKind kind,
    1145             :                                uint64 insn_offset);
    1146             : 
    1147             :  private:
    1148             :   // A logging sink function, as supplied by LUL's user.
    1149             :   void (*log_)(const char*);
    1150             : 
    1151             :  protected:
    1152             :   // The name of the file whose CFI we're reading.
    1153             :   std::string filename_;
    1154             : 
    1155             :   // The name of the CFI section in that file.
    1156             :   std::string section_;
    1157             : };
    1158             : 
    1159             : 
    1160             : using lul::CallFrameInfo;
    1161             : using lul::Summariser;
    1162             : 
    1163             : // A class that accepts parsed call frame information from the DWARF
    1164             : // CFI parser and populates a google_breakpad::Module object with the
    1165             : // contents.
    1166             : class DwarfCFIToModule: public CallFrameInfo::Handler {
    1167             :  public:
    1168             : 
    1169             :   // DwarfCFIToModule uses an instance of this class to report errors
    1170             :   // detected while converting DWARF CFI to Breakpad STACK CFI records.
    1171             :   class Reporter {
    1172             :    public:
    1173             :     // Create a reporter that writes messages to the message sink
    1174             :     // |aLog|. FILE is the name of the file we're processing, and
    1175             :     // SECTION is the name of the section within that file that we're
    1176             :     // looking at (.debug_frame, .eh_frame, etc.).
    1177           0 :     Reporter(void (*aLog)(const char*),
    1178             :              const std::string &file, const std::string &section)
    1179           0 :       : log_(aLog), file_(file), section_(section) { }
    1180           0 :     virtual ~Reporter() { }
    1181             : 
    1182             :     // The DWARF CFI entry at OFFSET says that REG is undefined, but the
    1183             :     // Breakpad symbol file format cannot express this.
    1184             :     virtual void UndefinedNotSupported(size_t offset,
    1185             :                                        const UniqueString* reg);
    1186             : 
    1187             :     // The DWARF CFI entry at OFFSET says that REG uses a DWARF
    1188             :     // expression to find its value, but parseDwarfExpr could not
    1189             :     // convert it to a sequence of PfxInstrs.
    1190             :     virtual void ExpressionCouldNotBeSummarised(size_t offset,
    1191             :                                                 const UniqueString* reg);
    1192             : 
    1193             :   private:
    1194             :     // A logging sink function, as supplied by LUL's user.
    1195             :     void (*log_)(const char*);
    1196             :   protected:
    1197             :     std::string file_, section_;
    1198             :   };
    1199             : 
    1200             :   // Register name tables. If TABLE is a vector returned by one of these
    1201             :   // functions, then TABLE[R] is the name of the register numbered R in
    1202             :   // DWARF call frame information.
    1203             :   class RegisterNames {
    1204             :    public:
    1205             :     // Intel's "x86" or IA-32.
    1206             :     static unsigned int I386();
    1207             : 
    1208             :     // AMD x86_64, AMD64, Intel EM64T, or Intel 64
    1209             :     static unsigned int X86_64();
    1210             : 
    1211             :     // ARM.
    1212             :     static unsigned int ARM();
    1213             :   };
    1214             : 
    1215             :   // Create a handler for the dwarf2reader::CallFrameInfo parser that
    1216             :   // records the stack unwinding information it receives in SUMM.
    1217             :   //
    1218             :   // Use REGISTER_NAMES[I] as the name of register number I; *this
    1219             :   // keeps a reference to the vector, so the vector should remain
    1220             :   // alive for as long as the DwarfCFIToModule does.
    1221             :   //
    1222             :   // Use REPORTER for reporting problems encountered in the conversion
    1223             :   // process.
    1224           0 :   DwarfCFIToModule(const unsigned int num_dw_regs,
    1225             :                    Reporter *reporter,
    1226             :                    ByteReader* reader,
    1227             :                    /*MOD*/UniqueStringUniverse* usu,
    1228             :                    /*OUT*/Summariser* summ)
    1229           0 :       : summ_(summ), usu_(usu), num_dw_regs_(num_dw_regs),
    1230           0 :         reporter_(reporter), reader_(reader), return_address_(-1) {
    1231           0 :   }
    1232           0 :   virtual ~DwarfCFIToModule() {}
    1233             : 
    1234             :   virtual bool Entry(size_t offset, uint64 address, uint64 length,
    1235             :                      uint8 version, const std::string &augmentation,
    1236             :                      unsigned return_address);
    1237             :   virtual bool UndefinedRule(uint64 address, int reg);
    1238             :   virtual bool SameValueRule(uint64 address, int reg);
    1239             :   virtual bool OffsetRule(uint64 address, int reg,
    1240             :                           int base_register, long offset);
    1241             :   virtual bool ValOffsetRule(uint64 address, int reg,
    1242             :                              int base_register, long offset);
    1243             :   virtual bool RegisterRule(uint64 address, int reg, int base_register);
    1244             :   virtual bool ExpressionRule(uint64 address, int reg,
    1245             :                               const std::string &expression);
    1246             :   virtual bool ValExpressionRule(uint64 address, int reg,
    1247             :                                  const std::string &expression);
    1248             :   virtual bool End();
    1249             : 
    1250             :  private:
    1251             :   // Return the name to use for register I.
    1252             :   const UniqueString* RegisterName(int i);
    1253             : 
    1254             :   // The Summariser to which we should give entries
    1255             :   Summariser* summ_;
    1256             : 
    1257             :   // Universe for creating UniqueStrings in, should that be necessary.
    1258             :   UniqueStringUniverse* usu_;
    1259             : 
    1260             :   // The number of Dwarf-defined register names for this architecture.
    1261             :   const unsigned int num_dw_regs_;
    1262             : 
    1263             :   // The reporter to use to report problems.
    1264             :   Reporter *reporter_;
    1265             : 
    1266             :   // The ByteReader to use for parsing Dwarf expressions.
    1267             :   ByteReader* reader_;
    1268             : 
    1269             :   // The section offset of the current frame description entry, for
    1270             :   // use in error messages.
    1271             :   size_t entry_offset_;
    1272             : 
    1273             :   // The return address column for that entry.
    1274             :   unsigned return_address_;
    1275             : };
    1276             : 
    1277             : 
    1278             : // Convert the Dwarf expression in |expr| into PfxInstrs stored in the
    1279             : // SecMap referred to by |summ|, and return the index of the starting
    1280             : // PfxInstr added, which must be >= 0.  In case of failure return -1.
    1281             : int32_t parseDwarfExpr(Summariser* summ, const ByteReader* reader,
    1282             :                        string expr, bool debug,
    1283             :                        bool pushCfaAtStart, bool derefAtEnd);
    1284             : 
    1285             : } // namespace lul
    1286             : 
    1287             : #endif // LulDwarfExt_h

Generated by: LCOV version 1.13