diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp --- a/llvm/lib/Passes/StandardInstrumentations.cpp +++ b/llvm/lib/Passes/StandardInstrumentations.cpp @@ -70,16 +70,24 @@ llvm_unreachable("Unknown IR unit"); } -void printIR(const Module *M, StringRef Banner, StringRef Extra = StringRef()) { - dbgs() << Banner << Extra << "\n"; - M->print(dbgs(), nullptr, false); -} void printIR(const Function *F, StringRef Banner, StringRef Extra = StringRef()) { if (!llvm::isFunctionInPrintList(F->getName())) return; dbgs() << Banner << Extra << "\n" << static_cast(*F); } + +void printIR(const Module *M, StringRef Banner, StringRef Extra = StringRef()) { + if (llvm::isFunctionInPrintList("*") || llvm::forcePrintModuleIR()) { + dbgs() << Banner << Extra << "\n"; + M->print(dbgs(), nullptr, false); + } else { + for (const auto &F : M->functions()) { + printIR(&F, Banner, Extra); + } + } +} + void printIR(const LazyCallGraph::SCC *C, StringRef Banner, StringRef Extra = StringRef()) { bool BannerPrinted = false; diff --git a/llvm/test/Other/module-pass-printer.ll b/llvm/test/Other/module-pass-printer.ll --- a/llvm/test/Other/module-pass-printer.ll +++ b/llvm/test/Other/module-pass-printer.ll @@ -1,13 +1,43 @@ ; Check pass name is only printed once. -; RUN: opt < %s 2>&1 -forceattrs -disable-output -print-after-all | FileCheck %s -; RUN: opt < %s 2>&1 -forceattrs -disable-output -print-after-all -filter-print-funcs=foo,bar | FileCheck %s +; Check only one function is printed +; RUN: opt < %s 2>&1 -forceattrs -disable-output -print-after-all -filter-print-funcs=foo | FileCheck %s -check-prefix=FOO +; RUN: opt < %s 2>&1 -passes=forceattrs -disable-output -print-after-all -filter-print-funcs=foo | FileCheck %s -check-prefix=FOO + +; Check pass name is only printed once. +; Check both functions are printed +; RUN: opt < %s 2>&1 -forceattrs -disable-output -print-after-all -filter-print-funcs=foo,bar | FileCheck %s -check-prefix=BOTH +; RUN: opt < %s 2>&1 -passes=forceattrs -disable-output -print-after-all -filter-print-funcs=foo,bar | FileCheck %s -check-prefix=BOTH ; Check pass name is not printed if a module doesn't include any function specified in -filter-print-funcs. ; RUN: opt < %s 2>&1 -forceattrs -disable-output -print-after-all -filter-print-funcs=baz | FileCheck %s -allow-empty -check-prefix=EMPTY +; RUN: opt < %s 2>&1 -passes=forceattrs -disable-output -print-after-all -filter-print-funcs=baz | FileCheck %s -allow-empty -check-prefix=EMPTY + +; Check whole module is printed with user-specified wildcast switch -filter-print-funcs=* or -print-module-scope +; RUN: opt < %s 2>&1 -forceattrs -disable-output -print-after-all | FileCheck %s -check-prefix=ALL +; RUN: opt < %s 2>&1 -forceattrs -disable-output -print-after-all -filter-print-funcs=* | FileCheck %s -check-prefix=ALL +; RUN: opt < %s 2>&1 -forceattrs -disable-output -print-after-all -filter-print-funcs=foo -print-module-scope | FileCheck %s -check-prefix=ALL +; RUN: opt < %s 2>&1 -passes=forceattrs -disable-output -print-after-all | FileCheck %s -check-prefix=ALL +; RUN: opt < %s 2>&1 -passes=forceattrs -disable-output -print-after-all -filter-print-funcs=* | FileCheck %s -check-prefix=ALL +; RUN: opt < %s 2>&1 -passes=forceattrs -disable-output -print-after-all -filter-print-funcs=foo -print-module-scope | FileCheck %s -check-prefix=ALL + +; FOO: IR Dump After {{Force set function attributes|ForceFunctionAttrsPass}} +; FOO: define void @foo +; FOO-NOT: define void @bar +; FOO-NOT: IR Dump After {{Force set function attributes|ForceFunctionAttrsPass}} + +; BOTH: IR Dump After {{Force set function attributes|ForceFunctionAttrsPass}} +; BOTH: define void @foo +; BOTH: define void @bar +; BOTH-NOT: IR Dump After {{Force set function attributes|ForceFunctionAttrsPass}} +; BOTH-NOT: ModuleID = + +; EMPTY-NOT: IR Dump After {{Force set function attributes|ForceFunctionAttrsPass}} -; CHECK: *** IR Dump After Force set function attributes *** -; CHECK-NOT: *** IR Dump After Force set function attributes *** -; EMPTY-NOT: *** IR Dump After Force set function attributes *** +; ALL: IR Dump After {{Force set function attributes|ForceFunctionAttrsPass}} +; ALL: ModuleID = +; ALL: define void @foo +; ALL: define void @bar +; ALL-NOT: IR Dump After {{Force set function attributes|ForceFunctionAttrsPass}} define void @foo() { ret void