@@ -135,16 +135,20 @@ template <> struct MappingTraits<TypeIdSummary> {
135
135
}
136
136
};
137
137
138
- struct FunctionSummaryYaml {
138
+ struct GlobalValueSummaryYaml {
139
+ // Commonly used fields
139
140
unsigned Linkage, Visibility;
140
141
bool NotEligibleToImport, Live, IsLocal, CanAutoHide;
141
142
unsigned ImportType;
142
- std::vector<uint64_t > Refs;
143
- std::vector<uint64_t > TypeTests;
144
- std::vector<FunctionSummary::VFuncId> TypeTestAssumeVCalls,
145
- TypeCheckedLoadVCalls;
146
- std::vector<FunctionSummary::ConstVCall> TypeTestAssumeConstVCalls,
147
- TypeCheckedLoadConstVCalls;
143
+ // Fields for AliasSummary
144
+ std::optional<uint64_t > Aliasee;
145
+ // Fields for FunctionSummary
146
+ std::vector<uint64_t > Refs = {};
147
+ std::vector<uint64_t > TypeTests = {};
148
+ std::vector<FunctionSummary::VFuncId> TypeTestAssumeVCalls = {};
149
+ std::vector<FunctionSummary::VFuncId> TypeCheckedLoadVCalls = {};
150
+ std::vector<FunctionSummary::ConstVCall> TypeTestAssumeConstVCalls = {};
151
+ std::vector<FunctionSummary::ConstVCall> TypeCheckedLoadConstVCalls = {};
148
152
};
149
153
150
154
} // End yaml namespace
@@ -176,15 +180,16 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionSummary::ConstVCall)
176
180
namespace llvm {
177
181
namespace yaml {
178
182
179
- template <> struct MappingTraits <FunctionSummaryYaml > {
180
- static void mapping (IO &io, FunctionSummaryYaml& summary) {
183
+ template <> struct MappingTraits <GlobalValueSummaryYaml > {
184
+ static void mapping (IO &io, GlobalValueSummaryYaml & summary) {
181
185
io.mapOptional (" Linkage" , summary.Linkage );
182
186
io.mapOptional (" Visibility" , summary.Visibility );
183
187
io.mapOptional (" NotEligibleToImport" , summary.NotEligibleToImport );
184
188
io.mapOptional (" Live" , summary.Live );
185
189
io.mapOptional (" Local" , summary.IsLocal );
186
190
io.mapOptional (" CanAutoHide" , summary.CanAutoHide );
187
191
io.mapOptional (" ImportType" , summary.ImportType );
192
+ io.mapOptional (" Aliasee" , summary.Aliasee );
188
193
io.mapOptional (" Refs" , summary.Refs );
189
194
io.mapOptional (" TypeTests" , summary.TypeTests );
190
195
io.mapOptional (" TypeTestAssumeVCalls" , summary.TypeTestAssumeVCalls );
@@ -199,69 +204,107 @@ template <> struct MappingTraits<FunctionSummaryYaml> {
199
204
} // End yaml namespace
200
205
} // End llvm namespace
201
206
202
- LLVM_YAML_IS_SEQUENCE_VECTOR (FunctionSummaryYaml )
207
+ LLVM_YAML_IS_SEQUENCE_VECTOR (GlobalValueSummaryYaml )
203
208
204
209
namespace llvm {
205
210
namespace yaml {
206
211
207
212
// FIXME: Add YAML mappings for the rest of the module summary.
208
213
template <> struct CustomMappingTraits <GlobalValueSummaryMapTy> {
209
214
static void inputOne (IO &io, StringRef Key, GlobalValueSummaryMapTy &V) {
210
- std::vector<FunctionSummaryYaml> FSums ;
211
- io.mapRequired (Key.str ().c_str (), FSums );
215
+ std::vector<GlobalValueSummaryYaml> GVSums ;
216
+ io.mapRequired (Key.str ().c_str (), GVSums );
212
217
uint64_t KeyInt;
213
218
if (Key.getAsInteger (0 , KeyInt)) {
214
219
io.setError (" key not an integer" );
215
220
return ;
216
221
}
217
222
auto &Elem = V.try_emplace (KeyInt, /* IsAnalysis=*/ false ).first ->second ;
218
- for (auto &FSum : FSums) {
223
+ for (auto &GVSum : GVSums) {
224
+ GlobalValueSummary::GVFlags GVFlags (
225
+ static_cast <GlobalValue::LinkageTypes>(GVSum.Linkage ),
226
+ static_cast <GlobalValue::VisibilityTypes>(GVSum.Visibility ),
227
+ GVSum.NotEligibleToImport , GVSum.Live , GVSum.IsLocal ,
228
+ GVSum.CanAutoHide ,
229
+ static_cast <GlobalValueSummary::ImportKind>(GVSum.ImportType ));
230
+ if (GVSum.Aliasee ) {
231
+ auto ASum = std::make_unique<AliasSummary>(GVFlags);
232
+ if (!V.count (*GVSum.Aliasee ))
233
+ V.emplace (*GVSum.Aliasee , /* IsAnalysis=*/ false );
234
+ ValueInfo AliaseeVI (/* IsAnalysis=*/ false , &*V.find (*GVSum.Aliasee ));
235
+ // Note: Aliasee cannot be filled until all summaries are loaded.
236
+ // This is done in fixAliaseeLinks() which is called in
237
+ // MappingTraits<ModuleSummaryIndex>::mapping().
238
+ ASum->setAliasee (AliaseeVI, /* Aliasee=*/ nullptr );
239
+ Elem.SummaryList .push_back (std::move (ASum));
240
+ continue ;
241
+ }
219
242
SmallVector<ValueInfo, 0 > Refs;
220
- Refs.reserve (FSum .Refs .size ());
221
- for (auto &RefGUID : FSum .Refs ) {
243
+ Refs.reserve (GVSum .Refs .size ());
244
+ for (auto &RefGUID : GVSum .Refs ) {
222
245
auto It = V.try_emplace (RefGUID, /* IsAnalysis=*/ false ).first ;
223
246
Refs.push_back (ValueInfo (/* IsAnalysis=*/ false , &*It));
224
247
}
225
248
Elem.SummaryList .push_back (std::make_unique<FunctionSummary>(
226
- GlobalValueSummary::GVFlags (
227
- static_cast <GlobalValue::LinkageTypes>(FSum.Linkage ),
228
- static_cast <GlobalValue::VisibilityTypes>(FSum.Visibility ),
229
- FSum.NotEligibleToImport , FSum.Live , FSum.IsLocal ,
230
- FSum.CanAutoHide ,
231
- static_cast <GlobalValueSummary::ImportKind>(FSum.ImportType )),
232
- /* NumInsts=*/ 0 , FunctionSummary::FFlags{}, std::move (Refs),
233
- SmallVector<FunctionSummary::EdgeTy, 0 >{}, std::move (FSum.TypeTests ),
234
- std::move (FSum.TypeTestAssumeVCalls ),
235
- std::move (FSum.TypeCheckedLoadVCalls ),
236
- std::move (FSum.TypeTestAssumeConstVCalls ),
237
- std::move (FSum.TypeCheckedLoadConstVCalls ),
249
+ GVFlags, /* NumInsts=*/ 0 , FunctionSummary::FFlags{}, std::move (Refs),
250
+ SmallVector<FunctionSummary::EdgeTy, 0 >{}, std::move (GVSum.TypeTests ),
251
+ std::move (GVSum.TypeTestAssumeVCalls ),
252
+ std::move (GVSum.TypeCheckedLoadVCalls ),
253
+ std::move (GVSum.TypeTestAssumeConstVCalls ),
254
+ std::move (GVSum.TypeCheckedLoadConstVCalls ),
238
255
ArrayRef<FunctionSummary::ParamAccess>{}, ArrayRef<CallsiteInfo>{},
239
256
ArrayRef<AllocInfo>{}));
240
257
}
241
258
}
242
259
static void output (IO &io, GlobalValueSummaryMapTy &V) {
243
260
for (auto &P : V) {
244
- std::vector<FunctionSummaryYaml> FSums ;
261
+ std::vector<GlobalValueSummaryYaml> GVSums ;
245
262
for (auto &Sum : P.second .SummaryList ) {
246
263
if (auto *FSum = dyn_cast<FunctionSummary>(Sum.get ())) {
247
264
std::vector<uint64_t > Refs;
248
265
Refs.reserve (FSum->refs ().size ());
249
266
for (auto &VI : FSum->refs ())
250
267
Refs.push_back (VI.getGUID ());
251
- FSums .push_back (FunctionSummaryYaml {
268
+ GVSums .push_back (GlobalValueSummaryYaml {
252
269
FSum->flags ().Linkage , FSum->flags ().Visibility ,
253
270
static_cast <bool >(FSum->flags ().NotEligibleToImport ),
254
271
static_cast <bool >(FSum->flags ().Live ),
255
272
static_cast <bool >(FSum->flags ().DSOLocal ),
256
273
static_cast <bool >(FSum->flags ().CanAutoHide ),
257
- FSum->flags ().ImportType , Refs, FSum->type_tests (),
258
- FSum->type_test_assume_vcalls (), FSum->type_checked_load_vcalls (),
274
+ FSum->flags ().ImportType , /* Aliasee=*/ std::nullopt, Refs,
275
+ FSum->type_tests (), FSum->type_test_assume_vcalls (),
276
+ FSum->type_checked_load_vcalls (),
259
277
FSum->type_test_assume_const_vcalls (),
260
278
FSum->type_checked_load_const_vcalls ()});
261
- }
279
+ } else if (auto *ASum = dyn_cast<AliasSummary>(Sum.get ());
280
+ ASum && ASum->hasAliasee ()) {
281
+ GVSums.push_back (GlobalValueSummaryYaml{
282
+ ASum->flags ().Linkage , ASum->flags ().Visibility ,
283
+ static_cast <bool >(ASum->flags ().NotEligibleToImport ),
284
+ static_cast <bool >(ASum->flags ().Live ),
285
+ static_cast <bool >(ASum->flags ().DSOLocal ),
286
+ static_cast <bool >(ASum->flags ().CanAutoHide ),
287
+ ASum->flags ().ImportType ,
288
+ /* Aliasee=*/ ASum->getAliaseeGUID ()});
289
+ }
290
+ }
291
+ if (!GVSums.empty ())
292
+ io.mapRequired (llvm::utostr (P.first ).c_str (), GVSums);
293
+ }
294
+ }
295
+ static void fixAliaseeLinks (GlobalValueSummaryMapTy &V) {
296
+ for (auto &P : V) {
297
+ for (auto &Sum : P.second .SummaryList ) {
298
+ if (auto *Alias = dyn_cast<AliasSummary>(Sum.get ())) {
299
+ ValueInfo AliaseeVI = Alias->getAliaseeVI ();
300
+ auto AliaseeSL = AliaseeVI.getSummaryList ();
301
+ if (AliaseeSL.empty ()) {
302
+ ValueInfo EmptyVI;
303
+ Alias->setAliasee (EmptyVI, nullptr );
304
+ } else
305
+ Alias->setAliasee (AliaseeVI, AliaseeSL[0 ].get ());
306
+ }
262
307
}
263
- if (!FSums.empty ())
264
- io.mapRequired (llvm::utostr (P.first ).c_str (), FSums);
265
308
}
266
309
}
267
310
};
@@ -281,6 +324,9 @@ template <> struct CustomMappingTraits<TypeIdSummaryMapTy> {
281
324
template <> struct MappingTraits <ModuleSummaryIndex> {
282
325
static void mapping (IO &io, ModuleSummaryIndex& index) {
283
326
io.mapOptional (" GlobalValueMap" , index .GlobalValueMap );
327
+ if (!io.outputting ())
328
+ CustomMappingTraits<GlobalValueSummaryMapTy>::fixAliaseeLinks (
329
+ index .GlobalValueMap );
284
330
io.mapOptional (" TypeIdMap" , index .TypeIdMap );
285
331
io.mapOptional (" WithGlobalValueDeadStripping" ,
286
332
index .WithGlobalValueDeadStripping );
0 commit comments