[cfe-commits] r74008 - in /cfe/trunk: lib/CodeGen/CGObjCGNU.cpp lib/CodeGen/CGObjCMac.cpp lib/CodeGen/CGObjCRuntime.h lib/CodeGen/CodeGenModule.cpp test/CodeGenObjC/deadcode_strip_used_var.m

Fariborz Jahanian fjahanian at apple.com
Tue Jun 23 14:47:47 PDT 2009


Author: fjahanian
Date: Tue Jun 23 16:47:46 2009
New Revision: 74008

URL: http://llvm.org/viewvc/llvm-project?rev=74008&view=rev
Log:
Patch fixes an obscure bug when 'used' attribute is applied to
variables in ObjC's Next runtime mode. Next runtime also implicitly applies
'used' attribute on some of its meta-data. This results in two 
'llvm.used' arrays to be generated, and one of them is renamed to
'llvm.used1'.


Added:
    cfe/trunk/test/CodeGenObjC/deadcode_strip_used_var.m
Modified:
    cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp
    cfe/trunk/lib/CodeGen/CGObjCRuntime.h
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Tue Jun 23 16:47:46 2009
@@ -139,6 +139,7 @@
                                            const ObjCProtocolDecl *PD);
   virtual void GenerateProtocol(const ObjCProtocolDecl *PD);
   virtual llvm::Function *ModuleInitFunction();
+  virtual void MergeMetadataGlobals(std::vector<llvm::Constant*> &UsedArray);
   virtual llvm::Function *GetPropertyGetFunction();
   virtual llvm::Function *GetPropertySetFunction();
   virtual llvm::Function *EnumerationMutationFunction();
@@ -998,6 +999,10 @@
   Classes.push_back(ClassStruct);
 }
 
+void CGObjCGNU::MergeMetadataGlobals(
+                          std::vector<llvm::Constant*> &UsedArray) {
+}
+
 llvm::Function *CGObjCGNU::ModuleInitFunction() { 
   // Only emit an ObjC load function if no Objective-C stuff has been called
   if (Classes.empty() && Categories.empty() && ConstantStrings.empty() &&

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Tue Jun 23 16:47:46 2009
@@ -911,6 +911,8 @@
                                         const CallArgList &CallArgs,
                                         const ObjCCommonTypesHelper &ObjCTypes);
 
+  virtual void MergeMetadataGlobals(std::vector<llvm::Constant*> &UsedArray);
+
 public:
   CGObjCCommonMac(CodeGen::CodeGenModule &cgm) : CGM(cgm)
   { }
@@ -3426,6 +3428,16 @@
   NameOut += ']';
 }
 
+void CGObjCCommonMac::MergeMetadataGlobals(
+                                  std::vector<llvm::Constant*> &UsedArray) {
+  llvm::Type *i8PTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+  for (std::vector<llvm::GlobalVariable*>::iterator i = UsedGlobals.begin(),
+       e = UsedGlobals.end(); i != e; ++i) {
+    UsedArray.push_back(llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(*i), 
+                                                       i8PTy));
+  }
+}
+
 void CGObjCMac::FinishModule() {
   EmitModuleInfo();
 
@@ -3447,22 +3459,6 @@
                                                         Values));
   }
 
-  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");
-
   // Add assembler directives to add lazy undefined symbol references
   // for classes which are referenced but not defined. This is
   // important for correct linker interaction.
@@ -4111,24 +4107,6 @@
   IMGV->setSection("__DATA, __objc_imageinfo, regular, no_dead_strip");
   IMGV->setConstant(true);
   UsedGlobals.push_back(IMGV);
-  
-  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");
-  
 }
 
 /// LegacyDispatchedSelector - Returns true if SEL is not in the list of

Modified: cfe/trunk/lib/CodeGen/CGObjCRuntime.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.h?rev=74008&r1=74007&r2=74008&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCRuntime.h (original)
+++ cfe/trunk/lib/CodeGen/CGObjCRuntime.h Tue Jun 23 16:47:46 2009
@@ -95,6 +95,9 @@
   /// this compilation unit with the runtime library.
   virtual llvm::Function *ModuleInitFunction() = 0;
 
+  /// Add metadata globals to the 'used' globals for final output.
+  virtual void MergeMetadataGlobals(std::vector<llvm::Constant*> &UsedArray) = 0;
+
   /// Get a selector for the specified name and type values. The
   /// return value should have the LLVM type for pointer-to
   /// ASTContext::getObjCSelType().

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Jun 23 16:47:46 2009
@@ -406,11 +406,12 @@
 
 void CodeGenModule::EmitLLVMUsed() {
   // Don't create llvm.used if there is no need.
-  if (LLVMUsed.empty())
+  // FIXME. Runtime indicates that there might be more 'used' symbols; but not
+  // necessariy. So, this test is not accurate for emptiness.
+  if (LLVMUsed.empty() && !Runtime)
     return;
 
   llvm::Type *i8PTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
-  llvm::ArrayType *ATy = llvm::ArrayType::get(i8PTy, LLVMUsed.size());
   
   // Convert LLVMUsed to what ConstantArray needs.
   std::vector<llvm::Constant*> UsedArray;
@@ -420,6 +421,12 @@
      llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(&*LLVMUsed[i]), i8PTy);
   }
   
+  if (Runtime)
+    Runtime->MergeMetadataGlobals(UsedArray);
+  if (UsedArray.empty())
+    return;
+  llvm::ArrayType *ATy = llvm::ArrayType::get(i8PTy, UsedArray.size());
+  
   llvm::GlobalVariable *GV = 
     new llvm::GlobalVariable(ATy, false, 
                              llvm::GlobalValue::AppendingLinkage,

Added: cfe/trunk/test/CodeGenObjC/deadcode_strip_used_var.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/deadcode_strip_used_var.m?rev=74008&view=auto

==============================================================================
--- cfe/trunk/test/CodeGenObjC/deadcode_strip_used_var.m (added)
+++ cfe/trunk/test/CodeGenObjC/deadcode_strip_used_var.m Tue Jun 23 16:47:46 2009
@@ -0,0 +1,9 @@
+// RUN: clang-cc %s -emit-llvm -o %t -triple i386-apple-darwin10 &&
+// RUN: grep "llvm.used" %t | count 1 &&
+// RUN: clang-cc %s -emit-llvm -o %t -triple x86_64-apple-darwin10 &&
+// RUN: grep "llvm.used" %t | count 1 
+
+
+__attribute__((used)) static int  XXXXXX  __attribute__ ((section ("__DATA,__Xinterpose"))) ;
+__attribute__((used)) static int  YYYY  __attribute__ ((section ("__DATA,__Xinterpose"))) ;
+





More information about the cfe-commits mailing list