[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