Index: lib/Transforms/IPO/FunctionImport.cpp =================================================================== --- lib/Transforms/IPO/FunctionImport.cpp +++ lib/Transforms/IPO/FunctionImport.cpp @@ -254,7 +254,10 @@ continue; } - LLVM_DEBUG(dbgs() << " ref -> " << VI.getGUID() << "\n"); + LLVM_DEBUG(dbgs() << " ref -> " << VI.getGUID()); + if (!VI.name().empty()) + LLVM_DEBUG(dbgs() << " (" << VI.name() << ")"); + LLVM_DEBUG(dbgs() << "\n"); for (auto &RefSummary : VI.getSummaryList()) if (RefSummary->getSummaryKind() == GlobalValueSummary::GlobalVarKind && @@ -284,8 +287,10 @@ static int ImportCount = 0; for (auto &Edge : Summary.calls()) { ValueInfo VI = Edge.first; - LLVM_DEBUG(dbgs() << " edge -> " << VI.getGUID() - << " Threshold:" << Threshold << "\n"); + LLVM_DEBUG(dbgs() << " edge -> " << VI.getGUID()); + if (!VI.name().empty()) + LLVM_DEBUG(dbgs() << " (" << VI.name() << ")"); + LLVM_DEBUG(dbgs() << " Threshold:" << Threshold << "\n"); if (ImportCutoff >= 0 && ImportCount >= ImportCutoff) { LLVM_DEBUG(dbgs() << "ignored! import-cutoff value of " << ImportCutoff @@ -399,8 +404,18 @@ // Populate the worklist with the import for the functions in the current // module for (auto &GVSummary : DefinedGVSummaries) { +#ifndef NDEBUG + // FIXME: Change the GVSummaryMapTy to hold ValueInfo instead of GUID + // so this map look up (and possibly others) can be avoided. + auto VI = Index.getValueInfo(GVSummary.first); +#endif if (!Index.isGlobalValueLive(GVSummary.second)) { - LLVM_DEBUG(dbgs() << "Ignores Dead GUID: " << GVSummary.first << "\n"); + LLVM_DEBUG(dbgs() << "Ignores Dead GUID: " << GVSummary.first); +#ifndef NDEBUG + if (!VI.name().empty()) + LLVM_DEBUG(dbgs() << " (" << VI.name() << ")"); +#endif + LLVM_DEBUG(dbgs() << "\n"); continue; } auto *FuncSummary = @@ -408,7 +423,12 @@ if (!FuncSummary) // Skip import for global variables continue; - LLVM_DEBUG(dbgs() << "Initialize import for " << GVSummary.first << "\n"); + LLVM_DEBUG(dbgs() << "Initialize import for " << GVSummary.first); +#ifndef NDEBUG + if (!VI.name().empty()) + LLVM_DEBUG(dbgs() << " (" << VI.name() << ")"); +#endif + LLVM_DEBUG(dbgs() << "\n"); computeImportForFunction(*FuncSummary, Index, ImportInstrLimit, DefinedGVSummaries, Worklist, ImportList, ExportLists); @@ -600,14 +620,19 @@ } // Add values flagged in the index as live roots to the worklist. - for (const auto &Entry : Index) + for (const auto &Entry : Index) { + auto VI = Index.getValueInfo(Entry); for (auto &S : Entry.second.SummaryList) if (S->isLive()) { - LLVM_DEBUG(dbgs() << "Live root: " << Entry.first << "\n"); - Worklist.push_back(ValueInfo(/*IsAnalysis=*/false, &Entry)); + LLVM_DEBUG(dbgs() << "Live root: " << Entry.first); + if (!VI.name().empty()) + LLVM_DEBUG(dbgs() << " (" << VI.name() << ")"); + LLVM_DEBUG(dbgs() << "\n"); + Worklist.push_back(VI); ++LiveSymbols; break; } + } // Make value live and add it to the worklist if it was not live before. auto visit = [&](ValueInfo VI) { Index: test/ThinLTO/X86/Inputs/funcimport-debug.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/Inputs/funcimport-debug.ll @@ -0,0 +1,10 @@ +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.11.0" + + +define void @foo() #0 { +entry: + ret void +} + +@baz = constant i32 10, align 4 Index: test/ThinLTO/X86/deadstrip.ll =================================================================== --- test/ThinLTO/X86/deadstrip.ll +++ test/ThinLTO/X86/deadstrip.ll @@ -1,3 +1,6 @@ +; Require asserts for -debug-only +; REQUIRES: asserts + ; RUN: opt -module-summary %s -o %t1.bc ; RUN: opt -module-summary %p/Inputs/deadstrip.ll -o %t2.bc ; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc @@ -18,7 +21,9 @@ ; RUN: -r %t2.bc,_baz,pl \ ; RUN: -r %t2.bc,_boo,pl \ ; RUN: -r %t2.bc,_dead_func,l \ -; RUN: -r %t2.bc,_another_dead_func,pl +; RUN: -r %t2.bc,_another_dead_func,pl \ +; RUN: -thinlto-threads=1 \ +; RUN: -debug-only=function-import 2>&1 | FileCheck %s --check-prefix=DEBUG ; RUN: llvm-dis < %t.out.1.3.import.bc | FileCheck %s --check-prefix=LTO2 ; RUN: llvm-dis < %t.out.2.3.import.bc | FileCheck %s --check-prefix=LTO2-CHECK2 ; RUN: llvm-nm %t.out.1 | FileCheck %s --check-prefix=CHECK2-NM @@ -71,6 +76,13 @@ ; CHECK-NM-NOT: bar ; CHECK-NM-NOT: dead +; DEBUG: Live root: 2412314959268824392 (llvm.global_ctors) +; DEBUG: Live root: 15822663052811949562 (main) +; DEBUG: Ignores Dead GUID: 7342339837106705152 (dead_func) +; DEBUG: Ignores Dead GUID: 7546896869197086323 (baz) +; DEBUG: Initialize import for 15611644523426561710 (boo) +; DEBUG: Ignores Dead GUID: 2384416018110111308 (another_dead_func) + ; Next test the case where Inputs/deadstrip.ll does not get a module index, ; which will cause it to be handled by regular LTO in the new LTO API. ; In that case there are uses of @dead_func in the regular LTO partition Index: test/ThinLTO/X86/funcimport-debug.ll =================================================================== --- /dev/null +++ test/ThinLTO/X86/funcimport-debug.ll @@ -0,0 +1,35 @@ +; Test of function importing debug messages + +; Require asserts for -debug-only +; REQUIRES: asserts + +; Do setup work for all below tests: generate bitcode and combined index +; RUN: opt -module-summary %s -o %t1.bc +; RUN: opt -module-summary %p/Inputs/funcimport-debug.ll -o %t2.bc + +; RUN: llvm-lto2 run %t1.bc %t2.bc -o %t.o -save-temps \ +; RUN: -r=%t1.bc,_main,plx \ +; RUN: -r=%t1.bc,_foo,l \ +; RUN: -r=%t1.bc,_baz,l \ +; RUN: -r=%t2.bc,_foo,plx \ +; RUN: -r=%t2.bc,_baz,plx \ +; RUN: -thinlto-threads=1 \ +; RUN: -debug-only=function-import 2>&1 | FileCheck %s + +; CHECK-DAG: Initialize import for 6699318081062747564 (foo) +; CHECK-DAG: Initialize import for 15822663052811949562 (main) +; CHECK-DAG: ref -> 7546896869197086323 (baz) +; CHECK-DAG: edge -> 6699318081062747564 (foo) Threshold:100 + +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.11.0" + +define i32 @main() #0 { +entry: + call void (...) @foo() + %0 = load i32, i32* @baz, align 4 + ret i32 %0 +} + +declare void @foo(...) #1 +@baz = external global i32