diff options
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/IPO/ExtractGV.cpp | 54 |
1 files changed, 17 insertions, 37 deletions
diff --git a/lib/Transforms/IPO/ExtractGV.cpp b/lib/Transforms/IPO/ExtractGV.cpp index 07b05ee38a..fa3d72ddcf 100644 --- a/lib/Transforms/IPO/ExtractGV.cpp +++ b/lib/Transforms/IPO/ExtractGV.cpp @@ -21,38 +21,6 @@ #include <algorithm> using namespace llvm; -/// Make sure GV is visible from both modules. Delete is true if it is -/// being deleted from this module. -/// This also makes sure GV cannot be dropped so that references from -/// the split module remain valid. -static void makeVisible(GlobalValue &GV, bool Delete) { - bool Local = GV.hasLocalLinkage(); - if (Local) - GV.setVisibility(GlobalValue::HiddenVisibility); - - if (Local || Delete) { - GV.setLinkage(GlobalValue::ExternalLinkage); - return; - } - - if (!GV.hasLinkOnceLinkage()) { - assert(!GV.isDiscardableIfUnused()); - return; - } - - // Map linkonce* to weak* so that llvm doesn't drop this GV. - switch(GV.getLinkage()) { - default: - llvm_unreachable("Unexpected linkage"); - case GlobalValue::LinkOnceAnyLinkage: - GV.setLinkage(GlobalValue::WeakAnyLinkage); - return; - case GlobalValue::LinkOnceODRLinkage: - GV.setLinkage(GlobalValue::WeakODRLinkage); - return; - } -} - namespace { /// @brief A pass to extract specific functions and their dependencies. class GVExtractorPass : public ModulePass { @@ -92,7 +60,12 @@ namespace { continue; } - makeVisible(*I, Delete); + bool Local = I->isDiscardableIfUnused(); + if (Local) + I->setVisibility(GlobalValue::HiddenVisibility); + + if (Local || Delete) + I->setLinkage(GlobalValue::ExternalLinkage); if (Delete) I->setInitializer(0); @@ -107,7 +80,12 @@ namespace { continue; } - makeVisible(*I, Delete); + bool Local = I->isDiscardableIfUnused(); + if (Local) + I->setVisibility(GlobalValue::HiddenVisibility); + + if (Local || Delete) + I->setLinkage(GlobalValue::ExternalLinkage); if (Delete) I->deleteBody(); @@ -119,10 +97,12 @@ namespace { Module::alias_iterator CurI = I; ++I; - bool Delete = deleteStuff == (bool)Named.count(CurI); - makeVisible(*I, Delete); + if (CurI->isDiscardableIfUnused()) { + CurI->setVisibility(GlobalValue::HiddenVisibility); + CurI->setLinkage(GlobalValue::ExternalLinkage); + } - if (Delete) { + if (deleteStuff == (bool)Named.count(CurI)) { Type *Ty = CurI->getType()->getElementType(); CurI->removeFromParent(); |