diff --git a/clang/test/Analysis/alias-indirect-function-lto.c b/clang/test/Analysis/alias-indirect-function-lto.c new file mode 100644 --- /dev/null +++ b/clang/test/Analysis/alias-indirect-function-lto.c @@ -0,0 +1,4 @@ +// RUN: %clang_analyze_cc1 -flto -c +void f() __attribute__((ifunc("g"))); +static void *g() { return 0; }; +void h() __attribute__((alias("f"))); \ No newline at end of file diff --git a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp --- a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp +++ b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp @@ -646,23 +646,26 @@ Index.addGlobalValueSummary(V, std::move(GVarSummary)); } -static void -computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A, - DenseSet &CantBePromoted) { - bool NonRenamableLocal = isNonRenamableLocal(A); - GlobalValueSummary::GVFlags Flags( - A.getLinkage(), A.getVisibility(), NonRenamableLocal, - /* Live = */ false, A.isDSOLocal(), A.canBeOmittedFromSymbolTable()); - auto AS = std::make_unique(Flags); +static void computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A, + DenseSet &CantBePromoted) { auto *Aliasee = A.getAliaseeObject(); - auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID()); - assert(AliaseeVI && "Alias expects aliasee summary to be available"); - assert(AliaseeVI.getSummaryList().size() == 1 && - "Expected a single entry per aliasee in per-module index"); - AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get()); - if (NonRenamableLocal) - CantBePromoted.insert(A.getGUID()); - Index.addGlobalValueSummary(A, std::move(AS)); + // Currently, skip summary for indirect function aliases as + // summary for aliasee will not be emitted. + if (Aliasee->getValueID() != Value::ValueTy::GlobalIFuncVal) { + bool NonRenamableLocal = isNonRenamableLocal(A); + GlobalValueSummary::GVFlags Flags( + A.getLinkage(), A.getVisibility(), NonRenamableLocal, + /* Live = */ false, A.isDSOLocal(), A.canBeOmittedFromSymbolTable()); + auto AS = std::make_unique(Flags); + auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID()); + assert(AliaseeVI && "Alias expects aliasee summary to be available"); + assert(AliaseeVI.getSummaryList().size() == 1 && + "Expected a single entry per aliasee in per-module index"); + AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get()); + if (NonRenamableLocal) + CantBePromoted.insert(A.getGUID()); + Index.addGlobalValueSummary(A, std::move(AS)); + } } // Set LiveRoot flag on entries matching the given value name. diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -4103,8 +4103,10 @@ for (const GlobalAlias &A : M.aliases()) { auto *Aliasee = A.getAliaseeObject(); - if (!Aliasee->hasName()) - // Nameless function don't have an entry in the summary, skip it. + if (!Aliasee->hasName() || + Aliasee->getValueID() == Value::ValueTy::GlobalIFuncVal) + // IFunc function and Nameless function don't have an entry in the + // summary, skip it. continue; auto AliasId = VE.getValueID(&A); auto AliaseeId = VE.getValueID(Aliasee);