[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

Daniel Dunbar daniel at zuster.org
Wed Jun 24 08:07:31 PDT 2009


Hi Fariborz,

I think this is more complicated than it need be, can't the runtime
just use CodeGenModule::AddUsedGlobal to add the things it wants to
mark used onto the global metadata used list?

 - Daniel

On Tue, Jun 23, 2009 at 2:47 PM, Fariborz Jahanian<fjahanian at apple.com> wrote:
> 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"))) ;
> +
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list