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 16 namespace llvm { 17 // Visitor class that finds all indirect call sites. 18 struct 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. 30 static inline std::vector<Instruction *> findIndirectCallSites(Function &F) { 31 PGOIndirectCallSiteVisitor ICV; 32 ICV.visit(F); 33 return ICV.IndirectCallInsts; 34 } 35 } 36