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_ 108