diff options
author | Qiu Chaofan <qcf@ecnelises.com> | 2025-03-29 01:54:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-29 01:54:14 +0800 |
commit | b3f01a6aa45b00240cec1c64286b85d7ba87e2af (patch) | |
tree | a56db37aa87cb9ed2b27750bac0efaa01a73e194 | |
parent | e70fe9b264b6f98fd3744b514d7166f75dd19872 (diff) | |
download | llvm-b3f01a6aa45b00240cec1c64286b85d7ba87e2af.zip llvm-b3f01a6aa45b00240cec1c64286b85d7ba87e2af.tar.gz llvm-b3f01a6aa45b00240cec1c64286b85d7ba87e2af.tar.bz2 |
[Clang] Check PP presence when printing stats (#131608)
Front-end option `-print-stats` can be used to print statistics around
the compilation process. But clang with this options will crash when
input is IR file. This patch fixes the crash by checking preprocessor
presence before invoking it.
-rw-r--r-- | clang/docs/ReleaseNotes.rst | 2 | ||||
-rw-r--r-- | clang/lib/Frontend/FrontendAction.cpp | 12 | ||||
-rw-r--r-- | clang/test/Frontend/print-stats.c | 20 |
3 files changed, 30 insertions, 4 deletions
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index eaecead..e409f20 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -389,6 +389,8 @@ Miscellaneous Bug Fixes Miscellaneous Clang Crashes Fixed ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Fixed crash when ``-print-stats`` is enabled in compiling IR files. (#GH131608) + OpenACC Specific Changes ------------------------ diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index f6ad7c8..2d77f06 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -1074,10 +1074,14 @@ void FrontendAction::EndSourceFile() { if (CI.getFrontendOpts().ShowStats) { llvm::errs() << "\nSTATISTICS FOR '" << getCurrentFileOrBufferName() << "':\n"; - CI.getPreprocessor().PrintStats(); - CI.getPreprocessor().getIdentifierTable().PrintStats(); - CI.getPreprocessor().getHeaderSearchInfo().PrintStats(); - CI.getSourceManager().PrintStats(); + if (CI.hasPreprocessor()) { + CI.getPreprocessor().PrintStats(); + CI.getPreprocessor().getIdentifierTable().PrintStats(); + CI.getPreprocessor().getHeaderSearchInfo().PrintStats(); + } + if (CI.hasSourceManager()) { + CI.getSourceManager().PrintStats(); + } llvm::errs() << "\n"; } diff --git a/clang/test/Frontend/print-stats.c b/clang/test/Frontend/print-stats.c new file mode 100644 index 0000000..c29717b --- /dev/null +++ b/clang/test/Frontend/print-stats.c @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -print-stats \ +// RUN: -emit-llvm -x ir /dev/null -o - 2>&1 | FileCheck %s --check-prefix=CHECK-IR +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -print-stats \ +// RUN: -emit-llvm -x c /dev/null -o - 2>&1 | FileCheck %s --check-prefix=CHECK-C + +// CHECK-IR: *** Source Manager Stats +// CHECK-IR: *** File Manager Stats +// CHECK-IR: *** Virtual File System Stats + +// CHECK-C: *** Semantic Analysis Stats +// CHECK-C: *** Analysis Based Warnings Stats +// CHECK-C: *** AST Context Stats +// CHECK-C: *** Decl Stats +// CHECK-C: *** Stmt/Expr Stats +// CHECK-C: *** Preprocessor Stats +// CHECK-C: *** Identifier Table Stats +// CHECK-C: *** HeaderSearch Stats +// CHECK-C: *** Source Manager Stats +// CHECK-C: *** File Manager Stats +// CHECK-C: *** Virtual File System Stats |