blob: 52e17db4f50ce46eefa74955240ced0e57617cb9 [file] [log] [blame]
//===- bolt/Passes/CallGraph.h ----------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef BOLT_PASSES_BINARY_FUNCTION_CALLGRAPH_H
#define BOLT_PASSES_BINARY_FUNCTION_CALLGRAPH_H
#include "bolt/Passes/CallGraph.h"
#include <deque>
#include <functional>
#include <unordered_map>
namespace llvm {
namespace bolt {
class BinaryFunction;
class BinaryContext;
class BinaryFunctionCallGraph : public CallGraph {
public:
NodeId maybeGetNodeId(const BinaryFunction *BF) const {
auto Itr = FuncToNodeId.find(BF);
return Itr != FuncToNodeId.end() ? Itr->second : InvalidId;
}
NodeId getNodeId(const BinaryFunction *BF) const {
auto Itr = FuncToNodeId.find(BF);
assert(Itr != FuncToNodeId.end());
return Itr->second;
}
BinaryFunction *nodeIdToFunc(NodeId Id) {
assert(Id < Funcs.size());
return Funcs[Id];
}
const BinaryFunction *nodeIdToFunc(NodeId Id) const {
assert(Id < Funcs.size());
return Funcs[Id];
}
NodeId addNode(BinaryFunction *BF, uint32_t Size, uint64_t Samples = 0);
/// Compute a DFS traversal of the call graph.
std::deque<BinaryFunction *> buildTraversalOrder();
private:
std::unordered_map<const BinaryFunction *, NodeId> FuncToNodeId;
std::vector<BinaryFunction *> Funcs;
};
using CgFilterFunction = std::function<bool(const BinaryFunction &BF)>;
inline bool NoFilter(const BinaryFunction &) { return false; }
/// Builds a call graph from the map of BinaryFunctions provided in BC.
/// The arguments control how the graph is constructed.
/// Filter is called on each function, any function that it returns true for
/// is omitted from the graph.
/// If IncludeSplitCalls is true, then calls from cold BBs are considered for
/// the graph, otherwise they are ignored. UseFunctionHotSize controls whether
/// the hot size of a function is used when filling in the Size attribute of new
/// Nodes. UseEdgeCounts is used to control if the Weight attribute on Arcs is
/// computed using the number of calls.
BinaryFunctionCallGraph
buildCallGraph(BinaryContext &BC, CgFilterFunction Filter = NoFilter,
bool CgFromPerfData = false, bool IncludeSplitCalls = true,
bool UseFunctionHotSize = false, bool UseSplitHotSize = false,
bool UseEdgeCounts = false, bool IgnoreRecursiveCalls = false);
} // namespace bolt
} // namespace llvm
#endif