172a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris/*
272a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris * Copyright (C) 2016 The Android Open Source Project
372a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris *
472a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris * Licensed under the Apache License, Version 2.0 (the "License");
572a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris * you may not use this file except in compliance with the License.
672a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris * You may obtain a copy of the License at
772a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris *
872a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris *      http://www.apache.org/licenses/LICENSE-2.0
972a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris *
1072a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris * Unless required by applicable law or agreed to in writing, software
1172a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris * distributed under the License is distributed on an "AS IS" BASIS,
1272a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris * See the License for the specific language governing permissions and
1472a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris * limitations under the License.
1572a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris */
1672a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
1772a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris#ifndef _LIBUNWINDSTACK_DWARF_MEMORY_H
1872a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris#define _LIBUNWINDSTACK_DWARF_MEMORY_H
1972a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
2072a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris#include <stdint.h>
2172a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
22d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferrisnamespace unwindstack {
23d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris
2472a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris// Forward declarations.
2572a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferrisclass Memory;
2672a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
2772a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferrisclass DwarfMemory {
2872a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris public:
2972a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  DwarfMemory(Memory* memory) : memory_(memory) {}
3072a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  virtual ~DwarfMemory() = default;
3172a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
3272a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  bool ReadBytes(void* dst, size_t num_bytes);
3372a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
3472a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  template <typename SignedType>
3572a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  bool ReadSigned(uint64_t* value);
3672a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
3772a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  bool ReadULEB128(uint64_t* value);
3872a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
3972a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  bool ReadSLEB128(int64_t* value);
4072a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
4172a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  template <typename AddressType>
4272a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  size_t GetEncodedSize(uint8_t encoding);
4372a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
4472a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  bool AdjustEncodedValue(uint8_t encoding, uint64_t* value);
4572a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
4672a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  template <typename AddressType>
4772a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  bool ReadEncodedValue(uint8_t encoding, uint64_t* value);
4872a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
4972a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  uint64_t cur_offset() { return cur_offset_; }
5072a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  void set_cur_offset(uint64_t cur_offset) { cur_offset_ = cur_offset; }
5172a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
5272a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  void set_pc_offset(uint64_t offset) { pc_offset_ = offset; }
5372a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  void clear_pc_offset() { pc_offset_ = static_cast<uint64_t>(-1); }
5472a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
5572a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  void set_data_offset(uint64_t offset) { data_offset_ = offset; }
5672a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  void clear_data_offset() { data_offset_ = static_cast<uint64_t>(-1); }
5772a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
5872a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  void set_func_offset(uint64_t offset) { func_offset_ = offset; }
5972a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  void clear_func_offset() { func_offset_ = static_cast<uint64_t>(-1); }
6072a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
6172a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  void set_text_offset(uint64_t offset) { text_offset_ = offset; }
6272a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  void clear_text_offset() { text_offset_ = static_cast<uint64_t>(-1); }
6372a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
6472a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris private:
6572a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  Memory* memory_;
6672a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  uint64_t cur_offset_ = 0;
6772a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
6872a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  uint64_t pc_offset_ = static_cast<uint64_t>(-1);
6972a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  uint64_t data_offset_ = static_cast<uint64_t>(-1);
7072a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  uint64_t func_offset_ = static_cast<uint64_t>(-1);
7172a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris  uint64_t text_offset_ = static_cast<uint64_t>(-1);
7272a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris};
7372a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris
74d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris}  // namespace unwindstack
75d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris
7672a6fa693b1d5d0fa2a83264776d73eeeae6478dChristopher Ferris#endif  // _LIBUNWINDSTACK_DWARF_MEMORY_H
77