1*eb293b8fSAndroid Build Coastguard Worker /* 2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*eb293b8fSAndroid Build Coastguard Worker * 4*eb293b8fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*eb293b8fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*eb293b8fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*eb293b8fSAndroid Build Coastguard Worker * 8*eb293b8fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*eb293b8fSAndroid Build Coastguard Worker * 10*eb293b8fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*eb293b8fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*eb293b8fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*eb293b8fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*eb293b8fSAndroid Build Coastguard Worker * limitations under the License. 15*eb293b8fSAndroid Build Coastguard Worker */ 16*eb293b8fSAndroid Build Coastguard Worker 17*eb293b8fSAndroid Build Coastguard Worker #pragma once 18*eb293b8fSAndroid Build Coastguard Worker 19*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h> 20*eb293b8fSAndroid Build Coastguard Worker 21*eb293b8fSAndroid Build Coastguard Worker #include <map> 22*eb293b8fSAndroid Build Coastguard Worker #include <optional> 23*eb293b8fSAndroid Build Coastguard Worker #include <string> 24*eb293b8fSAndroid Build Coastguard Worker #include <unordered_map> 25*eb293b8fSAndroid Build Coastguard Worker 26*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/SharedString.h> 27*eb293b8fSAndroid Build Coastguard Worker 28*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack { 29*eb293b8fSAndroid Build Coastguard Worker 30*eb293b8fSAndroid Build Coastguard Worker // Forward declaration. 31*eb293b8fSAndroid Build Coastguard Worker class Memory; 32*eb293b8fSAndroid Build Coastguard Worker 33*eb293b8fSAndroid Build Coastguard Worker class Symbols { 34*eb293b8fSAndroid Build Coastguard Worker struct Info { 35*eb293b8fSAndroid Build Coastguard Worker uint32_t size; // Symbol size in bytes. 36*eb293b8fSAndroid Build Coastguard Worker uint32_t index; // Index into *sorted* symbol table. 37*eb293b8fSAndroid Build Coastguard Worker SharedString name; 38*eb293b8fSAndroid Build Coastguard Worker }; 39*eb293b8fSAndroid Build Coastguard Worker 40*eb293b8fSAndroid Build Coastguard Worker public: 41*eb293b8fSAndroid Build Coastguard Worker Symbols(uint64_t offset, uint64_t size, uint64_t entry_size, uint64_t str_offset, 42*eb293b8fSAndroid Build Coastguard Worker uint64_t str_size); 43*eb293b8fSAndroid Build Coastguard Worker virtual ~Symbols() = default; 44*eb293b8fSAndroid Build Coastguard Worker 45*eb293b8fSAndroid Build Coastguard Worker template <typename SymType> 46*eb293b8fSAndroid Build Coastguard Worker bool GetName(uint64_t addr, Memory* elf_memory, SharedString* name, uint64_t* func_offset); 47*eb293b8fSAndroid Build Coastguard Worker 48*eb293b8fSAndroid Build Coastguard Worker template <typename SymType> 49*eb293b8fSAndroid Build Coastguard Worker bool GetGlobal(Memory* elf_memory, const std::string& name, uint64_t* memory_address); 50*eb293b8fSAndroid Build Coastguard Worker ClearCache()51*eb293b8fSAndroid Build Coastguard Worker void ClearCache() { 52*eb293b8fSAndroid Build Coastguard Worker symbols_.clear(); 53*eb293b8fSAndroid Build Coastguard Worker remap_.reset(); 54*eb293b8fSAndroid Build Coastguard Worker } 55*eb293b8fSAndroid Build Coastguard Worker 56*eb293b8fSAndroid Build Coastguard Worker private: 57*eb293b8fSAndroid Build Coastguard Worker template <typename SymType, bool RemapIndices> 58*eb293b8fSAndroid Build Coastguard Worker Info* BinarySearch(uint64_t addr, Memory* elf_memory, uint64_t* func_offset); 59*eb293b8fSAndroid Build Coastguard Worker 60*eb293b8fSAndroid Build Coastguard Worker template <typename SymType> 61*eb293b8fSAndroid Build Coastguard Worker void BuildRemapTable(Memory* elf_memory); 62*eb293b8fSAndroid Build Coastguard Worker 63*eb293b8fSAndroid Build Coastguard Worker const uint64_t offset_; 64*eb293b8fSAndroid Build Coastguard Worker const uint64_t count_; 65*eb293b8fSAndroid Build Coastguard Worker const uint64_t entry_size_; 66*eb293b8fSAndroid Build Coastguard Worker const uint64_t str_offset_; 67*eb293b8fSAndroid Build Coastguard Worker uint64_t str_end_; 68*eb293b8fSAndroid Build Coastguard Worker 69*eb293b8fSAndroid Build Coastguard Worker std::map<uint64_t, Info> symbols_; // Cache of read symbols (keyed by function *end* address). 70*eb293b8fSAndroid Build Coastguard Worker std::optional<std::vector<uint32_t>> remap_; // Indices of function symbols sorted by address. 71*eb293b8fSAndroid Build Coastguard Worker 72*eb293b8fSAndroid Build Coastguard Worker // Cache of global data (non-function) symbols. 73*eb293b8fSAndroid Build Coastguard Worker std::unordered_map<std::string, std::optional<uint64_t>> global_variables_; 74*eb293b8fSAndroid Build Coastguard Worker 75*eb293b8fSAndroid Build Coastguard Worker // Do not allow the total number of symbols to go above this. 76*eb293b8fSAndroid Build Coastguard Worker constexpr static size_t kMaxSymbols = 1000000; 77*eb293b8fSAndroid Build Coastguard Worker }; 78*eb293b8fSAndroid Build Coastguard Worker 79*eb293b8fSAndroid Build Coastguard Worker } // namespace unwindstack 80