Do not emit a UsedDirective for things in the llvm.used

list that have internal linkage; the linker doesn't need
or want this.  (These objects must still be preserved
at compile time, so just removing them from the llvm.used
list doesn't work.)  Should affect only Darwin.

llvm-svn: 55722
This commit is contained in:
Dale Johannesen 2008-09-03 20:34:58 +00:00
parent bec27e2c8b
commit 5c1ff11fc3
2 changed files with 33 additions and 3 deletions

View File

@ -363,6 +363,7 @@ namespace llvm {
void printVisibility(const std::string& Name, unsigned Visibility) const; void printVisibility(const std::string& Name, unsigned Visibility) const;
private: private:
const GlobalValue *findGlobalValue(const Constant* CV);
void EmitLLVMUsedList(Constant *List); void EmitLLVMUsedList(Constant *List);
void EmitXXStructorList(Constant *List); void EmitXXStructorList(Constant *List);
void EmitConstantPool(unsigned Alignment, const char *Section, void EmitConstantPool(unsigned Alignment, const char *Section,

View File

@ -425,8 +425,34 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
return false; return false;
} }
/// findGlobalValue - if CV is an expression equivalent to a single
/// global value, return that value.
const GlobalValue * AsmPrinter::findGlobalValue(const Constant *CV) {
if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV))
return GV;
else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
const TargetData *TD = TM.getTargetData();
unsigned Opcode = CE->getOpcode();
switch (Opcode) {
case Instruction::GetElementPtr: {
const Constant *ptrVal = CE->getOperand(0);
SmallVector<Value*, 8> idxVec(CE->op_begin()+1, CE->op_end());
if (TD->getIndexedOffset(ptrVal->getType(), &idxVec[0], idxVec.size()))
return 0;
return findGlobalValue(ptrVal);
}
case Instruction::BitCast:
return findGlobalValue(CE->getOperand(0));
default:
return 0;
}
}
return 0;
}
/// EmitLLVMUsedList - For targets that define a TAI::UsedDirective, mark each /// EmitLLVMUsedList - For targets that define a TAI::UsedDirective, mark each
/// global in the specified llvm.used list as being used with this directive. /// global in the specified llvm.used list as being used with this directive.
/// Non-globals (i.e. internal linkage) should not be emitted.
void AsmPrinter::EmitLLVMUsedList(Constant *List) { void AsmPrinter::EmitLLVMUsedList(Constant *List) {
const char *Directive = TAI->getUsedDirective(); const char *Directive = TAI->getUsedDirective();
@ -435,11 +461,14 @@ void AsmPrinter::EmitLLVMUsedList(Constant *List) {
if (InitList == 0) return; if (InitList == 0) return;
for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
const GlobalValue *GV = findGlobalValue(InitList->getOperand(i));
if (GV && !GV->hasInternalLinkage()) {
O << Directive; O << Directive;
EmitConstantValueOnly(InitList->getOperand(i)); EmitConstantValueOnly(InitList->getOperand(i));
O << '\n'; O << '\n';
} }
} }
}
/// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the /// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the
/// function pointers, ignoring the init priority. /// function pointers, ignoring the init priority.