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; PGOIndirectCallSiteVisitorPGOIndirectCallSiteVisitor21 PGOIndirectCallSiteVisitor() {} 22 visitCallSitePGOIndirectCallSiteVisitor23 void visitCallSite(CallSite CS) { 24 if (CS.getCalledFunction() || !CS.getCalledValue()) 25 return; 26 Instruction *I = CS.getInstruction(); 27 if (CallInst *CI = dyn_cast<CallInst>(I)) { 28 if (CI->isInlineAsm()) 29 return; 30 } 31 if (isa<Constant>(CS.getCalledValue())) 32 return; 33 IndirectCallInsts.push_back(I); 34 } 35 }; 36 37 // Helper function that finds all indirect call sites. findIndirectCallSites(Function & F)38static inline std::vector<Instruction *> findIndirectCallSites(Function &F) { 39 PGOIndirectCallSiteVisitor ICV; 40 ICV.visit(F); 41 return ICV.IndirectCallInsts; 42 } 43 } 44