summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2012-10-29 00:27:55 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2012-10-29 00:27:55 +0000
commitc0916d30e09192b7023e453aaa7d2ffe026345ed (patch)
tree58b483b79894ac48d38aeeedd4da5ef997ae5533 /lib
parent3a9f4568fbb974844afacd12ab9b62e8844fd8ad (diff)
downloadllvm-c0916d30e09192b7023e453aaa7d2ffe026345ed.tar.gz
llvm-c0916d30e09192b7023e453aaa7d2ffe026345ed.tar.bz2
llvm-c0916d30e09192b7023e453aaa7d2ffe026345ed.tar.xz
llvm-extract was unable to handle aliases. It would leave a copy on the
output of both llvm-extract foo.ll -func=bar and llvm-extract foo.ll -func=bar -delete so the two new files could not be linked together anymore. With this change alias are handled almost like functions and global variables. Almost because with alias we cannot just clear the initializer/body, we have to create a new declaration and replace the alias with it. The net result is that now the output of the above commands can be linked even if foo.ll has aliases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166907 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/IPO/ExtractGV.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/Transforms/IPO/ExtractGV.cpp b/lib/Transforms/IPO/ExtractGV.cpp
index 4c7f0ed236..57c2f6d410 100644
--- a/lib/Transforms/IPO/ExtractGV.cpp
+++ b/lib/Transforms/IPO/ExtractGV.cpp
@@ -79,6 +79,36 @@ namespace {
I->setLinkage(GlobalValue::ExternalLinkage);
}
+ // Visit the Aliases.
+ for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end();
+ I != E;) {
+ Module::alias_iterator CurI = I;
+ ++I;
+
+ if (CurI->hasLocalLinkage())
+ CurI->setVisibility(GlobalValue::HiddenVisibility);
+ CurI->setLinkage(GlobalValue::ExternalLinkage);
+
+ if (deleteStuff == (bool)Named.count(CurI)) {
+ Type *Ty = CurI->getType()->getElementType();
+
+ CurI->removeFromParent();
+ llvm::Value *Declaration;
+ if (FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
+ Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage,
+ CurI->getName(), &M);
+
+ } else {
+ Declaration =
+ new GlobalVariable(M, Ty, false, GlobalValue::ExternalLinkage,
+ 0, CurI->getName());
+
+ }
+ CurI->replaceAllUsesWith(Declaration);
+ delete CurI;
+ }
+ }
+
return true;
}
};