Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <stdint.h>
     18 
     19 #include <ios>
     20 #include <vector>
     21 
     22 #include <gtest/gtest.h>
     23 
     24 #include <unwindstack/DwarfMemory.h>
     25 
     26 #include "MemoryFake.h"
     27 
     28 namespace unwindstack {
     29 
     30 class DwarfMemoryTest : public ::testing::Test {
     31  protected:
     32   void SetUp() override {
     33     memory_.Clear();
     34     dwarf_mem_.reset(new DwarfMemory(&memory_));
     35   }
     36 
     37   template <typename AddressType>
     38   void GetEncodedSizeTest(uint8_t value, size_t expected);
     39   template <typename AddressType>
     40   void ReadEncodedValue_omit();
     41   template <typename AddressType>
     42   void ReadEncodedValue_leb128();
     43   template <typename AddressType>
     44   void ReadEncodedValue_data1();
     45   template <typename AddressType>
     46   void ReadEncodedValue_data2();
     47   template <typename AddressType>
     48   void ReadEncodedValue_data4();
     49   template <typename AddressType>
     50   void ReadEncodedValue_data8();
     51   template <typename AddressType>
     52   void ReadEncodedValue_non_zero_adjust();
     53   template <typename AddressType>
     54   void ReadEncodedValue_overflow();
     55   template <typename AddressType>
     56   void ReadEncodedValue_high_bit_set();
     57 
     58   MemoryFake memory_;
     59   std::unique_ptr<DwarfMemory> dwarf_mem_;
     60 };
     61 
     62 TEST_F(DwarfMemoryTest, ReadBytes) {
     63   memory_.SetMemory(0, std::vector<uint8_t>{0x10, 0x18, 0xff, 0xfe});
     64 
     65   uint8_t byte;
     66   ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
     67   ASSERT_EQ(0x10U, byte);
     68   ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
     69   ASSERT_EQ(0x18U, byte);
     70   ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
     71   ASSERT_EQ(0xffU, byte);
     72   ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
     73   ASSERT_EQ(0xfeU, byte);
     74   ASSERT_EQ(4U, dwarf_mem_->cur_offset());
     75 
     76   dwarf_mem_->set_cur_offset(2);
     77   ASSERT_TRUE(dwarf_mem_->ReadBytes(&byte, 1));
     78   ASSERT_EQ(0xffU, byte);
     79   ASSERT_EQ(3U, dwarf_mem_->cur_offset());
     80 }
     81 
     82 TEST_F(DwarfMemoryTest, ReadSigned_check) {
     83   uint64_t value;
     84 
     85   // Signed 8 byte reads.
     86   memory_.SetData8(0, static_cast<uint8_t>(-10));
     87   memory_.SetData8(1, 200);
     88   ASSERT_TRUE(dwarf_mem_->ReadSigned<int8_t>(&value));
     89   ASSERT_EQ(static_cast<int8_t>(-10), static_cast<int8_t>(value));
     90   ASSERT_TRUE(dwarf_mem_->ReadSigned<int8_t>(&value));
     91   ASSERT_EQ(static_cast<int8_t>(200), static_cast<int8_t>(value));
     92 
     93   // Signed 16 byte reads.
     94   memory_.SetData16(0x10, static_cast<uint16_t>(-1000));
     95   memory_.SetData16(0x12, 50100);
     96   dwarf_mem_->set_cur_offset(0x10);
     97   ASSERT_TRUE(dwarf_mem_->ReadSigned<int16_t>(&value));
     98   ASSERT_EQ(static_cast<int16_t>(-1000), static_cast<int16_t>(value));
     99   ASSERT_TRUE(dwarf_mem_->ReadSigned<int16_t>(&value));
    100   ASSERT_EQ(static_cast<int16_t>(50100), static_cast<int16_t>(value));
    101 
    102   // Signed 32 byte reads.
    103   memory_.SetData32(0x100, static_cast<uint32_t>(-1000000000));
    104   memory_.SetData32(0x104, 3000000000);
    105   dwarf_mem_->set_cur_offset(0x100);
    106   ASSERT_TRUE(dwarf_mem_->ReadSigned<int32_t>(&value));
    107   ASSERT_EQ(static_cast<int32_t>(-1000000000), static_cast<int32_t>(value));
    108   ASSERT_TRUE(dwarf_mem_->ReadSigned<int32_t>(&value));
    109   ASSERT_EQ(static_cast<int32_t>(3000000000), static_cast<int32_t>(value));
    110 
    111   // Signed 64 byte reads.
    112   memory_.SetData64(0x200, static_cast<uint64_t>(-2000000000000LL));
    113   memory_.SetData64(0x208, 5000000000000LL);
    114   dwarf_mem_->set_cur_offset(0x200);
    115   ASSERT_TRUE(dwarf_mem_->ReadSigned<int64_t>(&value));
    116   ASSERT_EQ(static_cast<int64_t>(-2000000000000), static_cast<int64_t>(value));
    117   ASSERT_TRUE(dwarf_mem_->ReadSigned<int64_t>(&value));
    118   ASSERT_EQ(static_cast<int64_t>(5000000000000), static_cast<int64_t>(value));
    119 }
    120 
    121 TEST_F(DwarfMemoryTest, ReadULEB128) {
    122   memory_.SetMemory(0, std::vector<uint8_t>{0x01, 0x80, 0x24, 0xff, 0xc3, 0xff, 0x7f});
    123 
    124   uint64_t value;
    125   ASSERT_TRUE(dwarf_mem_->ReadULEB128(&value));
    126   ASSERT_EQ(1U, dwarf_mem_->cur_offset());
    127   ASSERT_EQ(1U, value);
    128 
    129   ASSERT_TRUE(dwarf_mem_->ReadULEB128(&value));
    130   ASSERT_EQ(3U, dwarf_mem_->cur_offset());
    131   ASSERT_EQ(0x1200U, value);
    132 
    133   ASSERT_TRUE(dwarf_mem_->ReadULEB128(&value));
    134   ASSERT_EQ(7U, dwarf_mem_->cur_offset());
    135   ASSERT_EQ(0xfffe1ffU, value);
    136 }
    137 
    138 TEST_F(DwarfMemoryTest, ReadSLEB128) {
    139   memory_.SetMemory(0, std::vector<uint8_t>{0x06, 0x40, 0x82, 0x34, 0x89, 0x64, 0xf9, 0xc3, 0x8f,
    140                                             0x2f, 0xbf, 0xc3, 0xf7, 0x5f});
    141 
    142   int64_t value;
    143   ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
    144   ASSERT_EQ(1U, dwarf_mem_->cur_offset());
    145   ASSERT_EQ(6U, value);
    146 
    147   ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
    148   ASSERT_EQ(2U, dwarf_mem_->cur_offset());
    149   ASSERT_EQ(0xffffffffffffffc0ULL, static_cast<uint64_t>(value));
    150 
    151   ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
    152   ASSERT_EQ(4U, dwarf_mem_->cur_offset());
    153   ASSERT_EQ(0x1a02U, value);
    154 
    155   ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
    156   ASSERT_EQ(6U, dwarf_mem_->cur_offset());
    157   ASSERT_EQ(0xfffffffffffff209ULL, static_cast<uint64_t>(value));
    158 
    159   ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
    160   ASSERT_EQ(10U, dwarf_mem_->cur_offset());
    161   ASSERT_EQ(0x5e3e1f9U, value);
    162 
    163   ASSERT_TRUE(dwarf_mem_->ReadSLEB128(&value));
    164   ASSERT_EQ(14U, dwarf_mem_->cur_offset());
    165   ASSERT_EQ(0xfffffffffbfde1bfULL, static_cast<uint64_t>(value));
    166 }
    167 
    168 template <typename AddressType>
    169 void DwarfMemoryTest::GetEncodedSizeTest(uint8_t value, size_t expected) {
    170   for (size_t i = 0; i < 16; i++) {
    171     uint8_t encoding = (i << 4) | value;
    172     ASSERT_EQ(expected, dwarf_mem_->GetEncodedSize<AddressType>(encoding))
    173         << "encoding 0x" << std::hex << static_cast<uint32_t>(encoding) << " test value 0x"
    174         << static_cast<size_t>(value);
    175   }
    176 }
    177 
    178 TEST_F(DwarfMemoryTest, GetEncodedSize_absptr_uint32_t) {
    179   GetEncodedSizeTest<uint32_t>(0, sizeof(uint32_t));
    180 }
    181 
    182 TEST_F(DwarfMemoryTest, GetEncodedSize_absptr_uint64_t) {
    183   GetEncodedSizeTest<uint64_t>(0, sizeof(uint64_t));
    184 }
    185 
    186 TEST_F(DwarfMemoryTest, GetEncodedSize_data1) {
    187   // udata1
    188   GetEncodedSizeTest<uint32_t>(0x0d, 1);
    189   GetEncodedSizeTest<uint64_t>(0x0d, 1);
    190 
    191   // sdata1
    192   GetEncodedSizeTest<uint32_t>(0x0e, 1);
    193   GetEncodedSizeTest<uint64_t>(0x0e, 1);
    194 }
    195 
    196 TEST_F(DwarfMemoryTest, GetEncodedSize_data2) {
    197   // udata2
    198   GetEncodedSizeTest<uint32_t>(0x02, 2);
    199   GetEncodedSizeTest<uint64_t>(0x02, 2);
    200 
    201   // sdata2
    202   GetEncodedSizeTest<uint32_t>(0x0a, 2);
    203   GetEncodedSizeTest<uint64_t>(0x0a, 2);
    204 }
    205 
    206 TEST_F(DwarfMemoryTest, GetEncodedSize_data4) {
    207   // udata4
    208   GetEncodedSizeTest<uint32_t>(0x03, 4);
    209   GetEncodedSizeTest<uint64_t>(0x03, 4);
    210 
    211   // sdata4
    212   GetEncodedSizeTest<uint32_t>(0x0b, 4);
    213   GetEncodedSizeTest<uint64_t>(0x0b, 4);
    214 }
    215 
    216 TEST_F(DwarfMemoryTest, GetEncodedSize_data8) {
    217   // udata8
    218   GetEncodedSizeTest<uint32_t>(0x04, 8);
    219   GetEncodedSizeTest<uint64_t>(0x04, 8);
    220 
    221   // sdata8
    222   GetEncodedSizeTest<uint32_t>(0x0c, 8);
    223   GetEncodedSizeTest<uint64_t>(0x0c, 8);
    224 }
    225 
    226 TEST_F(DwarfMemoryTest, GetEncodedSize_unknown) {
    227   GetEncodedSizeTest<uint32_t>(0x01, 0);
    228   GetEncodedSizeTest<uint64_t>(0x01, 0);
    229 
    230   GetEncodedSizeTest<uint32_t>(0x09, 0);
    231   GetEncodedSizeTest<uint64_t>(0x09, 0);
    232 
    233   GetEncodedSizeTest<uint32_t>(0x0f, 0);
    234   GetEncodedSizeTest<uint64_t>(0x0f, 0);
    235 }
    236 
    237 template <typename AddressType>
    238 void DwarfMemoryTest::ReadEncodedValue_omit() {
    239   uint64_t value = 123;
    240   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0xff, &value));
    241   ASSERT_EQ(0U, value);
    242 }
    243 
    244 TEST_F(DwarfMemoryTest, ReadEncodedValue_omit_uint32_t) {
    245   ReadEncodedValue_omit<uint32_t>();
    246 }
    247 
    248 TEST_F(DwarfMemoryTest, ReadEncodedValue_omit_uint64_t) {
    249   ReadEncodedValue_omit<uint64_t>();
    250 }
    251 
    252 TEST_F(DwarfMemoryTest, ReadEncodedValue_absptr_uint32_t) {
    253   uint64_t value = 100;
    254   ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<uint32_t>(0x00, &value));
    255 
    256   memory_.SetData32(0, 0x12345678);
    257 
    258   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<uint32_t>(0x00, &value));
    259   ASSERT_EQ(4U, dwarf_mem_->cur_offset());
    260   ASSERT_EQ(0x12345678U, value);
    261 }
    262 
    263 TEST_F(DwarfMemoryTest, ReadEncodedValue_absptr_uint64_t) {
    264   uint64_t value = 100;
    265   ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<uint64_t>(0x00, &value));
    266 
    267   memory_.SetData64(0, 0x12345678f1f2f3f4ULL);
    268 
    269   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<uint64_t>(0x00, &value));
    270   ASSERT_EQ(8U, dwarf_mem_->cur_offset());
    271   ASSERT_EQ(0x12345678f1f2f3f4ULL, value);
    272 }
    273 
    274 TEST_F(DwarfMemoryTest, ReadEncodedValue_aligned_uint32_t) {
    275   uint64_t value = 100;
    276   dwarf_mem_->set_cur_offset(1);
    277   ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<uint32_t>(0x50, &value));
    278 
    279   memory_.SetData32(4, 0x12345678);
    280 
    281   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<uint32_t>(0x50, &value));
    282   ASSERT_EQ(8U, dwarf_mem_->cur_offset());
    283   ASSERT_EQ(0x12345678U, value);
    284 }
    285 
    286 TEST_F(DwarfMemoryTest, ReadEncodedValue_aligned_uint64_t) {
    287   uint64_t value = 100;
    288   dwarf_mem_->set_cur_offset(1);
    289   ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<uint64_t>(0x50, &value));
    290 
    291   memory_.SetData64(8, 0x12345678f1f2f3f4ULL);
    292 
    293   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<uint64_t>(0x50, &value));
    294   ASSERT_EQ(16U, dwarf_mem_->cur_offset());
    295   ASSERT_EQ(0x12345678f1f2f3f4ULL, value);
    296 }
    297 
    298 template <typename AddressType>
    299 void DwarfMemoryTest::ReadEncodedValue_leb128() {
    300   memory_.SetMemory(0, std::vector<uint8_t>{0x80, 0x42});
    301 
    302   uint64_t value = 100;
    303   // uleb128
    304   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x01, &value));
    305   ASSERT_EQ(0x2100U, value);
    306 
    307   dwarf_mem_->set_cur_offset(0);
    308   // sleb128
    309   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x09, &value));
    310   ASSERT_EQ(0xffffffffffffe100ULL, value);
    311 }
    312 
    313 TEST_F(DwarfMemoryTest, ReadEncodedValue_leb128_uint32_t) {
    314   ReadEncodedValue_leb128<uint32_t>();
    315 }
    316 
    317 TEST_F(DwarfMemoryTest, ReadEncodedValue_leb128_uint64_t) {
    318   ReadEncodedValue_leb128<uint64_t>();
    319 }
    320 
    321 template <typename AddressType>
    322 void DwarfMemoryTest::ReadEncodedValue_data1() {
    323   memory_.SetData8(0, 0xe0);
    324 
    325   uint64_t value = 0;
    326   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0d, &value));
    327   ASSERT_EQ(0xe0U, value);
    328 
    329   dwarf_mem_->set_cur_offset(0);
    330   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0e, &value));
    331   ASSERT_EQ(0xffffffffffffffe0ULL, value);
    332 }
    333 
    334 TEST_F(DwarfMemoryTest, ReadEncodedValue_data1_uint32_t) {
    335   ReadEncodedValue_data1<uint32_t>();
    336 }
    337 
    338 TEST_F(DwarfMemoryTest, ReadEncodedValue_data1_uint64_t) {
    339   ReadEncodedValue_data1<uint64_t>();
    340 }
    341 
    342 template <typename AddressType>
    343 void DwarfMemoryTest::ReadEncodedValue_data2() {
    344   memory_.SetData16(0, 0xe000);
    345 
    346   uint64_t value = 0;
    347   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x02, &value));
    348   ASSERT_EQ(0xe000U, value);
    349 
    350   dwarf_mem_->set_cur_offset(0);
    351   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0a, &value));
    352   ASSERT_EQ(0xffffffffffffe000ULL, value);
    353 }
    354 
    355 TEST_F(DwarfMemoryTest, ReadEncodedValue_data2_uint32_t) {
    356   ReadEncodedValue_data2<uint32_t>();
    357 }
    358 
    359 TEST_F(DwarfMemoryTest, ReadEncodedValue_data2_uint64_t) {
    360   ReadEncodedValue_data2<uint64_t>();
    361 }
    362 
    363 template <typename AddressType>
    364 void DwarfMemoryTest::ReadEncodedValue_data4() {
    365   memory_.SetData32(0, 0xe0000000);
    366 
    367   uint64_t value = 0;
    368   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x03, &value));
    369   ASSERT_EQ(0xe0000000U, value);
    370 
    371   dwarf_mem_->set_cur_offset(0);
    372   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0b, &value));
    373   ASSERT_EQ(0xffffffffe0000000ULL, value);
    374 }
    375 
    376 TEST_F(DwarfMemoryTest, ReadEncodedValue_data4_uint32_t) {
    377   ReadEncodedValue_data4<uint32_t>();
    378 }
    379 
    380 TEST_F(DwarfMemoryTest, ReadEncodedValue_data4_uint64_t) {
    381   ReadEncodedValue_data4<uint64_t>();
    382 }
    383 
    384 template <typename AddressType>
    385 void DwarfMemoryTest::ReadEncodedValue_data8() {
    386   memory_.SetData64(0, 0xe000000000000000ULL);
    387 
    388   uint64_t value = 0;
    389   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x04, &value));
    390   ASSERT_EQ(0xe000000000000000ULL, value);
    391 
    392   dwarf_mem_->set_cur_offset(0);
    393   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x0c, &value));
    394   ASSERT_EQ(0xe000000000000000ULL, value);
    395 }
    396 
    397 TEST_F(DwarfMemoryTest, ReadEncodedValue_data8_uint32_t) {
    398   ReadEncodedValue_data8<uint32_t>();
    399 }
    400 
    401 TEST_F(DwarfMemoryTest, ReadEncodedValue_data8_uint64_t) {
    402   ReadEncodedValue_data8<uint64_t>();
    403 }
    404 
    405 template <typename AddressType>
    406 void DwarfMemoryTest::ReadEncodedValue_non_zero_adjust() {
    407   memory_.SetData64(0, 0xe000000000000000ULL);
    408 
    409   uint64_t value = 0;
    410   dwarf_mem_->set_pc_offset(0x2000);
    411   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0x14, &value));
    412   ASSERT_EQ(0xe000000000002000ULL, value);
    413 }
    414 
    415 TEST_F(DwarfMemoryTest, ReadEncodedValue_non_zero_adjust_uint32_t) {
    416   ReadEncodedValue_non_zero_adjust<uint32_t>();
    417 }
    418 
    419 TEST_F(DwarfMemoryTest, ReadEncodedValue_non_zero_adjust_uint64_t) {
    420   ReadEncodedValue_non_zero_adjust<uint64_t>();
    421 }
    422 
    423 template <typename AddressType>
    424 void DwarfMemoryTest::ReadEncodedValue_overflow() {
    425   memory_.SetData64(0, 0);
    426 
    427   uint64_t value = 0;
    428   dwarf_mem_->set_cur_offset(UINT64_MAX);
    429   ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<AddressType>(0x50, &value));
    430 }
    431 
    432 TEST_F(DwarfMemoryTest, ReadEncodedValue_overflow_uint32_t) {
    433   ReadEncodedValue_overflow<uint32_t>();
    434 }
    435 
    436 TEST_F(DwarfMemoryTest, ReadEncodedValue_overflow_uint64_t) {
    437   ReadEncodedValue_overflow<uint64_t>();
    438 }
    439 
    440 template <typename AddressType>
    441 void DwarfMemoryTest::ReadEncodedValue_high_bit_set() {
    442   uint64_t value;
    443   memory_.SetData32(0, 0x15234);
    444   ASSERT_FALSE(dwarf_mem_->ReadEncodedValue<AddressType>(0xc3, &value));
    445 
    446   dwarf_mem_->set_func_offset(0x60000);
    447   dwarf_mem_->set_cur_offset(0);
    448   ASSERT_TRUE(dwarf_mem_->ReadEncodedValue<AddressType>(0xc3, &value));
    449   ASSERT_EQ(0x75234U, value);
    450 }
    451 
    452 TEST_F(DwarfMemoryTest, ReadEncodedValue_high_bit_set_uint32_t) {
    453   ReadEncodedValue_high_bit_set<uint32_t>();
    454 }
    455 
    456 TEST_F(DwarfMemoryTest, ReadEncodedValue_high_bit_set_uint64_t) {
    457   ReadEncodedValue_high_bit_set<uint64_t>();
    458 }
    459 
    460 TEST_F(DwarfMemoryTest, AdjustEncodedValue_absptr) {
    461   uint64_t value = 0x1234;
    462   ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x00, &value));
    463   ASSERT_EQ(0x1234U, value);
    464 }
    465 
    466 TEST_F(DwarfMemoryTest, AdjustEncodedValue_pcrel) {
    467   uint64_t value = 0x1234;
    468   ASSERT_FALSE(dwarf_mem_->AdjustEncodedValue(0x10, &value));
    469 
    470   dwarf_mem_->set_pc_offset(0x2000);
    471   ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x10, &value));
    472   ASSERT_EQ(0x3234U, value);
    473 
    474   dwarf_mem_->set_pc_offset(static_cast<uint64_t>(-4));
    475   value = 0x1234;
    476   ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x10, &value));
    477   ASSERT_EQ(0x1230U, value);
    478 }
    479 
    480 TEST_F(DwarfMemoryTest, AdjustEncodedValue_textrel) {
    481   uint64_t value = 0x8234;
    482   ASSERT_FALSE(dwarf_mem_->AdjustEncodedValue(0x20, &value));
    483 
    484   dwarf_mem_->set_text_offset(0x1000);
    485   ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x20, &value));
    486   ASSERT_EQ(0x9234U, value);
    487 
    488   dwarf_mem_->set_text_offset(static_cast<uint64_t>(-16));
    489   value = 0x8234;
    490   ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x20, &value));
    491   ASSERT_EQ(0x8224U, value);
    492 }
    493 
    494 TEST_F(DwarfMemoryTest, AdjustEncodedValue_datarel) {
    495   uint64_t value = 0xb234;
    496   ASSERT_FALSE(dwarf_mem_->AdjustEncodedValue(0x30, &value));
    497 
    498   dwarf_mem_->set_data_offset(0x1200);
    499   ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x30, &value));
    500   ASSERT_EQ(0xc434U, value);
    501 
    502   dwarf_mem_->set_data_offset(static_cast<uint64_t>(-256));
    503   value = 0xb234;
    504   ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x30, &value));
    505   ASSERT_EQ(0xb134U, value);
    506 }
    507 
    508 TEST_F(DwarfMemoryTest, AdjustEncodedValue_funcrel) {
    509   uint64_t value = 0x15234;
    510   ASSERT_FALSE(dwarf_mem_->AdjustEncodedValue(0x40, &value));
    511 
    512   dwarf_mem_->set_func_offset(0x60000);
    513   ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x40, &value));
    514   ASSERT_EQ(0x75234U, value);
    515 
    516   dwarf_mem_->set_func_offset(static_cast<uint64_t>(-4096));
    517   value = 0x15234;
    518   ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x40, &value));
    519   ASSERT_EQ(0x14234U, value);
    520 }
    521 
    522 }  // namespace unwindstack
    523