r271310 - PCH + module: make sure we write out macros associated with builtin identifiers.
Manman Ren via cfe-commits
cfe-commits at lists.llvm.org
Tue May 31 11:19:32 PDT 2016
Author: mren
Date: Tue May 31 13:19:32 2016
New Revision: 271310
URL: http://llvm.org/viewvc/llvm-project?rev=271310&view=rev
Log:
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
Added:
cfe/trunk/test/Modules/Inputs/MacroFabs1.h
cfe/trunk/test/Modules/Inputs/pch-import-module-with-macro.pch
cfe/trunk/test/Modules/pch-module-macro.m
Modified:
cfe/trunk/lib/Serialization/ASTWriter.cpp
cfe/trunk/test/Modules/Inputs/module.map
Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=271310&r1=271309&r2=271310&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Tue May 31 13:19:32 2016
@@ -2187,30 +2187,29 @@ void ASTWriter::WritePreprocessor(const
// Write out any exported module macros.
bool EmittedModuleMacros = false;
- if (IsModule) {
- auto Leafs = PP.getLeafModuleMacros(Name);
- SmallVector<ModuleMacro*, 8> Worklist(Leafs.begin(), Leafs.end());
- llvm::DenseMap<ModuleMacro*, unsigned> 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);
+ // We write out exported module macros for PCH as well.
+ auto Leafs = PP.getLeafModuleMacros(Name);
+ SmallVector<ModuleMacro*, 8> Worklist(Leafs.begin(), Leafs.end());
+ llvm::DenseMap<ModuleMacro*, unsigned> 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;
- }
+ EmittedModuleMacros = true;
}
if (Record.empty() && !EmittedModuleMacros)
Added: cfe/trunk/test/Modules/Inputs/MacroFabs1.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/MacroFabs1.h?rev=271310&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/MacroFabs1.h (added)
+++ cfe/trunk/test/Modules/Inputs/MacroFabs1.h Tue May 31 13:19:32 2016
@@ -0,0 +1,6 @@
+
+#undef fabs
+#define fabs(x) (x)
+
+#undef my_fabs
+#define my_fabs(x) (x)
Modified: cfe/trunk/test/Modules/Inputs/module.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=271310&r1=271309&r2=271310&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/module.map (original)
+++ cfe/trunk/test/Modules/Inputs/module.map Tue May 31 13:19:32 2016
@@ -414,3 +414,7 @@ module MethodPoolString2 {
}
module Empty {}
+
+module MacroFabs1 {
+ header "MacroFabs1.h"
+}
Added: cfe/trunk/test/Modules/Inputs/pch-import-module-with-macro.pch
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/pch-import-module-with-macro.pch?rev=271310&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/pch-import-module-with-macro.pch (added)
+++ cfe/trunk/test/Modules/Inputs/pch-import-module-with-macro.pch Tue May 31 13:19:32 2016
@@ -0,0 +1,3 @@
+
+ at import MacroFabs1;
+
Added: cfe/trunk/test/Modules/pch-module-macro.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pch-module-macro.m?rev=271310&view=auto
==============================================================================
--- cfe/trunk/test/Modules/pch-module-macro.m (added)
+++ cfe/trunk/test/Modules/pch-module-macro.m Tue May 31 13:19:32 2016
@@ -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);
+}
+
More information about the cfe-commits
mailing list