From e0384663d67bfeb040e11b86bdb9e9a5fc9e8099 Mon Sep 17 00:00:00 2001 From: Mehdi Amini Date: Wed, 14 Sep 2016 21:04:59 +0000 Subject: [PATCH] [ThinLTO] Add an option to llvm-lto to print some basic statistics for the index Differential Revision: https://reviews.llvm.org/D24290 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281537 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/ThinLTO/X86/funcimport.ll | 3 +++ tools/llvm-lto/llvm-lto.cpp | 44 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/test/ThinLTO/X86/funcimport.ll b/test/ThinLTO/X86/funcimport.ll index ebb4d347b67..41be0ed78f5 100644 --- a/test/ThinLTO/X86/funcimport.ll +++ b/test/ThinLTO/X86/funcimport.ll @@ -3,6 +3,9 @@ ; RUN: opt -module-summary %p/Inputs/funcimport.ll -o %t2.bc ; RUN: llvm-lto -thinlto-action=thinlink -o %t3.bc %t.bc %t2.bc +; RUN: llvm-lto -thinlto-index-stats %t3.bc | FileCheck %s -check-prefix=STATS +; STATS: Index {{.*}} contains 24 nodes (13 functions, 3 alias, 8 globals) and 19 edges (8 refs and 11 calls) + ; Ensure statics are promoted/renamed correctly from this file (all but ; constant variable need promotion). ; RUN: llvm-lto -thinlto-action=promote %t.bc -thinlto-index=%t3.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=EXPORTSTATIC diff --git a/tools/llvm-lto/llvm-lto.cpp b/tools/llvm-lto/llvm-lto.cpp index 05d1bbdd1f7..2e9d8b7ed2f 100644 --- a/tools/llvm-lto/llvm-lto.cpp +++ b/tools/llvm-lto/llvm-lto.cpp @@ -42,6 +42,11 @@ static cl::opt "(default = '-O2')"), cl::Prefix, cl::ZeroOrMore, cl::init('2')); +static cl::opt + IndexStats("thinlto-index-stats", + cl::desc("Print statistic for the index in every input files"), + cl::init(false)); + static cl::opt DisableVerify( "disable-verify", cl::init(false), cl::desc("Do not run the verifier during the optimization pipeline")); @@ -264,6 +269,40 @@ getLocalLTOModule(StringRef Path, std::unique_ptr &Buffer, return std::move(*Ret); } +/// Print some statistics on the index for each input files. +void printIndexStats() { + for (auto &Filename : InputFilenames) { + CurrentActivity = "loading file '" + Filename + "'"; + ErrorOr> IndexOrErr = + llvm::getModuleSummaryIndexForFile(Filename, diagnosticHandler); + error(IndexOrErr, "error " + CurrentActivity); + std::unique_ptr Index = std::move(IndexOrErr.get()); + CurrentActivity = ""; + // Skip files without a module summary. + if (!Index) + report_fatal_error(Filename + " does not contain an index"); + + unsigned Calls = 0, Refs = 0, Functions = 0, Alias = 0, Globals = 0; + for (auto &Summaries : *Index) { + for (auto &Summary : Summaries.second) { + Refs += Summary->refs().size(); + if (auto *FuncSummary = dyn_cast(Summary.get())) { + Functions++; + Calls += FuncSummary->calls().size(); + } else if (isa(Summary.get())) + Alias++; + else + Globals++; + } + } + outs() << "Index " << Filename << " contains " + << (Alias + Globals + Functions) << " nodes (" << Functions + << " functions, " << Alias << " alias, " << Globals + << " globals) and " << (Calls + Refs) << " edges (" << Refs + << " refs and " << Calls << " calls)\n"; + } +} + /// \brief List symbols in each IR file. /// /// The main point here is to provide lit-testable coverage for the LTOModule @@ -725,6 +764,11 @@ int main(int argc, char **argv) { return 0; } + if (IndexStats) { + printIndexStats(); + return 0; + } + if (CheckHasObjC) { for (auto &Filename : InputFilenames) { ErrorOr> BufferOrErr =