1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 02:33:06 +01:00

IR printing for single function with the new pass manager.

Summary:
The IR printing always prints out all functions in a module with the new pass manager, even with -filter-print-funcs specified. This is being fixed in this change. However, 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.

Test Plan:
make check-clang
make check-llvm

Reviewers: wenlei

Reviewed By: wenlei

Subscribers: wenlei, hiraditya, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D74814
This commit is contained in:
Hongtao Yu 2020-02-23 15:13:27 -08:00 committed by Wenlei He
parent 8e843e8cc6
commit 49f50c7626
2 changed files with 47 additions and 9 deletions

View File

@ -70,16 +70,24 @@ Optional<std::pair<const Module *, std::string>> unwrapModule(Any IR) {
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<const Value &>(*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;

View File

@ -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: *** 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 ***
; 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}}
; 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