forked from OSchip/llvm-project
Add dummy Mac Objective-C runtime interface.
- Not currently accessible and completely non-functional. llvm-svn: 54624
This commit is contained in:
parent
d83be33cc0
commit
303e2c2f1f
|
@ -864,6 +864,6 @@ llvm::Function *CGObjCGNU::MethodPreamble(
|
|||
return Method;
|
||||
}
|
||||
|
||||
CodeGen::CGObjCRuntime *CodeGen::CreateObjCRuntime(CodeGen::CodeGenModule &CGM){
|
||||
CodeGen::CGObjCRuntime *CodeGen::CreateGNUObjCRuntime(CodeGen::CodeGenModule &CGM){
|
||||
return new CGObjCGNU(CGM);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,214 @@
|
|||
//===------- CGObjCMac.cpp - Interface to Apple Objective-C Runtime -------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This provides Objective-C code generation targetting the Apple runtime.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "CGObjCRuntime.h"
|
||||
#include "CodeGenModule.h"
|
||||
#include "clang/AST/ASTContext.h"
|
||||
#include "llvm/Module.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
#include "llvm/Support/IRBuilder.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include <map>
|
||||
|
||||
using namespace clang;
|
||||
|
||||
namespace {
|
||||
class CGObjCMac : public CodeGen::CGObjCRuntime {
|
||||
private:
|
||||
CodeGen::CodeGenModule &CGM;
|
||||
|
||||
public:
|
||||
CGObjCMac(CodeGen::CodeGenModule &cgm);
|
||||
virtual llvm::Constant *GenerateConstantString(const char *String,
|
||||
const size_t length);
|
||||
|
||||
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,
|
||||
const llvm::Type *ReturnTy,
|
||||
llvm::Value *Sender,
|
||||
const char *SuperClassName,
|
||||
llvm::Value *Receiver,
|
||||
Selector Sel,
|
||||
llvm::Value** ArgV,
|
||||
unsigned ArgC);
|
||||
|
||||
virtual llvm::Value *LookupClass(llvm::IRBuilder<> &Builder,
|
||||
llvm::Value *ClassName);
|
||||
|
||||
virtual llvm::Value *GetSelector(llvm::IRBuilder<> &Builder, Selector Sel);
|
||||
|
||||
virtual llvm::Function *MethodPreamble(const std::string &ClassName,
|
||||
const std::string &CategoryName,
|
||||
const std::string &MethodName,
|
||||
const llvm::Type *ReturnTy,
|
||||
const llvm::Type *SelfTy,
|
||||
const llvm::Type **ArgTy,
|
||||
unsigned ArgC,
|
||||
bool isClassMethod,
|
||||
bool isVarArg);
|
||||
|
||||
virtual void GenerateCategory(const char *ClassName, const char *CategoryName,
|
||||
const llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
|
||||
const llvm::SmallVectorImpl<Selector> &ClassMethodSels,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes,
|
||||
const llvm::SmallVectorImpl<std::string> &Protocols);
|
||||
|
||||
virtual void GenerateClass(
|
||||
const char *ClassName,
|
||||
const char *SuperClassName,
|
||||
const int instanceSize,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &IvarNames,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &IvarTypes,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &IvarOffsets,
|
||||
const llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
|
||||
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 void GenerateProtocol(const char *ProtocolName,
|
||||
const llvm::SmallVectorImpl<std::string> &Protocols,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodNames,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodNames,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes);
|
||||
|
||||
virtual llvm::Function *ModuleInitFunction();
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
CGObjCMac::CGObjCMac(CodeGen::CodeGenModule &cgm) : CGM(cgm) {
|
||||
}
|
||||
|
||||
// This has to perform the lookup every time, since posing and related
|
||||
// techniques can modify the name -> class mapping.
|
||||
llvm::Value *CGObjCMac::LookupClass(llvm::IRBuilder<> &Builder,
|
||||
llvm::Value *ClassName) {
|
||||
assert(0 && "Cannot lookup classes on Mac runtime.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// GetSelector - Return the pointer to the unique'd string for this selector.
|
||||
llvm::Value *CGObjCMac::GetSelector(llvm::IRBuilder<> &Builder, Selector Sel) {
|
||||
assert(0 && "Cannot get selector on Mac runtime.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Generate an NSConstantString object.
|
||||
llvm::Constant *CGObjCMac::GenerateConstantString(const char *String,
|
||||
const size_t length) {
|
||||
assert(0 && "Cannot generate constant string for Mac runtime.");
|
||||
return 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 *CGObjCMac::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
|
||||
const llvm::Type *ReturnTy,
|
||||
llvm::Value *Sender,
|
||||
const char *SuperClassName,
|
||||
llvm::Value *Receiver,
|
||||
Selector Sel,
|
||||
llvm::Value** ArgV,
|
||||
unsigned ArgC) {
|
||||
assert(0 && "Cannot generate message send to super for Mac runtime.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Generate code for a message send expression.
|
||||
llvm::Value *CGObjCMac::GenerateMessageSend(llvm::IRBuilder<> &Builder,
|
||||
const llvm::Type *ReturnTy,
|
||||
llvm::Value *Sender,
|
||||
llvm::Value *Receiver,
|
||||
Selector Sel,
|
||||
llvm::Value** ArgV,
|
||||
unsigned ArgC) {
|
||||
assert(0 && "Cannot generate message send for Mac runtime.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
llvm::Value *CGObjCMac::GenerateProtocolRef(llvm::IRBuilder<> &Builder,
|
||||
const char *ProtocolName) {
|
||||
assert(0 && "Cannot get protocol reference on Mac runtime.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CGObjCMac::GenerateProtocol(const char *ProtocolName,
|
||||
const llvm::SmallVectorImpl<std::string> &Protocols,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodNames,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodNames,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes) {
|
||||
assert(0 && "Cannot generate protocol for Mac runtime.");
|
||||
}
|
||||
|
||||
void CGObjCMac::GenerateCategory(
|
||||
const char *ClassName,
|
||||
const char *CategoryName,
|
||||
const llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
|
||||
const llvm::SmallVectorImpl<Selector> &ClassMethodSels,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes,
|
||||
const llvm::SmallVectorImpl<std::string> &Protocols) {
|
||||
assert(0 && "Cannot generate category for Mac runtime.");
|
||||
}
|
||||
|
||||
void CGObjCMac::GenerateClass(
|
||||
const char *ClassName,
|
||||
const char *SuperClassName,
|
||||
const int instanceSize,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &IvarNames,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &IvarTypes,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &IvarOffsets,
|
||||
const llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
|
||||
const llvm::SmallVectorImpl<Selector> &ClassMethodSels,
|
||||
const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes,
|
||||
const llvm::SmallVectorImpl<std::string> &Protocols) {
|
||||
assert(0 && "Cannot generate class for Mac runtime.");
|
||||
}
|
||||
|
||||
llvm::Function *CGObjCMac::ModuleInitFunction() {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
llvm::Function *CGObjCMac::MethodPreamble(
|
||||
const std::string &ClassName,
|
||||
const std::string &CategoryName,
|
||||
const std::string &MethodName,
|
||||
const llvm::Type *ReturnTy,
|
||||
const llvm::Type *SelfTy,
|
||||
const llvm::Type **ArgTy,
|
||||
unsigned ArgC,
|
||||
bool isClassMethod,
|
||||
bool isVarArg) {
|
||||
assert(0 && "Cannot generate method preamble for Mac runtime.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
CodeGen::CGObjCRuntime *CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM){
|
||||
return new CGObjCMac(CGM);
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
//===----- CGObjCRuntime.h - Emit LLVM Code from ASTs for a Module --------===//
|
||||
//===----- CGObjCRuntime.h - Interface to ObjC Runtimes ---------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
|
@ -81,7 +81,7 @@ public:
|
|||
const llvm::SmallVectorImpl<std::string> &Protocols) =0;
|
||||
/// Generate a reference to the named protocol.
|
||||
virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<true> &Builder,
|
||||
const char *ProtocolName) =0;
|
||||
const char *ProtocolName) = 0;
|
||||
virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<true> &Builder,
|
||||
const llvm::Type *ReturnTy,
|
||||
llvm::Value *Sender,
|
||||
|
@ -121,7 +121,8 @@ public:
|
|||
|
||||
/// Creates an instance of an Objective-C runtime class.
|
||||
//TODO: This should include some way of selecting which runtime to target.
|
||||
CGObjCRuntime *CreateObjCRuntime(CodeGenModule &CGM);
|
||||
CGObjCRuntime *CreateGNUObjCRuntime(CodeGenModule &CGM);
|
||||
CGObjCRuntime *CreateMacObjCRuntime(CodeGenModule &CGM);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -34,12 +34,17 @@ using namespace CodeGen;
|
|||
|
||||
CodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO,
|
||||
llvm::Module &M, const llvm::TargetData &TD,
|
||||
Diagnostic &diags, bool GenerateDebugInfo)
|
||||
Diagnostic &diags, bool GenerateDebugInfo,
|
||||
bool UseMacObjCRuntime)
|
||||
: Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags),
|
||||
Types(C, M, TD), MemCpyFn(0), MemMoveFn(0), MemSetFn(0),
|
||||
CFConstantStringClassRef(0) {
|
||||
//TODO: Make this selectable at runtime
|
||||
Runtime = CreateObjCRuntime(*this);
|
||||
if (UseMacObjCRuntime) {
|
||||
Runtime = CreateMacObjCRuntime(*this);
|
||||
} else {
|
||||
Runtime = CreateGNUObjCRuntime(*this);
|
||||
}
|
||||
|
||||
// If debug info generation is enabled, create the CGDebugInfo object.
|
||||
DebugInfo = GenerateDebugInfo ? new CGDebugInfo(this) : 0;
|
||||
|
|
|
@ -105,7 +105,7 @@ class CodeGenModule {
|
|||
public:
|
||||
CodeGenModule(ASTContext &C, const LangOptions &Features, llvm::Module &M,
|
||||
const llvm::TargetData &TD, Diagnostic &Diags,
|
||||
bool GenerateDebugInfo);
|
||||
bool GenerateDebugInfo, bool UseMacObjCRuntime);
|
||||
|
||||
~CodeGenModule();
|
||||
|
||||
|
|
|
@ -60,7 +60,8 @@ namespace {
|
|||
M->setDataLayout(Ctx->Target.getTargetDescription());
|
||||
TD.reset(new llvm::TargetData(Ctx->Target.getTargetDescription()));
|
||||
Builder.reset(new CodeGen::CodeGenModule(Context, Features, *M, *TD,
|
||||
Diags, GenerateDebugInfo));
|
||||
Diags, GenerateDebugInfo,
|
||||
false));
|
||||
}
|
||||
|
||||
virtual void HandleTopLevelDecl(Decl *D) {
|
||||
|
|
Loading…
Reference in New Issue