Home | History | Annotate | Download | only in dwarf
      1 // Copyright (c) 2010, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 
     30 // Original author: Jim Blandy <jimb (at) mozilla.com> <jimb (at) red-bean.com>
     31 
     32 // bytereader_unittest.cc: Unit tests for dwarf2reader::ByteReader
     33 
     34 #include <string>
     35 
     36 #include "breakpad_googletest_includes.h"
     37 #include "common/dwarf/bytereader.h"
     38 #include "common/dwarf/bytereader-inl.h"
     39 #include "common/dwarf/cfi_assembler.h"
     40 #include "common/using_std_string.h"
     41 
     42 using dwarf2reader::ByteReader;
     43 using dwarf2reader::DwarfPointerEncoding;
     44 using dwarf2reader::ENDIANNESS_BIG;
     45 using dwarf2reader::ENDIANNESS_LITTLE;
     46 using google_breakpad::CFISection;
     47 using google_breakpad::test_assembler::Label;
     48 using google_breakpad::test_assembler::kBigEndian;
     49 using google_breakpad::test_assembler::kLittleEndian;
     50 using google_breakpad::test_assembler::Section;
     51 using testing::Test;
     52 
     53 struct ReaderFixture {
     54   string contents;
     55   size_t pointer_size;
     56 };
     57 
     58 class Reader: public ReaderFixture, public Test { };
     59 class ReaderDeathTest: public ReaderFixture, public Test { };
     60 
     61 TEST_F(Reader, SimpleConstructor) {
     62   ByteReader reader(ENDIANNESS_BIG);
     63   reader.SetAddressSize(4);
     64   CFISection section(kBigEndian, 4);
     65   section
     66     .D8(0xc0)
     67     .D16(0xcf0d)
     68     .D32(0x96fdd219)
     69     .D64(0xbbf55fef0825f117ULL)
     70     .ULEB128(0xa0927048ba8121afULL)
     71     .LEB128(-0x4f337badf4483f83LL)
     72     .D32(0xfec319c9);
     73   ASSERT_TRUE(section.GetContents(&contents));
     74   const char *data = contents.data();
     75   EXPECT_EQ(0xc0U, reader.ReadOneByte(data));
     76   EXPECT_EQ(0xcf0dU, reader.ReadTwoBytes(data + 1));
     77   EXPECT_EQ(0x96fdd219U, reader.ReadFourBytes(data + 3));
     78   EXPECT_EQ(0xbbf55fef0825f117ULL, reader.ReadEightBytes(data + 7));
     79   size_t leb128_size;
     80   EXPECT_EQ(0xa0927048ba8121afULL,
     81             reader.ReadUnsignedLEB128(data + 15, &leb128_size));
     82   EXPECT_EQ(10U, leb128_size);
     83   EXPECT_EQ(-0x4f337badf4483f83LL,
     84             reader.ReadSignedLEB128(data + 25, &leb128_size));
     85   EXPECT_EQ(10U, leb128_size);
     86   EXPECT_EQ(0xfec319c9, reader.ReadAddress(data + 35));
     87 }
     88 
     89 TEST_F(Reader, ValidEncodings) {
     90   ByteReader reader(ENDIANNESS_LITTLE);
     91   EXPECT_TRUE(reader.ValidEncoding(
     92       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr)));
     93   EXPECT_TRUE(reader.ValidEncoding(
     94       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_omit)));
     95   EXPECT_TRUE(reader.ValidEncoding(
     96       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_aligned)));
     97   EXPECT_TRUE(reader.ValidEncoding(
     98       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128)));
     99   EXPECT_TRUE(reader.ValidEncoding(
    100       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2)));
    101   EXPECT_TRUE(reader.ValidEncoding(
    102       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4)));
    103   EXPECT_TRUE(reader.ValidEncoding(
    104       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8)));
    105   EXPECT_TRUE(reader.ValidEncoding(
    106       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128)));
    107   EXPECT_TRUE(reader.ValidEncoding(
    108       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2)));
    109   EXPECT_TRUE(reader.ValidEncoding(
    110       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4)));
    111   EXPECT_TRUE(reader.ValidEncoding(
    112       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8)));
    113   EXPECT_TRUE(reader.ValidEncoding(
    114       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |
    115                            dwarf2reader::DW_EH_PE_pcrel)));
    116   EXPECT_TRUE(reader.ValidEncoding(
    117       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |
    118                            dwarf2reader::DW_EH_PE_pcrel)));
    119   EXPECT_TRUE(reader.ValidEncoding(
    120       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |
    121                            dwarf2reader::DW_EH_PE_pcrel)));
    122   EXPECT_TRUE(reader.ValidEncoding(
    123       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |
    124                            dwarf2reader::DW_EH_PE_pcrel)));
    125   EXPECT_TRUE(reader.ValidEncoding(
    126       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |
    127                            dwarf2reader::DW_EH_PE_pcrel)));
    128   EXPECT_TRUE(reader.ValidEncoding(
    129       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |
    130                            dwarf2reader::DW_EH_PE_pcrel)));
    131   EXPECT_TRUE(reader.ValidEncoding(
    132       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |
    133                            dwarf2reader::DW_EH_PE_pcrel)));
    134   EXPECT_TRUE(reader.ValidEncoding(
    135       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |
    136                            dwarf2reader::DW_EH_PE_pcrel)));
    137   EXPECT_TRUE(reader.ValidEncoding(
    138       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |
    139                            dwarf2reader::DW_EH_PE_pcrel)));
    140   EXPECT_TRUE(reader.ValidEncoding(
    141       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |
    142                            dwarf2reader::DW_EH_PE_textrel)));
    143   EXPECT_TRUE(reader.ValidEncoding(
    144       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |
    145                            dwarf2reader::DW_EH_PE_textrel)));
    146   EXPECT_TRUE(reader.ValidEncoding(
    147       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |
    148                            dwarf2reader::DW_EH_PE_textrel)));
    149   EXPECT_TRUE(reader.ValidEncoding(
    150       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |
    151                            dwarf2reader::DW_EH_PE_textrel)));
    152   EXPECT_TRUE(reader.ValidEncoding(
    153       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |
    154                            dwarf2reader::DW_EH_PE_textrel)));
    155   EXPECT_TRUE(reader.ValidEncoding(
    156       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |
    157                            dwarf2reader::DW_EH_PE_textrel)));
    158   EXPECT_TRUE(reader.ValidEncoding(
    159       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |
    160                            dwarf2reader::DW_EH_PE_textrel)));
    161   EXPECT_TRUE(reader.ValidEncoding(
    162       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |
    163                            dwarf2reader::DW_EH_PE_textrel)));
    164   EXPECT_TRUE(reader.ValidEncoding(
    165       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |
    166                            dwarf2reader::DW_EH_PE_textrel)));
    167   EXPECT_TRUE(reader.ValidEncoding(
    168       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |
    169                            dwarf2reader::DW_EH_PE_datarel)));
    170   EXPECT_TRUE(reader.ValidEncoding(
    171       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |
    172                            dwarf2reader::DW_EH_PE_datarel)));
    173   EXPECT_TRUE(reader.ValidEncoding(
    174       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |
    175                            dwarf2reader::DW_EH_PE_datarel)));
    176   EXPECT_TRUE(reader.ValidEncoding(
    177       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |
    178                            dwarf2reader::DW_EH_PE_datarel)));
    179   EXPECT_TRUE(reader.ValidEncoding(
    180       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |
    181                            dwarf2reader::DW_EH_PE_datarel)));
    182   EXPECT_TRUE(reader.ValidEncoding(
    183       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |
    184                            dwarf2reader::DW_EH_PE_datarel)));
    185   EXPECT_TRUE(reader.ValidEncoding(
    186       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |
    187                            dwarf2reader::DW_EH_PE_datarel)));
    188   EXPECT_TRUE(reader.ValidEncoding(
    189       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |
    190                            dwarf2reader::DW_EH_PE_datarel)));
    191   EXPECT_TRUE(reader.ValidEncoding(
    192       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |
    193                            dwarf2reader::DW_EH_PE_datarel)));
    194   EXPECT_TRUE(reader.ValidEncoding(
    195       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |
    196                            dwarf2reader::DW_EH_PE_funcrel)));
    197   EXPECT_TRUE(reader.ValidEncoding(
    198       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |
    199                            dwarf2reader::DW_EH_PE_funcrel)));
    200   EXPECT_TRUE(reader.ValidEncoding(
    201       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |
    202                            dwarf2reader::DW_EH_PE_funcrel)));
    203   EXPECT_TRUE(reader.ValidEncoding(
    204       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |
    205                            dwarf2reader::DW_EH_PE_funcrel)));
    206   EXPECT_TRUE(reader.ValidEncoding(
    207       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |
    208                            dwarf2reader::DW_EH_PE_funcrel)));
    209   EXPECT_TRUE(reader.ValidEncoding(
    210       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |
    211                            dwarf2reader::DW_EH_PE_funcrel)));
    212   EXPECT_TRUE(reader.ValidEncoding(
    213       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |
    214                            dwarf2reader::DW_EH_PE_funcrel)));
    215   EXPECT_TRUE(reader.ValidEncoding(
    216       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |
    217                            dwarf2reader::DW_EH_PE_funcrel)));
    218   EXPECT_TRUE(reader.ValidEncoding(
    219       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |
    220                            dwarf2reader::DW_EH_PE_funcrel)));
    221   EXPECT_TRUE(reader.ValidEncoding(
    222       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    223                            dwarf2reader::DW_EH_PE_absptr |
    224                            dwarf2reader::DW_EH_PE_pcrel)));
    225   EXPECT_TRUE(reader.ValidEncoding(
    226       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    227                            dwarf2reader::DW_EH_PE_uleb128 |
    228                            dwarf2reader::DW_EH_PE_pcrel)));
    229   EXPECT_TRUE(reader.ValidEncoding(
    230       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    231                            dwarf2reader::DW_EH_PE_udata2 |
    232                            dwarf2reader::DW_EH_PE_pcrel)));
    233   EXPECT_TRUE(reader.ValidEncoding(
    234       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    235                            dwarf2reader::DW_EH_PE_udata4 |
    236                            dwarf2reader::DW_EH_PE_pcrel)));
    237   EXPECT_TRUE(reader.ValidEncoding(
    238       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    239                            dwarf2reader::DW_EH_PE_udata8 |
    240                            dwarf2reader::DW_EH_PE_pcrel)));
    241   EXPECT_TRUE(reader.ValidEncoding(
    242       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    243                            dwarf2reader::DW_EH_PE_sleb128 |
    244                            dwarf2reader::DW_EH_PE_pcrel)));
    245   EXPECT_TRUE(reader.ValidEncoding(
    246       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    247                            dwarf2reader::DW_EH_PE_sdata2 |
    248                            dwarf2reader::DW_EH_PE_pcrel)));
    249   EXPECT_TRUE(reader.ValidEncoding(
    250       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    251                            dwarf2reader::DW_EH_PE_sdata4 |
    252                            dwarf2reader::DW_EH_PE_pcrel)));
    253   EXPECT_TRUE(reader.ValidEncoding(
    254       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    255                            dwarf2reader::DW_EH_PE_sdata8 |
    256                            dwarf2reader::DW_EH_PE_pcrel)));
    257   EXPECT_TRUE(reader.ValidEncoding(
    258       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    259                            dwarf2reader::DW_EH_PE_absptr |
    260                            dwarf2reader::DW_EH_PE_textrel)));
    261   EXPECT_TRUE(reader.ValidEncoding(
    262       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    263                            dwarf2reader::DW_EH_PE_uleb128 |
    264                            dwarf2reader::DW_EH_PE_textrel)));
    265   EXPECT_TRUE(reader.ValidEncoding(
    266       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    267                            dwarf2reader::DW_EH_PE_udata2 |
    268                            dwarf2reader::DW_EH_PE_textrel)));
    269   EXPECT_TRUE(reader.ValidEncoding(
    270       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    271                            dwarf2reader::DW_EH_PE_udata4 |
    272                            dwarf2reader::DW_EH_PE_textrel)));
    273   EXPECT_TRUE(reader.ValidEncoding(
    274       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    275                            dwarf2reader::DW_EH_PE_udata8 |
    276                            dwarf2reader::DW_EH_PE_textrel)));
    277   EXPECT_TRUE(reader.ValidEncoding(
    278       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    279                            dwarf2reader::DW_EH_PE_sleb128 |
    280                            dwarf2reader::DW_EH_PE_textrel)));
    281   EXPECT_TRUE(reader.ValidEncoding(
    282       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    283                            dwarf2reader::DW_EH_PE_sdata2 |
    284                            dwarf2reader::DW_EH_PE_textrel)));
    285   EXPECT_TRUE(reader.ValidEncoding(
    286       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    287                            dwarf2reader::DW_EH_PE_sdata4 |
    288                            dwarf2reader::DW_EH_PE_textrel)));
    289   EXPECT_TRUE(reader.ValidEncoding(
    290       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    291                            dwarf2reader::DW_EH_PE_sdata8 |
    292                            dwarf2reader::DW_EH_PE_textrel)));
    293   EXPECT_TRUE(reader.ValidEncoding(
    294       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    295                            dwarf2reader::DW_EH_PE_absptr |
    296                            dwarf2reader::DW_EH_PE_datarel)));
    297   EXPECT_TRUE(reader.ValidEncoding(
    298       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    299                            dwarf2reader::DW_EH_PE_uleb128 |
    300                            dwarf2reader::DW_EH_PE_datarel)));
    301   EXPECT_TRUE(reader.ValidEncoding(
    302       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    303                            dwarf2reader::DW_EH_PE_udata2 |
    304                            dwarf2reader::DW_EH_PE_datarel)));
    305   EXPECT_TRUE(reader.ValidEncoding(
    306       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    307                            dwarf2reader::DW_EH_PE_udata4 |
    308                            dwarf2reader::DW_EH_PE_datarel)));
    309   EXPECT_TRUE(reader.ValidEncoding(
    310       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    311                            dwarf2reader::DW_EH_PE_udata8 |
    312                            dwarf2reader::DW_EH_PE_datarel)));
    313   EXPECT_TRUE(reader.ValidEncoding(
    314       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    315                            dwarf2reader::DW_EH_PE_sleb128 |
    316                            dwarf2reader::DW_EH_PE_datarel)));
    317   EXPECT_TRUE(reader.ValidEncoding(
    318       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    319                            dwarf2reader::DW_EH_PE_sdata2 |
    320                            dwarf2reader::DW_EH_PE_datarel)));
    321   EXPECT_TRUE(reader.ValidEncoding(
    322       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    323                            dwarf2reader::DW_EH_PE_sdata4 |
    324                            dwarf2reader::DW_EH_PE_datarel)));
    325   EXPECT_TRUE(reader.ValidEncoding(
    326       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    327                            dwarf2reader::DW_EH_PE_sdata8 |
    328                            dwarf2reader::DW_EH_PE_datarel)));
    329   EXPECT_TRUE(reader.ValidEncoding(
    330       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    331                            dwarf2reader::DW_EH_PE_absptr |
    332                            dwarf2reader::DW_EH_PE_funcrel)));
    333   EXPECT_TRUE(reader.ValidEncoding(
    334       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    335                            dwarf2reader::DW_EH_PE_uleb128 |
    336                            dwarf2reader::DW_EH_PE_funcrel)));
    337   EXPECT_TRUE(reader.ValidEncoding(
    338       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    339                            dwarf2reader::DW_EH_PE_udata2 |
    340                            dwarf2reader::DW_EH_PE_funcrel)));
    341   EXPECT_TRUE(reader.ValidEncoding(
    342       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    343                            dwarf2reader::DW_EH_PE_udata4 |
    344                            dwarf2reader::DW_EH_PE_funcrel)));
    345   EXPECT_TRUE(reader.ValidEncoding(
    346       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    347                            dwarf2reader::DW_EH_PE_udata8 |
    348                            dwarf2reader::DW_EH_PE_funcrel)));
    349   EXPECT_TRUE(reader.ValidEncoding(
    350       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    351                            dwarf2reader::DW_EH_PE_sleb128 |
    352                            dwarf2reader::DW_EH_PE_funcrel)));
    353   EXPECT_TRUE(reader.ValidEncoding(
    354       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    355                            dwarf2reader::DW_EH_PE_sdata2 |
    356                            dwarf2reader::DW_EH_PE_funcrel)));
    357   EXPECT_TRUE(reader.ValidEncoding(
    358       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    359                            dwarf2reader::DW_EH_PE_sdata4 |
    360                            dwarf2reader::DW_EH_PE_funcrel)));
    361   EXPECT_TRUE(reader.ValidEncoding(
    362       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
    363                            dwarf2reader::DW_EH_PE_sdata8 |
    364                            dwarf2reader::DW_EH_PE_funcrel)));
    365 
    366   EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x05)));
    367   EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x07)));
    368   EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0d)));
    369   EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0f)));
    370   EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x51)));
    371   EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x60)));
    372   EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x70)));
    373   EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xf0)));
    374   EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xd0)));
    375 }
    376 
    377 TEST_F(ReaderDeathTest, DW_EH_PE_omit) {
    378   static const char data[1] = { 42 };
    379   ByteReader reader(ENDIANNESS_BIG);
    380   reader.SetAddressSize(4);
    381   EXPECT_DEATH(reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_omit,
    382                                          &pointer_size),
    383                "encoding != DW_EH_PE_omit");
    384 }
    385 
    386 TEST_F(Reader, DW_EH_PE_absptr4) {
    387   static const char data[] = { 0x27, 0x57, 0xea, 0x40 };
    388   ByteReader reader(ENDIANNESS_LITTLE);
    389   reader.SetAddressSize(4);
    390   EXPECT_EQ(0x40ea5727U,
    391             reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_absptr,
    392                                       &pointer_size));
    393   EXPECT_EQ(4U, pointer_size);
    394 }
    395 
    396 TEST_F(Reader, DW_EH_PE_absptr8) {
    397   static const char data[] = {
    398     0x60, 0x27, 0x57, 0xea, 0x40, 0xc2, 0x98, 0x05, 0x01, 0x50
    399   };
    400   ByteReader reader(ENDIANNESS_LITTLE);
    401   reader.SetAddressSize(8);
    402   EXPECT_EQ(0x010598c240ea5727ULL,
    403             reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_absptr,
    404                                       &pointer_size));
    405   EXPECT_EQ(8U, pointer_size);
    406 }
    407 
    408 TEST_F(Reader, DW_EH_PE_uleb128) {
    409   static const char data[] = { 0x81, 0x84, 0x4c };
    410   ByteReader reader(ENDIANNESS_LITTLE);
    411   reader.SetAddressSize(4);
    412   EXPECT_EQ(0x130201U,
    413             reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_uleb128,
    414                                       &pointer_size));
    415   EXPECT_EQ(3U, pointer_size);
    416 }
    417 
    418 TEST_F(Reader, DW_EH_PE_udata2) {
    419   static const char data[] = { 0xf4, 0x8d };
    420   ByteReader reader(ENDIANNESS_BIG);
    421   reader.SetAddressSize(4);
    422   EXPECT_EQ(0xf48dU,
    423             reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_udata2,
    424                                       &pointer_size));
    425   EXPECT_EQ(2U, pointer_size);
    426 }
    427 
    428 TEST_F(Reader, DW_EH_PE_udata4) {
    429   static const char data[] = { 0xb2, 0x68, 0xa5, 0x62, 0x8f, 0x8b };
    430   ByteReader reader(ENDIANNESS_BIG);
    431   reader.SetAddressSize(8);
    432   EXPECT_EQ(0xa5628f8b,
    433             reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_udata4,
    434                                       &pointer_size));
    435   EXPECT_EQ(4U, pointer_size);
    436 }
    437 
    438 TEST_F(Reader, DW_EH_PE_udata8Addr8) {
    439   static const char data[] = {
    440     0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe
    441   };
    442   ByteReader reader(ENDIANNESS_LITTLE);
    443   reader.SetAddressSize(8);
    444   EXPECT_EQ(0x8fed199f69047304ULL,
    445             reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8,
    446                                         &pointer_size));
    447   EXPECT_EQ(8U, pointer_size);
    448 }
    449 
    450 TEST_F(Reader, DW_EH_PE_udata8Addr4) {
    451   static const char data[] = {
    452     0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe
    453   };
    454   ByteReader reader(ENDIANNESS_LITTLE);
    455   reader.SetAddressSize(4);
    456   EXPECT_EQ(0x69047304ULL,
    457             reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8,
    458                                         &pointer_size));
    459   EXPECT_EQ(8U, pointer_size);
    460 }
    461 
    462 TEST_F(Reader, DW_EH_PE_sleb128) {
    463   static const char data[] = { 0x42, 0xff, 0xfb, 0x73 };
    464   ByteReader reader(ENDIANNESS_BIG);
    465   reader.SetAddressSize(4);
    466   EXPECT_EQ(-0x030201U & 0xffffffff,
    467             reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sleb128,
    468                                         &pointer_size));
    469   EXPECT_EQ(3U, pointer_size);
    470 }
    471 
    472 TEST_F(Reader, DW_EH_PE_sdata2) {
    473   static const char data[] = { 0xb9, 0xbf };
    474   ByteReader reader(ENDIANNESS_LITTLE);
    475   reader.SetAddressSize(8);
    476   EXPECT_EQ(0xffffffffffffbfb9ULL,
    477             reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_sdata2,
    478                                         &pointer_size));
    479   EXPECT_EQ(2U, pointer_size);
    480 }
    481 
    482 TEST_F(Reader, DW_EH_PE_sdata4) {
    483   static const char data[] = { 0xa0, 0xca, 0xf2, 0xb8, 0xc2, 0xad };
    484   ByteReader reader(ENDIANNESS_LITTLE);
    485   reader.SetAddressSize(8);
    486   EXPECT_EQ(0xffffffffadc2b8f2ULL,
    487             reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_sdata4,
    488                                         &pointer_size));
    489   EXPECT_EQ(4U, pointer_size);
    490 }
    491 
    492 TEST_F(Reader, DW_EH_PE_sdata8) {
    493   static const char data[] = {
    494     0xf6, 0x66, 0x57, 0x79, 0xe0, 0x0c, 0x9b, 0x26, 0x87
    495   };
    496   ByteReader reader(ENDIANNESS_LITTLE);
    497   reader.SetAddressSize(8);
    498   EXPECT_EQ(0x87269b0ce0795766ULL,
    499             reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sdata8,
    500                                         &pointer_size));
    501   EXPECT_EQ(8U, pointer_size);
    502 }
    503 
    504 TEST_F(Reader, DW_EH_PE_pcrel) {
    505   static const char data[] = { 0x4a, 0x8b, 0x1b, 0x14, 0xc8, 0xc4, 0x02, 0xce };
    506   ByteReader reader(ENDIANNESS_BIG);
    507   reader.SetAddressSize(4);
    508   DwarfPointerEncoding encoding =
    509       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_pcrel
    510                            | dwarf2reader::DW_EH_PE_absptr);
    511   reader.SetCFIDataBase(0x89951377, data);
    512   EXPECT_EQ(0x89951377 + 3 + 0x14c8c402,
    513             reader.ReadEncodedPointer(data + 3, encoding, &pointer_size));
    514   EXPECT_EQ(4U, pointer_size);
    515 }
    516 
    517 TEST_F(Reader, DW_EH_PE_textrel) {
    518   static const char data[] = { 0xd9, 0x0d, 0x05, 0x17, 0xc9, 0x7a, 0x42, 0x1e };
    519   ByteReader reader(ENDIANNESS_LITTLE);
    520   reader.SetAddressSize(4);
    521   reader.SetTextBase(0xb91beaf0);
    522   DwarfPointerEncoding encoding =
    523       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_textrel
    524                            | dwarf2reader::DW_EH_PE_sdata2);
    525   EXPECT_EQ((0xb91beaf0 + 0xffffc917) & 0xffffffff,
    526             reader.ReadEncodedPointer(data + 3, encoding, &pointer_size));
    527   EXPECT_EQ(2U, pointer_size);
    528 }
    529 
    530 TEST_F(Reader, DW_EH_PE_datarel) {
    531   static const char data[] = { 0x16, 0xf2, 0xbb, 0x82, 0x68, 0xa7, 0xbc, 0x39 };
    532   ByteReader reader(ENDIANNESS_BIG);
    533   reader.SetAddressSize(8);
    534   reader.SetDataBase(0xbef308bd25ce74f0ULL);
    535   DwarfPointerEncoding encoding =
    536       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_datarel
    537                            | dwarf2reader::DW_EH_PE_sleb128);
    538   EXPECT_EQ(0xbef308bd25ce74f0ULL + 0xfffffffffffa013bULL,
    539             reader.ReadEncodedPointer(data + 2, encoding, &pointer_size));
    540   EXPECT_EQ(3U, pointer_size);
    541 }
    542 
    543 TEST_F(Reader, DW_EH_PE_funcrel) {
    544   static const char data[] = { 0x84, 0xf8, 0x14, 0x01, 0x61, 0xd1, 0x48, 0xc9 };
    545   ByteReader reader(ENDIANNESS_BIG);
    546   reader.SetAddressSize(4);
    547   reader.SetFunctionBase(0x823c3520);
    548   DwarfPointerEncoding encoding =
    549       DwarfPointerEncoding(dwarf2reader::DW_EH_PE_funcrel
    550                            | dwarf2reader::DW_EH_PE_udata2);
    551   EXPECT_EQ(0x823c3520 + 0xd148,
    552             reader.ReadEncodedPointer(data + 5, encoding, &pointer_size));
    553   EXPECT_EQ(2U, pointer_size);
    554 }
    555 
    556 TEST(UsableBase, CFI) {
    557   static const char data[1] = { 0x42 };
    558   ByteReader reader(ENDIANNESS_BIG);
    559   reader.SetCFIDataBase(0xb31cbd20, data);
    560   EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
    561   EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
    562   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
    563   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
    564   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
    565   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
    566   EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
    567 }
    568 
    569 TEST(UsableBase, Text) {
    570   ByteReader reader(ENDIANNESS_BIG);
    571   reader.SetTextBase(0xa899ccb9);
    572   EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
    573   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
    574   EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
    575   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
    576   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
    577   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
    578   EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
    579 }
    580 
    581 TEST(UsableBase, Data) {
    582   ByteReader reader(ENDIANNESS_BIG);
    583   reader.SetDataBase(0xf7b10bcd);
    584   EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
    585   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
    586   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
    587   EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
    588   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
    589   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
    590   EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
    591 }
    592 
    593 TEST(UsableBase, Function) {
    594   ByteReader reader(ENDIANNESS_BIG);
    595   reader.SetFunctionBase(0xc2c0ed81);
    596   EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
    597   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
    598   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
    599   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
    600   EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
    601   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
    602   EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
    603 }
    604 
    605 TEST(UsableBase, ClearFunction) {
    606   ByteReader reader(ENDIANNESS_BIG);
    607   reader.SetFunctionBase(0xc2c0ed81);
    608   reader.ClearFunctionBase();
    609   EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
    610   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
    611   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
    612   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
    613   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
    614   EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
    615   EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
    616 }
    617 
    618 struct AlignedFixture {
    619   AlignedFixture() : reader(ENDIANNESS_BIG) { reader.SetAddressSize(4); }
    620   static const char data[10];
    621   ByteReader reader;
    622   size_t pointer_size;
    623 };
    624 
    625 const char AlignedFixture::data[10] = {
    626   0xfe, 0x6e, 0x93, 0xd8, 0x34, 0xd5, 0x1c, 0xd3, 0xac, 0x2b
    627 };
    628 
    629 class Aligned: public AlignedFixture, public Test { };
    630 
    631 TEST_F(Aligned, DW_EH_PE_aligned0) {
    632   reader.SetCFIDataBase(0xb440305c, data);
    633   EXPECT_EQ(0xfe6e93d8U,
    634             reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,
    635                                       &pointer_size));
    636   EXPECT_EQ(4U, pointer_size);
    637 }
    638 
    639 TEST_F(Aligned, DW_EH_PE_aligned1) {
    640   reader.SetCFIDataBase(0xb440305d, data);
    641   EXPECT_EQ(0xd834d51cU,
    642             reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,
    643                                       &pointer_size));
    644   EXPECT_EQ(7U, pointer_size);
    645 }
    646 
    647 TEST_F(Aligned, DW_EH_PE_aligned2) {
    648   reader.SetCFIDataBase(0xb440305e, data);
    649   EXPECT_EQ(0x93d834d5U,
    650             reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,
    651                                       &pointer_size));
    652   EXPECT_EQ(6U, pointer_size);
    653 }
    654 
    655 TEST_F(Aligned, DW_EH_PE_aligned3) {
    656   reader.SetCFIDataBase(0xb440305f, data);
    657   EXPECT_EQ(0x6e93d834U,
    658             reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,
    659                                       &pointer_size));
    660   EXPECT_EQ(5U, pointer_size);
    661 }
    662 
    663 TEST_F(Aligned, DW_EH_PE_aligned11) {
    664   reader.SetCFIDataBase(0xb4403061, data);
    665   EXPECT_EQ(0xd834d51cU,
    666             reader.ReadEncodedPointer(data + 1,
    667                                       dwarf2reader::DW_EH_PE_aligned,
    668                                       &pointer_size));
    669   EXPECT_EQ(6U, pointer_size);
    670 }
    671 
    672 TEST_F(Aligned, DW_EH_PE_aligned30) {
    673   reader.SetCFIDataBase(0xb4403063, data);
    674   EXPECT_EQ(0x6e93d834U,
    675             reader.ReadEncodedPointer(data + 1,
    676                                       dwarf2reader::DW_EH_PE_aligned,
    677                                       &pointer_size));
    678   EXPECT_EQ(4U, pointer_size);
    679 }
    680 
    681 TEST_F(Aligned, DW_EH_PE_aligned23) {
    682   reader.SetCFIDataBase(0xb4403062, data);
    683   EXPECT_EQ(0x1cd3ac2bU,
    684             reader.ReadEncodedPointer(data + 3,
    685                                       dwarf2reader::DW_EH_PE_aligned,
    686                                       &pointer_size));
    687   EXPECT_EQ(7U, pointer_size);
    688 }
    689 
    690 TEST_F(Aligned, DW_EH_PE_aligned03) {
    691   reader.SetCFIDataBase(0xb4403064, data);
    692   EXPECT_EQ(0x34d51cd3U,
    693             reader.ReadEncodedPointer(data + 3,
    694                                       dwarf2reader::DW_EH_PE_aligned,
    695                                       &pointer_size));
    696   EXPECT_EQ(5U, pointer_size);
    697 }
    698