/// graph remains valid for the module. It is also relatively expensive.
LazyCallGraph(const LazyCallGraph &G);
-#if LLVM_HAS_RVALUE_REFERENCES
/// \brief Move constructor.
///
/// This is a deep move. It leaves G in an undefined but destroyable state.
/// Any other operation on G is likely to fail.
LazyCallGraph(LazyCallGraph &&G);
-#endif
iterator begin() { return iterator(*this, EntryNodes); }
iterator end() { return iterator(*this, EntryNodes, iterator::IsAtEndT()); }
/// \brief Helper to copy a node from another graph into this one.
Node *copyInto(const Node &OtherN);
-#if LLVM_HAS_RVALUE_REFERENCES
/// \brief Helper to move a node from another graph into this one.
Node *moveInto(Node &&OtherN);
-#endif
};
/// \brief A node in the call graph.
/// \brief Constructor used when copying a node from one graph to another.
Node(LazyCallGraph &G, const Node &OtherN);
-#if LLVM_HAS_RVALUE_REFERENCES
/// \brief Constructor used when moving a node from one graph to another.
Node(LazyCallGraph &G, Node &&OtherN);
-#endif
public:
typedef LazyCallGraph::iterator iterator;
PreservedPassIDs.erase(*I);
}
-#if LLVM_HAS_RVALUE_REFERENCES
/// \brief Intersect this set with a temporary other set in place.
///
/// This is a mutating operation on this preserved set, removing all
if (!Arg.PreservedPassIDs.count(*I))
PreservedPassIDs.erase(*I);
}
-#endif
/// \brief Query whether a pass is marked as preserved by this set.
template <typename PassT> bool preserved() const {
Callees.push_back(G.copyInto(*OI->get<Node *>()));
}
-#if LLVM_HAS_RVALUE_REFERENCES
LazyCallGraph::Node::Node(LazyCallGraph &G, Node &&OtherN)
: G(G), F(OtherN.F), Callees(std::move(OtherN.Callees)),
CalleeSet(std::move(OtherN.CalleeSet)) {
if (Node *ChildN = CI->dyn_cast<Node *>())
*CI = G.moveInto(std::move(*ChildN));
}
-#endif
LazyCallGraph::LazyCallGraph(Module &M) : M(M) {
for (Module::iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI)
EntryNodes.push_back(copyInto(*EI->get<Node *>()));
}
-#if LLVM_HAS_RVALUE_REFERENCES
// FIXME: This would be crazy simpler if BumpPtrAllocator were movable without
// invalidating any of the allocated memory. We should make that be the case at
// some point and delete this.
if (Node *EntryN = EI->dyn_cast<Node *>())
*EI = moveInto(std::move(*EntryN));
}
-#endif
LazyCallGraph::Node *LazyCallGraph::insertInto(Function &F, Node *&MappedN) {
return new (MappedN = BPA.Allocate()) Node(*this, F);
return new (N = BPA.Allocate()) Node(*this, OtherN);
}
-#if LLVM_HAS_RVALUE_REFERENCES
LazyCallGraph::Node *LazyCallGraph::moveInto(Node &&OtherN) {
Node *&N = NodeMap[&OtherN.F];
if (N)
return new (N = BPA.Allocate()) Node(*this, std::move(OtherN));
}
-#endif
char LazyCallGraphAnalysis::PassID;