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