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@mozilla.com> <jimb@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
42using dwarf2reader::ByteReader;
43using dwarf2reader::DwarfPointerEncoding;
44using dwarf2reader::ENDIANNESS_BIG;
45using dwarf2reader::ENDIANNESS_LITTLE;
46using google_breakpad::CFISection;
47using google_breakpad::test_assembler::Label;
48using google_breakpad::test_assembler::kBigEndian;
49using google_breakpad::test_assembler::kLittleEndian;
50using google_breakpad::test_assembler::Section;
51using testing::Test;
52
53struct ReaderFixture {
54  string contents;
55  size_t pointer_size;
56};
57
58class Reader: public ReaderFixture, public Test { };
59class ReaderDeathTest: public ReaderFixture, public Test { };
60
61TEST_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
89TEST_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
377TEST_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
386TEST_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
396TEST_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
408TEST_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
418TEST_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
428TEST_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
438TEST_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
450TEST_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
462TEST_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
472TEST_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
482TEST_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
492TEST_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
504TEST_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
517TEST_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
530TEST_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
543TEST_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
556TEST(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
569TEST(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
581TEST(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
593TEST(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
605TEST(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
618struct 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
625const char AlignedFixture::data[10] = {
626  0xfe, 0x6e, 0x93, 0xd8, 0x34, 0xd5, 0x1c, 0xd3, 0xac, 0x2b
627};
628
629class Aligned: public AlignedFixture, public Test { };
630
631TEST_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
639TEST_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
647TEST_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
655TEST_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
663TEST_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
672TEST_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
681TEST_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
690TEST_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