1488a800aSTeresa Johnson //===- lib/Transforms/Utils/FunctionImportUtils.cpp - Importing utilities -===// 2488a800aSTeresa Johnson // 3488a800aSTeresa Johnson // The LLVM Compiler Infrastructure 4488a800aSTeresa Johnson // 5488a800aSTeresa Johnson // This file is distributed under the University of Illinois Open Source 6488a800aSTeresa Johnson // License. See LICENSE.TXT for details. 7488a800aSTeresa Johnson // 8488a800aSTeresa Johnson //===----------------------------------------------------------------------===// 9488a800aSTeresa Johnson // 10488a800aSTeresa Johnson // This file implements the FunctionImportGlobalProcessing class, used 11488a800aSTeresa Johnson // to perform the necessary global value handling for function importing. 12488a800aSTeresa Johnson // 13488a800aSTeresa Johnson //===----------------------------------------------------------------------===// 14488a800aSTeresa Johnson 15488a800aSTeresa Johnson #include "llvm/Transforms/Utils/FunctionImportUtils.h" 16*df5ef871STeresa Johnson #include "llvm/IR/InstIterator.h" 17*df5ef871STeresa Johnson #include "llvm/IR/Instructions.h" 18488a800aSTeresa Johnson using namespace llvm; 19488a800aSTeresa Johnson 20488a800aSTeresa Johnson /// Checks if we should import SGV as a definition, otherwise import as a 21488a800aSTeresa Johnson /// declaration. 22488a800aSTeresa Johnson bool FunctionImportGlobalProcessing::doImportAsDefinition( 238d05185aSMehdi Amini const GlobalValue *SGV, DenseSet<const GlobalValue *> *GlobalsToImport) { 248d05185aSMehdi Amini 258d05185aSMehdi Amini // For alias, we tie the definition to the base object. Extract it and recurse 268d05185aSMehdi Amini if (auto *GA = dyn_cast<GlobalAlias>(SGV)) { 27488a800aSTeresa Johnson if (GA->hasWeakAnyLinkage()) 28488a800aSTeresa Johnson return false; 29488a800aSTeresa Johnson const GlobalObject *GO = GA->getBaseObject(); 30488a800aSTeresa Johnson if (!GO->hasLinkOnceODRLinkage()) 31488a800aSTeresa Johnson return false; 32488a800aSTeresa Johnson return FunctionImportGlobalProcessing::doImportAsDefinition( 338d05185aSMehdi Amini GO, GlobalsToImport); 34488a800aSTeresa Johnson } 358d05185aSMehdi Amini // Only import the globals requested for importing. 368d05185aSMehdi Amini if (GlobalsToImport->count(SGV)) 37488a800aSTeresa Johnson return true; 38488a800aSTeresa Johnson // Otherwise no. 39488a800aSTeresa Johnson return false; 40488a800aSTeresa Johnson } 41488a800aSTeresa Johnson 42488a800aSTeresa Johnson bool FunctionImportGlobalProcessing::doImportAsDefinition( 43488a800aSTeresa Johnson const GlobalValue *SGV) { 44488a800aSTeresa Johnson if (!isPerformingImport()) 45488a800aSTeresa Johnson return false; 468d05185aSMehdi Amini return FunctionImportGlobalProcessing::doImportAsDefinition(SGV, 478d05185aSMehdi Amini GlobalsToImport); 48488a800aSTeresa Johnson } 49488a800aSTeresa Johnson 50488a800aSTeresa Johnson bool FunctionImportGlobalProcessing::doPromoteLocalToGlobal( 51488a800aSTeresa Johnson const GlobalValue *SGV) { 52488a800aSTeresa Johnson assert(SGV->hasLocalLinkage()); 53488a800aSTeresa Johnson // Both the imported references and the original local variable must 54488a800aSTeresa Johnson // be promoted. 55488a800aSTeresa Johnson if (!isPerformingImport() && !isModuleExporting()) 56488a800aSTeresa Johnson return false; 57488a800aSTeresa Johnson 58488a800aSTeresa Johnson // Local const variables never need to be promoted unless they are address 59488a800aSTeresa Johnson // taken. The imported uses can simply use the clone created in this module. 60488a800aSTeresa Johnson // For now we are conservative in determining which variables are not 61488a800aSTeresa Johnson // address taken by checking the unnamed addr flag. To be more aggressive, 62488a800aSTeresa Johnson // the address taken information must be checked earlier during parsing 6326ab5772STeresa Johnson // of the module and recorded in the summary index for use when importing 64488a800aSTeresa Johnson // from that module. 65488a800aSTeresa Johnson auto *GVar = dyn_cast<GlobalVariable>(SGV); 66488a800aSTeresa Johnson if (GVar && GVar->isConstant() && GVar->hasUnnamedAddr()) 67488a800aSTeresa Johnson return false; 68488a800aSTeresa Johnson 69b4e1e829SMehdi Amini if (GVar && GVar->hasSection()) 70b4e1e829SMehdi Amini // Some sections like "__DATA,__cfstring" are "magic" and promotion is not 71b4e1e829SMehdi Amini // allowed. Just disable promotion on any GVar with sections right now. 72b4e1e829SMehdi Amini return false; 73b4e1e829SMehdi Amini 74488a800aSTeresa Johnson // Eventually we only need to promote functions in the exporting module that 75488a800aSTeresa Johnson // are referenced by a potentially exported function (i.e. one that is in the 7626ab5772STeresa Johnson // summary index). 77488a800aSTeresa Johnson return true; 78488a800aSTeresa Johnson } 79488a800aSTeresa Johnson 80488a800aSTeresa Johnson std::string FunctionImportGlobalProcessing::getName(const GlobalValue *SGV) { 81488a800aSTeresa Johnson // For locals that must be promoted to global scope, ensure that 82488a800aSTeresa Johnson // the promoted name uniquely identifies the copy in the original module, 83488a800aSTeresa Johnson // using the ID assigned during combined index creation. When importing, 84488a800aSTeresa Johnson // we rename all locals (not just those that are promoted) in order to 85488a800aSTeresa Johnson // avoid naming conflicts between locals imported from different modules. 86488a800aSTeresa Johnson if (SGV->hasLocalLinkage() && 87488a800aSTeresa Johnson (doPromoteLocalToGlobal(SGV) || isPerformingImport())) 8826ab5772STeresa Johnson return ModuleSummaryIndex::getGlobalNameForLocal( 89488a800aSTeresa Johnson SGV->getName(), 90ae280e54SMehdi Amini ImportIndex.getModuleHash(SGV->getParent()->getModuleIdentifier())); 91488a800aSTeresa Johnson return SGV->getName(); 92488a800aSTeresa Johnson } 93488a800aSTeresa Johnson 94488a800aSTeresa Johnson GlobalValue::LinkageTypes 95488a800aSTeresa Johnson FunctionImportGlobalProcessing::getLinkage(const GlobalValue *SGV) { 96488a800aSTeresa Johnson // Any local variable that is referenced by an exported function needs 97488a800aSTeresa Johnson // to be promoted to global scope. Since we don't currently know which 98488a800aSTeresa Johnson // functions reference which local variables/functions, we must treat 99488a800aSTeresa Johnson // all as potentially exported if this module is exporting anything. 100488a800aSTeresa Johnson if (isModuleExporting()) { 101488a800aSTeresa Johnson if (SGV->hasLocalLinkage() && doPromoteLocalToGlobal(SGV)) 102488a800aSTeresa Johnson return GlobalValue::ExternalLinkage; 103488a800aSTeresa Johnson return SGV->getLinkage(); 104488a800aSTeresa Johnson } 105488a800aSTeresa Johnson 106488a800aSTeresa Johnson // Otherwise, if we aren't importing, no linkage change is needed. 107488a800aSTeresa Johnson if (!isPerformingImport()) 108488a800aSTeresa Johnson return SGV->getLinkage(); 109488a800aSTeresa Johnson 110488a800aSTeresa Johnson switch (SGV->getLinkage()) { 111488a800aSTeresa Johnson case GlobalValue::ExternalLinkage: 112488a800aSTeresa Johnson // External defnitions are converted to available_externally 113488a800aSTeresa Johnson // definitions upon import, so that they are available for inlining 114488a800aSTeresa Johnson // and/or optimization, but are turned into declarations later 115488a800aSTeresa Johnson // during the EliminateAvailableExternally pass. 116488a800aSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 117488a800aSTeresa Johnson return GlobalValue::AvailableExternallyLinkage; 118488a800aSTeresa Johnson // An imported external declaration stays external. 119488a800aSTeresa Johnson return SGV->getLinkage(); 120488a800aSTeresa Johnson 121488a800aSTeresa Johnson case GlobalValue::AvailableExternallyLinkage: 122488a800aSTeresa Johnson // An imported available_externally definition converts 123488a800aSTeresa Johnson // to external if imported as a declaration. 124488a800aSTeresa Johnson if (!doImportAsDefinition(SGV)) 125488a800aSTeresa Johnson return GlobalValue::ExternalLinkage; 126488a800aSTeresa Johnson // An imported available_externally declaration stays that way. 127488a800aSTeresa Johnson return SGV->getLinkage(); 128488a800aSTeresa Johnson 129488a800aSTeresa Johnson case GlobalValue::LinkOnceAnyLinkage: 130488a800aSTeresa Johnson case GlobalValue::LinkOnceODRLinkage: 131488a800aSTeresa Johnson // These both stay the same when importing the definition. 132488a800aSTeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 133488a800aSTeresa Johnson return SGV->getLinkage(); 134488a800aSTeresa Johnson 135488a800aSTeresa Johnson case GlobalValue::WeakAnyLinkage: 136488a800aSTeresa Johnson // Can't import weak_any definitions correctly, or we might change the 137488a800aSTeresa Johnson // program semantics, since the linker will pick the first weak_any 138488a800aSTeresa Johnson // definition and importing would change the order they are seen by the 139488a800aSTeresa Johnson // linker. The module linking caller needs to enforce this. 140488a800aSTeresa Johnson assert(!doImportAsDefinition(SGV)); 141488a800aSTeresa Johnson // If imported as a declaration, it becomes external_weak. 142bb3a1d92SMehdi Amini return SGV->getLinkage(); 143488a800aSTeresa Johnson 144488a800aSTeresa Johnson case GlobalValue::WeakODRLinkage: 145488a800aSTeresa Johnson // For weak_odr linkage, there is a guarantee that all copies will be 146488a800aSTeresa Johnson // equivalent, so the issue described above for weak_any does not exist, 147488a800aSTeresa Johnson // and the definition can be imported. It can be treated similarly 148488a800aSTeresa Johnson // to an imported externally visible global value. 149488a800aSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 150488a800aSTeresa Johnson return GlobalValue::AvailableExternallyLinkage; 151488a800aSTeresa Johnson else 152488a800aSTeresa Johnson return GlobalValue::ExternalLinkage; 153488a800aSTeresa Johnson 154488a800aSTeresa Johnson case GlobalValue::AppendingLinkage: 155488a800aSTeresa Johnson // It would be incorrect to import an appending linkage variable, 156488a800aSTeresa Johnson // since it would cause global constructors/destructors to be 157488a800aSTeresa Johnson // executed multiple times. This should have already been handled 158488a800aSTeresa Johnson // by linkIfNeeded, and we will assert in shouldLinkFromSource 159488a800aSTeresa Johnson // if we try to import, so we simply return AppendingLinkage. 160488a800aSTeresa Johnson return GlobalValue::AppendingLinkage; 161488a800aSTeresa Johnson 162488a800aSTeresa Johnson case GlobalValue::InternalLinkage: 163488a800aSTeresa Johnson case GlobalValue::PrivateLinkage: 164488a800aSTeresa Johnson // If we are promoting the local to global scope, it is handled 165488a800aSTeresa Johnson // similarly to a normal externally visible global. 166488a800aSTeresa Johnson if (doPromoteLocalToGlobal(SGV)) { 167488a800aSTeresa Johnson if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV)) 168488a800aSTeresa Johnson return GlobalValue::AvailableExternallyLinkage; 169488a800aSTeresa Johnson else 170488a800aSTeresa Johnson return GlobalValue::ExternalLinkage; 171488a800aSTeresa Johnson } 172488a800aSTeresa Johnson // A non-promoted imported local definition stays local. 173488a800aSTeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 174488a800aSTeresa Johnson return SGV->getLinkage(); 175488a800aSTeresa Johnson 176488a800aSTeresa Johnson case GlobalValue::ExternalWeakLinkage: 177488a800aSTeresa Johnson // External weak doesn't apply to definitions, must be a declaration. 178488a800aSTeresa Johnson assert(!doImportAsDefinition(SGV)); 179488a800aSTeresa Johnson // Linkage stays external_weak. 180488a800aSTeresa Johnson return SGV->getLinkage(); 181488a800aSTeresa Johnson 182488a800aSTeresa Johnson case GlobalValue::CommonLinkage: 183488a800aSTeresa Johnson // Linkage stays common on definitions. 184488a800aSTeresa Johnson // The ThinLTO pass will eventually force-import their definitions. 185488a800aSTeresa Johnson return SGV->getLinkage(); 186488a800aSTeresa Johnson } 187488a800aSTeresa Johnson 188488a800aSTeresa Johnson llvm_unreachable("unknown linkage type"); 189488a800aSTeresa Johnson } 190488a800aSTeresa Johnson 191488a800aSTeresa Johnson void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) { 192488a800aSTeresa Johnson if (GV.hasLocalLinkage() && 193488a800aSTeresa Johnson (doPromoteLocalToGlobal(&GV) || isPerformingImport())) { 194488a800aSTeresa Johnson GV.setName(getName(&GV)); 195488a800aSTeresa Johnson GV.setLinkage(getLinkage(&GV)); 196488a800aSTeresa Johnson if (!GV.hasLocalLinkage()) 197488a800aSTeresa Johnson GV.setVisibility(GlobalValue::HiddenVisibility); 198488a800aSTeresa Johnson } else 199488a800aSTeresa Johnson GV.setLinkage(getLinkage(&GV)); 200488a800aSTeresa Johnson 201488a800aSTeresa Johnson // Remove functions imported as available externally defs from comdats, 202488a800aSTeresa Johnson // as this is a declaration for the linker, and will be dropped eventually. 203488a800aSTeresa Johnson // It is illegal for comdats to contain declarations. 204488a800aSTeresa Johnson auto *GO = dyn_cast_or_null<GlobalObject>(&GV); 205488a800aSTeresa Johnson if (GO && GO->isDeclarationForLinker() && GO->hasComdat()) { 206488a800aSTeresa Johnson // The IRMover should not have placed any imported declarations in 207488a800aSTeresa Johnson // a comdat, so the only declaration that should be in a comdat 208488a800aSTeresa Johnson // at this point would be a definition imported as available_externally. 209488a800aSTeresa Johnson assert(GO->hasAvailableExternallyLinkage() && 210488a800aSTeresa Johnson "Expected comdat on definition (possibly available external)"); 211488a800aSTeresa Johnson GO->setComdat(nullptr); 212488a800aSTeresa Johnson } 213488a800aSTeresa Johnson } 214488a800aSTeresa Johnson 215488a800aSTeresa Johnson void FunctionImportGlobalProcessing::processGlobalsForThinLTO() { 216*df5ef871STeresa Johnson // We cannot currently promote or rename anything used in inline assembly, 217*df5ef871STeresa Johnson // which are not visible to the compiler. Detect a possible case by looking 218*df5ef871STeresa Johnson // for a llvm.used local value, in conjunction with an inline assembly call 219*df5ef871STeresa Johnson // in the module. Prevent changing any such values on the exporting side, 220b35cc691STeresa Johnson // since we would already have guarded against an import from this module by 221b35cc691STeresa Johnson // suppressing its index generation. See comments on what is required 222b35cc691STeresa Johnson // in order to implement a finer grained solution in 223b35cc691STeresa Johnson // ModuleSummaryIndexBuilder::ModuleSummaryIndexBuilder(). 224b35cc691STeresa Johnson SmallPtrSet<GlobalValue *, 8> Used; 225b35cc691STeresa Johnson collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); 226*df5ef871STeresa Johnson bool LocalIsUsed = false; 227b35cc691STeresa Johnson for (GlobalValue *V : Used) { 228b35cc691STeresa Johnson // We would have blocked importing from this module by suppressing index 229b35cc691STeresa Johnson // generation. 230*df5ef871STeresa Johnson assert((!V->hasLocalLinkage() || !isPerformingImport()) && 231b35cc691STeresa Johnson "Should have blocked importing from module with local used"); 232*df5ef871STeresa Johnson if ((LocalIsUsed |= V->hasLocalLinkage())) 233*df5ef871STeresa Johnson break; 234b35cc691STeresa Johnson } 235*df5ef871STeresa Johnson if (LocalIsUsed) 236*df5ef871STeresa Johnson for (auto &F : M) 237*df5ef871STeresa Johnson for (auto &I : instructions(F)) 238*df5ef871STeresa Johnson if (const CallInst *CallI = dyn_cast<CallInst>(&I)) 239*df5ef871STeresa Johnson if (CallI->isInlineAsm()) 240*df5ef871STeresa Johnson return; 241b35cc691STeresa Johnson 242488a800aSTeresa Johnson for (GlobalVariable &GV : M.globals()) 243488a800aSTeresa Johnson processGlobalForThinLTO(GV); 244488a800aSTeresa Johnson for (Function &SF : M) 245488a800aSTeresa Johnson processGlobalForThinLTO(SF); 246488a800aSTeresa Johnson for (GlobalAlias &GA : M.aliases()) 247488a800aSTeresa Johnson processGlobalForThinLTO(GA); 248488a800aSTeresa Johnson } 249488a800aSTeresa Johnson 250488a800aSTeresa Johnson bool FunctionImportGlobalProcessing::run() { 251488a800aSTeresa Johnson processGlobalsForThinLTO(); 252488a800aSTeresa Johnson return false; 253488a800aSTeresa Johnson } 254488a800aSTeresa Johnson 2558d05185aSMehdi Amini bool llvm::renameModuleForThinLTO( 2568d05185aSMehdi Amini Module &M, const ModuleSummaryIndex &Index, 2578d05185aSMehdi Amini DenseSet<const GlobalValue *> *GlobalsToImport) { 2588d05185aSMehdi Amini FunctionImportGlobalProcessing ThinLTOProcessing(M, Index, GlobalsToImport); 259488a800aSTeresa Johnson return ThinLTOProcessing.run(); 260488a800aSTeresa Johnson } 261