diff options
author | Daniel Dunbar <daniel@zuster.org> | 2008-08-11 02:45:11 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2008-08-11 02:45:11 +0000 |
commit | c17a4d3b16a2624a76de5d7508805534545bd3bf (patch) | |
tree | 15f0875382b94ef651d6a03742773263fcfa97b5 /lib/CodeGen/CGObjCMac.cpp | |
parent | c46cf49229a5a3e2d10b776ece4f1c5378123de0 (diff) |
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
Diffstat (limited to 'lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 214 |
1 files changed, 214 insertions, 0 deletions
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 <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); +} |