diff --git a/clang/test/Misc/print-single-function.c b/clang/test/Misc/print-single-function.c new file mode 100644 --- /dev/null +++ b/clang/test/Misc/print-single-function.c @@ -0,0 +1,21 @@ +// Testing single function IR printing with the new pass manager. there are two exceptions, i.e, with user-specified wildcast switch -filter-print-funcs=* or -print-module-scope, under which IR of all functions should be printed. +// RUN: %clang_cc1 -emit-llvm -fexperimental-new-pass-manager -mllvm -print-after-all -mllvm -filter-print-funcs=foo %s -o %t 2>&1 | FileCheck %s --check-prefix=FOO +// RUN: %clang_cc1 -emit-llvm -fexperimental-new-pass-manager -mllvm -print-after-all -mllvm -filter-print-funcs=foo %s -mllvm -print-module-scope -o %t 2>&1 | FileCheck %s --check-prefix=ALL +// RUN: %clang_cc1 -emit-llvm -fexperimental-new-pass-manager -mllvm -print-after-all -mllvm -filter-print-funcs=* %s -o %t 2>&1 | FileCheck %s --check-prefix=ALL + +// FOO: *** IR Dump After AlwaysInlinerPass *** +// FOO: define void @foo() +// FOO-NOT: define void @bar() + +// ALL: *** IR Dump After AlwaysInlinerPass *** +// ALL-NEXT: ; ModuleID = +// ALL: define void @foo() +// ALL: define void @bar() + +void bar() { + return; +} + +void foo() { + bar(); +} 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;