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 <pthread.h> 20*eb293b8fSAndroid Build Coastguard Worker #include <sys/types.h> 21*eb293b8fSAndroid Build Coastguard Worker #include <unistd.h> 22*eb293b8fSAndroid Build Coastguard Worker 23*eb293b8fSAndroid Build Coastguard Worker #include <memory> 24*eb293b8fSAndroid Build Coastguard Worker #include <string> 25*eb293b8fSAndroid Build Coastguard Worker #include <vector> 26*eb293b8fSAndroid Build Coastguard Worker 27*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/MapInfo.h> 28*eb293b8fSAndroid Build Coastguard Worker 29*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack { 30*eb293b8fSAndroid Build Coastguard Worker 31*eb293b8fSAndroid Build Coastguard Worker // Special flag to indicate a map is in /dev/. However, a map in 32*eb293b8fSAndroid Build Coastguard Worker // /dev/ashmem/... does not set this flag. 33*eb293b8fSAndroid Build Coastguard Worker static constexpr int MAPS_FLAGS_DEVICE_MAP = 0x8000; 34*eb293b8fSAndroid Build Coastguard Worker // Special flag to indicate that this map represents an elf file 35*eb293b8fSAndroid Build Coastguard Worker // created by ART for use with the gdb jit debug interface. 36*eb293b8fSAndroid Build Coastguard Worker // This should only ever appear in offline maps data. 37*eb293b8fSAndroid Build Coastguard Worker static constexpr int MAPS_FLAGS_JIT_SYMFILE_MAP = 0x4000; 38*eb293b8fSAndroid Build Coastguard Worker 39*eb293b8fSAndroid Build Coastguard Worker class Maps { 40*eb293b8fSAndroid Build Coastguard Worker public: 41*eb293b8fSAndroid Build Coastguard Worker virtual ~Maps() = default; 42*eb293b8fSAndroid Build Coastguard Worker 43*eb293b8fSAndroid Build Coastguard Worker Maps() = default; 44*eb293b8fSAndroid Build Coastguard Worker 45*eb293b8fSAndroid Build Coastguard Worker // Maps are not copyable but movable, because they own pointers to MapInfo 46*eb293b8fSAndroid Build Coastguard Worker // objects. 47*eb293b8fSAndroid Build Coastguard Worker Maps(const Maps&) = delete; 48*eb293b8fSAndroid Build Coastguard Worker Maps& operator=(const Maps&) = delete; 49*eb293b8fSAndroid Build Coastguard Worker Maps(Maps&&) = default; 50*eb293b8fSAndroid Build Coastguard Worker Maps& operator=(Maps&&) = default; 51*eb293b8fSAndroid Build Coastguard Worker 52*eb293b8fSAndroid Build Coastguard Worker virtual std::shared_ptr<MapInfo> Find(uint64_t pc); 53*eb293b8fSAndroid Build Coastguard Worker 54*eb293b8fSAndroid Build Coastguard Worker virtual bool Parse(); 55*eb293b8fSAndroid Build Coastguard Worker GetMapsFile()56*eb293b8fSAndroid Build Coastguard Worker virtual const std::string GetMapsFile() const { return ""; } 57*eb293b8fSAndroid Build Coastguard Worker ForEachMapInfo(std::function<bool (MapInfo *)> const & find_var)58*eb293b8fSAndroid Build Coastguard Worker virtual void ForEachMapInfo(std::function<bool(MapInfo*)> const& find_var) { 59*eb293b8fSAndroid Build Coastguard Worker for (const auto& info : maps_) { 60*eb293b8fSAndroid Build Coastguard Worker if (!find_var(info.get())) break; 61*eb293b8fSAndroid Build Coastguard Worker } 62*eb293b8fSAndroid Build Coastguard Worker } 63*eb293b8fSAndroid Build Coastguard Worker 64*eb293b8fSAndroid Build Coastguard Worker void Add(uint64_t start, uint64_t end, uint64_t offset, uint64_t flags, const std::string& name); 65*eb293b8fSAndroid Build Coastguard Worker void Add(uint64_t start, uint64_t end, uint64_t offset, uint64_t flags, const std::string& name, 66*eb293b8fSAndroid Build Coastguard Worker uint64_t load_bias); 67*eb293b8fSAndroid Build Coastguard Worker 68*eb293b8fSAndroid Build Coastguard Worker void Sort(); 69*eb293b8fSAndroid Build Coastguard Worker 70*eb293b8fSAndroid Build Coastguard Worker typedef std::vector<std::shared_ptr<MapInfo>>::iterator iterator; begin()71*eb293b8fSAndroid Build Coastguard Worker iterator begin() { return maps_.begin(); } end()72*eb293b8fSAndroid Build Coastguard Worker iterator end() { return maps_.end(); } 73*eb293b8fSAndroid Build Coastguard Worker 74*eb293b8fSAndroid Build Coastguard Worker typedef std::vector<std::shared_ptr<MapInfo>>::const_iterator const_iterator; begin()75*eb293b8fSAndroid Build Coastguard Worker const_iterator begin() const { return maps_.begin(); } end()76*eb293b8fSAndroid Build Coastguard Worker const_iterator end() const { return maps_.end(); } 77*eb293b8fSAndroid Build Coastguard Worker Total()78*eb293b8fSAndroid Build Coastguard Worker size_t Total() { return maps_.size(); } 79*eb293b8fSAndroid Build Coastguard Worker Get(size_t index)80*eb293b8fSAndroid Build Coastguard Worker std::shared_ptr<MapInfo> Get(size_t index) { 81*eb293b8fSAndroid Build Coastguard Worker if (index >= maps_.size()) return nullptr; 82*eb293b8fSAndroid Build Coastguard Worker return maps_[index]; 83*eb293b8fSAndroid Build Coastguard Worker } 84*eb293b8fSAndroid Build Coastguard Worker 85*eb293b8fSAndroid Build Coastguard Worker protected: 86*eb293b8fSAndroid Build Coastguard Worker std::vector<std::shared_ptr<MapInfo>> maps_; 87*eb293b8fSAndroid Build Coastguard Worker }; 88*eb293b8fSAndroid Build Coastguard Worker 89*eb293b8fSAndroid Build Coastguard Worker class RemoteMaps : public Maps { 90*eb293b8fSAndroid Build Coastguard Worker public: RemoteMaps(pid_t pid)91*eb293b8fSAndroid Build Coastguard Worker RemoteMaps(pid_t pid) : pid_(pid) {} 92*eb293b8fSAndroid Build Coastguard Worker virtual ~RemoteMaps() = default; 93*eb293b8fSAndroid Build Coastguard Worker 94*eb293b8fSAndroid Build Coastguard Worker virtual const std::string GetMapsFile() const override; 95*eb293b8fSAndroid Build Coastguard Worker 96*eb293b8fSAndroid Build Coastguard Worker private: 97*eb293b8fSAndroid Build Coastguard Worker pid_t pid_; 98*eb293b8fSAndroid Build Coastguard Worker }; 99*eb293b8fSAndroid Build Coastguard Worker 100*eb293b8fSAndroid Build Coastguard Worker class LocalMaps : public RemoteMaps { 101*eb293b8fSAndroid Build Coastguard Worker public: LocalMaps()102*eb293b8fSAndroid Build Coastguard Worker LocalMaps() : RemoteMaps(getpid()) {} 103*eb293b8fSAndroid Build Coastguard Worker virtual ~LocalMaps() = default; 104*eb293b8fSAndroid Build Coastguard Worker }; 105*eb293b8fSAndroid Build Coastguard Worker 106*eb293b8fSAndroid Build Coastguard Worker class LocalUpdatableMaps : public Maps { 107*eb293b8fSAndroid Build Coastguard Worker public: 108*eb293b8fSAndroid Build Coastguard Worker LocalUpdatableMaps(); 109*eb293b8fSAndroid Build Coastguard Worker virtual ~LocalUpdatableMaps() = default; 110*eb293b8fSAndroid Build Coastguard Worker 111*eb293b8fSAndroid Build Coastguard Worker std::shared_ptr<MapInfo> Find(uint64_t pc) override; 112*eb293b8fSAndroid Build Coastguard Worker 113*eb293b8fSAndroid Build Coastguard Worker bool Parse() override; 114*eb293b8fSAndroid Build Coastguard Worker 115*eb293b8fSAndroid Build Coastguard Worker const std::string GetMapsFile() const override; 116*eb293b8fSAndroid Build Coastguard Worker 117*eb293b8fSAndroid Build Coastguard Worker virtual void ForEachMapInfo(std::function<bool(MapInfo*)> const& find_var) override; 118*eb293b8fSAndroid Build Coastguard Worker 119*eb293b8fSAndroid Build Coastguard Worker bool Reparse(/*out*/ bool* any_changed = nullptr); 120*eb293b8fSAndroid Build Coastguard Worker 121*eb293b8fSAndroid Build Coastguard Worker private: 122*eb293b8fSAndroid Build Coastguard Worker pthread_rwlock_t maps_rwlock_; 123*eb293b8fSAndroid Build Coastguard Worker }; 124*eb293b8fSAndroid Build Coastguard Worker 125*eb293b8fSAndroid Build Coastguard Worker class BufferMaps : public Maps { 126*eb293b8fSAndroid Build Coastguard Worker public: BufferMaps(const char * buffer)127*eb293b8fSAndroid Build Coastguard Worker BufferMaps(const char* buffer) : buffer_(buffer) {} 128*eb293b8fSAndroid Build Coastguard Worker virtual ~BufferMaps() = default; 129*eb293b8fSAndroid Build Coastguard Worker 130*eb293b8fSAndroid Build Coastguard Worker bool Parse() override; 131*eb293b8fSAndroid Build Coastguard Worker 132*eb293b8fSAndroid Build Coastguard Worker private: 133*eb293b8fSAndroid Build Coastguard Worker const char* buffer_; 134*eb293b8fSAndroid Build Coastguard Worker }; 135*eb293b8fSAndroid Build Coastguard Worker 136*eb293b8fSAndroid Build Coastguard Worker class FileMaps : public Maps { 137*eb293b8fSAndroid Build Coastguard Worker public: FileMaps(const std::string & file)138*eb293b8fSAndroid Build Coastguard Worker FileMaps(const std::string& file) : file_(file) {} 139*eb293b8fSAndroid Build Coastguard Worker virtual ~FileMaps() = default; 140*eb293b8fSAndroid Build Coastguard Worker GetMapsFile()141*eb293b8fSAndroid Build Coastguard Worker const std::string GetMapsFile() const override { return file_; } 142*eb293b8fSAndroid Build Coastguard Worker 143*eb293b8fSAndroid Build Coastguard Worker protected: 144*eb293b8fSAndroid Build Coastguard Worker const std::string file_; 145*eb293b8fSAndroid Build Coastguard Worker }; 146*eb293b8fSAndroid Build Coastguard Worker 147*eb293b8fSAndroid Build Coastguard Worker } // namespace unwindstack 148