xref: /aosp_15_r20/system/unwinding/libunwindstack/include/unwindstack/Maps.h (revision eb293b8f56ee8303637c5595cfcdeef8039e85c6)
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