[cfe-commits] r62894 - /cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Fariborz Jahanian fjahanian at apple.com
Fri Jan 23 15:53:39 PST 2009


Author: fjahanian
Date: Fri Jan 23 17:53:38 2009
New Revision: 62894

URL: http://llvm.org/viewvc/llvm-project?rev=62894&view=rev
Log:
Some very early work for new objc's 
meta-data generation.

Modified:
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=62894&r1=62893&r2=62894&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Fri Jan 23 17:53:38 2009
@@ -234,6 +234,9 @@
   // ClassnfABITy - LLVM for struct _class_t
   const llvm::StructType *ClassnfABITy;
   
+  // ClassnfABIPtrTy - LLVM for struct _class_t*
+  const llvm::Type *ClassnfABIPtrTy;
+  
   // IvarnfABITy - LLVM for struct _ivar_t
   const llvm::StructType *IvarnfABITy;
   
@@ -344,6 +347,8 @@
 public:
   CGObjCCommonMac(CodeGen::CodeGenModule &cgm) : CGM(cgm)
   { }
+  
+  virtual llvm::Constant *GenerateConstantString(const std::string &String);
 };
   
 class CGObjCMac : public CGObjCCommonMac {
@@ -476,8 +481,9 @@
 
 public:
   CGObjCMac(CodeGen::CodeGenModule &cgm);
-  virtual llvm::Constant *GenerateConstantString(const std::string &String);
 
+  virtual llvm::Function *ModuleInitFunction();
+  
   virtual CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
                                               QualType ResultType,
                                               Selector Sel,
@@ -511,7 +517,6 @@
 
   virtual void GenerateProtocol(const ObjCProtocolDecl *PD);
 
-  virtual llvm::Function *ModuleInitFunction();
   virtual llvm::Function *GetPropertyGetFunction();
   virtual llvm::Function *GetPropertySetFunction();
   virtual llvm::Function *EnumerationMutationFunction();
@@ -535,8 +540,83 @@
 class CGObjCNonFragileABIMac : public CGObjCCommonMac {
 private:
   ObjCNonFragileABITypesHelper ObjCTypes;
+  llvm::GlobalVariable* ObjCEmptyCacheVar;
+  llvm::GlobalVariable* ObjCEmptyVtableVar;
+  
+  /// FinishNonFragileABIModule - Write out global data structures at the end of
+  /// processing a translation unit.
+  void FinishNonFragileABIModule();
+  
 public:
   CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm);
+  // FIXME. All stubs for now!
+  virtual llvm::Function *ModuleInitFunction();
+  
+  virtual CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
+                                              QualType ResultType,
+                                              Selector Sel,
+                                              llvm::Value *Receiver,
+                                              bool IsClassMessage,
+                                              const CallArgList &CallArgs)
+    {return RValue::get(0);}
+  
+  virtual CodeGen::RValue 
+  GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
+                           QualType ResultType,
+                           Selector Sel,
+                           const ObjCInterfaceDecl *Class,
+                           llvm::Value *Receiver,
+                           bool IsClassMessage,
+                           const CallArgList &CallArgs){ return RValue::get(0);}
+  
+  virtual llvm::Value *GetClass(CGBuilderTy &Builder,
+                                const ObjCInterfaceDecl *ID){ return 0; }
+  
+  virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel)
+    { return 0; }
+  
+  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
+                                         const ObjCContainerDecl *CD=0)
+    { return 0; }
+  
+  virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD)
+  { return; }
+  
+  virtual void GenerateClass(const ObjCImplementationDecl *ClassDecl);
+  
+  virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
+                                           const ObjCProtocolDecl *PD)
+    { return 0; }
+  
+  virtual void GenerateProtocol(const ObjCProtocolDecl *PD){ return; }
+  
+  virtual llvm::Function *GetPropertyGetFunction(){ return 0; }
+  virtual llvm::Function *GetPropertySetFunction()
+    { return 0; }
+  virtual llvm::Function *EnumerationMutationFunction()
+    { return 0; }
+  
+  virtual void EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
+                                         const Stmt &S)
+    { return; }
+  virtual void EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
+                             const ObjCAtThrowStmt &S)
+    { return; }
+  virtual llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
+                                         llvm::Value *AddrWeakObj)
+    { return 0; }
+  virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
+                                  llvm::Value *src, llvm::Value *dst)
+    { return; } 
+  virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
+                                    llvm::Value *src, llvm::Value *dest)
+    { return; }
+  virtual void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
+                                  llvm::Value *src, llvm::Value *dest)
+  { return; }
+  virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
+                                        llvm::Value *src, llvm::Value *dest)
+    { return; }
 };
   
 } // end anonymous namespace
@@ -585,7 +665,8 @@
    };
 */
 
-llvm::Constant *CGObjCMac::GenerateConstantString(const std::string &String) {
+llvm::Constant *CGObjCCommonMac::GenerateConstantString(
+                                                  const std::string &String) {
   return CGM.GetAddrOfConstantCFString(String);
 }
 
@@ -2300,6 +2381,7 @@
   : CGObjCCommonMac(cgm),
   ObjCTypes(cgm)
 {
+  ObjCEmptyCacheVar = ObjCEmptyVtableVar = NULL;
   ObjCABI = 2;
 }
 
@@ -2862,13 +2944,13 @@
   CGM.getModule().addTypeName("struct._objc_protocol_list",
                               ProtocolListnfABITy);
   
-  // FIXME! Is this doing the right thing?
-  cast<llvm::OpaqueType>(ProtocolListTyHolder.get())->refineAbstractTypeTo(
-                                                        ProtocolListnfABITy);
-  
   // struct _objc_protocol_list*
   ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy);
   
+  // FIXME! Is this doing the right thing?
+  cast<llvm::OpaqueType>(ProtocolListTyHolder.get())->refineAbstractTypeTo(
+                                                      ProtocolListnfABIPtrTy);
+  
   // struct _ivar_t {
   //   unsigned long int *offset;  // pointer to ivar offset location
   //   char *name;
@@ -2953,6 +3035,9 @@
   cast<llvm::OpaqueType>(ClassTyHolder.get())->refineAbstractTypeTo(
                                                                 ClassnfABITy);
   
+  // LLVM for struct _class_t *
+  ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy);
+  
   // struct _category_t {
   //   const char * const name;
   //   struct _class_t *const cls;
@@ -2962,8 +3047,7 @@
   //   const struct _prop_list_t * const properties;
   // }
   CategorynfABITy = llvm::StructType::get(Int8PtrTy,
-                                          llvm::PointerType::getUnqual(
-                                                               ClassnfABITy),
+                                          ClassnfABIPtrTy,
                                           MethodListnfABIPtrTy,
                                           MethodListnfABIPtrTy,
                                           ProtocolListnfABIPtrTy,
@@ -2973,6 +3057,120 @@
                                           
 }
 
+llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() { 
+  FinishNonFragileABIModule();
+  
+  return NULL;
+}
+
+void CGObjCNonFragileABIMac::FinishNonFragileABIModule() {
+  // nonfragile abi has no module definition.
+  std::vector<llvm::Constant*> Used;
+  for (std::vector<llvm::GlobalVariable*>::iterator i = UsedGlobals.begin(), 
+       e = UsedGlobals.end(); i != e; ++i) {
+    Used.push_back(llvm::ConstantExpr::getBitCast(*i, ObjCTypes.Int8PtrTy));
+  }
+  
+  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.Int8PtrTy, Used.size());
+  llvm::GlobalValue *GV = 
+  new llvm::GlobalVariable(AT, false,
+                           llvm::GlobalValue::AppendingLinkage,
+                           llvm::ConstantArray::get(AT, Used),
+                           "llvm.used", 
+                           &CGM.getModule());
+  
+  GV->setSection("llvm.metadata");
+  
+}
+
+void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
+  std::string ClassName = ID->getNameAsString();
+  if (!ObjCEmptyCacheVar) {
+    ObjCEmptyCacheVar = new llvm::GlobalVariable(
+                                            ObjCTypes.CachePtrTy,
+                                            false,
+                                            llvm::GlobalValue::ExternalLinkage,
+                                            0,
+                                            "\01_objc_empty_cache",
+                                            &CGM.getModule());
+    UsedGlobals.push_back(ObjCEmptyCacheVar);
+    
+    ObjCEmptyVtableVar = new llvm::GlobalVariable(
+                            llvm::PointerType::getUnqual(
+                                                  ObjCTypes.ImpnfABITy),
+                            false,
+                            llvm::GlobalValue::ExternalLinkage,
+                            0,
+                            "\01_objc_empty_vtable",
+                            &CGM.getModule());
+    UsedGlobals.push_back(ObjCEmptyVtableVar);
+  }
+  
+  std::vector<llvm::Constant*> Values(11); // 11 for 64bit targets!
+  // Generate following meta-data:
+  // struct _class_ro_t {
+  //   uint32_t const flags;
+  //   uint32_t const instanceStart;
+  //   uint32_t const instanceSize;
+  //   uint32_t const reserved;  // only when building for 64bit targets
+  //   const uint8_t * const ivarLayout;
+  //   const char *const name;
+  //   const struct _method_list_t * const baseMethods;
+  //   const struct _objc_protocol_list *const baseProtocols;
+  //   const struct _ivar_list_t *const ivars;
+  //   const uint8_t * const weakIvarLayout;
+  //   const struct _prop_list_t * const properties;
+  // }
+  Values[ 0] = llvm::ConstantInt::get(ObjCTypes.IntTy, 0);
+  Values[ 1] = llvm::ConstantInt::get(ObjCTypes.IntTy, 0);
+  Values[ 2] = llvm::ConstantInt::get(ObjCTypes.IntTy, 0);
+  Values[ 3] = llvm::ConstantInt::get(ObjCTypes.IntTy, 0);
+  // FIXME. For 64bit targets add 0 here.
+  Values[ 4] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
+  Values[ 5] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
+  Values[ 6] = llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
+  Values[ 7] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
+  Values[ 8] = llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
+  Values[ 9] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
+  Values[10] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
+  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassRonfABITy,
+                                                   Values);
+  llvm::GlobalVariable *CLASS_RO_GV =
+    new llvm::GlobalVariable(ObjCTypes.ClassRonfABITy, false,
+                           llvm::GlobalValue::InternalLinkage,
+                           Init,
+                           std::string("\01l_OBJC_CLASS_RO_$_")+ClassName,
+                           &CGM.getModule());
+  CLASS_RO_GV->setSection(".section __DATA,__data,regular,no_dead_strip");
+  UsedGlobals.push_back(CLASS_RO_GV);
+  
+  // Generate following meta-data:
+  // struct _class_t {
+  //   struct _class_t *isa;
+  //   struct _class_t * const superclass;
+  //   void *cache;
+  //   IMP *vtable;
+  //   struct class_ro_t *ro;
+  // }
+  Values.resize(5);
+  Values[0] = llvm::Constant::getNullValue(ObjCTypes.ClassnfABIPtrTy);
+  Values[1] = llvm::Constant::getNullValue(ObjCTypes.ClassnfABIPtrTy);
+  Values[2] = ObjCEmptyCacheVar;  // &ObjCEmptyCacheVar
+  Values[3] = ObjCEmptyVtableVar; // &ObjCEmptyVtableVar
+  Values[4] = CLASS_RO_GV;                 // &CLASS_RO_GV
+  Init = llvm::ConstantStruct::get(ObjCTypes.ClassnfABITy, Values);
+  llvm::GlobalVariable *GV =
+    new llvm::GlobalVariable(ObjCTypes.ClassnfABITy, false,
+                           llvm::GlobalValue::ExternalLinkage,
+                           Init,
+                           std::string("\01_OBJC_CLASS_$_")+ClassName,
+                           &CGM.getModule());
+  GV->setSection(".section __DATA,__data,regular,no_dead_strip");
+  UsedGlobals.push_back(GV);
+  // FIXME! why?
+  GV->setAlignment(32);
+}
+
 /* *** */
 
 CodeGen::CGObjCRuntime *
@@ -2982,6 +3180,5 @@
 
 CodeGen::CGObjCRuntime *
 CodeGen::CreateMacNonFragileABIObjCRuntime(CodeGen::CodeGenModule &CGM) {
-  return 0;
-  // return new CGObjCNonFragileABIMac(CGM);
+  return new CGObjCNonFragileABIMac(CGM);
 }





More information about the cfe-commits mailing list