IndirectCallVisitor.h revision 353358
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 18namespace llvm { 19// Visitor class that finds all indirect call. 20struct PGOIndirectCallVisitor : public InstVisitor<PGOIndirectCallVisitor> { 21 std::vector<Instruction *> IndirectCalls; 22 PGOIndirectCallVisitor() {} 23 24 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. 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