xref: /llvm-project/llvm/lib/Transforms/Utils/FunctionImportUtils.cpp (revision 9006d5265136429e81eb9310f2c91892fded06d3)
1 //===- lib/Transforms/Utils/FunctionImportUtils.cpp - Importing utilities -===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the FunctionImportGlobalProcessing class, used
11 // to perform the necessary global value handling for function importing.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "llvm/Analysis/ModuleSummaryAnalysis.h"
16 #include "llvm/Transforms/Utils/FunctionImportUtils.h"
17 #include "llvm/IR/InstIterator.h"
18 #include "llvm/IR/Instructions.h"
19 using namespace llvm;
20 
21 /// Checks if we should import SGV as a definition, otherwise import as a
22 /// declaration.
23 bool FunctionImportGlobalProcessing::doImportAsDefinition(
24     const GlobalValue *SGV, DenseSet<const GlobalValue *> *GlobalsToImport) {
25 
26   // For alias, we tie the definition to the base object. Extract it and recurse
27   if (auto *GA = dyn_cast<GlobalAlias>(SGV)) {
28     if (GA->hasWeakAnyLinkage())
29       return false;
30     const GlobalObject *GO = GA->getBaseObject();
31     if (!GO->hasLinkOnceODRLinkage())
32       return false;
33     return FunctionImportGlobalProcessing::doImportAsDefinition(
34         GO, GlobalsToImport);
35   }
36   // Only import the globals requested for importing.
37   if (GlobalsToImport->count(SGV))
38     return true;
39   // Otherwise no.
40   return false;
41 }
42 
43 bool FunctionImportGlobalProcessing::doImportAsDefinition(
44     const GlobalValue *SGV) {
45   if (!isPerformingImport())
46     return false;
47   return FunctionImportGlobalProcessing::doImportAsDefinition(SGV,
48                                                               GlobalsToImport);
49 }
50 
51 bool FunctionImportGlobalProcessing::shouldPromoteLocalToGlobal(
52     const GlobalValue *SGV) {
53   assert(SGV->hasLocalLinkage());
54   // Both the imported references and the original local variable must
55   // be promoted.
56   if (!isPerformingImport() && !isModuleExporting())
57     return false;
58 
59   if (isPerformingImport()) {
60     assert((!GlobalsToImport->count(SGV) || !isNonRenamableLocal(*SGV)) &&
61            "Attempting to promote non-renamable local");
62     // We don't know for sure yet if we are importing this value (as either
63     // a reference or a def), since we are simply walking all values in the
64     // module. But by necessity if we end up importing it and it is local,
65     // it must be promoted, so unconditionally promote all values in the
66     // importing module.
67     return true;
68   }
69 
70   // When exporting, consult the index. We can have more than one local
71   // with the same GUID, in the case of same-named locals in different but
72   // same-named source files that were compiled in their respective directories
73   // (so the source file name and resulting GUID is the same). Find the one
74   // in this module.
75   auto Summary = ImportIndex.findSummaryInModule(
76       SGV->getGUID(), SGV->getParent()->getModuleIdentifier());
77   assert(Summary && "Missing summary for global value when exporting");
78   auto Linkage = Summary->linkage();
79   if (!GlobalValue::isLocalLinkage(Linkage)) {
80     assert(!isNonRenamableLocal(*SGV) &&
81            "Attempting to promote non-renamable local");
82     return true;
83   }
84 
85   return false;
86 }
87 
88 #ifndef NDEBUG
89 bool FunctionImportGlobalProcessing::isNonRenamableLocal(
90     const GlobalValue &GV) const {
91   if (!GV.hasLocalLinkage())
92     return false;
93   // This needs to stay in sync with the logic in buildModuleSummaryIndex.
94   if (GV.hasSection())
95     return true;
96   if (Used.count(const_cast<GlobalValue *>(&GV)))
97     return true;
98   return false;
99 }
100 #endif
101 
102 std::string FunctionImportGlobalProcessing::getName(const GlobalValue *SGV,
103                                                     bool DoPromote) {
104   // For locals that must be promoted to global scope, ensure that
105   // the promoted name uniquely identifies the copy in the original module,
106   // using the ID assigned during combined index creation. When importing,
107   // we rename all locals (not just those that are promoted) in order to
108   // avoid naming conflicts between locals imported from different modules.
109   if (SGV->hasLocalLinkage() && (DoPromote || isPerformingImport()))
110     return ModuleSummaryIndex::getGlobalNameForLocal(
111         SGV->getName(),
112         ImportIndex.getModuleHash(SGV->getParent()->getModuleIdentifier()));
113   return SGV->getName();
114 }
115 
116 GlobalValue::LinkageTypes
117 FunctionImportGlobalProcessing::getLinkage(const GlobalValue *SGV,
118                                            bool DoPromote) {
119   // Any local variable that is referenced by an exported function needs
120   // to be promoted to global scope. Since we don't currently know which
121   // functions reference which local variables/functions, we must treat
122   // all as potentially exported if this module is exporting anything.
123   if (isModuleExporting()) {
124     if (SGV->hasLocalLinkage() && DoPromote)
125       return GlobalValue::ExternalLinkage;
126     return SGV->getLinkage();
127   }
128 
129   // Otherwise, if we aren't importing, no linkage change is needed.
130   if (!isPerformingImport())
131     return SGV->getLinkage();
132 
133   switch (SGV->getLinkage()) {
134   case GlobalValue::ExternalLinkage:
135     // External defnitions are converted to available_externally
136     // definitions upon import, so that they are available for inlining
137     // and/or optimization, but are turned into declarations later
138     // during the EliminateAvailableExternally pass.
139     if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
140       return GlobalValue::AvailableExternallyLinkage;
141     // An imported external declaration stays external.
142     return SGV->getLinkage();
143 
144   case GlobalValue::AvailableExternallyLinkage:
145     // An imported available_externally definition converts
146     // to external if imported as a declaration.
147     if (!doImportAsDefinition(SGV))
148       return GlobalValue::ExternalLinkage;
149     // An imported available_externally declaration stays that way.
150     return SGV->getLinkage();
151 
152   case GlobalValue::LinkOnceAnyLinkage:
153   case GlobalValue::LinkOnceODRLinkage:
154     // These both stay the same when importing the definition.
155     // The ThinLTO pass will eventually force-import their definitions.
156     return SGV->getLinkage();
157 
158   case GlobalValue::WeakAnyLinkage:
159     // Can't import weak_any definitions correctly, or we might change the
160     // program semantics, since the linker will pick the first weak_any
161     // definition and importing would change the order they are seen by the
162     // linker. The module linking caller needs to enforce this.
163     assert(!doImportAsDefinition(SGV));
164     // If imported as a declaration, it becomes external_weak.
165     return SGV->getLinkage();
166 
167   case GlobalValue::WeakODRLinkage:
168     // For weak_odr linkage, there is a guarantee that all copies will be
169     // equivalent, so the issue described above for weak_any does not exist,
170     // and the definition can be imported. It can be treated similarly
171     // to an imported externally visible global value.
172     if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
173       return GlobalValue::AvailableExternallyLinkage;
174     else
175       return GlobalValue::ExternalLinkage;
176 
177   case GlobalValue::AppendingLinkage:
178     // It would be incorrect to import an appending linkage variable,
179     // since it would cause global constructors/destructors to be
180     // executed multiple times. This should have already been handled
181     // by linkIfNeeded, and we will assert in shouldLinkFromSource
182     // if we try to import, so we simply return AppendingLinkage.
183     return GlobalValue::AppendingLinkage;
184 
185   case GlobalValue::InternalLinkage:
186   case GlobalValue::PrivateLinkage:
187     // If we are promoting the local to global scope, it is handled
188     // similarly to a normal externally visible global.
189     if (DoPromote) {
190       if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
191         return GlobalValue::AvailableExternallyLinkage;
192       else
193         return GlobalValue::ExternalLinkage;
194     }
195     // A non-promoted imported local definition stays local.
196     // The ThinLTO pass will eventually force-import their definitions.
197     return SGV->getLinkage();
198 
199   case GlobalValue::ExternalWeakLinkage:
200     // External weak doesn't apply to definitions, must be a declaration.
201     assert(!doImportAsDefinition(SGV));
202     // Linkage stays external_weak.
203     return SGV->getLinkage();
204 
205   case GlobalValue::CommonLinkage:
206     // Linkage stays common on definitions.
207     // The ThinLTO pass will eventually force-import their definitions.
208     return SGV->getLinkage();
209   }
210 
211   llvm_unreachable("unknown linkage type");
212 }
213 
214 void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) {
215   bool DoPromote = false;
216   if (GV.hasLocalLinkage() &&
217       ((DoPromote = shouldPromoteLocalToGlobal(&GV)) || isPerformingImport())) {
218     // Once we change the name or linkage it is difficult to determine
219     // again whether we should promote since shouldPromoteLocalToGlobal needs
220     // to locate the summary (based on GUID from name and linkage). Therefore,
221     // use DoPromote result saved above.
222     GV.setName(getName(&GV, DoPromote));
223     GV.setLinkage(getLinkage(&GV, DoPromote));
224     if (!GV.hasLocalLinkage())
225       GV.setVisibility(GlobalValue::HiddenVisibility);
226   } else
227     GV.setLinkage(getLinkage(&GV, /* DoPromote */ false));
228 
229   // Remove functions imported as available externally defs from comdats,
230   // as this is a declaration for the linker, and will be dropped eventually.
231   // It is illegal for comdats to contain declarations.
232   auto *GO = dyn_cast_or_null<GlobalObject>(&GV);
233   if (GO && GO->isDeclarationForLinker() && GO->hasComdat()) {
234     // The IRMover should not have placed any imported declarations in
235     // a comdat, so the only declaration that should be in a comdat
236     // at this point would be a definition imported as available_externally.
237     assert(GO->hasAvailableExternallyLinkage() &&
238            "Expected comdat on definition (possibly available external)");
239     GO->setComdat(nullptr);
240   }
241 }
242 
243 void FunctionImportGlobalProcessing::processGlobalsForThinLTO() {
244   for (GlobalVariable &GV : M.globals())
245     processGlobalForThinLTO(GV);
246   for (Function &SF : M)
247     processGlobalForThinLTO(SF);
248   for (GlobalAlias &GA : M.aliases())
249     processGlobalForThinLTO(GA);
250 }
251 
252 bool FunctionImportGlobalProcessing::run() {
253   processGlobalsForThinLTO();
254   return false;
255 }
256 
257 bool llvm::renameModuleForThinLTO(
258     Module &M, const ModuleSummaryIndex &Index,
259     DenseSet<const GlobalValue *> *GlobalsToImport) {
260   FunctionImportGlobalProcessing ThinLTOProcessing(M, Index, GlobalsToImport);
261   return ThinLTOProcessing.run();
262 }
263