michael@0: // Copyright (c) 2010, Google Inc. michael@0: // All rights reserved. michael@0: // michael@0: // Redistribution and use in source and binary forms, with or without michael@0: // modification, are permitted provided that the following conditions are michael@0: // met: michael@0: // michael@0: // * Redistributions of source code must retain the above copyright michael@0: // notice, this list of conditions and the following disclaimer. michael@0: // * Redistributions in binary form must reproduce the above michael@0: // copyright notice, this list of conditions and the following disclaimer michael@0: // in the documentation and/or other materials provided with the michael@0: // distribution. michael@0: // * Neither the name of Google Inc. nor the names of its michael@0: // contributors may be used to endorse or promote products derived from michael@0: // this software without specific prior written permission. michael@0: // michael@0: // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS michael@0: // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT michael@0: // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR michael@0: // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT michael@0: // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, michael@0: // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT michael@0: // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, michael@0: // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY michael@0: // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT michael@0: // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE michael@0: // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. michael@0: michael@0: // Original author: Jim Blandy michael@0: michael@0: // bytereader_unittest.cc: Unit tests for dwarf2reader::ByteReader michael@0: michael@0: #include michael@0: michael@0: #include "breakpad_googletest_includes.h" michael@0: #include "common/dwarf/bytereader.h" michael@0: #include "common/dwarf/bytereader-inl.h" michael@0: #include "common/dwarf/cfi_assembler.h" michael@0: #include "common/using_std_string.h" michael@0: michael@0: using dwarf2reader::ByteReader; michael@0: using dwarf2reader::DwarfPointerEncoding; michael@0: using dwarf2reader::ENDIANNESS_BIG; michael@0: using dwarf2reader::ENDIANNESS_LITTLE; michael@0: using google_breakpad::CFISection; michael@0: using google_breakpad::test_assembler::Label; michael@0: using google_breakpad::test_assembler::kBigEndian; michael@0: using google_breakpad::test_assembler::kLittleEndian; michael@0: using google_breakpad::test_assembler::Section; michael@0: using testing::Test; michael@0: michael@0: struct ReaderFixture { michael@0: string contents; michael@0: size_t pointer_size; michael@0: }; michael@0: michael@0: class Reader: public ReaderFixture, public Test { }; michael@0: class ReaderDeathTest: public ReaderFixture, public Test { }; michael@0: michael@0: TEST_F(Reader, SimpleConstructor) { michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetAddressSize(4); michael@0: CFISection section(kBigEndian, 4); michael@0: section michael@0: .D8(0xc0) michael@0: .D16(0xcf0d) michael@0: .D32(0x96fdd219) michael@0: .D64(0xbbf55fef0825f117ULL) michael@0: .ULEB128(0xa0927048ba8121afULL) michael@0: .LEB128(-0x4f337badf4483f83LL) michael@0: .D32(0xfec319c9); michael@0: ASSERT_TRUE(section.GetContents(&contents)); michael@0: const char *data = contents.data(); michael@0: EXPECT_EQ(0xc0U, reader.ReadOneByte(data)); michael@0: EXPECT_EQ(0xcf0dU, reader.ReadTwoBytes(data + 1)); michael@0: EXPECT_EQ(0x96fdd219U, reader.ReadFourBytes(data + 3)); michael@0: EXPECT_EQ(0xbbf55fef0825f117ULL, reader.ReadEightBytes(data + 7)); michael@0: size_t leb128_size; michael@0: EXPECT_EQ(0xa0927048ba8121afULL, michael@0: reader.ReadUnsignedLEB128(data + 15, &leb128_size)); michael@0: EXPECT_EQ(10U, leb128_size); michael@0: EXPECT_EQ(-0x4f337badf4483f83LL, michael@0: reader.ReadSignedLEB128(data + 25, &leb128_size)); michael@0: EXPECT_EQ(10U, leb128_size); michael@0: EXPECT_EQ(0xfec319c9, reader.ReadAddress(data + 35)); michael@0: } michael@0: michael@0: TEST_F(Reader, ValidEncodings) { michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_omit))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_aligned))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_absptr | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_uleb128 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata2 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata4 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata8 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sleb128 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata2 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata4 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata8 | michael@0: dwarf2reader::DW_EH_PE_pcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_absptr | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_uleb128 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata2 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata4 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata8 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sleb128 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata2 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata4 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata8 | michael@0: dwarf2reader::DW_EH_PE_textrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_absptr | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_uleb128 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata2 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata4 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata8 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sleb128 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata2 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata4 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata8 | michael@0: dwarf2reader::DW_EH_PE_datarel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_absptr | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_uleb128 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata2 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata4 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_udata8 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sleb128 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata2 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata4 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: EXPECT_TRUE(reader.ValidEncoding( michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | michael@0: dwarf2reader::DW_EH_PE_sdata8 | michael@0: dwarf2reader::DW_EH_PE_funcrel))); michael@0: michael@0: EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x05))); michael@0: EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x07))); michael@0: EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0d))); michael@0: EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0f))); michael@0: EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x51))); michael@0: EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x60))); michael@0: EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x70))); michael@0: EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xf0))); michael@0: EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xd0))); michael@0: } michael@0: michael@0: TEST_F(ReaderDeathTest, DW_EH_PE_omit) { michael@0: static const char data[1] = { 42 }; michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetAddressSize(4); michael@0: EXPECT_DEATH(reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_omit, michael@0: &pointer_size), michael@0: "encoding != DW_EH_PE_omit"); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_absptr4) { michael@0: static const char data[] = { 0x27, 0x57, 0xea, 0x40 }; michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: reader.SetAddressSize(4); michael@0: EXPECT_EQ(0x40ea5727U, michael@0: reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_absptr, michael@0: &pointer_size)); michael@0: EXPECT_EQ(4U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_absptr8) { michael@0: static const char data[] = { michael@0: 0x60, 0x27, 0x57, 0xea, 0x40, 0xc2, 0x98, 0x05, 0x01, 0x50 michael@0: }; michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: reader.SetAddressSize(8); michael@0: EXPECT_EQ(0x010598c240ea5727ULL, michael@0: reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_absptr, michael@0: &pointer_size)); michael@0: EXPECT_EQ(8U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_uleb128) { michael@0: static const char data[] = { 0x81, 0x84, 0x4c }; michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: reader.SetAddressSize(4); michael@0: EXPECT_EQ(0x130201U, michael@0: reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_uleb128, michael@0: &pointer_size)); michael@0: EXPECT_EQ(3U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_udata2) { michael@0: static const char data[] = { 0xf4, 0x8d }; michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetAddressSize(4); michael@0: EXPECT_EQ(0xf48dU, michael@0: reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_udata2, michael@0: &pointer_size)); michael@0: EXPECT_EQ(2U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_udata4) { michael@0: static const char data[] = { 0xb2, 0x68, 0xa5, 0x62, 0x8f, 0x8b }; michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetAddressSize(8); michael@0: EXPECT_EQ(0xa5628f8b, michael@0: reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_udata4, michael@0: &pointer_size)); michael@0: EXPECT_EQ(4U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_udata8Addr8) { michael@0: static const char data[] = { michael@0: 0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe michael@0: }; michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: reader.SetAddressSize(8); michael@0: EXPECT_EQ(0x8fed199f69047304ULL, michael@0: reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8, michael@0: &pointer_size)); michael@0: EXPECT_EQ(8U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_udata8Addr4) { michael@0: static const char data[] = { michael@0: 0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe michael@0: }; michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: reader.SetAddressSize(4); michael@0: EXPECT_EQ(0x69047304ULL, michael@0: reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8, michael@0: &pointer_size)); michael@0: EXPECT_EQ(8U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_sleb128) { michael@0: static const char data[] = { 0x42, 0xff, 0xfb, 0x73 }; michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetAddressSize(4); michael@0: EXPECT_EQ(-0x030201U & 0xffffffff, michael@0: reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sleb128, michael@0: &pointer_size)); michael@0: EXPECT_EQ(3U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_sdata2) { michael@0: static const char data[] = { 0xb9, 0xbf }; michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: reader.SetAddressSize(8); michael@0: EXPECT_EQ(0xffffffffffffbfb9ULL, michael@0: reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_sdata2, michael@0: &pointer_size)); michael@0: EXPECT_EQ(2U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_sdata4) { michael@0: static const char data[] = { 0xa0, 0xca, 0xf2, 0xb8, 0xc2, 0xad }; michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: reader.SetAddressSize(8); michael@0: EXPECT_EQ(0xffffffffadc2b8f2ULL, michael@0: reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_sdata4, michael@0: &pointer_size)); michael@0: EXPECT_EQ(4U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_sdata8) { michael@0: static const char data[] = { michael@0: 0xf6, 0x66, 0x57, 0x79, 0xe0, 0x0c, 0x9b, 0x26, 0x87 michael@0: }; michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: reader.SetAddressSize(8); michael@0: EXPECT_EQ(0x87269b0ce0795766ULL, michael@0: reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sdata8, michael@0: &pointer_size)); michael@0: EXPECT_EQ(8U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_pcrel) { michael@0: static const char data[] = { 0x4a, 0x8b, 0x1b, 0x14, 0xc8, 0xc4, 0x02, 0xce }; michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetAddressSize(4); michael@0: DwarfPointerEncoding encoding = michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_pcrel michael@0: | dwarf2reader::DW_EH_PE_absptr); michael@0: reader.SetCFIDataBase(0x89951377, data); michael@0: EXPECT_EQ(0x89951377 + 3 + 0x14c8c402, michael@0: reader.ReadEncodedPointer(data + 3, encoding, &pointer_size)); michael@0: EXPECT_EQ(4U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_textrel) { michael@0: static const char data[] = { 0xd9, 0x0d, 0x05, 0x17, 0xc9, 0x7a, 0x42, 0x1e }; michael@0: ByteReader reader(ENDIANNESS_LITTLE); michael@0: reader.SetAddressSize(4); michael@0: reader.SetTextBase(0xb91beaf0); michael@0: DwarfPointerEncoding encoding = michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_textrel michael@0: | dwarf2reader::DW_EH_PE_sdata2); michael@0: EXPECT_EQ((0xb91beaf0 + 0xffffc917) & 0xffffffff, michael@0: reader.ReadEncodedPointer(data + 3, encoding, &pointer_size)); michael@0: EXPECT_EQ(2U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_datarel) { michael@0: static const char data[] = { 0x16, 0xf2, 0xbb, 0x82, 0x68, 0xa7, 0xbc, 0x39 }; michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetAddressSize(8); michael@0: reader.SetDataBase(0xbef308bd25ce74f0ULL); michael@0: DwarfPointerEncoding encoding = michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_datarel michael@0: | dwarf2reader::DW_EH_PE_sleb128); michael@0: EXPECT_EQ(0xbef308bd25ce74f0ULL + 0xfffffffffffa013bULL, michael@0: reader.ReadEncodedPointer(data + 2, encoding, &pointer_size)); michael@0: EXPECT_EQ(3U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Reader, DW_EH_PE_funcrel) { michael@0: static const char data[] = { 0x84, 0xf8, 0x14, 0x01, 0x61, 0xd1, 0x48, 0xc9 }; michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetAddressSize(4); michael@0: reader.SetFunctionBase(0x823c3520); michael@0: DwarfPointerEncoding encoding = michael@0: DwarfPointerEncoding(dwarf2reader::DW_EH_PE_funcrel michael@0: | dwarf2reader::DW_EH_PE_udata2); michael@0: EXPECT_EQ(0x823c3520 + 0xd148, michael@0: reader.ReadEncodedPointer(data + 5, encoding, &pointer_size)); michael@0: EXPECT_EQ(2U, pointer_size); michael@0: } michael@0: michael@0: TEST(UsableBase, CFI) { michael@0: static const char data[1] = { 0x42 }; michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetCFIDataBase(0xb31cbd20, data); michael@0: EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); michael@0: EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); michael@0: EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); michael@0: } michael@0: michael@0: TEST(UsableBase, Text) { michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetTextBase(0xa899ccb9); michael@0: EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); michael@0: EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); michael@0: EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); michael@0: } michael@0: michael@0: TEST(UsableBase, Data) { michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetDataBase(0xf7b10bcd); michael@0: EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); michael@0: EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); michael@0: EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); michael@0: } michael@0: michael@0: TEST(UsableBase, Function) { michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetFunctionBase(0xc2c0ed81); michael@0: EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); michael@0: EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); michael@0: EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); michael@0: } michael@0: michael@0: TEST(UsableBase, ClearFunction) { michael@0: ByteReader reader(ENDIANNESS_BIG); michael@0: reader.SetFunctionBase(0xc2c0ed81); michael@0: reader.ClearFunctionBase(); michael@0: EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); michael@0: EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); michael@0: EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); michael@0: } michael@0: michael@0: struct AlignedFixture { michael@0: AlignedFixture() : reader(ENDIANNESS_BIG) { reader.SetAddressSize(4); } michael@0: static const char data[10]; michael@0: ByteReader reader; michael@0: size_t pointer_size; michael@0: }; michael@0: michael@0: const char AlignedFixture::data[10] = { michael@0: 0xfe, 0x6e, 0x93, 0xd8, 0x34, 0xd5, 0x1c, 0xd3, 0xac, 0x2b michael@0: }; michael@0: michael@0: class Aligned: public AlignedFixture, public Test { }; michael@0: michael@0: TEST_F(Aligned, DW_EH_PE_aligned0) { michael@0: reader.SetCFIDataBase(0xb440305c, data); michael@0: EXPECT_EQ(0xfe6e93d8U, michael@0: reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned, michael@0: &pointer_size)); michael@0: EXPECT_EQ(4U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Aligned, DW_EH_PE_aligned1) { michael@0: reader.SetCFIDataBase(0xb440305d, data); michael@0: EXPECT_EQ(0xd834d51cU, michael@0: reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned, michael@0: &pointer_size)); michael@0: EXPECT_EQ(7U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Aligned, DW_EH_PE_aligned2) { michael@0: reader.SetCFIDataBase(0xb440305e, data); michael@0: EXPECT_EQ(0x93d834d5U, michael@0: reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned, michael@0: &pointer_size)); michael@0: EXPECT_EQ(6U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Aligned, DW_EH_PE_aligned3) { michael@0: reader.SetCFIDataBase(0xb440305f, data); michael@0: EXPECT_EQ(0x6e93d834U, michael@0: reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned, michael@0: &pointer_size)); michael@0: EXPECT_EQ(5U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Aligned, DW_EH_PE_aligned11) { michael@0: reader.SetCFIDataBase(0xb4403061, data); michael@0: EXPECT_EQ(0xd834d51cU, michael@0: reader.ReadEncodedPointer(data + 1, michael@0: dwarf2reader::DW_EH_PE_aligned, michael@0: &pointer_size)); michael@0: EXPECT_EQ(6U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Aligned, DW_EH_PE_aligned30) { michael@0: reader.SetCFIDataBase(0xb4403063, data); michael@0: EXPECT_EQ(0x6e93d834U, michael@0: reader.ReadEncodedPointer(data + 1, michael@0: dwarf2reader::DW_EH_PE_aligned, michael@0: &pointer_size)); michael@0: EXPECT_EQ(4U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Aligned, DW_EH_PE_aligned23) { michael@0: reader.SetCFIDataBase(0xb4403062, data); michael@0: EXPECT_EQ(0x1cd3ac2bU, michael@0: reader.ReadEncodedPointer(data + 3, michael@0: dwarf2reader::DW_EH_PE_aligned, michael@0: &pointer_size)); michael@0: EXPECT_EQ(7U, pointer_size); michael@0: } michael@0: michael@0: TEST_F(Aligned, DW_EH_PE_aligned03) { michael@0: reader.SetCFIDataBase(0xb4403064, data); michael@0: EXPECT_EQ(0x34d51cd3U, michael@0: reader.ReadEncodedPointer(data + 3, michael@0: dwarf2reader::DW_EH_PE_aligned, michael@0: &pointer_size)); michael@0: EXPECT_EQ(5U, pointer_size); michael@0: }