--- /dev/null
+//===-- CGBuilder.h - Choose IRBuilder implementation ----------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_CODEGEN_CGBUILDER_H
+#define CLANG_CODEGEN_CGBUILDER_H
+
+#include "llvm/Support/IRBuilder.h"
+
+namespace clang {
+namespace CodeGen {
+ typedef llvm::IRBuilder<> CGBuilderTy;
+} // end namespace CodeGen
+} // end namespace clang
+
+#endif
#include "llvm/ADT/SmallVector.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/Support/Dwarf.h"
-#include "llvm/Support/IRBuilder.h"
#include "llvm/Target/TargetMachine.h"
using namespace clang;
using namespace clang::CodeGen;
void CGDebugInfo::EmitFunctionStart(const char *Name,
QualType ReturnType,
llvm::Function *Fn,
- llvm::IRBuilder<> &Builder)
+ CGBuilderTy &Builder)
{
// Create subprogram descriptor.
Subprogram = new llvm::SubprogramDesc();
void
-CGDebugInfo::EmitStopPoint(llvm::Function *Fn, llvm::IRBuilder<> &Builder)
+CGDebugInfo::EmitStopPoint(llvm::Function *Fn, CGBuilderTy &Builder)
{
if (CurLoc.isInvalid() || CurLoc.isMacroID()) return;
/// EmitRegionStart- Constructs the debug code for entering a declarative
/// region - "llvm.dbg.region.start.".
void CGDebugInfo::EmitRegionStart(llvm::Function *Fn,
- llvm::IRBuilder<> &Builder)
+ CGBuilderTy &Builder)
{
llvm::BlockDesc *Block = new llvm::BlockDesc();
if (!RegionStack.empty())
/// EmitRegionEnd - Constructs the debug code for exiting a declarative
/// region - "llvm.dbg.region.end."
-void CGDebugInfo::EmitRegionEnd(llvm::Function *Fn, llvm::IRBuilder<> &Builder)
+void CGDebugInfo::EmitRegionEnd(llvm::Function *Fn, CGBuilderTy &Builder)
{
assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
/// EmitDeclare - Emit local variable declaration debug info.
void CGDebugInfo::EmitDeclare(const VarDecl *decl, unsigned Tag,
llvm::Value *AI,
- llvm::IRBuilder<> &Builder)
+ CGBuilderTy &Builder)
{
assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
#include "clang/AST/Type.h"
#include "clang/Basic/SourceLocation.h"
-#include "llvm/Support/IRBuilder.h"
#include <map>
#include <vector>
+#include "CGBuilder.h"
namespace llvm {
class Function;
namespace clang {
class FunctionDecl;
class VarDecl;
+
namespace CodeGen {
class CodeGenModule;
SourceLocation CurLoc;
SourceLocation PrevLoc;
- typedef llvm::IRBuilder<> BuilderType;
-
/// CompileUnitCache - Cache of previously constructed CompileUnits.
std::map<const FileEntry*, llvm::CompileUnitDesc *> CompileUnitCache;
/// EmitStopPoint - Emit a call to llvm.dbg.stoppoint to indicate a change of
/// source line.
- void EmitStopPoint(llvm::Function *Fn, BuilderType &Builder);
+ void EmitStopPoint(llvm::Function *Fn, CGBuilderTy &Builder);
/// EmitFunctionStart - Emit a call to llvm.dbg.function.start to indicate
/// start of a new function.
void EmitFunctionStart(const char *Name, QualType ReturnType,
- llvm::Function *Fn, BuilderType &Builder);
+ llvm::Function *Fn, CGBuilderTy &Builder);
/// EmitRegionStart - Emit a call to llvm.dbg.region.start to indicate start
/// of a new block.
- void EmitRegionStart(llvm::Function *Fn, BuilderType &Builder);
+ void EmitRegionStart(llvm::Function *Fn, CGBuilderTy &Builder);
/// EmitRegionEnd - Emit call to llvm.dbg.region.end to indicate end of a
/// block.
- void EmitRegionEnd(llvm::Function *Fn, BuilderType &Builder);
+ void EmitRegionEnd(llvm::Function *Fn, CGBuilderTy &Builder);
/// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration.
void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI,
- BuilderType &Builder);
+ CGBuilderTy &Builder);
/// EmitGlobalVariable - Emit information about a global variable.
void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *decl);
namespace {
class VISIBILITY_HIDDEN AggExprEmitter : public StmtVisitor<AggExprEmitter> {
CodeGenFunction &CGF;
- llvm::IRBuilder<> &Builder;
+ CGBuilderTy &Builder;
llvm::Value *DestPtr;
bool VolatileDest;
public:
class VISIBILITY_HIDDEN ComplexExprEmitter
: public StmtVisitor<ComplexExprEmitter, ComplexPairTy> {
CodeGenFunction &CGF;
- llvm::IRBuilder<> &Builder;
+ CGBuilderTy &Builder;
public:
ComplexExprEmitter(CodeGenFunction &cgf) : CGF(cgf), Builder(CGF.Builder) {
}
class VISIBILITY_HIDDEN ScalarExprEmitter
: public StmtVisitor<ScalarExprEmitter, Value*> {
CodeGenFunction &CGF;
- llvm::IRBuilder<> &Builder;
+ CGBuilderTy &Builder;
public:
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/Support/Compiler.h"
-#include "llvm/Support/IRBuilder.h"
#include "llvm/Target/TargetData.h"
#include <map>
using namespace clang;
llvm::Value *Receiver,
bool IsClassMessage,
const CallArgList &CallArgs);
- virtual llvm::Value *GetClass(llvm::IRBuilder<> &Builder,
+ virtual llvm::Value *GetClass(CGBuilderTy &Builder,
const ObjCInterfaceDecl *OID);
- virtual llvm::Value *GetSelector(llvm::IRBuilder<> &Builder, Selector Sel);
+ virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel);
virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD);
virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD);
virtual void GenerateClass(const ObjCImplementationDecl *ClassDecl);
- virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<> &Builder,
+ virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
const ObjCProtocolDecl *PD);
virtual void GenerateProtocol(const ObjCProtocolDecl *PD);
virtual llvm::Function *ModuleInitFunction();
}
// This has to perform the lookup every time, since posing and related
// techniques can modify the name -> class mapping.
-llvm::Value *CGObjCGNU::GetClass(llvm::IRBuilder<> &Builder,
+llvm::Value *CGObjCGNU::GetClass(CGBuilderTy &Builder,
const ObjCInterfaceDecl *OID) {
llvm::Value *ClassName = CGM.GetAddrOfConstantCString(OID->getName());
ClassName = Builder.CreateStructGEP(ClassName, 0);
}
/// GetSelector - Return the pointer to the unique'd string for this selector.
-llvm::Value *CGObjCGNU::GetSelector(llvm::IRBuilder<> &Builder, Selector Sel) {
+llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel) {
// FIXME: uniquing on the string is wasteful, unique on Sel instead!
llvm::GlobalAlias *&US = UntypedSelectors[Sel.getName()];
if (US == 0)
return MakeGlobal(ProtocolListTy, Elements, ".objc_protocol_list");
}
-llvm::Value *CGObjCGNU::GenerateProtocolRef(llvm::IRBuilder<> &Builder,
+llvm::Value *CGObjCGNU::GenerateProtocolRef(CGBuilderTy &Builder,
const ObjCProtocolDecl *PD) {
return ExistingProtocols[PD->getName()];
}
llvm::GlobalValue::InternalLinkage, ".objc_load_function",
&TheModule);
llvm::BasicBlock *EntryBB = llvm::BasicBlock::Create("entry", LoadFunction);
- llvm::IRBuilder<> Builder;
+ CGBuilderTy Builder;
Builder.SetInsertPoint(EntryBB);
llvm::Value *Register = TheModule.getOrInsertFunction("__objc_exec_class",
llvm::Type::VoidTy, llvm::PointerType::getUnqual(ModuleTy), NULL);
#include "llvm/Module.h"
#include "llvm/ADT/DenseSet.h"
-#include "llvm/Support/IRBuilder.h"
#include "llvm/Target/TargetData.h"
#include <sstream>
/// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
/// for the given class.
- llvm::Value *EmitClassRef(llvm::IRBuilder<> &Builder,
+ llvm::Value *EmitClassRef(CGBuilderTy &Builder,
const ObjCInterfaceDecl *ID);
CodeGen::RValue EmitMessageSend(CodeGen::CodeGenFunction &CGF,
/// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
/// for the given selector.
- llvm::Value *EmitSelector(llvm::IRBuilder<> &Builder, Selector Sel);
+ llvm::Value *EmitSelector(CGBuilderTy &Builder, Selector Sel);
/// GetProtocolRef - Return a reference to the internal protocol
/// description, creating an empty one if it has not been
bool IsClassMessage,
const CallArgList &CallArgs);
- virtual llvm::Value *GetClass(llvm::IRBuilder<> &Builder,
+ virtual llvm::Value *GetClass(CGBuilderTy &Builder,
const ObjCInterfaceDecl *ID);
- virtual llvm::Value *GetSelector(llvm::IRBuilder<> &Builder, Selector Sel);
+ virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel);
virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD);
virtual void GenerateClass(const ObjCImplementationDecl *ClassDecl);
- virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<> &Builder,
+ virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
const ObjCProtocolDecl *PD);
virtual void GenerateProtocol(const ObjCProtocolDecl *PD);
/// GetClass - Return a reference to the class for the given interface
/// decl.
-llvm::Value *CGObjCMac::GetClass(llvm::IRBuilder<> &Builder,
+llvm::Value *CGObjCMac::GetClass(CGBuilderTy &Builder,
const ObjCInterfaceDecl *ID) {
return EmitClassRef(Builder, ID);
}
/// GetSelector - Return the pointer to the unique'd string for this selector.
-llvm::Value *CGObjCMac::GetSelector(llvm::IRBuilder<> &Builder, Selector Sel) {
+llvm::Value *CGObjCMac::GetSelector(CGBuilderTy &Builder, Selector Sel) {
return EmitSelector(Builder, Sel);
}
return CGF.EmitCall(Fn, ResultType, ActualArgs);
}
-llvm::Value *CGObjCMac::GenerateProtocolRef(llvm::IRBuilder<> &Builder,
+llvm::Value *CGObjCMac::GenerateProtocolRef(CGBuilderTy &Builder,
const ObjCProtocolDecl *PD) {
// FIXME: I don't understand why gcc generates this, or where it is
// resolved. Investigate. Its also wasteful to look this up over and
return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
}
-llvm::Value *CGObjCMac::EmitClassRef(llvm::IRBuilder<> &Builder,
+llvm::Value *CGObjCMac::EmitClassRef(CGBuilderTy &Builder,
const ObjCInterfaceDecl *ID) {
LazySymbols.insert(ID->getIdentifier());
return Builder.CreateLoad(Entry, false, "tmp");
}
-llvm::Value *CGObjCMac::EmitSelector(llvm::IRBuilder<> &Builder, Selector Sel) {
+llvm::Value *CGObjCMac::EmitSelector(CGBuilderTy &Builder, Selector Sel) {
llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
if (!Entry) {
#define CLANG_CODEGEN_OBCJRUNTIME_H
#include "clang/Basic/IdentifierTable.h" // Selector
#include "llvm/ADT/SmallVector.h"
-#include "llvm/Support/IRBuilder.h"
#include <string>
-#include "CGValue.h"
+#include "CGBuilder.h"
#include "CGCall.h"
+#include "CGValue.h"
namespace llvm {
class Constant;
/// Implements runtime-specific code generation functions.
class CGObjCRuntime {
- typedef llvm::IRBuilder<> BuilderType;
public:
virtual ~CGObjCRuntime();
/// Get a selector for the specified name and type values. The
/// return value should have the LLVM type for pointer-to
/// ASTContext::getObjCSelType().
- virtual llvm::Value *GetSelector(BuilderType &Builder,
+ virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
Selector Sel) = 0;
/// Generate a constant string object.
/// Emit the code to return the named protocol as an object, as in a
/// @protocol expression.
- virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<true> &Builder,
+ virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
const ObjCProtocolDecl *OPD) = 0;
/// Generate the named protocol. Protocols contain method metadata but no
/// GetClass - Return a reference to the class for the given
/// interface decl.
- virtual llvm::Value *GetClass(BuilderType &Builder,
+ virtual llvm::Value *GetClass(CGBuilderTy &Builder,
const ObjCInterfaceDecl *OID) = 0;
/// EnumerationMutationFunction - Return the function that's called by the
#include "clang/AST/Type.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
-#include "llvm/Support/IRBuilder.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include <vector>
#include <map>
+#include "CGBuilder.h"
#include "CGCall.h"
#include "CGValue.h"
class CodeGenModule;
class CodeGenTypes;
class CGRecordLayout;
-
+
/// CodeGenFunction - This class organizes the per-function state that is used
/// while generating LLVM code.
class CodeGenFunction {
TargetInfo &Target;
typedef std::pair<llvm::Value *, llvm::Value *> ComplexPairTy;
- llvm::IRBuilder<> Builder;
+ CGBuilderTy Builder;
// Holds the Decl for the current function or method
const Decl *CurFuncDecl;