Home | History | Annotate | Download | only in quipper
      1 // Copyright 2016 The Chromium OS Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROMIUMOS_WIDE_PROFILING_DSO_H_
      6 #define CHROMIUMOS_WIDE_PROFILING_DSO_H_
      7 
      8 #include <sys/stat.h>
      9 
     10 #include <unordered_set>
     11 #include <utility>
     12 
     13 #include "compat/string.h"
     14 #include "data_reader.h"
     15 
     16 namespace quipper {
     17 
     18 // Defines a type for a pid:tid pair.
     19 using PidTid = std::pair<u32, u32>;
     20 
     21 // A struct containing all relevant info for a mapped DSO, independent of any
     22 // samples.
     23 struct DSOInfo {
     24   string name;
     25   string build_id;
     26   u32 maj = 0;
     27   u32 min = 0;
     28   u64 ino = 0;
     29   bool hit = false;  // Have we seen any samples in this DSO?
     30   // unordered_set of pids this DSO had samples in.
     31   std::unordered_set<uint64_t> threads;
     32 };
     33 
     34 // Do the |DSOInfo| and |struct stat| refer to the same inode?
     35 bool SameInode(const DSOInfo& dso, const struct stat* s);
     36 
     37 // Must be called at least once before using libelf.
     38 void InitializeLibelf();
     39 // Read buildid from an ELF file using libelf.
     40 bool ReadElfBuildId(const string& filename, string* buildid);
     41 bool ReadElfBuildId(int fd, string* buildid);
     42 
     43 // Read buildid from /sys/module/<module_name>/notes/.note.gnu.build-id
     44 // (Does not use libelf.)
     45 bool ReadModuleBuildId(const string& module_name, string* buildid);
     46 // Read builid from Elf note data section.
     47 bool ReadBuildIdNote(DataReader* data, string* buildid);
     48 
     49 // Is |name| match one of the things reported by the kernel that is known
     50 // not to be a kernel module?
     51 bool IsKernelNonModuleName(string name);
     52 
     53 }  // namespace quipper
     54 
     55 #endif  // CHROMIUMOS_WIDE_PROFILING_DSO_H_
     56