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<[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
