implement a new magic global "llvm.compiler.used" which is like llvm.used, but

doesn't cause ".no_dead_strip" to be emitted on darwin.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76399 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2009-07-20 06:14:25 +00:00
parent ba8dc03935
commit 401e10c4fb
8 changed files with 63 additions and 32 deletions

View File

@@ -138,7 +138,9 @@ bool InternalizePass::runOnModule(Module &M) {
// Never internalize the llvm.used symbol. It is used to implement
// attribute((used)).
// FIXME: Shouldn't this just filter on llvm.metadata section??
ExternalNames.insert("llvm.used");
ExternalNames.insert("llvm.compiler.used");
// Never internalize anchors used by the machine module info, else the info
// won't find them. (see MachineModuleInfo.)

View File

@@ -157,32 +157,26 @@ static void StripTypeSymtab(TypeSymbolTable &ST, bool PreserveDbgInfo) {
}
/// Find values that are marked as llvm.used.
void findUsedValues(Module &M,
SmallPtrSet<const GlobalValue*, 8>& llvmUsedValues) {
if (GlobalVariable *LLVMUsed = M.getGlobalVariable("llvm.used")) {
llvmUsedValues.insert(LLVMUsed);
// Collect values that are preserved as per explicit request.
// llvm.used is used to list these values.
if (ConstantArray *Inits =
dyn_cast<ConstantArray>(LLVMUsed->getInitializer())) {
for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i) {
if (GlobalValue *GV = dyn_cast<GlobalValue>(Inits->getOperand(i)))
llvmUsedValues.insert(GV);
else if (ConstantExpr *CE =
dyn_cast<ConstantExpr>(Inits->getOperand(i)))
if (CE->getOpcode() == Instruction::BitCast)
if (GlobalValue *GV = dyn_cast<GlobalValue>(CE->getOperand(0)))
llvmUsedValues.insert(GV);
}
}
}
static void findUsedValues(GlobalVariable *LLVMUsed,
SmallPtrSet<const GlobalValue*, 8> &UsedValues) {
if (LLVMUsed == 0) return;
UsedValues.insert(LLVMUsed);
ConstantArray *Inits = dyn_cast<ConstantArray>(LLVMUsed->getInitializer());
if (Inits == 0) return;
for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i)
if (GlobalValue *GV =
dyn_cast<GlobalValue>(Inits->getOperand(i)->stripPointerCasts()))
UsedValues.insert(GV);
}
/// StripSymbolNames - Strip symbol names.
bool StripSymbolNames(Module &M, bool PreserveDbgInfo) {
SmallPtrSet<const GlobalValue*, 8> llvmUsedValues;
findUsedValues(M, llvmUsedValues);
findUsedValues(M.getGlobalVariable("llvm.used"), llvmUsedValues);
findUsedValues(M.getGlobalVariable("llvm.compiler.used"), llvmUsedValues);
for (Module::global_iterator I = M.global_begin(), E = M.global_end();
I != E; ++I) {
@@ -210,7 +204,8 @@ bool StripSymbolNames(Module &M, bool PreserveDbgInfo) {
bool StripDebugInfo(Module &M) {
SmallPtrSet<const GlobalValue*, 8> llvmUsedValues;
findUsedValues(M, llvmUsedValues);
findUsedValues(M.getGlobalVariable("llvm.used"), llvmUsedValues);
findUsedValues(M.getGlobalVariable("llvm.compiler.used"), llvmUsedValues);
SmallVector<GlobalVariable *, 2> CUs;
SmallVector<GlobalVariable *, 4> GVs;