// Copyright 2016 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROMIUMOS_WIDE_PROFILING_DSO_H_ #define CHROMIUMOS_WIDE_PROFILING_DSO_H_ #include <sys/stat.h> #include <unordered_set> #include <utility> #include "compat/string.h" #include "data_reader.h" namespace quipper { // Defines a type for a pid:tid pair. using PidTid = std::pair<u32, u32>; // A struct containing all relevant info for a mapped DSO, independent of any // samples. struct DSOInfo { string name; string build_id; u32 maj = 0; u32 min = 0; u64 ino = 0; bool hit = false; // Have we seen any samples in this DSO? // unordered_set of pids this DSO had samples in. std::unordered_set<uint64_t> threads; }; // Do the |DSOInfo| and |struct stat| refer to the same inode? bool SameInode(const DSOInfo& dso, const struct stat* s); // Must be called at least once before using libelf. void InitializeLibelf(); // Read buildid from an ELF file using libelf. bool ReadElfBuildId(const string& filename, string* buildid); bool ReadElfBuildId(int fd, string* buildid); // Read buildid from /sys/module/<module_name>/notes/.note.gnu.build-id // (Does not use libelf.) bool ReadModuleBuildId(const string& module_name, string* buildid); // Read builid from Elf note data section. bool ReadBuildIdNote(DataReader* data, string* buildid); // Is |name| match one of the things reported by the kernel that is known // not to be a kernel module? bool IsKernelNonModuleName(string name); } // namespace quipper #endif // CHROMIUMOS_WIDE_PROFILING_DSO_H_