1//===-- CGBuilder.h - Choose IRBuilder implementation ----------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef CLANG_CODEGEN_CGBUILDER_H 11#define CLANG_CODEGEN_CGBUILDER_H 12 13#include "llvm/IR/IRBuilder.h" 14 15namespace clang { 16namespace CodeGen { 17 18class CodeGenFunction; 19 20/// \brief This is an IRBuilder insertion helper that forwards to 21/// CodeGenFunction::InsertHelper, which adds nesessary metadata to 22/// instructions. 23template <bool PreserveNames> 24class CGBuilderInserter 25 : protected llvm::IRBuilderDefaultInserter<PreserveNames> { 26public: 27 CGBuilderInserter() : CGF(nullptr) {} 28 explicit CGBuilderInserter(CodeGenFunction *CGF) : CGF(CGF) {} 29 30protected: 31 /// \brief This forwards to CodeGenFunction::InsertHelper. 32 void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, 33 llvm::BasicBlock *BB, 34 llvm::BasicBlock::iterator InsertPt) const; 35private: 36 void operator=(const CGBuilderInserter &) LLVM_DELETED_FUNCTION; 37 38 CodeGenFunction *CGF; 39}; 40 41// Don't preserve names on values in an optimized build. 42#ifdef NDEBUG 43#define PreserveNames false 44#else 45#define PreserveNames true 46#endif 47typedef CGBuilderInserter<PreserveNames> CGBuilderInserterTy; 48typedef llvm::IRBuilder<PreserveNames, llvm::ConstantFolder, 49 CGBuilderInserterTy> CGBuilderTy; 50#undef PreserveNames 51 52} // end namespace CodeGen 53} // end namespace clang 54 55#endif 56