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/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp
new file mode 100644
index 0000000..af3745f
--- /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);
+}