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
206 }
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.
263 if (isa<InvokeInst>(I) || isa<CallBrInst>(I))
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
return RetTy
bool End
Definition: ELF_riscv.cpp:480
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
Definition: Instructions.h:64
An instruction that atomically checks whether a specified value is in a memory location,...
Definition: Instructions.h:506
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:709
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...
Definition: InstrTypes.h:1116
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.
Definition: Instructions.h:429
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
Definition: Instructions.h:949
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)
Definition: InstVisitor.h:217
RetTy visitIndirectBrInst(IndirectBrInst &I)
Definition: InstVisitor.h:230
RetTy visitFreezeInst(FreezeInst &I)
Definition: InstVisitor.h:201
RetTy visitPtrToIntInst(PtrToIntInst &I)
Definition: InstVisitor.h:185
RetTy visitCmpInst(CmpInst &I)
Definition: InstVisitor.h:257
RetTy visitMemIntrinsic(MemIntrinsic &I)
Definition: InstVisitor.h:210
RetTy visitInvokeInst(InvokeInst &I)
Definition: InstVisitor.h:216
RetTy visitFPToSIInst(FPToSIInst &I)
Definition: InstVisitor.h:182
RetTy visitVACopyInst(VACopyInst &I)
Definition: InstVisitor.h:213
RetTy visitFCmpInst(FCmpInst &I)
Definition: InstVisitor.h:167
RetTy visitTerminator(Instruction &I)
Definition: InstVisitor.h:248
RetTy visitExtractElementInst(ExtractElementInst &I)
Definition: InstVisitor.h:192
RetTy visitVAStartInst(VAStartInst &I)
Definition: InstVisitor.h:211
RetTy visitMemCpyInst(MemCpyInst &I)
Definition: InstVisitor.h:207
RetTy visitCallBase(CallBase &I)
Definition: InstVisitor.h:262
RetTy visitTruncInst(TruncInst &I)
Definition: InstVisitor.h:176
void visitFunction(Function &F)
Definition: InstVisitor.h:142
void visit(Module *M)
Definition: InstVisitor.h:108
RetTy visitCleanupReturnInst(CleanupReturnInst &I)
Definition: InstVisitor.h:239
RetTy visitInsertValueInst(InsertValueInst &I)
Definition: InstVisitor.h:196
RetTy visit(Instruction &I)
Definition: InstVisitor.h:115
RetTy visitCatchPadInst(CatchPadInst &I)
Definition: InstVisitor.h:200
RetTy visitIntrinsicInst(IntrinsicInst &I)
Definition: InstVisitor.h:214
RetTy visitShuffleVectorInst(ShuffleVectorInst &I)
Definition: InstVisitor.h:194
RetTy visitLandingPadInst(LandingPadInst &I)
Definition: InstVisitor.h:197
void visitBasicBlock(BasicBlock &BB)
Definition: InstVisitor.h:143
RetTy visitUnreachableInst(UnreachableInst &I)
Definition: InstVisitor.h:236
RetTy visitAtomicCmpXchgInst(AtomicCmpXchgInst &I)
Definition: InstVisitor.h:171
RetTy visitIntToPtrInst(IntToPtrInst &I)
Definition: InstVisitor.h:187
RetTy visitSExtInst(SExtInst &I)
Definition: InstVisitor.h:178
RetTy visitBitCastInst(BitCastInst &I)
Definition: InstVisitor.h:188
RetTy visitSwitchInst(SwitchInst &I)
Definition: InstVisitor.h:227
RetTy visitCleanupPadInst(CleanupPadInst &I)
Definition: InstVisitor.h:199
void visit(Iterator Start, Iterator End)
Definition: InstVisitor.h:87
RetTy visit(Instruction *I)
Definition: InstVisitor.h:111
RetTy visitPHINode(PHINode &I)
Definition: InstVisitor.h:175
RetTy visitReturnInst(ReturnInst &I)
Definition: InstVisitor.h:221
RetTy visitExtractValueInst(ExtractValueInst &I)
Definition: InstVisitor.h:195
RetTy visitVAEndInst(VAEndInst &I)
Definition: InstVisitor.h:212
void visit(Function &F)
Definition: InstVisitor.h:98
RetTy visitFPToUIInst(FPToUIInst &I)
Definition: InstVisitor.h:181
RetTy visitUnaryOperator(UnaryOperator &I)
Definition: InstVisitor.h:255
RetTy visitStoreInst(StoreInst &I)
Definition: InstVisitor.h:170
RetTy visitFuncletPadInst(FuncletPadInst &I)
Definition: InstVisitor.h:198
RetTy visitInsertElementInst(InsertElementInst &I)
Definition: InstVisitor.h:193
void visit(BasicBlock *BB)
Definition: InstVisitor.h:110
RetTy visitMemMoveInst(MemMoveInst &I)
Definition: InstVisitor.h:208
RetTy visitAtomicRMWInst(AtomicRMWInst &I)
Definition: InstVisitor.h:172
void visit(BasicBlock &BB)
Definition: InstVisitor.h:102
RetTy visitUnaryInstruction(UnaryInstruction &I)
Definition: InstVisitor.h:258
RetTy visitAddrSpaceCastInst(AddrSpaceCastInst &I)
Definition: InstVisitor.h:189
RetTy visitFPTruncInst(FPTruncInst &I)
Definition: InstVisitor.h:179
RetTy visitAllocaInst(AllocaInst &I)
Definition: InstVisitor.h:168
RetTy visitBinaryOperator(BinaryOperator &I)
Definition: InstVisitor.h:256
RetTy visitSIToFPInst(SIToFPInst &I)
Definition: InstVisitor.h:184
RetTy visitResumeInst(ResumeInst &I)
Definition: InstVisitor.h:233
RetTy visitFPExtInst(FPExtInst &I)
Definition: InstVisitor.h:180
RetTy visitICmpInst(ICmpInst &I)
Definition: InstVisitor.h:166
RetTy visitCatchReturnInst(CatchReturnInst &I)
Definition: InstVisitor.h:242
RetTy visitPtrToAddrInst(PtrToAddrInst &I)
Definition: InstVisitor.h:186
void visit(Module &M)
Definition: InstVisitor.h:94
RetTy visitMemSetPatternInst(MemSetPatternInst &I)
Definition: InstVisitor.h:204
RetTy visitMemTransferInst(MemTransferInst &I)
Definition: InstVisitor.h:209
RetTy visitMemSetInst(MemSetInst &I)
Definition: InstVisitor.h:203
RetTy visitCallInst(CallInst &I)
Definition: InstVisitor.h:215
void visitModule(Module &M)
Definition: InstVisitor.h:141
RetTy visitCatchSwitchInst(CatchSwitchInst &I)
Definition: InstVisitor.h:245
RetTy visitCastInst(CastInst &I)
Definition: InstVisitor.h:254
RetTy visitBranchInst(BranchInst &I)
Definition: InstVisitor.h:224
RetTy visitSelectInst(SelectInst &I)
Definition: InstVisitor.h:190
RetTy visitGetElementPtrInst(GetElementPtrInst &I)
Definition: InstVisitor.h:174
RetTy visitUIToFPInst(UIToFPInst &I)
Definition: InstVisitor.h:183
RetTy visitFenceInst(FenceInst &I)
Definition: InstVisitor.h:173
void visitInstruction(Instruction &I)
Definition: InstVisitor.h:275
void visit(Function *F)
Definition: InstVisitor.h:109
RetTy visitLoadInst(LoadInst &I)
Definition: InstVisitor.h:169
RetTy visitVAArgInst(VAArgInst &I)
Definition: InstVisitor.h:191
RetTy visitZExtInst(ZExtInst &I)
Definition: InstVisitor.h:177
This class represents a cast from an integer to a pointer.
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:49
Invoke instruction.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
An instruction for reading from memory.
Definition: Instructions.h:180
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.
Definition: Instructions.h:296
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.
Definition: AddressRanges.h:18