Home | History | Annotate | Download | only in simpleperf
      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