From f8601b2758f6ae1c39a32bd5ab57aaa970ff5724 Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Tue, 31 May 2016 18:19:32 +0000 Subject: [PATCH] PCH + module: make sure we write out macros associated with builtin identifiers. When we import a module that defines a builtin identifier from prefix header and precompile the prefix header, the macro information related to the identifier is lost. If we don't precompile the prefix header, the source file can still see the macro information. The reason is that we write out the identifier in the pch but not the macro information since the macro is not defined locally. This is related to r251565. In that commit, if we read a builtin identifier from a module that wasn't "interesting" to that module, we will still write it out to a PCH that imports that module. The fix is to write exported module macros for PCH as well. rdar://24666630 Differential Revision: http://reviews.llvm.org/D20383 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@271310 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Serialization/ASTWriter.cpp | 47 +++++++++---------- test/Modules/Inputs/MacroFabs1.h | 6 +++ test/Modules/Inputs/module.map | 4 ++ .../Inputs/pch-import-module-with-macro.pch | 3 ++ test/Modules/pch-module-macro.m | 9 ++++ 5 files changed, 45 insertions(+), 24 deletions(-) create mode 100644 test/Modules/Inputs/MacroFabs1.h create mode 100644 test/Modules/Inputs/pch-import-module-with-macro.pch create mode 100644 test/Modules/pch-module-macro.m diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 7540bc03d1..0c9264f403 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -2187,30 +2187,29 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) { // Write out any exported module macros. bool EmittedModuleMacros = false; - if (IsModule) { - auto Leafs = PP.getLeafModuleMacros(Name); - SmallVector Worklist(Leafs.begin(), Leafs.end()); - llvm::DenseMap Visits; - while (!Worklist.empty()) { - auto *Macro = Worklist.pop_back_val(); - - // Emit a record indicating this submodule exports this macro. - ModuleMacroRecord.push_back( - getSubmoduleID(Macro->getOwningModule())); - ModuleMacroRecord.push_back(getMacroRef(Macro->getMacroInfo(), Name)); - for (auto *M : Macro->overrides()) - ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule())); - - Stream.EmitRecord(PP_MODULE_MACRO, ModuleMacroRecord); - ModuleMacroRecord.clear(); - - // Enqueue overridden macros once we've visited all their ancestors. - for (auto *M : Macro->overrides()) - if (++Visits[M] == M->getNumOverridingMacros()) - Worklist.push_back(M); - - EmittedModuleMacros = true; - } + // We write out exported module macros for PCH as well. + auto Leafs = PP.getLeafModuleMacros(Name); + SmallVector Worklist(Leafs.begin(), Leafs.end()); + llvm::DenseMap Visits; + while (!Worklist.empty()) { + auto *Macro = Worklist.pop_back_val(); + + // Emit a record indicating this submodule exports this macro. + ModuleMacroRecord.push_back( + getSubmoduleID(Macro->getOwningModule())); + ModuleMacroRecord.push_back(getMacroRef(Macro->getMacroInfo(), Name)); + for (auto *M : Macro->overrides()) + ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule())); + + Stream.EmitRecord(PP_MODULE_MACRO, ModuleMacroRecord); + ModuleMacroRecord.clear(); + + // Enqueue overridden macros once we've visited all their ancestors. + for (auto *M : Macro->overrides()) + if (++Visits[M] == M->getNumOverridingMacros()) + Worklist.push_back(M); + + EmittedModuleMacros = true; } if (Record.empty() && !EmittedModuleMacros) diff --git a/test/Modules/Inputs/MacroFabs1.h b/test/Modules/Inputs/MacroFabs1.h new file mode 100644 index 0000000000..a78c5539f4 --- /dev/null +++ b/test/Modules/Inputs/MacroFabs1.h @@ -0,0 +1,6 @@ + +#undef fabs +#define fabs(x) (x) + +#undef my_fabs +#define my_fabs(x) (x) diff --git a/test/Modules/Inputs/module.map b/test/Modules/Inputs/module.map index 4db1cca925..6846690c84 100644 --- a/test/Modules/Inputs/module.map +++ b/test/Modules/Inputs/module.map @@ -414,3 +414,7 @@ module MethodPoolString2 { } module Empty {} + +module MacroFabs1 { + header "MacroFabs1.h" +} diff --git a/test/Modules/Inputs/pch-import-module-with-macro.pch b/test/Modules/Inputs/pch-import-module-with-macro.pch new file mode 100644 index 0000000000..c06d7728b6 --- /dev/null +++ b/test/Modules/Inputs/pch-import-module-with-macro.pch @@ -0,0 +1,3 @@ + +@import MacroFabs1; + diff --git a/test/Modules/pch-module-macro.m b/test/Modules/pch-module-macro.m new file mode 100644 index 0000000000..cc9f687374 --- /dev/null +++ b/test/Modules/pch-module-macro.m @@ -0,0 +1,9 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -emit-pch -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -o %t.pch -I %S/Inputs -x objective-c-header %S/Inputs/pch-import-module-with-macro.pch +// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -fsyntax-only -I %S/Inputs -include-pch %t.pch %s -verify +// expected-no-diagnostics + +int test(int x) { + return my_fabs(x) + fabs(x); +} + -- 2.40.0