emit tokens, constify the Preprocessor passed down into PCH writer.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68798 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/Frontend/PCHWriter.h b/include/clang/Frontend/PCHWriter.h
index a560857..41aa91d 100644
--- a/include/clang/Frontend/PCHWriter.h
+++ b/include/clang/Frontend/PCHWriter.h
@@ -77,7 +77,7 @@
pch::TypeID NextTypeID;
void WriteSourceManagerBlock(SourceManager &SourceMgr);
- void WritePreprocessor(Preprocessor &PP);
+ void WritePreprocessor(const Preprocessor &PP);
void WriteType(const Type *T);
void WriteTypesBlock(ASTContext &Context);
uint64_t WriteDeclContextLexicalBlock(ASTContext &Context, DeclContext *DC);
@@ -92,7 +92,7 @@
PCHWriter(llvm::BitstreamWriter &S);
/// \brief Write a precompiled header for the given AST context.
- void WritePCH(ASTContext &Context, Preprocessor &PP);
+ void WritePCH(ASTContext &Context, const Preprocessor &PP);
/// \brief Emit a source location.
void AddSourceLocation(SourceLocation Loc, RecordData &Record);
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp
index 05447dc..255ce8b 100644
--- a/lib/Frontend/PCHWriter.cpp
+++ b/lib/Frontend/PCHWriter.cpp
@@ -479,7 +479,7 @@
/// \brief Writes the block containing the serialized form of the
/// preprocessor.
///
-void PCHWriter::WritePreprocessor(Preprocessor &PP) {
+void PCHWriter::WritePreprocessor(const Preprocessor &PP) {
// Enter the preprocessor block.
S.EnterSubblock(pch::PREPROCESSOR_BLOCK_ID, 3);
@@ -527,7 +527,29 @@
S.EmitRecord(Code, Record);
Record.clear();
- // FIXME: Emit the tokens array.
+ // Emit the tokens array.
+ for (unsigned TokNo = 0, e = MI->getNumTokens(); TokNo != e; ++TokNo) {
+ // Note that we know that the preprocessor does not have any annotation
+ // tokens in it because they are created by the parser, and thus can't be
+ // in a macro definition.
+ const Token &Tok = MI->getReplacementToken(TokNo);
+
+ Record.push_back(Tok.getLocation().getRawEncoding());
+ Record.push_back(Tok.getLength());
+
+ // FIXME: Output the identifier Info ID #!
+ // FIXME: When reading literal tokens, reconstruct the literal pointer if
+ // it is needed.
+ Record.push_back((intptr_t)Tok.getIdentifierInfo());
+
+ // FIXME: Should translate token kind to a stable encoding.
+ Record.push_back(Tok.getKind());
+ // FIXME: Should translate token flags to a stable encoding.
+ Record.push_back(Tok.getFlags());
+
+ S.EmitRecord(pch::PP_TOKEN, Record);
+ Record.clear();
+ }
}
@@ -719,7 +741,7 @@
PCHWriter::PCHWriter(llvm::BitstreamWriter &S)
: S(S), NextTypeID(pch::NUM_PREDEF_TYPE_IDS) { }
-void PCHWriter::WritePCH(ASTContext &Context, Preprocessor &PP) {
+void PCHWriter::WritePCH(ASTContext &Context, const Preprocessor &PP) {
// Emit the file header.
S.Emit((unsigned)'C', 8);
S.Emit((unsigned)'P', 8);
diff --git a/tools/clang-cc/ASTConsumers.h b/tools/clang-cc/ASTConsumers.h
index d433d05..7c37266 100644
--- a/tools/clang-cc/ASTConsumers.h
+++ b/tools/clang-cc/ASTConsumers.h
@@ -68,7 +68,7 @@
const std::string &EmitDir,
Diagnostic &Diags);
-ASTConsumer *CreatePCHGenerator(Preprocessor &PP,
+ASTConsumer *CreatePCHGenerator(const Preprocessor &PP,
const std::string &OutFile);
ASTConsumer *CreateBlockRewriter(const std::string &InFile,
diff --git a/tools/clang-cc/GeneratePCH.cpp b/tools/clang-cc/GeneratePCH.cpp
index a850c58..9b86514 100644
--- a/tools/clang-cc/GeneratePCH.cpp
+++ b/tools/clang-cc/GeneratePCH.cpp
@@ -29,11 +29,11 @@
namespace {
class VISIBILITY_HIDDEN PCHGenerator : public ASTConsumer {
- Preprocessor &PP;
+ const Preprocessor &PP;
std::string OutFile;
public:
- explicit PCHGenerator(Preprocessor &PP, const std::string &OutFile)
+ explicit PCHGenerator(const Preprocessor &PP, const std::string &OutFile)
: PP(PP), OutFile(OutFile) { }
virtual void HandleTranslationUnit(ASTContext &Ctx);
@@ -68,7 +68,7 @@
Out.flush();
}
-ASTConsumer *clang::CreatePCHGenerator(Preprocessor &PP,
+ASTConsumer *clang::CreatePCHGenerator(const Preprocessor &PP,
const std::string &OutFile) {
return new PCHGenerator(PP, OutFile);
}