================ @@ -12,27 +12,96 @@ #ifndef LLVM_ANALYSIS_INDIRECTCALLVISITOR_H #define LLVM_ANALYSIS_INDIRECTCALLVISITOR_H +#include "llvm/ADT/SetVector.h" #include "llvm/IR/InstVisitor.h" #include <vector> namespace llvm { -// Visitor class that finds all indirect call. +// Visitor class that finds indirect calls or instructions that gives vtable +// value, depending on Type. struct PGOIndirectCallVisitor : public InstVisitor<PGOIndirectCallVisitor> { + enum class InstructionType { + kIndirectCall = 0, + kVTableVal = 1, + }; std::vector<CallBase *> IndirectCalls; - PGOIndirectCallVisitor() = default; + SetVector<Instruction *, std::vector<Instruction *>> VTableAddrs; + PGOIndirectCallVisitor(InstructionType Type) : Type(Type) {} void visitCallBase(CallBase &Call) { - if (Call.isIndirectCall()) + const CallInst *CI = dyn_cast<CallInst>(&Call); + if (Type == InstructionType::kVTableVal && CI && CI->getCalledFunction()) { ---------------- david-xl wrote:
Add a description for this a code block and describe what code pattern it is looking for. https://github.com/llvm/llvm-project/pull/66825 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits