145d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar//===-- CGBuilder.h - Choose IRBuilder implementation  ----------*- C++ -*-===//
245d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar//
345d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar//                     The LLVM Compiler Infrastructure
445d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar//
545d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar// This file is distributed under the University of Illinois Open Source
645d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar// License. See LICENSE.TXT for details.
745d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar//
845d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar//===----------------------------------------------------------------------===//
945d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar
1045d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar#ifndef CLANG_CODEGEN_CGBUILDER_H
1145d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar#define CLANG_CODEGEN_CGBUILDER_H
1245d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar
133b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/IRBuilder.h"
1445d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar
1545d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbarnamespace clang {
1645d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbarnamespace CodeGen {
17c7d209fb2442a63d328a25e1036b4726b0c4a49dJohn McCall
186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass CodeGenFunction;
196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// \brief This is an IRBuilder insertion helper that forwards to
216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// CodeGenFunction::InsertHelper, which adds nesessary metadata to
226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// instructions.
236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <bool PreserveNames>
246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass CGBuilderInserter
256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  : protected llvm::IRBuilderDefaultInserter<PreserveNames> {
266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinespublic:
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  CGBuilderInserter() : CGF(nullptr) {}
286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  explicit CGBuilderInserter(CodeGenFunction *CGF) : CGF(CGF) {}
296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesprotected:
316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief This forwards to CodeGenFunction::InsertHelper.
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name,
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                    llvm::BasicBlock *BB,
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                    llvm::BasicBlock::iterator InsertPt) const;
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesprivate:
366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void operator=(const CGBuilderInserter &) LLVM_DELETED_FUNCTION;
376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  CodeGenFunction *CGF;
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
41c7d209fb2442a63d328a25e1036b4726b0c4a49dJohn McCall// Don't preserve names on values in an optimized build.
4229ea6729155c759836be4b5453bee9ef8e1e97eeDaniel Dunbar#ifdef NDEBUG
436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define PreserveNames false
4429ea6729155c759836be4b5453bee9ef8e1e97eeDaniel Dunbar#else
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define PreserveNames true
4629ea6729155c759836be4b5453bee9ef8e1e97eeDaniel Dunbar#endif
476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestypedef CGBuilderInserter<PreserveNames> CGBuilderInserterTy;
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestypedef llvm::IRBuilder<PreserveNames, llvm::ConstantFolder,
496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                        CGBuilderInserterTy> CGBuilderTy;
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#undef PreserveNames
51c7d209fb2442a63d328a25e1036b4726b0c4a49dJohn McCall
5245d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar}  // end namespace CodeGen
5345d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar}  // end namespace clang
5445d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar
5545d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar#endif
56