@@ -135,16 +135,20 @@ template <> struct MappingTraits<TypeIdSummary> {
135135 }
136136};
137137
138- struct FunctionSummaryYaml {
138+ struct GlobalValueSummaryYaml {
139+ // Commonly used fields
139140 unsigned Linkage, Visibility;
140141 bool NotEligibleToImport, Live, IsLocal, CanAutoHide;
141142 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 = {};
148152};
149153
150154} // End yaml namespace
@@ -176,15 +180,16 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionSummary::ConstVCall)
176180namespace llvm {
177181namespace yaml {
178182
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) {
181185 io.mapOptional (" Linkage" , summary.Linkage );
182186 io.mapOptional (" Visibility" , summary.Visibility );
183187 io.mapOptional (" NotEligibleToImport" , summary.NotEligibleToImport );
184188 io.mapOptional (" Live" , summary.Live );
185189 io.mapOptional (" Local" , summary.IsLocal );
186190 io.mapOptional (" CanAutoHide" , summary.CanAutoHide );
187191 io.mapOptional (" ImportType" , summary.ImportType );
192+ io.mapOptional (" Aliasee" , summary.Aliasee );
188193 io.mapOptional (" Refs" , summary.Refs );
189194 io.mapOptional (" TypeTests" , summary.TypeTests );
190195 io.mapOptional (" TypeTestAssumeVCalls" , summary.TypeTestAssumeVCalls );
@@ -199,69 +204,107 @@ template <> struct MappingTraits<FunctionSummaryYaml> {
199204} // End yaml namespace
200205} // End llvm namespace
201206
202- LLVM_YAML_IS_SEQUENCE_VECTOR (FunctionSummaryYaml )
207+ LLVM_YAML_IS_SEQUENCE_VECTOR (GlobalValueSummaryYaml )
203208
204209namespace llvm {
205210namespace yaml {
206211
207212// FIXME: Add YAML mappings for the rest of the module summary.
208213template <> struct CustomMappingTraits <GlobalValueSummaryMapTy> {
209214 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 );
212217 uint64_t KeyInt;
213218 if (Key.getAsInteger (0 , KeyInt)) {
214219 io.setError (" key not an integer" );
215220 return ;
216221 }
217222 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+ }
219242 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 ) {
222245 auto It = V.try_emplace (RefGUID, /* IsAnalysis=*/ false ).first ;
223246 Refs.push_back (ValueInfo (/* IsAnalysis=*/ false , &*It));
224247 }
225248 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 ),
238255 ArrayRef<FunctionSummary::ParamAccess>{}, ArrayRef<CallsiteInfo>{},
239256 ArrayRef<AllocInfo>{}));
240257 }
241258 }
242259 static void output (IO &io, GlobalValueSummaryMapTy &V) {
243260 for (auto &P : V) {
244- std::vector<FunctionSummaryYaml> FSums ;
261+ std::vector<GlobalValueSummaryYaml> GVSums ;
245262 for (auto &Sum : P.second .SummaryList ) {
246263 if (auto *FSum = dyn_cast<FunctionSummary>(Sum.get ())) {
247264 std::vector<uint64_t > Refs;
248265 Refs.reserve (FSum->refs ().size ());
249266 for (auto &VI : FSum->refs ())
250267 Refs.push_back (VI.getGUID ());
251- FSums .push_back (FunctionSummaryYaml {
268+ GVSums .push_back (GlobalValueSummaryYaml {
252269 FSum->flags ().Linkage , FSum->flags ().Visibility ,
253270 static_cast <bool >(FSum->flags ().NotEligibleToImport ),
254271 static_cast <bool >(FSum->flags ().Live ),
255272 static_cast <bool >(FSum->flags ().DSOLocal ),
256273 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 (),
259277 FSum->type_test_assume_const_vcalls (),
260278 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+ }
262307 }
263- if (!FSums.empty ())
264- io.mapRequired (llvm::utostr (P.first ).c_str (), FSums);
265308 }
266309 }
267310};
@@ -281,6 +324,9 @@ template <> struct CustomMappingTraits<TypeIdSummaryMapTy> {
281324template <> struct MappingTraits <ModuleSummaryIndex> {
282325 static void mapping (IO &io, ModuleSummaryIndex& index) {
283326 io.mapOptional (" GlobalValueMap" , index.GlobalValueMap );
327+ if (!io.outputting ())
328+ CustomMappingTraits<GlobalValueSummaryMapTy>::fixAliaseeLinks (
329+ index.GlobalValueMap );
284330 io.mapOptional (" TypeIdMap" , index.TypeIdMap );
285331 io.mapOptional (" WithGlobalValueDeadStripping" ,
286332 index.WithGlobalValueDeadStripping );
0 commit comments