//===- InstVisitor.h - Instruction visitor templates ------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_INSTVISITOR_H #define LLVM_IR_INSTVISITOR_H #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/Module.h" namespace llvm { // We operate on opaque instruction classes, so forward declare all instruction // types now... // #define HANDLE_INST … #include "llvm/IR/Instruction.def" #define DELEGATE … /// Base class for instruction visitors /// /// Instruction visitors are used when you want to perform different actions /// for different kinds of instructions without having to use lots of casts /// and a big switch statement (in your code, that is). /// /// To define your own visitor, inherit from this class, specifying your /// new type for the 'SubClass' template parameter, and "override" visitXXX /// functions in your class. I say "override" because this class is defined /// in terms of statically resolved overloading, not virtual functions. /// /// For example, here is a visitor that counts the number of malloc /// instructions processed: /// /// /// Declare the class. Note that we derive from InstVisitor instantiated /// /// with _our new subclasses_ type. /// /// /// struct CountAllocaVisitor : public InstVisitor<CountAllocaVisitor> { /// unsigned Count; /// CountAllocaVisitor() : Count(0) {} /// /// void visitAllocaInst(AllocaInst &AI) { ++Count; } /// }; /// /// And this class would be used like this: /// CountAllocaVisitor CAV; /// CAV.visit(function); /// NumAllocas = CAV.Count; /// /// The defined has 'visit' methods for Instruction, and also for BasicBlock, /// Function, and Module, which recursively process all contained instructions. /// /// Note that if you don't implement visitXXX for some instruction type, /// the visitXXX method for instruction superclass will be invoked. So /// if instructions are added in the future, they will be automatically /// supported, if you handle one of their superclasses. /// /// The optional second template argument specifies the type that instruction /// visitation functions should return. If you specify this, you *MUST* provide /// an implementation of visitInstruction though!. /// /// Note that this class is specifically designed as a template to avoid /// virtual function call overhead. Defining and using an InstVisitor is just /// as efficient as having your own switch statement over the instruction /// opcode. template<typename SubClass, typename RetTy=void> class InstVisitor { … }; #undef DELEGATE } // End llvm namespace #endif