[clang] 360c5fe - [C++20] [Modules] Emit Macro Definition in -module-file-info action

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Sun Nov 13 21:33:52 PST 2022


Author: Chuanqi Xu
Date: 2022-11-14T13:28:26+08:00
New Revision: 360c5fe54c0758c73bf85453fd2913f371adc7d5

URL: https://github.com/llvm/llvm-project/commit/360c5fe54c0758c73bf85453fd2913f371adc7d5
DIFF: https://github.com/llvm/llvm-project/commit/360c5fe54c0758c73bf85453fd2913f371adc7d5.diff

LOG: [C++20] [Modules] Emit Macro Definition in -module-file-info action

It is helpful to know whih macro definition is emitted in the module
file without openning it directly. And this is not easy to be tested
with the lit test. So this patch add the facility to emit macro
definitions in `-module-file-info` action. And this should be innnocent
for every other cases.

Added: 
    clang/test/Modules/cxx20-module-file-info-macros.cpp

Modified: 
    clang/lib/Frontend/FrontendActions.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp
index be3c42e79802..b4ec3892a1b6 100644
--- a/clang/lib/Frontend/FrontendActions.cpp
+++ b/clang/lib/Frontend/FrontendActions.cpp
@@ -938,6 +938,20 @@ void DumpModuleInfoAction::ExecuteAction() {
         }
       }
     }
+
+    // Emit the macro definitions in the module file so that we can know how
+    // much definitions in the module file quickly.
+    // TODO: Emit the macro definition bodies completely.
+    if (auto FilteredMacros = llvm::make_filter_range(
+            R->getPreprocessor().macros(),
+            [](const auto &Macro) { return Macro.first->isFromAST(); });
+        !FilteredMacros.empty()) {
+      Out << "   Macro Definitions:\n";
+      for (/*<IdentifierInfo *, MacroState> pair*/ const auto &Macro :
+           FilteredMacros)
+        Out << "     " << Macro.first->getName() << "\n";
+    }
+
     // Now let's print out any modules we did not see as part of the Primary.
     for (auto SM : SubModMap) {
       if (!SM.second.Seen && SM.second.Mod) {

diff  --git a/clang/test/Modules/cxx20-module-file-info-macros.cpp b/clang/test/Modules/cxx20-module-file-info-macros.cpp
new file mode 100644
index 000000000000..422589702948
--- /dev/null
+++ b/clang/test/Modules/cxx20-module-file-info-macros.cpp
@@ -0,0 +1,74 @@
+// Test the output from -module-file-info about C++20 Modules
+// can reflect macros definitions correctly.
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 -emit-header-unit -xc++-user-header %t/foo.h -o %t/foo.pcm
+// RUN: %clang_cc1 -module-file-info %t/foo.pcm | FileCheck %t/foo.h
+//
+// RUN: %clang_cc1 -std=c++20 -emit-header-unit -xc++-user-header %t/include_foo.h -o %t/include_foo.pcm
+// RUN: %clang_cc1 -module-file-info %t/include_foo.pcm | FileCheck %t/include_foo.h
+
+// RUN: %clang_cc1 -std=c++20 -emit-header-unit -xc++-user-header -fmodule-file=%t/foo.pcm \
+// RUN:     %t/import_foo.h -o %t/import_foo.pcm
+// RUN: %clang_cc1 -module-file-info %t/import_foo.pcm | FileCheck %t/import_foo.h
+//
+// RUN: %clang_cc1 -std=c++20 %t/named_module.cppm -emit-module-interface -o %t/M.pcm
+// RUN: %clang_cc1 -module-file-info %t/M.pcm | FileCheck %t/named_module.cppm
+
+//--- foo.h
+#pragma once
+#define FOO
+#define CONSTANT 43
+#define FUNC_Macro(X) (X+1)
+#define TO_BE_UNDEF
+#undef TO_BE_UNDEF
+
+#ifndef FOO
+#define CONDITIONAL_DEF
+#endif
+
+#define REDEFINE
+#define REDEFINE
+
+// CHECK: Macro Definitions:
+// CHECK-DAG: REDEFINE
+// CHECK-DAG: FUNC_Macro
+// CHECK-DAG: CONSTANT
+// CHECK-DAG: FOO
+// CHECK-NEXT: ===
+
+//--- include_foo.h
+#include "foo.h"
+#undef REDEFINE
+// CHECK: Macro Definitions:
+// CHECK-DAG: CONSTANT
+// CHECK-DAG: FUNC_Macro
+// CHECK-DAG: FOO
+// CHECK-NEXT: ===
+
+//--- import_foo.h
+import "foo.h";
+#undef REDEFINE
+// CHECK: Macro Definitions:
+// CHECK-DAG: CONSTANT
+// CHECK-DAG: FUNC_Macro
+// CHECK-DAG: FOO
+// CHECK-NEXT: ===
+
+//--- named_module.cppm
+module;
+#include "foo.h"
+export module M;
+#define M_Module 43
+// FIXME: It is meaningless for named modules to emit macro definitions.
+// It wastes the time and spaces completely.
+// CHECK: Macro Definitions:
+// CHECK-DAG: M_Module
+// CHECK-DAG: REDEFINE
+// CHECK-DAG: FUNC_Macro
+// CHECK-DAG: TO_BE_UNDEF
+// CHECK-DAG: FOO
+// CHECK-DAG: CONSTANT
+// CHECK-NEXT: ===


        


More information about the cfe-commits mailing list