/// "llvm.dbg.func.start.".
void CGDebugInfo::EmitFunctionStart(const FunctionDecl *FnDecl,
llvm::Function *Fn,
- llvm::IRBuilder &Builder)
+ llvm::IRBuilder<> &Builder)
{
// Create subprogram descriptor.
Subprogram = new llvm::SubprogramDesc();
void
-CGDebugInfo::EmitStopPoint(llvm::Function *Fn, llvm::IRBuilder &Builder)
+CGDebugInfo::EmitStopPoint(llvm::Function *Fn, llvm::IRBuilder<> &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)
+void CGDebugInfo::EmitRegionStart(llvm::Function *Fn,
+ llvm::IRBuilder<> &Builder)
{
llvm::BlockDesc *Block = new llvm::BlockDesc();
if (RegionStack.size() > 0)
/// 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, llvm::IRBuilder<> &Builder)
{
// Lazily construct llvm.dbg.region.end function.
if (!RegionEndFn)
/// EmitDeclare - Emit local variable declaration debug info.
void CGDebugInfo::EmitDeclare(const VarDecl *decl, unsigned Tag,
llvm::Value *AI,
- llvm::IRBuilder &Builder)
+ llvm::IRBuilder<> &Builder)
{
// FIXME: If it is a compiler generated temporary then return.
namespace llvm {
class Function;
- class IRBuilder;
+ template<bool C> class IRBuilder;
class DISerializer;
class CompileUnitDesc;
class BasicBlock;
/// EmitStopPoint - Emit a call to llvm.dbg.stoppoint to indicate a change of
/// source line.
- void EmitStopPoint(llvm::Function *Fn, llvm::IRBuilder &Builder);
+ void EmitStopPoint(llvm::Function *Fn, llvm::IRBuilder<true> &Builder);
/// EmitFunctionStart - Emit a call to llvm.dbg.function.start to indicate
/// start of a new function
void EmitFunctionStart(const FunctionDecl *FnDecl, llvm::Function *Fn,
- llvm::IRBuilder &Builder);
+ llvm::IRBuilder<true> &Builder);
/// EmitRegionStart - Emit a call to llvm.dbg.region.start to indicate start
/// of a new block.
- void EmitRegionStart(llvm::Function *Fn, llvm::IRBuilder &Builder);
+ void EmitRegionStart(llvm::Function *Fn, llvm::IRBuilder<true> &Builder);
/// EmitRegionEnd - Emit call to llvm.dbg.region.end to indicate end of a
/// block.
- void EmitRegionEnd(llvm::Function *Fn, llvm::IRBuilder &Builder);
+ void EmitRegionEnd(llvm::Function *Fn, llvm::IRBuilder<true> &Builder);
/// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration.
void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI,
- llvm::IRBuilder &Builder);
+ llvm::IRBuilder<true> &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;
+ llvm::IRBuilder<> &Builder;
llvm::Value *DestPtr;
bool VolatileDest;
public:
class VISIBILITY_HIDDEN ComplexExprEmitter
: public StmtVisitor<ComplexExprEmitter, ComplexPairTy> {
CodeGenFunction &CGF;
- llvm::IRBuilder &Builder;
+ llvm::IRBuilder<> &Builder;
public:
ComplexExprEmitter(CodeGenFunction &cgf) : CGF(cgf), Builder(CGF.Builder) {
}
class VISIBILITY_HIDDEN ScalarExprEmitter
: public StmtVisitor<ScalarExprEmitter, Value*> {
CodeGenFunction &CGF;
- llvm::IRBuilder &Builder;
+ llvm::IRBuilder<> &Builder;
CGObjCRuntime *Runtime;
public:
CGObjCGNU(CodeGen::CodeGenModule &cgm);
virtual llvm::Constant *GenerateConstantString(const char *String,
const size_t length);
- virtual llvm::Value *GenerateMessageSend(llvm::IRBuilder &Builder,
+ virtual llvm::Value *GenerateMessageSend(llvm::IRBuilder<> &Builder,
const llvm::Type *ReturnTy,
llvm::Value *Sender,
llvm::Value *Receiver,
Selector Sel,
llvm::Value** ArgV,
unsigned ArgC);
- virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder &Builder,
+ virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
const llvm::Type *ReturnTy,
llvm::Value *Sender,
const char *SuperClassName,
Selector Sel,
llvm::Value** ArgV,
unsigned ArgC);
- virtual llvm::Value *LookupClass(llvm::IRBuilder &Builder,
+ virtual llvm::Value *LookupClass(llvm::IRBuilder<> &Builder,
llvm::Value *ClassName);
- virtual llvm::Value *GetSelector(llvm::IRBuilder &Builder, Selector Sel);
+ virtual llvm::Value *GetSelector(llvm::IRBuilder<> &Builder, Selector Sel);
virtual llvm::Function *MethodPreamble(
const std::string &ClassName,
const llvm::SmallVectorImpl<Selector> &ClassMethodSels,
const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes,
const llvm::SmallVectorImpl<std::string> &Protocols);
- virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder &Builder, const char
- *ProtocolName);
+ virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<> &Builder,
+ const char *ProtocolName);
virtual void GenerateProtocol(const char *ProtocolName,
const llvm::SmallVectorImpl<std::string> &Protocols,
const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodNames,
}
// This has to perform the lookup every time, since posing and related
// techniques can modify the name -> class mapping.
-llvm::Value *CGObjCGNU::LookupClass(llvm::IRBuilder &Builder,
+llvm::Value *CGObjCGNU::LookupClass(llvm::IRBuilder<> &Builder,
llvm::Value *ClassName) {
llvm::Constant *ClassLookupFn =
TheModule.getOrInsertFunction("objc_lookup_class", IdTy, PtrToInt8Ty,
}
/// 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(llvm::IRBuilder<> &Builder, Selector Sel) {
// FIXME: uniquing on the string is wasteful, unique on Sel instead!
llvm::GlobalAlias *&US = UntypedSelectors[Sel.getName()];
if (US == 0)
///Generates a message send where the super is the receiver. This is a message
///send to self with special delivery semantics indicating which class's method
///should be called.
-llvm::Value *CGObjCGNU::GenerateMessageSendSuper(llvm::IRBuilder &Builder,
+llvm::Value *CGObjCGNU::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
const llvm::Type *ReturnTy,
llvm::Value *Sender,
const char *SuperClassName,
}
/// Generate code for a message send expression.
-llvm::Value *CGObjCGNU::GenerateMessageSend(llvm::IRBuilder &Builder,
+llvm::Value *CGObjCGNU::GenerateMessageSend(llvm::IRBuilder<> &Builder,
const llvm::Type *ReturnTy,
llvm::Value *Sender,
llvm::Value *Receiver,
return MakeGlobal(ProtocolListTy, Elements, ".objc_protocol_list");
}
-llvm::Value *CGObjCGNU::GenerateProtocolRef(llvm::IRBuilder &Builder, const
+llvm::Value *CGObjCGNU::GenerateProtocolRef(llvm::IRBuilder<> &Builder, const
char *ProtocolName) {
return ExistingProtocols[ProtocolName];
}
llvm::GlobalValue::InternalLinkage, ".objc_load_function",
&TheModule);
llvm::BasicBlock *EntryBB = llvm::BasicBlock::Create("entry", LoadFunction);
- llvm::IRBuilder Builder;
+ llvm::IRBuilder<> Builder;
Builder.SetInsertPoint(EntryBB);
llvm::Value *Register = TheModule.getOrInsertFunction("__objc_exec_class",
llvm::Type::VoidTy, llvm::PointerType::getUnqual(ModuleTy), NULL);
#include <string>
namespace llvm {
- class IRBuilder;
+ template<bool C> class IRBuilder;
class Constant;
class Type;
class Value;
virtual ~CGObjCRuntime();
/// Generate an Objective-C message send operation
- virtual llvm::Value *GenerateMessageSend(llvm::IRBuilder &Builder,
+ virtual llvm::Value *GenerateMessageSend(llvm::IRBuilder<true> &Builder,
const llvm::Type *ReturnTy,
llvm::Value *Sender,
llvm::Value *Receiver,
/// this compilation unit with the runtime library.
virtual llvm::Function *ModuleInitFunction() =0;
/// Get a selector for the specified name and type values
- virtual llvm::Value *GetSelector(llvm::IRBuilder &Builder, Selector Sel) = 0;
+ virtual llvm::Value *GetSelector(llvm::IRBuilder<true> &Builder,
+ Selector Sel) =0;
/// Generate a constant string object
virtual llvm::Constant *GenerateConstantString(const char *String,
const size_t Length) = 0;
const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes,
const llvm::SmallVectorImpl<std::string> &Protocols) =0;
/// Generate a reference to the named protocol.
- virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder &Builder, const char
- *ProtocolName) =0;
- virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder &Builder,
+ virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<true> &Builder,
+ const char *ProtocolName) =0;
+ virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<true> &Builder,
const llvm::Type *ReturnTy,
llvm::Value *Sender,
const char *SuperClassName,
bool isClassMethod,
bool isVarArg) = 0;
/// Look up the class for the specified name
- virtual llvm::Value *LookupClass(llvm::IRBuilder &Builder, llvm::Value
- *ClassName) =0;
+ virtual llvm::Value *LookupClass(llvm::IRBuilder<true> &Builder,
+ llvm::Value *ClassName) =0;
/// If instance variable addresses are determined at runtime then this should
/// return true, otherwise instance variables will be accessed directly from
/// the structure. If this returns true then @defs is invalid for this
TargetInfo &Target;
typedef std::pair<llvm::Value *, llvm::Value *> ComplexPairTy;
- llvm::IRBuilder Builder;
+ llvm::IRBuilder<> Builder;
// Holds the Decl for the current function or method
const Decl *CurFuncDecl;