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