From: Daniel Dunbar Date: Mon, 11 Aug 2008 02:45:11 +0000 (+0000) Subject: Add dummy Mac Objective-C runtime interface. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c17a4d3b16a2624a76de5d7508805534545bd3bf;p=clang Add dummy Mac Objective-C runtime interface. - Not currently accessible and completely non-functional. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54624 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index 003991df34..9c8d32da44 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -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); } diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp new file mode 100644 index 0000000000..af3745feed --- /dev/null +++ b/lib/CodeGen/CGObjCMac.cpp @@ -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 + +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 &InstanceMethodSels, + const llvm::SmallVectorImpl &InstanceMethodTypes, + const llvm::SmallVectorImpl &ClassMethodSels, + const llvm::SmallVectorImpl &ClassMethodTypes, + const llvm::SmallVectorImpl &Protocols); + + virtual void GenerateClass( + const char *ClassName, + const char *SuperClassName, + const int instanceSize, + const llvm::SmallVectorImpl &IvarNames, + const llvm::SmallVectorImpl &IvarTypes, + const llvm::SmallVectorImpl &IvarOffsets, + const llvm::SmallVectorImpl &InstanceMethodSels, + const llvm::SmallVectorImpl &InstanceMethodTypes, + const llvm::SmallVectorImpl &ClassMethodSels, + const llvm::SmallVectorImpl &ClassMethodTypes, + const llvm::SmallVectorImpl &Protocols); + + virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<> &Builder, + const char *ProtocolName); + + virtual void GenerateProtocol(const char *ProtocolName, + const llvm::SmallVectorImpl &Protocols, + const llvm::SmallVectorImpl &InstanceMethodNames, + const llvm::SmallVectorImpl &InstanceMethodTypes, + const llvm::SmallVectorImpl &ClassMethodNames, + const llvm::SmallVectorImpl &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 &Protocols, + const llvm::SmallVectorImpl &InstanceMethodNames, + const llvm::SmallVectorImpl &InstanceMethodTypes, + const llvm::SmallVectorImpl &ClassMethodNames, + const llvm::SmallVectorImpl &ClassMethodTypes) { + assert(0 && "Cannot generate protocol for Mac runtime."); +} + +void CGObjCMac::GenerateCategory( + const char *ClassName, + const char *CategoryName, + const llvm::SmallVectorImpl &InstanceMethodSels, + const llvm::SmallVectorImpl &InstanceMethodTypes, + const llvm::SmallVectorImpl &ClassMethodSels, + const llvm::SmallVectorImpl &ClassMethodTypes, + const llvm::SmallVectorImpl &Protocols) { + assert(0 && "Cannot generate category for Mac runtime."); +} + +void CGObjCMac::GenerateClass( + const char *ClassName, + const char *SuperClassName, + const int instanceSize, + const llvm::SmallVectorImpl &IvarNames, + const llvm::SmallVectorImpl &IvarTypes, + const llvm::SmallVectorImpl &IvarOffsets, + const llvm::SmallVectorImpl &InstanceMethodSels, + const llvm::SmallVectorImpl &InstanceMethodTypes, + const llvm::SmallVectorImpl &ClassMethodSels, + const llvm::SmallVectorImpl &ClassMethodTypes, + const llvm::SmallVectorImpl &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); +} diff --git a/lib/CodeGen/CGObjCRuntime.h b/lib/CodeGen/CGObjCRuntime.h index c2f9f54e70..109d27422f 100644 --- a/lib/CodeGen/CGObjCRuntime.h +++ b/lib/CodeGen/CGObjCRuntime.h @@ -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 &Protocols) =0; /// Generate a reference to the named protocol. virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder &Builder, - const char *ProtocolName) =0; + const char *ProtocolName) = 0; virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder &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 diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index d17a6c88e4..cd8c90f921 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -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; diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index 8e7bb405a1..bd45f6580f 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -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(); diff --git a/lib/CodeGen/ModuleBuilder.cpp b/lib/CodeGen/ModuleBuilder.cpp index 8ec885e7f1..b654df744c 100644 --- a/lib/CodeGen/ModuleBuilder.cpp +++ b/lib/CodeGen/ModuleBuilder.cpp @@ -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) {