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