1 //===-- IndirectCallVisitor.h - indirect call visitor ---------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements defines a visitor class and a helper function that find 10 // all indirect call-sites in a function. 11 12 #ifndef LLVM_ANALYSIS_INDIRECTCALLVISITOR_H 13 #define LLVM_ANALYSIS_INDIRECTCALLVISITOR_H 14 15 #include "llvm/IR/InstVisitor.h" 16 #include <vector> 17 18 namespace llvm { 19 // Visitor class that finds all indirect call. 20 struct PGOIndirectCallVisitor : public InstVisitor<PGOIndirectCallVisitor> { 21 std::vector<Instruction *> IndirectCalls; PGOIndirectCallVisitorPGOIndirectCallVisitor22 PGOIndirectCallVisitor() {} 23 visitCallBasePGOIndirectCallVisitor24 void visitCallBase(CallBase &Call) { 25 if (Call.isIndirectCall()) 26 IndirectCalls.push_back(&Call); 27 } 28 }; 29 30 // Helper function that finds all indirect call sites. findIndirectCalls(Function & F)31inline std::vector<Instruction *> findIndirectCalls(Function &F) { 32 PGOIndirectCallVisitor ICV; 33 ICV.visit(F); 34 return ICV.IndirectCalls; 35 } 36 } // namespace llvm 37 38 #endif 39