blob: c0628b3bd49c4d7faa89311e9ccb648714c2be14 [file] [log] [blame]
Teresa Johnson488a8002016-02-10 18:11:31 +00001//===- 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/Transforms/Utils/FunctionImportUtils.h"
16using namespace llvm;
17
18/// Checks if we should import SGV as a definition, otherwise import as a
19/// declaration.
20bool FunctionImportGlobalProcessing::doImportAsDefinition(
Mehdi Amini8d051852016-03-19 00:40:31 +000021 const GlobalValue *SGV, DenseSet<const GlobalValue *> *GlobalsToImport) {
22
23 // For alias, we tie the definition to the base object. Extract it and recurse
24 if (auto *GA = dyn_cast<GlobalAlias>(SGV)) {
Teresa Johnson488a8002016-02-10 18:11:31 +000025 if (GA->hasWeakAnyLinkage())
26 return false;
27 const GlobalObject *GO = GA->getBaseObject();
28 if (!GO->hasLinkOnceODRLinkage())
29 return false;
30 return FunctionImportGlobalProcessing::doImportAsDefinition(
Mehdi Amini8d051852016-03-19 00:40:31 +000031 GO, GlobalsToImport);
Teresa Johnson488a8002016-02-10 18:11:31 +000032 }
Mehdi Amini8d051852016-03-19 00:40:31 +000033 // Only import the globals requested for importing.
34 if (GlobalsToImport->count(SGV))
Teresa Johnson488a8002016-02-10 18:11:31 +000035 return true;
36 // Otherwise no.
37 return false;
38}
39
40bool FunctionImportGlobalProcessing::doImportAsDefinition(
41 const GlobalValue *SGV) {
42 if (!isPerformingImport())
43 return false;
Mehdi Amini8d051852016-03-19 00:40:31 +000044 return FunctionImportGlobalProcessing::doImportAsDefinition(SGV,
45 GlobalsToImport);
Teresa Johnson488a8002016-02-10 18:11:31 +000046}
47
48bool FunctionImportGlobalProcessing::doPromoteLocalToGlobal(
49 const GlobalValue *SGV) {
50 assert(SGV->hasLocalLinkage());
51 // Both the imported references and the original local variable must
52 // be promoted.
53 if (!isPerformingImport() && !isModuleExporting())
54 return false;
55
56 // Local const variables never need to be promoted unless they are address
57 // taken. The imported uses can simply use the clone created in this module.
58 // For now we are conservative in determining which variables are not
59 // address taken by checking the unnamed addr flag. To be more aggressive,
60 // the address taken information must be checked earlier during parsing
Teresa Johnson26ab5772016-03-15 00:04:37 +000061 // of the module and recorded in the summary index for use when importing
Teresa Johnson488a8002016-02-10 18:11:31 +000062 // from that module.
63 auto *GVar = dyn_cast<GlobalVariable>(SGV);
64 if (GVar && GVar->isConstant() && GVar->hasUnnamedAddr())
65 return false;
66
67 // Eventually we only need to promote functions in the exporting module that
68 // are referenced by a potentially exported function (i.e. one that is in the
Teresa Johnson26ab5772016-03-15 00:04:37 +000069 // summary index).
Teresa Johnson488a8002016-02-10 18:11:31 +000070 return true;
71}
72
73std::string FunctionImportGlobalProcessing::getName(const GlobalValue *SGV) {
74 // For locals that must be promoted to global scope, ensure that
75 // the promoted name uniquely identifies the copy in the original module,
76 // using the ID assigned during combined index creation. When importing,
77 // we rename all locals (not just those that are promoted) in order to
78 // avoid naming conflicts between locals imported from different modules.
79 if (SGV->hasLocalLinkage() &&
80 (doPromoteLocalToGlobal(SGV) || isPerformingImport()))
Teresa Johnson26ab5772016-03-15 00:04:37 +000081 return ModuleSummaryIndex::getGlobalNameForLocal(
Teresa Johnson488a8002016-02-10 18:11:31 +000082 SGV->getName(),
Mehdi Aminiae280e52016-04-11 23:26:46 +000083 ImportIndex.getModuleHash(SGV->getParent()->getModuleIdentifier()));
Teresa Johnson488a8002016-02-10 18:11:31 +000084 return SGV->getName();
85}
86
87GlobalValue::LinkageTypes
88FunctionImportGlobalProcessing::getLinkage(const GlobalValue *SGV) {
89 // Any local variable that is referenced by an exported function needs
90 // to be promoted to global scope. Since we don't currently know which
91 // functions reference which local variables/functions, we must treat
92 // all as potentially exported if this module is exporting anything.
93 if (isModuleExporting()) {
94 if (SGV->hasLocalLinkage() && doPromoteLocalToGlobal(SGV))
95 return GlobalValue::ExternalLinkage;
96 return SGV->getLinkage();
97 }
98
99 // Otherwise, if we aren't importing, no linkage change is needed.
100 if (!isPerformingImport())
101 return SGV->getLinkage();
102
103 switch (SGV->getLinkage()) {
104 case GlobalValue::ExternalLinkage:
105 // External defnitions are converted to available_externally
106 // definitions upon import, so that they are available for inlining
107 // and/or optimization, but are turned into declarations later
108 // during the EliminateAvailableExternally pass.
109 if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
110 return GlobalValue::AvailableExternallyLinkage;
111 // An imported external declaration stays external.
112 return SGV->getLinkage();
113
114 case GlobalValue::AvailableExternallyLinkage:
115 // An imported available_externally definition converts
116 // to external if imported as a declaration.
117 if (!doImportAsDefinition(SGV))
118 return GlobalValue::ExternalLinkage;
119 // An imported available_externally declaration stays that way.
120 return SGV->getLinkage();
121
122 case GlobalValue::LinkOnceAnyLinkage:
123 case GlobalValue::LinkOnceODRLinkage:
124 // These both stay the same when importing the definition.
125 // The ThinLTO pass will eventually force-import their definitions.
126 return SGV->getLinkage();
127
128 case GlobalValue::WeakAnyLinkage:
129 // Can't import weak_any definitions correctly, or we might change the
130 // program semantics, since the linker will pick the first weak_any
131 // definition and importing would change the order they are seen by the
132 // linker. The module linking caller needs to enforce this.
133 assert(!doImportAsDefinition(SGV));
134 // If imported as a declaration, it becomes external_weak.
Mehdi Aminibb3a1d92016-04-20 04:18:11 +0000135 return SGV->getLinkage();
Teresa Johnson488a8002016-02-10 18:11:31 +0000136
137 case GlobalValue::WeakODRLinkage:
138 // For weak_odr linkage, there is a guarantee that all copies will be
139 // equivalent, so the issue described above for weak_any does not exist,
140 // and the definition can be imported. It can be treated similarly
141 // to an imported externally visible global value.
142 if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
143 return GlobalValue::AvailableExternallyLinkage;
144 else
145 return GlobalValue::ExternalLinkage;
146
147 case GlobalValue::AppendingLinkage:
148 // It would be incorrect to import an appending linkage variable,
149 // since it would cause global constructors/destructors to be
150 // executed multiple times. This should have already been handled
151 // by linkIfNeeded, and we will assert in shouldLinkFromSource
152 // if we try to import, so we simply return AppendingLinkage.
153 return GlobalValue::AppendingLinkage;
154
155 case GlobalValue::InternalLinkage:
156 case GlobalValue::PrivateLinkage:
157 // If we are promoting the local to global scope, it is handled
158 // similarly to a normal externally visible global.
159 if (doPromoteLocalToGlobal(SGV)) {
160 if (doImportAsDefinition(SGV) && !dyn_cast<GlobalAlias>(SGV))
161 return GlobalValue::AvailableExternallyLinkage;
162 else
163 return GlobalValue::ExternalLinkage;
164 }
165 // A non-promoted imported local definition stays local.
166 // The ThinLTO pass will eventually force-import their definitions.
167 return SGV->getLinkage();
168
169 case GlobalValue::ExternalWeakLinkage:
170 // External weak doesn't apply to definitions, must be a declaration.
171 assert(!doImportAsDefinition(SGV));
172 // Linkage stays external_weak.
173 return SGV->getLinkage();
174
175 case GlobalValue::CommonLinkage:
176 // Linkage stays common on definitions.
177 // The ThinLTO pass will eventually force-import their definitions.
178 return SGV->getLinkage();
179 }
180
181 llvm_unreachable("unknown linkage type");
182}
183
184void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) {
185 if (GV.hasLocalLinkage() &&
186 (doPromoteLocalToGlobal(&GV) || isPerformingImport())) {
187 GV.setName(getName(&GV));
188 GV.setLinkage(getLinkage(&GV));
189 if (!GV.hasLocalLinkage())
190 GV.setVisibility(GlobalValue::HiddenVisibility);
Teresa Johnson488a8002016-02-10 18:11:31 +0000191 } else
192 GV.setLinkage(getLinkage(&GV));
193
194 // Remove functions imported as available externally defs from comdats,
195 // as this is a declaration for the linker, and will be dropped eventually.
196 // It is illegal for comdats to contain declarations.
197 auto *GO = dyn_cast_or_null<GlobalObject>(&GV);
198 if (GO && GO->isDeclarationForLinker() && GO->hasComdat()) {
199 // The IRMover should not have placed any imported declarations in
200 // a comdat, so the only declaration that should be in a comdat
201 // at this point would be a definition imported as available_externally.
202 assert(GO->hasAvailableExternallyLinkage() &&
203 "Expected comdat on definition (possibly available external)");
204 GO->setComdat(nullptr);
205 }
206}
207
208void FunctionImportGlobalProcessing::processGlobalsForThinLTO() {
209 for (GlobalVariable &GV : M.globals())
210 processGlobalForThinLTO(GV);
211 for (Function &SF : M)
212 processGlobalForThinLTO(SF);
213 for (GlobalAlias &GA : M.aliases())
214 processGlobalForThinLTO(GA);
215}
216
217bool FunctionImportGlobalProcessing::run() {
218 processGlobalsForThinLTO();
219 return false;
220}
221
Mehdi Amini8d051852016-03-19 00:40:31 +0000222bool llvm::renameModuleForThinLTO(
223 Module &M, const ModuleSummaryIndex &Index,
224 DenseSet<const GlobalValue *> *GlobalsToImport) {
225 FunctionImportGlobalProcessing ThinLTOProcessing(M, Index, GlobalsToImport);
Teresa Johnson488a8002016-02-10 18:11:31 +0000226 return ThinLTOProcessing.run();
227}