OSDN Git Service

ANRdaemon: move trace result from /sdcard to /data am: d93aa41807
[android-x86/system-extras.git] / simpleperf / dso.h
1 /*
2  * Copyright (C) 2015 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 #ifndef SIMPLE_PERF_DSO_H_
18 #define SIMPLE_PERF_DSO_H_
19
20 #include <memory>
21 #include <string>
22 #include <unordered_map>
23 #include <vector>
24
25 #include "build_id.h"
26
27 struct Symbol {
28   uint64_t addr;
29   uint64_t len;
30
31   Symbol(const std::string& name, uint64_t addr, uint64_t len);
32   const char* Name() const {
33     return name_;
34   }
35
36   const char* DemangledName() const;
37
38  private:
39   const char* name_;
40   mutable const char* demangled_name_;
41 };
42
43 enum DsoType {
44   DSO_KERNEL,
45   DSO_KERNEL_MODULE,
46   DSO_ELF_FILE,
47 };
48
49 struct KernelSymbol;
50 struct ElfFileSymbol;
51
52 struct Dso {
53  public:
54   static void SetDemangle(bool demangle);
55   static std::string Demangle(const std::string& name);
56   static bool SetSymFsDir(const std::string& symfs_dir);
57   static void SetVmlinux(const std::string& vmlinux);
58   static void SetBuildIds(const std::vector<std::pair<std::string, BuildId>>& build_ids);
59
60   static std::unique_ptr<Dso> CreateDso(DsoType dso_type, const std::string& dso_path = "");
61
62   ~Dso();
63
64   // Return the path recorded in perf.data.
65   const std::string& Path() const {
66     return path_;
67   }
68
69   // Return the accessible path. It may be the same as Path(), or
70   // return the path with prefix set by SetSymFsDir().
71   std::string GetAccessiblePath() const;
72
73   // Return the minimum virtual address in program header.
74   uint64_t MinVirtualAddress();
75
76   const Symbol* FindSymbol(uint64_t vaddr_in_dso);
77
78  private:
79   static BuildId GetExpectedBuildId(const std::string& filename);
80   static bool KernelSymbolCallback(const KernelSymbol& kernel_symbol, Dso* dso);
81   static void VmlinuxSymbolCallback(const ElfFileSymbol& elf_symbol, Dso* dso);
82   static void ElfFileSymbolCallback(const ElfFileSymbol& elf_symbol, Dso* dso,
83                                     bool (*filter)(const ElfFileSymbol&));
84
85   static bool demangle_;
86   static std::string symfs_dir_;
87   static std::string vmlinux_;
88   static std::unordered_map<std::string, BuildId> build_id_map_;
89   static size_t dso_count_;
90
91   Dso(DsoType type, const std::string& path);
92   bool Load();
93   bool LoadKernel();
94   bool LoadKernelModule();
95   bool LoadElfFile();
96   bool LoadEmbeddedElfFile();
97   void InsertSymbol(const Symbol& symbol);
98   void FixupSymbolLength();
99
100   const DsoType type_;
101   const std::string path_;
102   uint64_t min_vaddr_;
103   std::vector<Symbol> symbols_;
104   bool is_loaded_;
105 };
106
107 #endif  // SIMPLE_PERF_DSO_H_