1//===-- IndirectCallSiteVisitor.h - indirect call-sites visitor -----------===//
2//
3//                      The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements defines a visitor class and a helper function that find
11// all indirect call-sites in a function.
12
13#include "llvm/IR/InstVisitor.h"
14#include <vector>
15
16namespace llvm {
17// Visitor class that finds all indirect call sites.
18struct PGOIndirectCallSiteVisitor
19    : public InstVisitor<PGOIndirectCallSiteVisitor> {
20  std::vector<Instruction *> IndirectCallInsts;
21  PGOIndirectCallSiteVisitor() {}
22
23  void visitCallSite(CallSite CS) {
24    if (CS.isIndirectCall())
25      IndirectCallInsts.push_back(CS.getInstruction());
26  }
27};
28
29// Helper function that finds all indirect call sites.
30static inline std::vector<Instruction *> findIndirectCallSites(Function &F) {
31  PGOIndirectCallSiteVisitor ICV;
32  ICV.visit(F);
33  return ICV.IndirectCallInsts;
34}
35}
36