diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-10-01 01:03:07 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-10-01 01:03:07 +0000 |
commit | eb114da5068e363e2c54fcffc550b137c56f1e7d (patch) | |
tree | dc6b94747a22ef3e18d74eb7e7f1f5b1e0dff596 /clang | |
parent | 220d971aced233ef55e1bf881426296f089710cc (diff) | |
download | bcm5719-llvm-eb114da5068e363e2c54fcffc550b137c56f1e7d.tar.gz bcm5719-llvm-eb114da5068e363e2c54fcffc550b137c56f1e7d.zip |
When an identifier that has a macro definition in the original PCH
file is somehow changed in a chained PCH file, make sure that we write
out the macro definition. Fixes part of <rdar://problem/8499034>.
llvm-svn: 115259
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 8 | ||||
-rw-r--r-- | clang/test/PCH/Inputs/chain-macro-override1.h | 1 | ||||
-rw-r--r-- | clang/test/PCH/Inputs/chain-macro-override2.h | 1 | ||||
-rw-r--r-- | clang/test/PCH/chain-macro-override.c | 3 |
4 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 3f537d21ab5..f5f96ecd24e 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1276,7 +1276,13 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP) { // Don't emit builtin macros like __LINE__ to the AST file unless they have // been redefined by the header (in which case they are not isBuiltinMacro). // Also skip macros from a AST file if we're chaining. - if (MI->isBuiltinMacro() || (Chain && MI->isFromAST())) + + // FIXME: There is a (probably minor) optimization we could do here, if + // the macro comes from the original PCH but the identifier comes from a + // chained PCH, by storing the offset into the original PCH rather than + // writing the macro definition a second time. + if (MI->isBuiltinMacro() || + (Chain && I->first->isFromAST() && MI->isFromAST())) continue; AddIdentifierRef(I->first, Record); diff --git a/clang/test/PCH/Inputs/chain-macro-override1.h b/clang/test/PCH/Inputs/chain-macro-override1.h index 4f9321de93b..d956396f916 100644 --- a/clang/test/PCH/Inputs/chain-macro-override1.h +++ b/clang/test/PCH/Inputs/chain-macro-override1.h @@ -2,3 +2,4 @@ void f() __attribute__((unavailable)); void g(); #define g() f() #define h() f() +#define x x diff --git a/clang/test/PCH/Inputs/chain-macro-override2.h b/clang/test/PCH/Inputs/chain-macro-override2.h index f279e2ad48c..e4bff77294f 100644 --- a/clang/test/PCH/Inputs/chain-macro-override2.h +++ b/clang/test/PCH/Inputs/chain-macro-override2.h @@ -2,3 +2,4 @@ #undef g #undef h #define h() g() +int x; diff --git a/clang/test/PCH/chain-macro-override.c b/clang/test/PCH/chain-macro-override.c index 14478af35f1..449ed8c7a0c 100644 --- a/clang/test/PCH/chain-macro-override.c +++ b/clang/test/PCH/chain-macro-override.c @@ -6,8 +6,9 @@ // RUN: %clang_cc1 -emit-pch -o %t2 %S/Inputs/chain-macro-override2.h -include-pch %t1 -chained-pch // RUN: %clang_cc1 -include-pch %t2 -fsyntax-only -verify %s -void foo() { +int foo() { f(); g(); h(); + return x; } |