1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader_unittest.cc Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,697 @@ 1.4 +// Copyright (c) 2010, Google Inc. 1.5 +// All rights reserved. 1.6 +// 1.7 +// Redistribution and use in source and binary forms, with or without 1.8 +// modification, are permitted provided that the following conditions are 1.9 +// met: 1.10 +// 1.11 +// * Redistributions of source code must retain the above copyright 1.12 +// notice, this list of conditions and the following disclaimer. 1.13 +// * Redistributions in binary form must reproduce the above 1.14 +// copyright notice, this list of conditions and the following disclaimer 1.15 +// in the documentation and/or other materials provided with the 1.16 +// distribution. 1.17 +// * Neither the name of Google Inc. nor the names of its 1.18 +// contributors may be used to endorse or promote products derived from 1.19 +// this software without specific prior written permission. 1.20 +// 1.21 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1.22 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1.23 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1.24 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1.25 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1.26 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1.27 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1.28 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1.29 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1.30 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1.31 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1.32 + 1.33 +// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com> 1.34 + 1.35 +// bytereader_unittest.cc: Unit tests for dwarf2reader::ByteReader 1.36 + 1.37 +#include <string> 1.38 + 1.39 +#include "breakpad_googletest_includes.h" 1.40 +#include "common/dwarf/bytereader.h" 1.41 +#include "common/dwarf/bytereader-inl.h" 1.42 +#include "common/dwarf/cfi_assembler.h" 1.43 +#include "common/using_std_string.h" 1.44 + 1.45 +using dwarf2reader::ByteReader; 1.46 +using dwarf2reader::DwarfPointerEncoding; 1.47 +using dwarf2reader::ENDIANNESS_BIG; 1.48 +using dwarf2reader::ENDIANNESS_LITTLE; 1.49 +using google_breakpad::CFISection; 1.50 +using google_breakpad::test_assembler::Label; 1.51 +using google_breakpad::test_assembler::kBigEndian; 1.52 +using google_breakpad::test_assembler::kLittleEndian; 1.53 +using google_breakpad::test_assembler::Section; 1.54 +using testing::Test; 1.55 + 1.56 +struct ReaderFixture { 1.57 + string contents; 1.58 + size_t pointer_size; 1.59 +}; 1.60 + 1.61 +class Reader: public ReaderFixture, public Test { }; 1.62 +class ReaderDeathTest: public ReaderFixture, public Test { }; 1.63 + 1.64 +TEST_F(Reader, SimpleConstructor) { 1.65 + ByteReader reader(ENDIANNESS_BIG); 1.66 + reader.SetAddressSize(4); 1.67 + CFISection section(kBigEndian, 4); 1.68 + section 1.69 + .D8(0xc0) 1.70 + .D16(0xcf0d) 1.71 + .D32(0x96fdd219) 1.72 + .D64(0xbbf55fef0825f117ULL) 1.73 + .ULEB128(0xa0927048ba8121afULL) 1.74 + .LEB128(-0x4f337badf4483f83LL) 1.75 + .D32(0xfec319c9); 1.76 + ASSERT_TRUE(section.GetContents(&contents)); 1.77 + const char *data = contents.data(); 1.78 + EXPECT_EQ(0xc0U, reader.ReadOneByte(data)); 1.79 + EXPECT_EQ(0xcf0dU, reader.ReadTwoBytes(data + 1)); 1.80 + EXPECT_EQ(0x96fdd219U, reader.ReadFourBytes(data + 3)); 1.81 + EXPECT_EQ(0xbbf55fef0825f117ULL, reader.ReadEightBytes(data + 7)); 1.82 + size_t leb128_size; 1.83 + EXPECT_EQ(0xa0927048ba8121afULL, 1.84 + reader.ReadUnsignedLEB128(data + 15, &leb128_size)); 1.85 + EXPECT_EQ(10U, leb128_size); 1.86 + EXPECT_EQ(-0x4f337badf4483f83LL, 1.87 + reader.ReadSignedLEB128(data + 25, &leb128_size)); 1.88 + EXPECT_EQ(10U, leb128_size); 1.89 + EXPECT_EQ(0xfec319c9, reader.ReadAddress(data + 35)); 1.90 +} 1.91 + 1.92 +TEST_F(Reader, ValidEncodings) { 1.93 + ByteReader reader(ENDIANNESS_LITTLE); 1.94 + EXPECT_TRUE(reader.ValidEncoding( 1.95 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr))); 1.96 + EXPECT_TRUE(reader.ValidEncoding( 1.97 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_omit))); 1.98 + EXPECT_TRUE(reader.ValidEncoding( 1.99 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_aligned))); 1.100 + EXPECT_TRUE(reader.ValidEncoding( 1.101 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128))); 1.102 + EXPECT_TRUE(reader.ValidEncoding( 1.103 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2))); 1.104 + EXPECT_TRUE(reader.ValidEncoding( 1.105 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4))); 1.106 + EXPECT_TRUE(reader.ValidEncoding( 1.107 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8))); 1.108 + EXPECT_TRUE(reader.ValidEncoding( 1.109 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128))); 1.110 + EXPECT_TRUE(reader.ValidEncoding( 1.111 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2))); 1.112 + EXPECT_TRUE(reader.ValidEncoding( 1.113 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4))); 1.114 + EXPECT_TRUE(reader.ValidEncoding( 1.115 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8))); 1.116 + EXPECT_TRUE(reader.ValidEncoding( 1.117 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr | 1.118 + dwarf2reader::DW_EH_PE_pcrel))); 1.119 + EXPECT_TRUE(reader.ValidEncoding( 1.120 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 | 1.121 + dwarf2reader::DW_EH_PE_pcrel))); 1.122 + EXPECT_TRUE(reader.ValidEncoding( 1.123 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 | 1.124 + dwarf2reader::DW_EH_PE_pcrel))); 1.125 + EXPECT_TRUE(reader.ValidEncoding( 1.126 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 | 1.127 + dwarf2reader::DW_EH_PE_pcrel))); 1.128 + EXPECT_TRUE(reader.ValidEncoding( 1.129 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 | 1.130 + dwarf2reader::DW_EH_PE_pcrel))); 1.131 + EXPECT_TRUE(reader.ValidEncoding( 1.132 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 | 1.133 + dwarf2reader::DW_EH_PE_pcrel))); 1.134 + EXPECT_TRUE(reader.ValidEncoding( 1.135 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 | 1.136 + dwarf2reader::DW_EH_PE_pcrel))); 1.137 + EXPECT_TRUE(reader.ValidEncoding( 1.138 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 | 1.139 + dwarf2reader::DW_EH_PE_pcrel))); 1.140 + EXPECT_TRUE(reader.ValidEncoding( 1.141 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 | 1.142 + dwarf2reader::DW_EH_PE_pcrel))); 1.143 + EXPECT_TRUE(reader.ValidEncoding( 1.144 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr | 1.145 + dwarf2reader::DW_EH_PE_textrel))); 1.146 + EXPECT_TRUE(reader.ValidEncoding( 1.147 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 | 1.148 + dwarf2reader::DW_EH_PE_textrel))); 1.149 + EXPECT_TRUE(reader.ValidEncoding( 1.150 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 | 1.151 + dwarf2reader::DW_EH_PE_textrel))); 1.152 + EXPECT_TRUE(reader.ValidEncoding( 1.153 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 | 1.154 + dwarf2reader::DW_EH_PE_textrel))); 1.155 + EXPECT_TRUE(reader.ValidEncoding( 1.156 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 | 1.157 + dwarf2reader::DW_EH_PE_textrel))); 1.158 + EXPECT_TRUE(reader.ValidEncoding( 1.159 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 | 1.160 + dwarf2reader::DW_EH_PE_textrel))); 1.161 + EXPECT_TRUE(reader.ValidEncoding( 1.162 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 | 1.163 + dwarf2reader::DW_EH_PE_textrel))); 1.164 + EXPECT_TRUE(reader.ValidEncoding( 1.165 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 | 1.166 + dwarf2reader::DW_EH_PE_textrel))); 1.167 + EXPECT_TRUE(reader.ValidEncoding( 1.168 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 | 1.169 + dwarf2reader::DW_EH_PE_textrel))); 1.170 + EXPECT_TRUE(reader.ValidEncoding( 1.171 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr | 1.172 + dwarf2reader::DW_EH_PE_datarel))); 1.173 + EXPECT_TRUE(reader.ValidEncoding( 1.174 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 | 1.175 + dwarf2reader::DW_EH_PE_datarel))); 1.176 + EXPECT_TRUE(reader.ValidEncoding( 1.177 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 | 1.178 + dwarf2reader::DW_EH_PE_datarel))); 1.179 + EXPECT_TRUE(reader.ValidEncoding( 1.180 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 | 1.181 + dwarf2reader::DW_EH_PE_datarel))); 1.182 + EXPECT_TRUE(reader.ValidEncoding( 1.183 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 | 1.184 + dwarf2reader::DW_EH_PE_datarel))); 1.185 + EXPECT_TRUE(reader.ValidEncoding( 1.186 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 | 1.187 + dwarf2reader::DW_EH_PE_datarel))); 1.188 + EXPECT_TRUE(reader.ValidEncoding( 1.189 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 | 1.190 + dwarf2reader::DW_EH_PE_datarel))); 1.191 + EXPECT_TRUE(reader.ValidEncoding( 1.192 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 | 1.193 + dwarf2reader::DW_EH_PE_datarel))); 1.194 + EXPECT_TRUE(reader.ValidEncoding( 1.195 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 | 1.196 + dwarf2reader::DW_EH_PE_datarel))); 1.197 + EXPECT_TRUE(reader.ValidEncoding( 1.198 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr | 1.199 + dwarf2reader::DW_EH_PE_funcrel))); 1.200 + EXPECT_TRUE(reader.ValidEncoding( 1.201 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 | 1.202 + dwarf2reader::DW_EH_PE_funcrel))); 1.203 + EXPECT_TRUE(reader.ValidEncoding( 1.204 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 | 1.205 + dwarf2reader::DW_EH_PE_funcrel))); 1.206 + EXPECT_TRUE(reader.ValidEncoding( 1.207 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 | 1.208 + dwarf2reader::DW_EH_PE_funcrel))); 1.209 + EXPECT_TRUE(reader.ValidEncoding( 1.210 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 | 1.211 + dwarf2reader::DW_EH_PE_funcrel))); 1.212 + EXPECT_TRUE(reader.ValidEncoding( 1.213 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 | 1.214 + dwarf2reader::DW_EH_PE_funcrel))); 1.215 + EXPECT_TRUE(reader.ValidEncoding( 1.216 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 | 1.217 + dwarf2reader::DW_EH_PE_funcrel))); 1.218 + EXPECT_TRUE(reader.ValidEncoding( 1.219 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 | 1.220 + dwarf2reader::DW_EH_PE_funcrel))); 1.221 + EXPECT_TRUE(reader.ValidEncoding( 1.222 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 | 1.223 + dwarf2reader::DW_EH_PE_funcrel))); 1.224 + EXPECT_TRUE(reader.ValidEncoding( 1.225 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.226 + dwarf2reader::DW_EH_PE_absptr | 1.227 + dwarf2reader::DW_EH_PE_pcrel))); 1.228 + EXPECT_TRUE(reader.ValidEncoding( 1.229 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.230 + dwarf2reader::DW_EH_PE_uleb128 | 1.231 + dwarf2reader::DW_EH_PE_pcrel))); 1.232 + EXPECT_TRUE(reader.ValidEncoding( 1.233 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.234 + dwarf2reader::DW_EH_PE_udata2 | 1.235 + dwarf2reader::DW_EH_PE_pcrel))); 1.236 + EXPECT_TRUE(reader.ValidEncoding( 1.237 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.238 + dwarf2reader::DW_EH_PE_udata4 | 1.239 + dwarf2reader::DW_EH_PE_pcrel))); 1.240 + EXPECT_TRUE(reader.ValidEncoding( 1.241 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.242 + dwarf2reader::DW_EH_PE_udata8 | 1.243 + dwarf2reader::DW_EH_PE_pcrel))); 1.244 + EXPECT_TRUE(reader.ValidEncoding( 1.245 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.246 + dwarf2reader::DW_EH_PE_sleb128 | 1.247 + dwarf2reader::DW_EH_PE_pcrel))); 1.248 + EXPECT_TRUE(reader.ValidEncoding( 1.249 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.250 + dwarf2reader::DW_EH_PE_sdata2 | 1.251 + dwarf2reader::DW_EH_PE_pcrel))); 1.252 + EXPECT_TRUE(reader.ValidEncoding( 1.253 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.254 + dwarf2reader::DW_EH_PE_sdata4 | 1.255 + dwarf2reader::DW_EH_PE_pcrel))); 1.256 + EXPECT_TRUE(reader.ValidEncoding( 1.257 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.258 + dwarf2reader::DW_EH_PE_sdata8 | 1.259 + dwarf2reader::DW_EH_PE_pcrel))); 1.260 + EXPECT_TRUE(reader.ValidEncoding( 1.261 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.262 + dwarf2reader::DW_EH_PE_absptr | 1.263 + dwarf2reader::DW_EH_PE_textrel))); 1.264 + EXPECT_TRUE(reader.ValidEncoding( 1.265 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.266 + dwarf2reader::DW_EH_PE_uleb128 | 1.267 + dwarf2reader::DW_EH_PE_textrel))); 1.268 + EXPECT_TRUE(reader.ValidEncoding( 1.269 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.270 + dwarf2reader::DW_EH_PE_udata2 | 1.271 + dwarf2reader::DW_EH_PE_textrel))); 1.272 + EXPECT_TRUE(reader.ValidEncoding( 1.273 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.274 + dwarf2reader::DW_EH_PE_udata4 | 1.275 + dwarf2reader::DW_EH_PE_textrel))); 1.276 + EXPECT_TRUE(reader.ValidEncoding( 1.277 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.278 + dwarf2reader::DW_EH_PE_udata8 | 1.279 + dwarf2reader::DW_EH_PE_textrel))); 1.280 + EXPECT_TRUE(reader.ValidEncoding( 1.281 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.282 + dwarf2reader::DW_EH_PE_sleb128 | 1.283 + dwarf2reader::DW_EH_PE_textrel))); 1.284 + EXPECT_TRUE(reader.ValidEncoding( 1.285 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.286 + dwarf2reader::DW_EH_PE_sdata2 | 1.287 + dwarf2reader::DW_EH_PE_textrel))); 1.288 + EXPECT_TRUE(reader.ValidEncoding( 1.289 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.290 + dwarf2reader::DW_EH_PE_sdata4 | 1.291 + dwarf2reader::DW_EH_PE_textrel))); 1.292 + EXPECT_TRUE(reader.ValidEncoding( 1.293 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.294 + dwarf2reader::DW_EH_PE_sdata8 | 1.295 + dwarf2reader::DW_EH_PE_textrel))); 1.296 + EXPECT_TRUE(reader.ValidEncoding( 1.297 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.298 + dwarf2reader::DW_EH_PE_absptr | 1.299 + dwarf2reader::DW_EH_PE_datarel))); 1.300 + EXPECT_TRUE(reader.ValidEncoding( 1.301 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.302 + dwarf2reader::DW_EH_PE_uleb128 | 1.303 + dwarf2reader::DW_EH_PE_datarel))); 1.304 + EXPECT_TRUE(reader.ValidEncoding( 1.305 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.306 + dwarf2reader::DW_EH_PE_udata2 | 1.307 + dwarf2reader::DW_EH_PE_datarel))); 1.308 + EXPECT_TRUE(reader.ValidEncoding( 1.309 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.310 + dwarf2reader::DW_EH_PE_udata4 | 1.311 + dwarf2reader::DW_EH_PE_datarel))); 1.312 + EXPECT_TRUE(reader.ValidEncoding( 1.313 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.314 + dwarf2reader::DW_EH_PE_udata8 | 1.315 + dwarf2reader::DW_EH_PE_datarel))); 1.316 + EXPECT_TRUE(reader.ValidEncoding( 1.317 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.318 + dwarf2reader::DW_EH_PE_sleb128 | 1.319 + dwarf2reader::DW_EH_PE_datarel))); 1.320 + EXPECT_TRUE(reader.ValidEncoding( 1.321 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.322 + dwarf2reader::DW_EH_PE_sdata2 | 1.323 + dwarf2reader::DW_EH_PE_datarel))); 1.324 + EXPECT_TRUE(reader.ValidEncoding( 1.325 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.326 + dwarf2reader::DW_EH_PE_sdata4 | 1.327 + dwarf2reader::DW_EH_PE_datarel))); 1.328 + EXPECT_TRUE(reader.ValidEncoding( 1.329 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.330 + dwarf2reader::DW_EH_PE_sdata8 | 1.331 + dwarf2reader::DW_EH_PE_datarel))); 1.332 + EXPECT_TRUE(reader.ValidEncoding( 1.333 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.334 + dwarf2reader::DW_EH_PE_absptr | 1.335 + dwarf2reader::DW_EH_PE_funcrel))); 1.336 + EXPECT_TRUE(reader.ValidEncoding( 1.337 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.338 + dwarf2reader::DW_EH_PE_uleb128 | 1.339 + dwarf2reader::DW_EH_PE_funcrel))); 1.340 + EXPECT_TRUE(reader.ValidEncoding( 1.341 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.342 + dwarf2reader::DW_EH_PE_udata2 | 1.343 + dwarf2reader::DW_EH_PE_funcrel))); 1.344 + EXPECT_TRUE(reader.ValidEncoding( 1.345 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.346 + dwarf2reader::DW_EH_PE_udata4 | 1.347 + dwarf2reader::DW_EH_PE_funcrel))); 1.348 + EXPECT_TRUE(reader.ValidEncoding( 1.349 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.350 + dwarf2reader::DW_EH_PE_udata8 | 1.351 + dwarf2reader::DW_EH_PE_funcrel))); 1.352 + EXPECT_TRUE(reader.ValidEncoding( 1.353 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.354 + dwarf2reader::DW_EH_PE_sleb128 | 1.355 + dwarf2reader::DW_EH_PE_funcrel))); 1.356 + EXPECT_TRUE(reader.ValidEncoding( 1.357 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.358 + dwarf2reader::DW_EH_PE_sdata2 | 1.359 + dwarf2reader::DW_EH_PE_funcrel))); 1.360 + EXPECT_TRUE(reader.ValidEncoding( 1.361 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.362 + dwarf2reader::DW_EH_PE_sdata4 | 1.363 + dwarf2reader::DW_EH_PE_funcrel))); 1.364 + EXPECT_TRUE(reader.ValidEncoding( 1.365 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect | 1.366 + dwarf2reader::DW_EH_PE_sdata8 | 1.367 + dwarf2reader::DW_EH_PE_funcrel))); 1.368 + 1.369 + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x05))); 1.370 + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x07))); 1.371 + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0d))); 1.372 + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0f))); 1.373 + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x51))); 1.374 + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x60))); 1.375 + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x70))); 1.376 + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xf0))); 1.377 + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xd0))); 1.378 +} 1.379 + 1.380 +TEST_F(ReaderDeathTest, DW_EH_PE_omit) { 1.381 + static const char data[1] = { 42 }; 1.382 + ByteReader reader(ENDIANNESS_BIG); 1.383 + reader.SetAddressSize(4); 1.384 + EXPECT_DEATH(reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_omit, 1.385 + &pointer_size), 1.386 + "encoding != DW_EH_PE_omit"); 1.387 +} 1.388 + 1.389 +TEST_F(Reader, DW_EH_PE_absptr4) { 1.390 + static const char data[] = { 0x27, 0x57, 0xea, 0x40 }; 1.391 + ByteReader reader(ENDIANNESS_LITTLE); 1.392 + reader.SetAddressSize(4); 1.393 + EXPECT_EQ(0x40ea5727U, 1.394 + reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_absptr, 1.395 + &pointer_size)); 1.396 + EXPECT_EQ(4U, pointer_size); 1.397 +} 1.398 + 1.399 +TEST_F(Reader, DW_EH_PE_absptr8) { 1.400 + static const char data[] = { 1.401 + 0x60, 0x27, 0x57, 0xea, 0x40, 0xc2, 0x98, 0x05, 0x01, 0x50 1.402 + }; 1.403 + ByteReader reader(ENDIANNESS_LITTLE); 1.404 + reader.SetAddressSize(8); 1.405 + EXPECT_EQ(0x010598c240ea5727ULL, 1.406 + reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_absptr, 1.407 + &pointer_size)); 1.408 + EXPECT_EQ(8U, pointer_size); 1.409 +} 1.410 + 1.411 +TEST_F(Reader, DW_EH_PE_uleb128) { 1.412 + static const char data[] = { 0x81, 0x84, 0x4c }; 1.413 + ByteReader reader(ENDIANNESS_LITTLE); 1.414 + reader.SetAddressSize(4); 1.415 + EXPECT_EQ(0x130201U, 1.416 + reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_uleb128, 1.417 + &pointer_size)); 1.418 + EXPECT_EQ(3U, pointer_size); 1.419 +} 1.420 + 1.421 +TEST_F(Reader, DW_EH_PE_udata2) { 1.422 + static const char data[] = { 0xf4, 0x8d }; 1.423 + ByteReader reader(ENDIANNESS_BIG); 1.424 + reader.SetAddressSize(4); 1.425 + EXPECT_EQ(0xf48dU, 1.426 + reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_udata2, 1.427 + &pointer_size)); 1.428 + EXPECT_EQ(2U, pointer_size); 1.429 +} 1.430 + 1.431 +TEST_F(Reader, DW_EH_PE_udata4) { 1.432 + static const char data[] = { 0xb2, 0x68, 0xa5, 0x62, 0x8f, 0x8b }; 1.433 + ByteReader reader(ENDIANNESS_BIG); 1.434 + reader.SetAddressSize(8); 1.435 + EXPECT_EQ(0xa5628f8b, 1.436 + reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_udata4, 1.437 + &pointer_size)); 1.438 + EXPECT_EQ(4U, pointer_size); 1.439 +} 1.440 + 1.441 +TEST_F(Reader, DW_EH_PE_udata8Addr8) { 1.442 + static const char data[] = { 1.443 + 0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe 1.444 + }; 1.445 + ByteReader reader(ENDIANNESS_LITTLE); 1.446 + reader.SetAddressSize(8); 1.447 + EXPECT_EQ(0x8fed199f69047304ULL, 1.448 + reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8, 1.449 + &pointer_size)); 1.450 + EXPECT_EQ(8U, pointer_size); 1.451 +} 1.452 + 1.453 +TEST_F(Reader, DW_EH_PE_udata8Addr4) { 1.454 + static const char data[] = { 1.455 + 0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe 1.456 + }; 1.457 + ByteReader reader(ENDIANNESS_LITTLE); 1.458 + reader.SetAddressSize(4); 1.459 + EXPECT_EQ(0x69047304ULL, 1.460 + reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8, 1.461 + &pointer_size)); 1.462 + EXPECT_EQ(8U, pointer_size); 1.463 +} 1.464 + 1.465 +TEST_F(Reader, DW_EH_PE_sleb128) { 1.466 + static const char data[] = { 0x42, 0xff, 0xfb, 0x73 }; 1.467 + ByteReader reader(ENDIANNESS_BIG); 1.468 + reader.SetAddressSize(4); 1.469 + EXPECT_EQ(-0x030201U & 0xffffffff, 1.470 + reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sleb128, 1.471 + &pointer_size)); 1.472 + EXPECT_EQ(3U, pointer_size); 1.473 +} 1.474 + 1.475 +TEST_F(Reader, DW_EH_PE_sdata2) { 1.476 + static const char data[] = { 0xb9, 0xbf }; 1.477 + ByteReader reader(ENDIANNESS_LITTLE); 1.478 + reader.SetAddressSize(8); 1.479 + EXPECT_EQ(0xffffffffffffbfb9ULL, 1.480 + reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_sdata2, 1.481 + &pointer_size)); 1.482 + EXPECT_EQ(2U, pointer_size); 1.483 +} 1.484 + 1.485 +TEST_F(Reader, DW_EH_PE_sdata4) { 1.486 + static const char data[] = { 0xa0, 0xca, 0xf2, 0xb8, 0xc2, 0xad }; 1.487 + ByteReader reader(ENDIANNESS_LITTLE); 1.488 + reader.SetAddressSize(8); 1.489 + EXPECT_EQ(0xffffffffadc2b8f2ULL, 1.490 + reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_sdata4, 1.491 + &pointer_size)); 1.492 + EXPECT_EQ(4U, pointer_size); 1.493 +} 1.494 + 1.495 +TEST_F(Reader, DW_EH_PE_sdata8) { 1.496 + static const char data[] = { 1.497 + 0xf6, 0x66, 0x57, 0x79, 0xe0, 0x0c, 0x9b, 0x26, 0x87 1.498 + }; 1.499 + ByteReader reader(ENDIANNESS_LITTLE); 1.500 + reader.SetAddressSize(8); 1.501 + EXPECT_EQ(0x87269b0ce0795766ULL, 1.502 + reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sdata8, 1.503 + &pointer_size)); 1.504 + EXPECT_EQ(8U, pointer_size); 1.505 +} 1.506 + 1.507 +TEST_F(Reader, DW_EH_PE_pcrel) { 1.508 + static const char data[] = { 0x4a, 0x8b, 0x1b, 0x14, 0xc8, 0xc4, 0x02, 0xce }; 1.509 + ByteReader reader(ENDIANNESS_BIG); 1.510 + reader.SetAddressSize(4); 1.511 + DwarfPointerEncoding encoding = 1.512 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_pcrel 1.513 + | dwarf2reader::DW_EH_PE_absptr); 1.514 + reader.SetCFIDataBase(0x89951377, data); 1.515 + EXPECT_EQ(0x89951377 + 3 + 0x14c8c402, 1.516 + reader.ReadEncodedPointer(data + 3, encoding, &pointer_size)); 1.517 + EXPECT_EQ(4U, pointer_size); 1.518 +} 1.519 + 1.520 +TEST_F(Reader, DW_EH_PE_textrel) { 1.521 + static const char data[] = { 0xd9, 0x0d, 0x05, 0x17, 0xc9, 0x7a, 0x42, 0x1e }; 1.522 + ByteReader reader(ENDIANNESS_LITTLE); 1.523 + reader.SetAddressSize(4); 1.524 + reader.SetTextBase(0xb91beaf0); 1.525 + DwarfPointerEncoding encoding = 1.526 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_textrel 1.527 + | dwarf2reader::DW_EH_PE_sdata2); 1.528 + EXPECT_EQ((0xb91beaf0 + 0xffffc917) & 0xffffffff, 1.529 + reader.ReadEncodedPointer(data + 3, encoding, &pointer_size)); 1.530 + EXPECT_EQ(2U, pointer_size); 1.531 +} 1.532 + 1.533 +TEST_F(Reader, DW_EH_PE_datarel) { 1.534 + static const char data[] = { 0x16, 0xf2, 0xbb, 0x82, 0x68, 0xa7, 0xbc, 0x39 }; 1.535 + ByteReader reader(ENDIANNESS_BIG); 1.536 + reader.SetAddressSize(8); 1.537 + reader.SetDataBase(0xbef308bd25ce74f0ULL); 1.538 + DwarfPointerEncoding encoding = 1.539 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_datarel 1.540 + | dwarf2reader::DW_EH_PE_sleb128); 1.541 + EXPECT_EQ(0xbef308bd25ce74f0ULL + 0xfffffffffffa013bULL, 1.542 + reader.ReadEncodedPointer(data + 2, encoding, &pointer_size)); 1.543 + EXPECT_EQ(3U, pointer_size); 1.544 +} 1.545 + 1.546 +TEST_F(Reader, DW_EH_PE_funcrel) { 1.547 + static const char data[] = { 0x84, 0xf8, 0x14, 0x01, 0x61, 0xd1, 0x48, 0xc9 }; 1.548 + ByteReader reader(ENDIANNESS_BIG); 1.549 + reader.SetAddressSize(4); 1.550 + reader.SetFunctionBase(0x823c3520); 1.551 + DwarfPointerEncoding encoding = 1.552 + DwarfPointerEncoding(dwarf2reader::DW_EH_PE_funcrel 1.553 + | dwarf2reader::DW_EH_PE_udata2); 1.554 + EXPECT_EQ(0x823c3520 + 0xd148, 1.555 + reader.ReadEncodedPointer(data + 5, encoding, &pointer_size)); 1.556 + EXPECT_EQ(2U, pointer_size); 1.557 +} 1.558 + 1.559 +TEST(UsableBase, CFI) { 1.560 + static const char data[1] = { 0x42 }; 1.561 + ByteReader reader(ENDIANNESS_BIG); 1.562 + reader.SetCFIDataBase(0xb31cbd20, data); 1.563 + EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); 1.564 + EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); 1.565 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); 1.566 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); 1.567 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); 1.568 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); 1.569 + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); 1.570 +} 1.571 + 1.572 +TEST(UsableBase, Text) { 1.573 + ByteReader reader(ENDIANNESS_BIG); 1.574 + reader.SetTextBase(0xa899ccb9); 1.575 + EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); 1.576 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); 1.577 + EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); 1.578 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); 1.579 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); 1.580 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); 1.581 + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); 1.582 +} 1.583 + 1.584 +TEST(UsableBase, Data) { 1.585 + ByteReader reader(ENDIANNESS_BIG); 1.586 + reader.SetDataBase(0xf7b10bcd); 1.587 + EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); 1.588 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); 1.589 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); 1.590 + EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); 1.591 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); 1.592 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); 1.593 + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); 1.594 +} 1.595 + 1.596 +TEST(UsableBase, Function) { 1.597 + ByteReader reader(ENDIANNESS_BIG); 1.598 + reader.SetFunctionBase(0xc2c0ed81); 1.599 + EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); 1.600 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); 1.601 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); 1.602 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); 1.603 + EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); 1.604 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); 1.605 + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); 1.606 +} 1.607 + 1.608 +TEST(UsableBase, ClearFunction) { 1.609 + ByteReader reader(ENDIANNESS_BIG); 1.610 + reader.SetFunctionBase(0xc2c0ed81); 1.611 + reader.ClearFunctionBase(); 1.612 + EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr)); 1.613 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel)); 1.614 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel)); 1.615 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel)); 1.616 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel)); 1.617 + EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit)); 1.618 + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); 1.619 +} 1.620 + 1.621 +struct AlignedFixture { 1.622 + AlignedFixture() : reader(ENDIANNESS_BIG) { reader.SetAddressSize(4); } 1.623 + static const char data[10]; 1.624 + ByteReader reader; 1.625 + size_t pointer_size; 1.626 +}; 1.627 + 1.628 +const char AlignedFixture::data[10] = { 1.629 + 0xfe, 0x6e, 0x93, 0xd8, 0x34, 0xd5, 0x1c, 0xd3, 0xac, 0x2b 1.630 +}; 1.631 + 1.632 +class Aligned: public AlignedFixture, public Test { }; 1.633 + 1.634 +TEST_F(Aligned, DW_EH_PE_aligned0) { 1.635 + reader.SetCFIDataBase(0xb440305c, data); 1.636 + EXPECT_EQ(0xfe6e93d8U, 1.637 + reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned, 1.638 + &pointer_size)); 1.639 + EXPECT_EQ(4U, pointer_size); 1.640 +} 1.641 + 1.642 +TEST_F(Aligned, DW_EH_PE_aligned1) { 1.643 + reader.SetCFIDataBase(0xb440305d, data); 1.644 + EXPECT_EQ(0xd834d51cU, 1.645 + reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned, 1.646 + &pointer_size)); 1.647 + EXPECT_EQ(7U, pointer_size); 1.648 +} 1.649 + 1.650 +TEST_F(Aligned, DW_EH_PE_aligned2) { 1.651 + reader.SetCFIDataBase(0xb440305e, data); 1.652 + EXPECT_EQ(0x93d834d5U, 1.653 + reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned, 1.654 + &pointer_size)); 1.655 + EXPECT_EQ(6U, pointer_size); 1.656 +} 1.657 + 1.658 +TEST_F(Aligned, DW_EH_PE_aligned3) { 1.659 + reader.SetCFIDataBase(0xb440305f, data); 1.660 + EXPECT_EQ(0x6e93d834U, 1.661 + reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned, 1.662 + &pointer_size)); 1.663 + EXPECT_EQ(5U, pointer_size); 1.664 +} 1.665 + 1.666 +TEST_F(Aligned, DW_EH_PE_aligned11) { 1.667 + reader.SetCFIDataBase(0xb4403061, data); 1.668 + EXPECT_EQ(0xd834d51cU, 1.669 + reader.ReadEncodedPointer(data + 1, 1.670 + dwarf2reader::DW_EH_PE_aligned, 1.671 + &pointer_size)); 1.672 + EXPECT_EQ(6U, pointer_size); 1.673 +} 1.674 + 1.675 +TEST_F(Aligned, DW_EH_PE_aligned30) { 1.676 + reader.SetCFIDataBase(0xb4403063, data); 1.677 + EXPECT_EQ(0x6e93d834U, 1.678 + reader.ReadEncodedPointer(data + 1, 1.679 + dwarf2reader::DW_EH_PE_aligned, 1.680 + &pointer_size)); 1.681 + EXPECT_EQ(4U, pointer_size); 1.682 +} 1.683 + 1.684 +TEST_F(Aligned, DW_EH_PE_aligned23) { 1.685 + reader.SetCFIDataBase(0xb4403062, data); 1.686 + EXPECT_EQ(0x1cd3ac2bU, 1.687 + reader.ReadEncodedPointer(data + 3, 1.688 + dwarf2reader::DW_EH_PE_aligned, 1.689 + &pointer_size)); 1.690 + EXPECT_EQ(7U, pointer_size); 1.691 +} 1.692 + 1.693 +TEST_F(Aligned, DW_EH_PE_aligned03) { 1.694 + reader.SetCFIDataBase(0xb4403064, data); 1.695 + EXPECT_EQ(0x34d51cd3U, 1.696 + reader.ReadEncodedPointer(data + 3, 1.697 + dwarf2reader::DW_EH_PE_aligned, 1.698 + &pointer_size)); 1.699 + EXPECT_EQ(5U, pointer_size); 1.700 +}