}
}
}
+
+ // 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) {
--- /dev/null
+// 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: ===