LLVM 22.0.0git
InstVisitor.h
Go to the documentation of this file.
1//===- InstVisitor.h - Instruction visitor templates ------------*- C++ -*-===//
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
10#ifndef LLVM_IR_INSTVISITOR_H
11#define LLVM_IR_INSTVISITOR_H
12
13#include "llvm/IR/Function.h"
16#include "llvm/IR/Intrinsics.h"
17#include "llvm/IR/Module.h"
18
19namespace llvm {
20
21// We operate on opaque instruction classes, so forward declare all instruction
22// types now...
23//
24#define HANDLE_INST(NUM, OPCODE, CLASS) class CLASS;
25#include "llvm/IR/Instruction.def"
26
27#define DELEGATE(CLASS_TO_VISIT) \
28 return static_cast<SubClass*>(this)-> \
29 visit##CLASS_TO_VISIT(static_cast<CLASS_TO_VISIT&>(I))
30
31
32/// Base class for instruction visitors
33///
34/// Instruction visitors are used when you want to perform different actions
35/// for different kinds of instructions without having to use lots of casts
36/// and a big switch statement (in your code, that is).
37///
38/// To define your own visitor, inherit from this class, specifying your
39/// new type for the 'SubClass' template parameter, and "override" visitXXX
40/// functions in your class. I say "override" because this class is defined
41/// in terms of statically resolved overloading, not virtual functions.
42///
43/// For example, here is a visitor that counts the number of malloc
44/// instructions processed:
45///
46/// /// Declare the class. Note that we derive from InstVisitor instantiated
47/// /// with _our new subclasses_ type.
48/// ///
49/// struct CountAllocaVisitor : public InstVisitor<CountAllocaVisitor> {
50/// unsigned Count;
51/// CountAllocaVisitor() : Count(0) {}
52///
53/// void visitAllocaInst(AllocaInst &AI) { ++Count; }
54/// };
55///
56/// And this class would be used like this:
57/// CountAllocaVisitor CAV;
58/// CAV.visit(function);
59/// NumAllocas = CAV.Count;
60///
61/// The defined has 'visit' methods for Instruction, and also for BasicBlock,
62/// Function, and Module, which recursively process all contained instructions.
63///
64/// Note that if you don't implement visitXXX for some instruction type,
65/// the visitXXX method for instruction superclass will be invoked. So
66/// if instructions are added in the future, they will be automatically
67/// supported, if you handle one of their superclasses.
68///
69/// The optional second template argument specifies the type that instruction
70/// visitation functions should return. If you specify this, you *MUST* provide
71/// an implementation of visitInstruction though!.
72///
73/// Note that this class is specifically designed as a template to avoid
74/// virtual function call overhead. Defining and using an InstVisitor is just
75/// as efficient as having your own switch statement over the instruction
76/// opcode.
77template<typename SubClass, typename RetTy=void>
79 //===--------------------------------------------------------------------===//
80 // Interface code - This is the public interface of the InstVisitor that you
81 // use to visit instructions...
82 //
83
84public:
85 // Generic visit method - Allow visitation to all instructions in a range
86 template<class Iterator>
87 void visit(Iterator Start, Iterator End) {
88 while (Start != End)
89 static_cast<SubClass*>(this)->visit(*Start++);
90 }
91
92 // Define visitors for functions and basic blocks...
93 //
94 void visit(Module &M) {
95 static_cast<SubClass*>(this)->visitModule(M);
96 visit(M.begin(), M.end());
97 }
98 void visit(Function &F) {
99 static_cast<SubClass*>(this)->visitFunction(F);
100 visit(F.begin(), F.end());
101 }
102 void visit(BasicBlock &BB) {
103 static_cast<SubClass*>(this)->visitBasicBlock(BB);
104 visit(BB.begin(), BB.end());
105 }
106
107 // Forwarding functions so that the user can visit with pointers AND refs.
108 void visit(Module *M) { visit(*M); }
109 void visit(Function *F) { visit(*F); }
110 void visit(BasicBlock *BB) { visit(*BB); }
111 RetTy visit(Instruction *I) { return visit(*I); }
112
113 // visit - Finally, code to visit an instruction...
114 //
116 static_assert(std::is_base_of<InstVisitor, SubClass>::value,
117 "Must pass the derived type to this template!");
118
119 switch (I.getOpcode()) {
120 default: llvm_unreachable("Unknown instruction type encountered!");
121 // Build the switch statement using the Instruction.def file...
122#define HANDLE_INST(NUM, OPCODE, CLASS) \
123 case Instruction::OPCODE: return \
124 static_cast<SubClass*>(this)-> \
125 visit##OPCODE(static_cast<CLASS&>(I));
126#include "llvm/IR/Instruction.def"
127 }
128 }
129
130 //===--------------------------------------------------------------------===//
131 // Visitation functions... these functions provide default fallbacks in case
132 // the user does not specify what to do for a particular instruction type.
133 // The default behavior is to generalize the instruction type to its subtype
134 // and try visiting the subtype. All of this should be inlined perfectly,
135 // because there are no virtual functions to get in the way.
136 //
137
138 // When visiting a module, function or basic block directly, these methods get
139 // called to indicate when transitioning into a new unit.
140 //
141 void visitModule (Module &M) {}
144
145 // Define instruction specific visitor functions that can be overridden to
146 // handle SPECIFIC instructions. These functions automatically define
147 // visitMul to proxy to visitBinaryOperator for instance in case the user does
148 // not need this generality.
149 //
150 // These functions can also implement fan-out, when a single opcode and
151 // instruction have multiple more specific Instruction subclasses. The Call
152 // instruction currently supports this. We implement that by redirecting that
153 // instruction to a special delegation helper.
154#define HANDLE_INST(NUM, OPCODE, CLASS) \
155 RetTy visit##OPCODE(CLASS &I) { \
156 if (NUM == Instruction::Call) \
157 return delegateCallInst(I); \
158 else \
159 DELEGATE(CLASS); \
160 }
161#include "llvm/IR/Instruction.def"
162
163 // Specific Instruction type classes... note that all of the casts are
164 // necessary because we use the instruction classes as opaque types...
165 //
202
218
219 // While terminators don't have a distinct type modeling them, we support
220 // intercepting them with dedicated a visitor callback.
222 return static_cast<SubClass *>(this)->visitTerminator(I);
223 }
225 return static_cast<SubClass *>(this)->visitTerminator(I);
226 }
228 return static_cast<SubClass *>(this)->visitTerminator(I);
229 }
231 return static_cast<SubClass *>(this)->visitTerminator(I);
232 }
234 return static_cast<SubClass *>(this)->visitTerminator(I);
235 }
237 return static_cast<SubClass *>(this)->visitTerminator(I);
238 }
240 return static_cast<SubClass *>(this)->visitTerminator(I);
241 }
243 return static_cast<SubClass *>(this)->visitTerminator(I);
244 }
246 return static_cast<SubClass *>(this)->visitTerminator(I);
247 }
249
250 // Next level propagators: If the user does not overload a specific
251 // instruction type, they can overload one of these to get the whole class
252 // of instructions...
253 //
259
260 // The next level delegation for `CallBase` is slightly more complex in order
261 // to support visiting cases where the call is also a terminator.
264 return static_cast<SubClass *>(this)->visitTerminator(I);
265
267 }
268
269 // If the user wants a 'default' case, they can choose to override this
270 // function. If this function is not overloaded in the user's subclass, then
271 // this instruction just gets ignored.
272 //
273 // Note that you MUST override this function if your return type is not void.
274 //
275 void visitInstruction(Instruction &I) {} // Ignore unhandled instructions
276
277private:
278 // Special helper function to delegate to CallInst subclass visitors.
279 RetTy delegateCallInst(CallInst &I) {
280 if (const Function *F = I.getCalledFunction()) {
281 switch (F->getIntrinsicID()) {
282 default: DELEGATE(IntrinsicInst);
283 case Intrinsic::memcpy:
284 case Intrinsic::memcpy_inline:
286 case Intrinsic::memmove: DELEGATE(MemMoveInst);
287 case Intrinsic::memset:
288 case Intrinsic::memset_inline:
290 case Intrinsic::experimental_memset_pattern:
292 case Intrinsic::vastart: DELEGATE(VAStartInst);
293 case Intrinsic::vaend: DELEGATE(VAEndInst);
294 case Intrinsic::vacopy: DELEGATE(VACopyInst);
295 case Intrinsic::not_intrinsic: break;
296 }
297 }
298 DELEGATE(CallInst);
299 }
300
301 // An overload that will never actually be called, it is used only from dead
302 // code in the dispatching from opcodes to instruction subclasses.
303 RetTy delegateCallInst(Instruction &I) {
304 llvm_unreachable("delegateCallInst called for non-CallInst");
305 }
306};
307
308#undef DELEGATE
309
310} // End llvm namespace
311
312#endif
Module.h This file contains the declarations for the Module class.
#define DELEGATE(CLASS_TO_VISIT)
Definition InstVisitor.h:27
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:472
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:459
This class represents a no-op cast from one type to another.
Conditional or Unconditional Branch instruction.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:448
This class is the base class for the comparison instructions.
Definition InstrTypes.h:666
This instruction extracts a single (scalar) element from a VectorType value.
This instruction extracts a struct member or array element value from an aggregate value.
This instruction compares its operands according to the predicate given to the constructor.
This class represents an extension of floating point types.
This class represents a cast from floating point to signed integer.
This class represents a cast from floating point to unsigned integer.
This class represents a truncation of floating point types.
An instruction for ordering other memory operations.
This class represents a freeze function that returns random concrete value if an operand is either a ...
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
This instruction inserts a single (scalar) element into a VectorType value.
This instruction inserts a struct field of array element value into an aggregate value.
Base class for instruction visitors.
Definition InstVisitor.h:78
RetTy visitCallBrInst(CallBrInst &I)
RetTy visitIndirectBrInst(IndirectBrInst &I)
RetTy visitFreezeInst(FreezeInst &I)
RetTy visitPtrToIntInst(PtrToIntInst &I)
RetTy visitCmpInst(CmpInst &I)
RetTy visitMemIntrinsic(MemIntrinsic &I)
RetTy visitInvokeInst(InvokeInst &I)
RetTy visitFPToSIInst(FPToSIInst &I)
RetTy visitVACopyInst(VACopyInst &I)
RetTy visitFCmpInst(FCmpInst &I)
RetTy visitTerminator(Instruction &I)
RetTy visitExtractElementInst(ExtractElementInst &I)
RetTy visitVAStartInst(VAStartInst &I)
RetTy visitMemCpyInst(MemCpyInst &I)
RetTy visitCallBase(CallBase &I)
RetTy visitTruncInst(TruncInst &I)
void visitFunction(Function &F)
void visit(Module *M)
RetTy visitCleanupReturnInst(CleanupReturnInst &I)
RetTy visitInsertValueInst(InsertValueInst &I)
RetTy visit(Instruction &I)
RetTy visitCatchPadInst(CatchPadInst &I)
RetTy visitIntrinsicInst(IntrinsicInst &I)
RetTy visitShuffleVectorInst(ShuffleVectorInst &I)
RetTy visitLandingPadInst(LandingPadInst &I)
void visitBasicBlock(BasicBlock &BB)
RetTy visitUnreachableInst(UnreachableInst &I)
RetTy visitAtomicCmpXchgInst(AtomicCmpXchgInst &I)
RetTy visitIntToPtrInst(IntToPtrInst &I)
RetTy visitSExtInst(SExtInst &I)
RetTy visitBitCastInst(BitCastInst &I)
RetTy visitSwitchInst(SwitchInst &I)
RetTy visitCleanupPadInst(CleanupPadInst &I)
void visit(Iterator Start, Iterator End)
Definition InstVisitor.h:87
RetTy visit(Instruction *I)
RetTy visitPHINode(PHINode &I)
RetTy visitReturnInst(ReturnInst &I)
RetTy visitExtractValueInst(ExtractValueInst &I)
RetTy visitVAEndInst(VAEndInst &I)
void visit(Function &F)
Definition InstVisitor.h:98
RetTy visitFPToUIInst(FPToUIInst &I)
RetTy visitUnaryOperator(UnaryOperator &I)
RetTy visitStoreInst(StoreInst &I)
RetTy visitFuncletPadInst(FuncletPadInst &I)
RetTy visitInsertElementInst(InsertElementInst &I)
void visit(BasicBlock *BB)
RetTy visitMemMoveInst(MemMoveInst &I)
RetTy visitAtomicRMWInst(AtomicRMWInst &I)
void visit(BasicBlock &BB)
RetTy visitUnaryInstruction(UnaryInstruction &I)
RetTy visitAddrSpaceCastInst(AddrSpaceCastInst &I)
RetTy visitFPTruncInst(FPTruncInst &I)
RetTy visitAllocaInst(AllocaInst &I)
RetTy visitBinaryOperator(BinaryOperator &I)
RetTy visitSIToFPInst(SIToFPInst &I)
RetTy visitResumeInst(ResumeInst &I)
RetTy visitFPExtInst(FPExtInst &I)
RetTy visitICmpInst(ICmpInst &I)
RetTy visitCatchReturnInst(CatchReturnInst &I)
RetTy visitPtrToAddrInst(PtrToAddrInst &I)
void visit(Module &M)
Definition InstVisitor.h:94
RetTy visitMemSetPatternInst(MemSetPatternInst &I)
RetTy visitMemTransferInst(MemTransferInst &I)
RetTy visitMemSetInst(MemSetInst &I)
RetTy visitCallInst(CallInst &I)
void visitModule(Module &M)
RetTy visitCatchSwitchInst(CatchSwitchInst &I)
RetTy visitCastInst(CastInst &I)
RetTy visitBranchInst(BranchInst &I)
RetTy visitSelectInst(SelectInst &I)
RetTy visitGetElementPtrInst(GetElementPtrInst &I)
RetTy visitUIToFPInst(UIToFPInst &I)
RetTy visitFenceInst(FenceInst &I)
void visitInstruction(Instruction &I)
void visit(Function *F)
RetTy visitLoadInst(LoadInst &I)
RetTy visitVAArgInst(VAArgInst &I)
RetTy visitZExtInst(ZExtInst &I)
This class represents a cast from an integer to a pointer.
A wrapper class for inspecting calls to intrinsic functions.
Invoke instruction.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
An instruction for reading from memory.
This class wraps the llvm.memcpy intrinsic.
This is the common base class for memset/memcpy/memmove.
This class wraps the llvm.memmove intrinsic.
This class wraps the llvm.memset and llvm.memset.inline intrinsics.
This class wraps the llvm.experimental.memset.pattern intrinsic.
This class wraps the llvm.memcpy/memmove intrinsics.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
This class represents a cast from a pointer to an address (non-capturing ptrtoint).
This class represents a cast from a pointer to an integer.
Resume the propagation of an exception.
Return a value (possibly void), from a function.
This class represents a sign extension of integer types.
This class represents a cast from signed integer to floating point.
This class represents the LLVM 'select' instruction.
This instruction constructs a fixed permutation of two input vectors.
An instruction for storing to memory.
Multiway switch.
This class represents a truncation of integer types.
This class represents a cast unsigned integer to floating point.
This function has undefined behavior.
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
This represents the llvm.va_copy intrinsic.
This represents the llvm.va_end intrinsic.
This represents the llvm.va_start intrinsic.
This class represents zero extension of integer types.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:548