Index: include/llvm/IR/ModuleSummaryIndex.h =================================================================== --- include/llvm/IR/ModuleSummaryIndex.h +++ include/llvm/IR/ModuleSummaryIndex.h @@ -408,6 +408,7 @@ return const_cast( static_cast(this)->getAliasee()); } + bool hasAliaseeGUID() const { return AliaseeGUID != 0; } const GlobalValue::GUID &getAliaseeGUID() const { assert(AliaseeGUID && "Unexpected missing aliasee GUID"); return AliaseeGUID; Index: lib/IR/ModuleSummaryIndex.cpp =================================================================== --- lib/IR/ModuleSummaryIndex.cpp +++ lib/IR/ModuleSummaryIndex.cpp @@ -198,9 +198,12 @@ ", ffl: " + fflagsToString(FS->fflags()); } +static std::string getNodeVisualName(GlobalValue::GUID Id) { + return std::string("@") + std::to_string(Id); +} + static std::string getNodeVisualName(const ValueInfo &VI) { - return VI.name().empty() ? std::string("@") + std::to_string(VI.getGUID()) - : VI.name().str(); + return VI.name().empty() ? getNodeVisualName(VI.getGUID()) : VI.name().str(); } static std::string getNodeLabel(const ValueInfo &VI, GlobalValueSummary *GVS) { @@ -221,13 +224,19 @@ // specific module associated with it. Typically this is function // or variable defined in native object or library. static void defineExternalNode(raw_ostream &OS, const char *Pfx, - const ValueInfo &VI) { - auto StrId = std::to_string(VI.getGUID()); - OS << " " << StrId << " [label=\"" << getNodeVisualName(VI) - << "\"]; // defined externally\n"; + const ValueInfo &VI, GlobalValue::GUID Id) { + auto StrId = std::to_string(Id); + OS << " " << StrId << " [label=\""; + + if (VI) { + OS << getNodeVisualName(VI); + } else { + OS << getNodeVisualName(Id); + } + OS << "\"]; // defined externally\n"; } -void ModuleSummaryIndex::exportToDot(raw_ostream& OS) const { +void ModuleSummaryIndex::exportToDot(raw_ostream &OS) const { std::vector CrossModuleEdges; DenseMap> NodeMap; StringMap ModuleToDefinedGVS; @@ -311,10 +320,17 @@ Draw(SummaryIt.first, R.getGUID(), -1); if (auto *AS = dyn_cast_or_null(SummaryIt.second)) { - auto AliaseeOrigId = AS->getAliasee().getOriginalName(); - auto AliaseeId = getGUIDFromOriginalID(AliaseeOrigId); - - Draw(SummaryIt.first, AliaseeId ? AliaseeId : AliaseeOrigId, -2); + GlobalValue::GUID AliaseeId; + if (AS->hasAliaseeGUID()) + AliaseeId = AS->getAliaseeGUID(); + else { + auto AliaseeOrigId = AS->getAliasee().getOriginalName(); + AliaseeId = getGUIDFromOriginalID(AliaseeOrigId); + if (!AliaseeId) + AliaseeId = AliaseeOrigId; + } + + Draw(SummaryIt.first, AliaseeId, -2); continue; } @@ -330,7 +346,7 @@ for (auto &E : CrossModuleEdges) { auto &ModList = NodeMap[E.Dst]; if (ModList.empty()) { - defineExternalNode(OS, " ", getValueInfo(E.Dst)); + defineExternalNode(OS, " ", getValueInfo(E.Dst), E.Dst); // Add fake module to the list to draw an edge to an external node // in the loop below. ModList.push_back(-1); Index: test/ThinLTO/X86/Inputs/alias_internal.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/Inputs/alias_internal.ll @@ -0,0 +1,8 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define internal i32 @f(i8*) unnamed_addr { + ret i32 42 +} + +@a2 = weak alias i32 (i8*), i32 (i8*)* @f Index: test/ThinLTO/X86/alias_internal.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/alias_internal.ll @@ -0,0 +1,21 @@ +; Test to make sure dot dumper can correctly handle aliases to multiple +; different internal aliasees with the same name. + +; RUN: opt -module-summary %s -o %t1.bc +; RUN: opt -module-summary %p/Inputs/alias_internal.ll -o %t2.bc +; RUN: llvm-lto2 run %t1.bc %t2.bc -o %t.out -save-temps \ +; RUN: -r %t1.bc,a1,plx \ +; RUN: -r %t2.bc,a2,plx + +; RUN: cat %t.out.index.dot | FileCheck %s +; CHECK-DAG: M0_12511626713252727690 -> M0_{{.*}} // alias +; CHECK-DAG: M1_8129049334585965161 -> M1_{{.*}} // alias + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define internal i32 @f(i8*) unnamed_addr { + ret i32 42 +} + +@a1 = weak alias i32 (i8*), i32 (i8*)* @f