diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index e6e8f45..9653526 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -649,17 +649,18 @@
   Diagnostic &Diags;
   ASTContext* Ctx;
   Preprocessor* PP;
+  PreprocessorFactory* PPF;
   const std::string& HTMLDir;
   bool Visualize;
   bool TrimGraph;
   llvm::OwningPtr<PathDiagnosticClient> PD;
   bool AnalyzeAll;
 public:
-  CheckerConsumer(Diagnostic &diags, Preprocessor* pp,
+  CheckerConsumer(Diagnostic &diags, Preprocessor* pp, PreprocessorFactory* ppf,
                   const std::string& fname,
                   const std::string& htmldir,
                   bool visualize, bool trim, bool analyzeAll)
-    : CFGVisitor(fname), Diags(diags), PP(pp), HTMLDir(htmldir),
+    : CFGVisitor(fname), Diags(diags), PP(pp), PPF(ppf), HTMLDir(htmldir),
       Visualize(visualize), TrimGraph(trim), AnalyzeAll(analyzeAll) {}
   
   virtual void Initialize(ASTContext &Context) { Ctx = &Context; }    
@@ -687,7 +688,7 @@
   // Lazily create the diagnostic client.
   
   if (!HTMLDir.empty() && PD.get() == NULL)
-    PD.reset(CreateHTMLDiagnosticClient(HTMLDir, PP));
+    PD.reset(CreateHTMLDiagnosticClient(HTMLDir, PP, PPF));
   
 
   if (!Visualize) {
@@ -734,9 +735,11 @@
 class GRSimpleValsVisitor : public CheckerConsumer {
 public:
   GRSimpleValsVisitor(Diagnostic &diags, Preprocessor* pp,
+                      PreprocessorFactory* ppf,
                       const std::string& fname, const std::string& htmldir,
                       bool visualize, bool trim, bool analyzeAll)
-  : CheckerConsumer(diags, pp, fname, htmldir, visualize, trim, analyzeAll) {}
+  : CheckerConsumer(diags, pp, ppf, fname, htmldir, visualize,
+                    trim, analyzeAll) {}
 
   virtual const char* getCheckerName() { return "GRSimpleVals"; }
   
@@ -748,12 +751,13 @@
 
 ASTConsumer* clang::CreateGRSimpleVals(Diagnostic &Diags,
                                        Preprocessor* PP,
+                                       PreprocessorFactory* PPF,
                                        const std::string& FunctionName,
                                        const std::string& HTMLDir,
                                        bool Visualize, bool TrimGraph,
                                        bool AnalyzeAll) {
   
-  return new GRSimpleValsVisitor(Diags, PP, FunctionName, HTMLDir,
+  return new GRSimpleValsVisitor(Diags, PP, PPF, FunctionName, HTMLDir,
                                  Visualize, TrimGraph, AnalyzeAll);
 }
 
@@ -765,10 +769,12 @@
 class CFRefCountCheckerVisitor : public CheckerConsumer {
 public:
   CFRefCountCheckerVisitor(Diagnostic &diags, Preprocessor* pp,
+                           PreprocessorFactory* ppf,
                            const std::string& fname,
                            const std::string& htmldir,
                            bool visualize, bool trim, bool analyzeAll)
-  : CheckerConsumer(diags, pp, fname, htmldir, visualize, trim, analyzeAll) {}
+  : CheckerConsumer(diags, pp, ppf, fname, htmldir, visualize,
+                    trim, analyzeAll) {}
   
   virtual const char* getCheckerName() { return "CFRefCountChecker"; }
   
@@ -780,12 +786,13 @@
 
 ASTConsumer* clang::CreateCFRefChecker(Diagnostic &Diags,
                                        Preprocessor* PP,
+                                       PreprocessorFactory* PPF,
                                        const std::string& FunctionName,
                                        const std::string& HTMLDir,
                                        bool Visualize, bool TrimGraph,
                                        bool AnalyzeAll) {
   
-  return new CFRefCountCheckerVisitor(Diags, PP, FunctionName, HTMLDir,
+  return new CFRefCountCheckerVisitor(Diags, PP, PPF, FunctionName, HTMLDir,
                                       Visualize, TrimGraph, AnalyzeAll);
 }
 
diff --git a/Driver/ASTConsumers.h b/Driver/ASTConsumers.h
index 391ff02..7ef42a0 100644
--- a/Driver/ASTConsumers.h
+++ b/Driver/ASTConsumers.h
@@ -28,6 +28,8 @@
 class FileManager;
 struct LangOptions;
 class Preprocessor;
+class PreprocessorFactory;
+
 
 ASTConsumer *CreateASTPrinter(std::ostream* OS = NULL);
 
@@ -44,13 +46,13 @@
 ASTConsumer *CreateUnitValsChecker(Diagnostic &Diags);
   
 ASTConsumer *CreateGRSimpleVals(Diagnostic &Diags,
-                                Preprocessor* PP,
+                                Preprocessor* PP, PreprocessorFactory* PPF,
                                 const std::string& Function,
                                 const std::string& HTMLDir, bool Visualize,
                                 bool TrimGraph, bool AnalyzeAll);
   
 ASTConsumer *CreateCFRefChecker(Diagnostic &Diags,
-                                Preprocessor* PP,
+                                Preprocessor* PP, PreprocessorFactory* PPF,
                                 const std::string& Function,
                                 const std::string& HTMLDir, bool Visualize,
                                 bool TrimGraph, bool AnalyzeAll);
@@ -61,7 +63,7 @@
                                     const LangOptions &LOpts);
 
 ASTConsumer* CreateHTMLPrinter(const std::string &OutFile, Diagnostic &D,
-                               Preprocessor *PP);
+                               Preprocessor *PP, PreprocessorFactory* PPF);
 
 ASTConsumer *CreateSerializationTest(Diagnostic &Diags,
                                      FileManager& FMgr, 
diff --git a/Driver/HTMLDiagnostics.cpp b/Driver/HTMLDiagnostics.cpp
index 78381f9..4d95c17 100644
--- a/Driver/HTMLDiagnostics.cpp
+++ b/Driver/HTMLDiagnostics.cpp
@@ -38,8 +38,10 @@
   llvm::sys::Path Directory, FilePrefix;
   bool createdDir, noDir;
   Preprocessor* PP;
+  PreprocessorFactory* PPF;
 public:
-  HTMLDiagnostics(const std::string& prefix, Preprocessor* pp = NULL);
+  HTMLDiagnostics(const std::string& prefix, Preprocessor* pp,
+                  PreprocessorFactory* ppf);
 
   virtual ~HTMLDiagnostics() {}
   
@@ -53,18 +55,20 @@
   
 } // end anonymous namespace
 
-HTMLDiagnostics::HTMLDiagnostics(const std::string& prefix, Preprocessor* pp)
+HTMLDiagnostics::HTMLDiagnostics(const std::string& prefix, Preprocessor* pp,
+                                 PreprocessorFactory* ppf)
   : Directory(prefix), FilePrefix(prefix), createdDir(false), noDir(false),
-    PP(pp) {
+    PP(pp), PPF(ppf) {
   
   // All html files begin with "report" 
   FilePrefix.appendComponent("report");
 }
 
 PathDiagnosticClient*
-clang::CreateHTMLDiagnosticClient(const std::string& prefix, Preprocessor* PP) {
+clang::CreateHTMLDiagnosticClient(const std::string& prefix, Preprocessor* PP,
+                                  PreprocessorFactory* PPF) {
   
-  return new HTMLDiagnostics(prefix, PP);
+  return new HTMLDiagnostics(prefix, PP, PPF);
 }
 
 //===----------------------------------------------------------------------===//
@@ -122,10 +126,8 @@
   // We might not have a preprocessor if we come from a deserialized AST file,
   // for example.
   
-  if (PP) {
-    html::SyntaxHighlight(R, FileID, *PP);
-    // html::HighlightMacros(R, FileID, *PP);
-  }
+  if (PP) html::SyntaxHighlight(R, FileID, *PP);
+  if (PPF) html::HighlightMacros(R, FileID, *PPF);
   
   // Get the full directory name of the analyzed file.
 
diff --git a/Driver/HTMLDiagnostics.h b/Driver/HTMLDiagnostics.h
index 146c2cc..be72c49 100644
--- a/Driver/HTMLDiagnostics.h
+++ b/Driver/HTMLDiagnostics.h
@@ -17,11 +17,15 @@
 #include <string>
 
 namespace clang {
-  class PathDiagnosticClient;
-  class Preprocessor;
+
+class PathDiagnosticClient;
+class Preprocessor;
+class PreprocessorFactory;
+
   
-  PathDiagnosticClient* CreateHTMLDiagnosticClient(const std::string& prefix,
-                                                   Preprocessor* PP);
+PathDiagnosticClient* CreateHTMLDiagnosticClient(const std::string& prefix,
+                                                 Preprocessor* PP,
+                                                 PreprocessorFactory* PPF);
 }
 
 #endif
diff --git a/Driver/HTMLPrint.cpp b/Driver/HTMLPrint.cpp
index ff04b0e..ba9cd9e 100644
--- a/Driver/HTMLPrint.cpp
+++ b/Driver/HTMLPrint.cpp
@@ -31,9 +31,11 @@
     std::string OutFilename;
     Diagnostic &Diags;
     Preprocessor *PP;
+    PreprocessorFactory *PPF;
   public:
-    HTMLPrinter(const std::string &OutFile, Diagnostic &D, Preprocessor *pp)
-      : OutFilename(OutFile), Diags(D), PP(pp) {}
+    HTMLPrinter(const std::string &OutFile, Diagnostic &D, Preprocessor *pp,
+                PreprocessorFactory* ppf)
+      : OutFilename(OutFile), Diags(D), PP(pp), PPF(ppf) {}
     virtual ~HTMLPrinter();
     
     void Initialize(ASTContext &context);
@@ -41,8 +43,10 @@
 }
 
 ASTConsumer* clang::CreateHTMLPrinter(const std::string &OutFile, 
-                                      Diagnostic &D, Preprocessor *PP) {
-  return new HTMLPrinter(OutFile, D, PP);
+                                      Diagnostic &D, Preprocessor *PP,
+                                      PreprocessorFactory* PPF) {
+  
+  return new HTMLPrinter(OutFile, D, PP, PPF);
 }
 
 void HTMLPrinter::Initialize(ASTContext &context) {
@@ -62,13 +66,10 @@
   // We might not have a preprocessor if we come from a deserialized AST file,
   // for example.
   
-  if (PP) {
-    html::SyntaxHighlight(R, FileID, *PP);
-    html::HighlightMacros(R, FileID, *PP);
-  }
+  if (PP) html::SyntaxHighlight(R, FileID, *PP);
+  if (PPF) html::HighlightMacros(R, FileID, *PPF);  
   html::EscapeText(R, FileID, false, true);
   
-  
   // Open the output.
   FILE *OutputFILE;
   if (OutFilename.empty() || OutFilename == "-")
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index cbd2725..1a6db48 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -48,6 +48,7 @@
 #include "llvm/System/Path.h"
 #include <memory>
 #include <fstream>
+#include <algorithm>
 using namespace clang;
 
 //===----------------------------------------------------------------------===//
@@ -586,26 +587,31 @@
 /// input file. If a failure happens, it returns 0.
 ///
 static unsigned InitializePreprocessor(Preprocessor &PP,
+                                       bool InitializeSourceMgr, 
                                        const std::string &InFile,
                                        std::vector<char> &PredefineBuffer) {
   
+
   FileManager &FileMgr = PP.getFileManager();
   
   // Figure out where to get and map in the main file.
   SourceManager &SourceMgr = PP.getSourceManager();
-  if (InFile != "-") {
-    const FileEntry *File = FileMgr.getFile(InFile);
-    if (File) SourceMgr.createMainFileID(File, SourceLocation());
-    if (SourceMgr.getMainFileID() == 0) {
-      fprintf(stderr, "Error reading '%s'!\n",InFile.c_str());
-      return 0;
-    }
-  } else {
-    llvm::MemoryBuffer *SB = llvm::MemoryBuffer::getSTDIN();
-    if (SB) SourceMgr.createMainFileIDForMemBuffer(SB);
-    if (SourceMgr.getMainFileID() == 0) {
-      fprintf(stderr, "Error reading standard input!  Empty?\n");
-      return 0;
+
+  if (InitializeSourceMgr) {
+    if (InFile != "-") {
+      const FileEntry *File = FileMgr.getFile(InFile);
+      if (File) SourceMgr.createMainFileID(File, SourceLocation());
+      if (SourceMgr.getMainFileID() == 0) {
+        fprintf(stderr, "Error reading '%s'!\n",InFile.c_str());
+        return 0;
+      }
+    } else {
+      llvm::MemoryBuffer *SB = llvm::MemoryBuffer::getSTDIN();
+      if (SB) SourceMgr.createMainFileIDForMemBuffer(SB);
+      if (SourceMgr.getMainFileID() == 0) {
+        fprintf(stderr, "Error reading standard input!  Empty?\n");
+        return 0;
+      }
     }
   }
 
@@ -625,9 +631,13 @@
   for (unsigned i = 0, e = ImplicitIncludes.size(); i != e; ++i)
     AddImplicitInclude(PredefineBuffer, ImplicitIncludes[i]);
   
-  // Null terminate PredefinedBuffer and add it.
+  // Null terminate PredefinedBuffer and add it.  We actually need to make a
+  // copy because PP will own the string.
   PredefineBuffer.push_back(0);
-  PP.setPredefines(&PredefineBuffer[0]);
+  
+  char* predefines = new char[PredefineBuffer.size()];
+  std::copy(PredefineBuffer.begin(), PredefineBuffer.end(), predefines);
+  PP.setPredefines(predefines);
   
   // Once we've read this, we're done.
   return SourceMgr.getMainFileID();
@@ -1015,23 +1025,41 @@
 
 namespace {
 class VISIBILITY_HIDDEN DriverPreprocessorFactory : public PreprocessorFactory {
+  const std::string &InFile;
   Diagnostic        &Diags;
   const LangOptions &LangInfo;
   TargetInfo        &Target;
   SourceManager     &SourceMgr;
   HeaderSearch      &HeaderInfo;
-
+  std::vector<char> PredefineBuffer;
+  bool              InitializeSourceMgr;
+  
 public:
-  DriverPreprocessorFactory(Diagnostic &diags, const LangOptions &opts,
+  DriverPreprocessorFactory(const std::string &infile,
+                            Diagnostic &diags, const LangOptions &opts,
                             TargetInfo &target, SourceManager &SM,
                             HeaderSearch &Headers)  
-  : Diags(diags), LangInfo(opts), Target(target),
-    SourceMgr(SM), HeaderInfo(Headers) {}
+  : InFile(infile), Diags(diags), LangInfo(opts), Target(target),
+    SourceMgr(SM), HeaderInfo(Headers), InitializeSourceMgr(true) {}
+  
   
   virtual ~DriverPreprocessorFactory() {}
   
   virtual Preprocessor* CreatePreprocessor() {
-    return new Preprocessor(Diags, LangInfo, Target, SourceMgr, HeaderInfo);
+    PredefineBuffer.clear();
+
+    Preprocessor* PP = new Preprocessor(Diags, LangInfo, Target,
+                                        SourceMgr, HeaderInfo);
+    
+    if (!InitializePreprocessor(*PP, InitializeSourceMgr, InFile,
+                                PredefineBuffer)) {
+      delete PP;
+      return NULL;
+    }
+    
+    InitializeSourceMgr = false;
+    
+    return PP;
   }
 };
 }
@@ -1060,6 +1088,7 @@
                                       Diagnostic& Diag, FileManager& FileMgr, 
                                       const LangOptions& LangOpts,
                                       Preprocessor *PP,
+                                      PreprocessorFactory *PPF,
                                       llvm::Module *&DestModule) {
   switch (ProgAction) {
     default:
@@ -1075,7 +1104,7 @@
       return CreateASTViewer();   
       
     case EmitHTML:
-      return CreateHTMLPrinter(OutputFile, Diag, PP);
+      return CreateHTMLPrinter(OutputFile, Diag, PP, PPF);
       
     case ParseCFGDump:
     case ParseCFGView:
@@ -1092,12 +1121,12 @@
       return CreateUnitValsChecker(Diag);
       
     case AnalysisGRSimpleVals:
-      return CreateGRSimpleVals(Diag, PP, AnalyzeSpecificFunction, OutputFile,
-                                VisualizeEG, TrimGraph, AnalyzeAll);
+      return CreateGRSimpleVals(Diag, PP, PPF, AnalyzeSpecificFunction,
+                                OutputFile, VisualizeEG, TrimGraph, AnalyzeAll);
       
     case CheckerCFRef:
-      return CreateCFRefChecker(Diag, PP, AnalyzeSpecificFunction, OutputFile,
-                                VisualizeEG, TrimGraph, AnalyzeAll);
+      return CreateCFRefChecker(Diag, PP, PPF, AnalyzeSpecificFunction,
+                                OutputFile, VisualizeEG, TrimGraph, AnalyzeAll);
       
     case TestSerialization:
       return CreateSerializationTest(Diag, FileMgr, LangOpts);
@@ -1118,7 +1147,8 @@
 
 /// ProcessInputFile - Process a single input file with the specified state.
 ///
-static void ProcessInputFile(Preprocessor &PP, const std::string &InFile) {
+static void ProcessInputFile(Preprocessor &PP, PreprocessorFactory &PPF,
+                             const std::string &InFile) {
 
   ASTConsumer* Consumer = NULL;
   bool ClearSourceMgr = false;
@@ -1128,7 +1158,7 @@
   default:
     Consumer = CreateASTConsumer(InFile, PP.getDiagnostics(),
                                  PP.getFileManager(), PP.getLangOptions(), &PP,
-                                 CodeGenModule);
+                                 &PPF, CodeGenModule);
     
     if (!Consumer) {      
       fprintf(stderr, "Unexpected program action!\n");
@@ -1267,7 +1297,7 @@
   // translation unit, rather than InFile.
   llvm::Module *DestModule;
   llvm::OwningPtr<ASTConsumer>
-    Consumer(CreateASTConsumer(InFile, Diag, FileMgr, TU->getLangOpts(), 0,
+    Consumer(CreateASTConsumer(InFile, Diag, FileMgr, TU->getLangOpts(), 0, 0,
                                DestModule));
   
   if (!Consumer) {      
@@ -1320,7 +1350,7 @@
     // FIXME: The HTMLDiagnosticClient uses the Preprocessor for
     //  (optional) syntax highlighting, but we don't have a preprocessor yet.
     //  Fix this dependency later.
-    DiagClient.reset(CreateHTMLDiagnosticClient(HTMLDiag, NULL));
+    DiagClient.reset(CreateHTMLDiagnosticClient(HTMLDiag, 0, 0));
   }
   else { // Use Text diagnostics.
     if (!VerifyDiagnostics) {
@@ -1387,16 +1417,15 @@
       InitializeIncludePaths(argv[0], HeaderInfo, FileMgr, LangInfo);
       
       // Set up the preprocessor with these options.
-      DriverPreprocessorFactory PPFactory(Diags, LangInfo, *Target,
+      DriverPreprocessorFactory PPFactory(InFile, Diags, LangInfo, *Target,
                                           SourceMgr, HeaderInfo);
       
       llvm::OwningPtr<Preprocessor> PP(PPFactory.CreatePreprocessor());
             
-      std::vector<char> PredefineBuffer;
-      if (!InitializePreprocessor(*PP, InFile, PredefineBuffer))
+      if (!PP)
         continue;
       
-      ProcessInputFile(*PP, InFile);
+      ProcessInputFile(*PP, PPFactory, InFile);
       HeaderInfo.ClearFileInfo();
       
       if (Stats)
diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h
index 5fc4642..6a0255e 100644
--- a/include/clang/Lex/Preprocessor.h
+++ b/include/clang/Lex/Preprocessor.h
@@ -196,6 +196,8 @@
   ///
   void setMacroInfo(IdentifierInfo *II, MacroInfo *MI);
   
+  /// setPredefines - Set the predefines for this Preprocessor.
+  ///  The Preprocessor assumes ownership of this pointer.
   void setPredefines(const char *P) {
     Predefines = P;
   }
diff --git a/include/clang/Rewrite/HTMLRewrite.h b/include/clang/Rewrite/HTMLRewrite.h
index ded431f..8c70840 100644
--- a/include/clang/Rewrite/HTMLRewrite.h
+++ b/include/clang/Rewrite/HTMLRewrite.h
@@ -22,6 +22,7 @@
   
 class Rewriter;
 class Preprocessor;
+class PreprocessorFactory;
   
 namespace html {
   
@@ -74,7 +75,7 @@
   /// file, to reexpand macros and insert (into the HTML) information about the
   /// macro expansions.  This won't be perfectly perfect, but it will be
   /// reasonably close.
-  void HighlightMacros(Rewriter &R, unsigned FileID, Preprocessor &PP);
+  void HighlightMacros(Rewriter &R, unsigned FileID, PreprocessorFactory &PPF);
   
 
   
diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp
index 6d08a36..370244b 100644
--- a/lib/Lex/Preprocessor.cpp
+++ b/lib/Lex/Preprocessor.cpp
@@ -112,6 +112,8 @@
   delete ScratchBuf;
 
   delete Callbacks;
+  
+  delete [] Predefines;
 }
 
 /// Diag - Forwarding function for diagnostics.  This emits a diagnostic at
diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp
index fd67182..ced8e5e 100644
--- a/lib/Rewrite/HTMLRewrite.cpp
+++ b/lib/Rewrite/HTMLRewrite.cpp
@@ -12,11 +12,13 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "clang/Lex/Preprocessor.h"
 #include "clang/Rewrite/Rewriter.h"
 #include "clang/Rewrite/HTMLRewrite.h"
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Basic/SourceManager.h"
 #include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/OwningPtr.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include <sstream>
 using namespace clang;
@@ -382,23 +384,28 @@
 /// file, to reexpand macros and insert (into the HTML) information about the
 /// macro expansions.  This won't be perfectly perfect, but it will be
 /// reasonably close.
-void html::HighlightMacros(Rewriter &R, unsigned FileID, Preprocessor &PP) {
+void html::HighlightMacros(Rewriter &R, unsigned FileID,
+                           PreprocessorFactory &PPF) {
+  
+  llvm::OwningPtr<Preprocessor> PP(PPF.CreatePreprocessor());
+  
+  
   RewriteBuffer &RB = R.getEditBuffer(FileID);
   
   // Inform the preprocessor that we don't want comments.
-  PP.SetCommentRetentionState(false, false);
+  PP->SetCommentRetentionState(false, false);
   
   // Start parsing the specified input file.
-  PP.EnterMainSourceFile();
+  PP->EnterMainSourceFile();
   
   // Lex all the tokens.
-  const SourceManager &SourceMgr = PP.getSourceManager();
+  const SourceManager &SourceMgr = PP->getSourceManager();
   Token Tok;
-  PP.Lex(Tok);
+  PP->Lex(Tok);
   while (Tok.isNot(tok::eof)) {
     // Ignore non-macro tokens.
     if (!Tok.getLocation().isMacroID()) {
-      PP.Lex(Tok);
+      PP->Lex(Tok);
       continue;
     }
     
@@ -408,7 +415,7 @@
       SourceMgr.getDecomposedFileLoc(LLoc);
     
     if (LLocInfo.first != FileID) {
-      PP.Lex(Tok);
+      PP->Lex(Tok);
       continue;
     }
     
@@ -426,11 +433,11 @@
                        strlen("<span class='macro'>"));
     RB.InsertTextBefore(TokOffs+TokLen, "</span>", strlen("</span>"));
     
-    std::string Expansion = PP.getSpelling(Tok);
+    std::string Expansion = PP->getSpelling(Tok);
     unsigned LineLen = Expansion.size();
     
     // Okay, eat this token, getting the next one.
-    PP.Lex(Tok);
+    PP->Lex(Tok);
     
     // Skip all the rest of the tokens that are part of this macro
     // instantiation.  It would be really nice to pop up a window with all the
@@ -444,9 +451,9 @@
       }
       
       LineLen -= Expansion.size();
-      Expansion += ' ' + PP.getSpelling(Tok);
+      Expansion += ' ' + PP->getSpelling(Tok);
       LineLen += Expansion.size();
-      PP.Lex(Tok);
+      PP->Lex(Tok);
     }
 
     // Insert the information about the expansion inside the macro span.
