• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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