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