diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h
index 6795e2a..81f1843 100644
--- a/include/clang/Frontend/PCHReader.h
+++ b/include/clang/Frontend/PCHReader.h
@@ -83,7 +83,7 @@
   Preprocessor &PP;
 
   /// \brief The AST context into which we'll read the PCH file.
-  ASTContext &Context;
+  ASTContext *Context;
 
   /// \brief The AST consumer.
   ASTConsumer *Consumer;
@@ -298,7 +298,7 @@
 public:
   typedef llvm::SmallVector<uint64_t, 64> RecordData;
 
-  explicit PCHReader(Preprocessor &PP, ASTContext &Context);
+  explicit PCHReader(Preprocessor &PP, ASTContext *Context);
   ~PCHReader();
 
   PCHReadResult ReadPCH(const std::string &FileName);
@@ -453,7 +453,7 @@
 
   /// \brief Retrieve the AST context that this PCH reader
   /// supplements.
-  ASTContext &getContext() { return Context; }
+  ASTContext *getContext() { return Context; }
 
   // \brief Contains declarations that were loaded before we have
   // access to a Sema object.
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index d36d836..7483f78 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -38,7 +38,7 @@
 // PCH reader implementation
 //===----------------------------------------------------------------------===//
 
-PCHReader::PCHReader(Preprocessor &PP, ASTContext &Context) 
+PCHReader::PCHReader(Preprocessor &PP, ASTContext *Context) 
   : SemaObj(0), PP(PP), Context(Context), Consumer(0),
     IdentifierTableData(0), IdentifierLookupTable(0),
     IdentifierOffsets(0),
@@ -102,7 +102,7 @@
     
   internal_key_type ReadKey(const unsigned char* d, unsigned) {
     using namespace clang::io;
-    SelectorTable &SelTable = Reader.getContext().Selectors;
+    SelectorTable &SelTable = Reader.getContext()->Selectors;
     unsigned N = ReadUnalignedLE16(d);
     IdentifierInfo *FirstII 
       = Reader.DecodeIdentifierInfo(ReadUnalignedLE32(d));
@@ -557,7 +557,7 @@
     return Failure;
   }
 
-  SourceManager &SourceMgr = Context.getSourceManager();
+  SourceManager &SourceMgr = PP.getSourceManager();
   RecordData Record;
   unsigned NumHeaderInfos = 0;
   while (true) {
@@ -637,7 +637,7 @@
     return Failure;
   }
 
-  SourceManager &SourceMgr = Context.getSourceManager();
+  SourceManager &SourceMgr = PP.getSourceManager();
   RecordData Record;
   const char *BlobStart;
   unsigned BlobLen;
@@ -928,9 +928,9 @@
 
     case pch::TARGET_TRIPLE: {
       std::string TargetTriple(BlobStart, BlobLen);
-      if (TargetTriple != Context.Target.getTargetTriple()) {
+      if (TargetTriple != PP.getTargetInfo().getTargetTriple()) {
         Diag(diag::warn_pch_target_triple)
-          << TargetTriple << Context.Target.getTargetTriple();
+          << TargetTriple << PP.getTargetInfo().getTargetTriple();
         Diag(diag::note_ignoring_pch) << FileName;
         return IgnorePCH;
       }
@@ -1137,7 +1137,8 @@
   }  
 
   // Load the translation unit declaration
-  ReadDeclRecord(DeclOffsets[0], 0);
+  if (Context)
+    ReadDeclRecord(DeclOffsets[0], 0);
 
   // Initialization of builtins and library builtins occurs before the
   // PCH file is read, so there may be some identifiers that were
@@ -1173,21 +1174,23 @@
   }
 
   // Load the special types.
-  Context.setBuiltinVaListType(
-    GetType(SpecialTypes[pch::SPECIAL_TYPE_BUILTIN_VA_LIST]));
-  if (unsigned Id = SpecialTypes[pch::SPECIAL_TYPE_OBJC_ID])
-    Context.setObjCIdType(GetType(Id));
-  if (unsigned Sel = SpecialTypes[pch::SPECIAL_TYPE_OBJC_SELECTOR])
-    Context.setObjCSelType(GetType(Sel));
-  if (unsigned Proto = SpecialTypes[pch::SPECIAL_TYPE_OBJC_PROTOCOL])
-    Context.setObjCProtoType(GetType(Proto));
-  if (unsigned Class = SpecialTypes[pch::SPECIAL_TYPE_OBJC_CLASS])
-    Context.setObjCClassType(GetType(Class));
-  if (unsigned String = SpecialTypes[pch::SPECIAL_TYPE_CF_CONSTANT_STRING])
-    Context.setCFConstantStringType(GetType(String));
-  if (unsigned FastEnum 
-        = SpecialTypes[pch::SPECIAL_TYPE_OBJC_FAST_ENUMERATION_STATE])
-    Context.setObjCFastEnumerationStateType(GetType(FastEnum));
+  if (Context) {
+    Context->setBuiltinVaListType(
+      GetType(SpecialTypes[pch::SPECIAL_TYPE_BUILTIN_VA_LIST]));
+    if (unsigned Id = SpecialTypes[pch::SPECIAL_TYPE_OBJC_ID])
+      Context->setObjCIdType(GetType(Id));
+    if (unsigned Sel = SpecialTypes[pch::SPECIAL_TYPE_OBJC_SELECTOR])
+      Context->setObjCSelType(GetType(Sel));
+    if (unsigned Proto = SpecialTypes[pch::SPECIAL_TYPE_OBJC_PROTOCOL])
+      Context->setObjCProtoType(GetType(Proto));
+    if (unsigned Class = SpecialTypes[pch::SPECIAL_TYPE_OBJC_CLASS])
+      Context->setObjCClassType(GetType(Class));
+    if (unsigned String = SpecialTypes[pch::SPECIAL_TYPE_CF_CONSTANT_STRING])
+      Context->setCFConstantStringType(GetType(String));
+    if (unsigned FastEnum 
+          = SpecialTypes[pch::SPECIAL_TYPE_OBJC_FAST_ENUMERATION_STATE])
+      Context->setObjCFastEnumerationStateType(GetType(FastEnum));
+  }
 
   return Success;
 }
@@ -1208,7 +1211,7 @@
 /// \returns true if the PCH file is unacceptable, false otherwise.
 bool PCHReader::ParseLanguageOptions(
                              const llvm::SmallVectorImpl<uint64_t> &Record) {
-  const LangOptions &LangOpts = Context.getLangOptions();
+  const LangOptions &LangOpts = PP.getLangOptions();
 #define PARSE_LANGOPT_BENIGN(Option) ++Idx
 #define PARSE_LANGOPT_IMPORTANT(Option, DiagID)                 \
   if (Record[Idx] != LangOpts.Option) {                         \
@@ -1304,52 +1307,52 @@
     
     QualType T = Base;
     if (GCAttr != QualType::GCNone)
-      T = Context.getObjCGCQualType(T, GCAttr);
+      T = Context->getObjCGCQualType(T, GCAttr);
     if (AddressSpace)
-      T = Context.getAddrSpaceQualType(T, AddressSpace);
+      T = Context->getAddrSpaceQualType(T, AddressSpace);
     return T;
   }
 
   case pch::TYPE_FIXED_WIDTH_INT: {
     assert(Record.size() == 2 && "Incorrect encoding of fixed-width int type");
-    return Context.getFixedWidthIntType(Record[0], Record[1]);
+    return Context->getFixedWidthIntType(Record[0], Record[1]);
   }
 
   case pch::TYPE_COMPLEX: {
     assert(Record.size() == 1 && "Incorrect encoding of complex type");
     QualType ElemType = GetType(Record[0]);
-    return Context.getComplexType(ElemType);
+    return Context->getComplexType(ElemType);
   }
 
   case pch::TYPE_POINTER: {
     assert(Record.size() == 1 && "Incorrect encoding of pointer type");
     QualType PointeeType = GetType(Record[0]);
-    return Context.getPointerType(PointeeType);
+    return Context->getPointerType(PointeeType);
   }
 
   case pch::TYPE_BLOCK_POINTER: {
     assert(Record.size() == 1 && "Incorrect encoding of block pointer type");
     QualType PointeeType = GetType(Record[0]);
-    return Context.getBlockPointerType(PointeeType);
+    return Context->getBlockPointerType(PointeeType);
   }
 
   case pch::TYPE_LVALUE_REFERENCE: {
     assert(Record.size() == 1 && "Incorrect encoding of lvalue reference type");
     QualType PointeeType = GetType(Record[0]);
-    return Context.getLValueReferenceType(PointeeType);
+    return Context->getLValueReferenceType(PointeeType);
   }
 
   case pch::TYPE_RVALUE_REFERENCE: {
     assert(Record.size() == 1 && "Incorrect encoding of rvalue reference type");
     QualType PointeeType = GetType(Record[0]);
-    return Context.getRValueReferenceType(PointeeType);
+    return Context->getRValueReferenceType(PointeeType);
   }
 
   case pch::TYPE_MEMBER_POINTER: {
     assert(Record.size() == 1 && "Incorrect encoding of member pointer type");
     QualType PointeeType = GetType(Record[0]);
     QualType ClassType = GetType(Record[1]);
-    return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
+    return Context->getMemberPointerType(PointeeType, ClassType.getTypePtr());
   }
 
   case pch::TYPE_CONSTANT_ARRAY: {
@@ -1358,22 +1361,22 @@
     unsigned IndexTypeQuals = Record[2];
     unsigned Idx = 3;
     llvm::APInt Size = ReadAPInt(Record, Idx);
-    return Context.getConstantArrayType(ElementType, Size, ASM, IndexTypeQuals);
+    return Context->getConstantArrayType(ElementType, Size, ASM,IndexTypeQuals);
   }
 
   case pch::TYPE_INCOMPLETE_ARRAY: {
     QualType ElementType = GetType(Record[0]);
     ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
     unsigned IndexTypeQuals = Record[2];
-    return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
+    return Context->getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
   }
 
   case pch::TYPE_VARIABLE_ARRAY: {
     QualType ElementType = GetType(Record[0]);
     ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
     unsigned IndexTypeQuals = Record[2];
-    return Context.getVariableArrayType(ElementType, ReadTypeExpr(),
-                                        ASM, IndexTypeQuals);
+    return Context->getVariableArrayType(ElementType, ReadTypeExpr(),
+                                         ASM, IndexTypeQuals);
   }
 
   case pch::TYPE_VECTOR: {
@@ -1384,7 +1387,7 @@
 
     QualType ElementType = GetType(Record[0]);
     unsigned NumElements = Record[1];
-    return Context.getVectorType(ElementType, NumElements);
+    return Context->getVectorType(ElementType, NumElements);
   }
 
   case pch::TYPE_EXT_VECTOR: {
@@ -1395,7 +1398,7 @@
 
     QualType ElementType = GetType(Record[0]);
     unsigned NumElements = Record[1];
-    return Context.getExtVectorType(ElementType, NumElements);
+    return Context->getExtVectorType(ElementType, NumElements);
   }
 
   case pch::TYPE_FUNCTION_NO_PROTO: {
@@ -1404,7 +1407,7 @@
       return QualType();
     }
     QualType ResultType = GetType(Record[0]);
-    return Context.getFunctionNoProtoType(ResultType);
+    return Context->getFunctionNoProtoType(ResultType);
   }
 
   case pch::TYPE_FUNCTION_PROTO: {
@@ -1416,16 +1419,16 @@
       ParamTypes.push_back(GetType(Record[Idx++]));
     bool isVariadic = Record[Idx++];
     unsigned Quals = Record[Idx++];
-    return Context.getFunctionType(ResultType, &ParamTypes[0], NumParams,
-                                   isVariadic, Quals);
+    return Context->getFunctionType(ResultType, &ParamTypes[0], NumParams,
+                                    isVariadic, Quals);
   }
 
   case pch::TYPE_TYPEDEF:
     assert(Record.size() == 1 && "Incorrect encoding of typedef type");
-    return Context.getTypeDeclType(cast<TypedefDecl>(GetDecl(Record[0])));
+    return Context->getTypeDeclType(cast<TypedefDecl>(GetDecl(Record[0])));
 
   case pch::TYPE_TYPEOF_EXPR:
-    return Context.getTypeOfExprType(ReadTypeExpr());
+    return Context->getTypeOfExprType(ReadTypeExpr());
 
   case pch::TYPE_TYPEOF: {
     if (Record.size() != 1) {
@@ -1433,20 +1436,20 @@
       return QualType();
     }
     QualType UnderlyingType = GetType(Record[0]);
-    return Context.getTypeOfType(UnderlyingType);
+    return Context->getTypeOfType(UnderlyingType);
   }
     
   case pch::TYPE_RECORD:
     assert(Record.size() == 1 && "Incorrect encoding of record type");
-    return Context.getTypeDeclType(cast<RecordDecl>(GetDecl(Record[0])));
+    return Context->getTypeDeclType(cast<RecordDecl>(GetDecl(Record[0])));
 
   case pch::TYPE_ENUM:
     assert(Record.size() == 1 && "Incorrect encoding of enum type");
-    return Context.getTypeDeclType(cast<EnumDecl>(GetDecl(Record[0])));
+    return Context->getTypeDeclType(cast<EnumDecl>(GetDecl(Record[0])));
 
   case pch::TYPE_OBJC_INTERFACE:
     assert(Record.size() == 1 && "Incorrect encoding of objc interface type");
-    return Context.getObjCInterfaceType(
+    return Context->getObjCInterfaceType(
                                   cast<ObjCInterfaceDecl>(GetDecl(Record[0])));
 
   case pch::TYPE_OBJC_QUALIFIED_INTERFACE: {
@@ -1456,7 +1459,7 @@
     llvm::SmallVector<ObjCProtocolDecl*, 4> Protos;
     for (unsigned I = 0; I != NumProtos; ++I)
       Protos.push_back(cast<ObjCProtocolDecl>(GetDecl(Record[Idx++])));
-    return Context.getObjCQualifiedInterfaceType(ItfD, &Protos[0], NumProtos);
+    return Context->getObjCQualifiedInterfaceType(ItfD, &Protos[0], NumProtos);
   }
 
   case pch::TYPE_OBJC_QUALIFIED_ID: {
@@ -1465,7 +1468,7 @@
     llvm::SmallVector<ObjCProtocolDecl*, 4> Protos;
     for (unsigned I = 0; I != NumProtos; ++I)
       Protos.push_back(cast<ObjCProtocolDecl>(GetDecl(Record[Idx++])));
-    return Context.getObjCQualifiedIdType(&Protos[0], NumProtos);
+    return Context->getObjCQualifiedIdType(&Protos[0], NumProtos);
   }
   }
   // Suppress a GCC warning
@@ -1481,31 +1484,31 @@
     QualType T;
     switch ((pch::PredefinedTypeIDs)Index) {
     case pch::PREDEF_TYPE_NULL_ID: return QualType();
-    case pch::PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
-    case pch::PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
+    case pch::PREDEF_TYPE_VOID_ID: T = Context->VoidTy; break;
+    case pch::PREDEF_TYPE_BOOL_ID: T = Context->BoolTy; break;
 
     case pch::PREDEF_TYPE_CHAR_U_ID:
     case pch::PREDEF_TYPE_CHAR_S_ID:
       // FIXME: Check that the signedness of CharTy is correct!
-      T = Context.CharTy;
+      T = Context->CharTy;
       break;
 
-    case pch::PREDEF_TYPE_UCHAR_ID:      T = Context.UnsignedCharTy;     break;
-    case pch::PREDEF_TYPE_USHORT_ID:     T = Context.UnsignedShortTy;    break;
-    case pch::PREDEF_TYPE_UINT_ID:       T = Context.UnsignedIntTy;      break;
-    case pch::PREDEF_TYPE_ULONG_ID:      T = Context.UnsignedLongTy;     break;
-    case pch::PREDEF_TYPE_ULONGLONG_ID:  T = Context.UnsignedLongLongTy; break;
-    case pch::PREDEF_TYPE_SCHAR_ID:      T = Context.SignedCharTy;       break;
-    case pch::PREDEF_TYPE_WCHAR_ID:      T = Context.WCharTy;            break;
-    case pch::PREDEF_TYPE_SHORT_ID:      T = Context.ShortTy;            break;
-    case pch::PREDEF_TYPE_INT_ID:        T = Context.IntTy;              break;
-    case pch::PREDEF_TYPE_LONG_ID:       T = Context.LongTy;             break;
-    case pch::PREDEF_TYPE_LONGLONG_ID:   T = Context.LongLongTy;         break;
-    case pch::PREDEF_TYPE_FLOAT_ID:      T = Context.FloatTy;            break;
-    case pch::PREDEF_TYPE_DOUBLE_ID:     T = Context.DoubleTy;           break;
-    case pch::PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy;       break;
-    case pch::PREDEF_TYPE_OVERLOAD_ID:   T = Context.OverloadTy;         break;
-    case pch::PREDEF_TYPE_DEPENDENT_ID:  T = Context.DependentTy;        break;
+    case pch::PREDEF_TYPE_UCHAR_ID:      T = Context->UnsignedCharTy;     break;
+    case pch::PREDEF_TYPE_USHORT_ID:     T = Context->UnsignedShortTy;    break;
+    case pch::PREDEF_TYPE_UINT_ID:       T = Context->UnsignedIntTy;      break;
+    case pch::PREDEF_TYPE_ULONG_ID:      T = Context->UnsignedLongTy;     break;
+    case pch::PREDEF_TYPE_ULONGLONG_ID:  T = Context->UnsignedLongLongTy; break;
+    case pch::PREDEF_TYPE_SCHAR_ID:      T = Context->SignedCharTy;       break;
+    case pch::PREDEF_TYPE_WCHAR_ID:      T = Context->WCharTy;            break;
+    case pch::PREDEF_TYPE_SHORT_ID:      T = Context->ShortTy;            break;
+    case pch::PREDEF_TYPE_INT_ID:        T = Context->IntTy;              break;
+    case pch::PREDEF_TYPE_LONG_ID:       T = Context->LongTy;             break;
+    case pch::PREDEF_TYPE_LONGLONG_ID:   T = Context->LongLongTy;         break;
+    case pch::PREDEF_TYPE_FLOAT_ID:      T = Context->FloatTy;            break;
+    case pch::PREDEF_TYPE_DOUBLE_ID:     T = Context->DoubleTy;           break;
+    case pch::PREDEF_TYPE_LONGDOUBLE_ID: T = Context->LongDoubleTy;       break;
+    case pch::PREDEF_TYPE_OVERLOAD_ID:   T = Context->OverloadTy;         break;
+    case pch::PREDEF_TYPE_DEPENDENT_ID:  T = Context->DependentTy;        break;
     }
 
     assert(!T.isNull() && "Unknown predefined type");
@@ -1814,7 +1817,7 @@
       const char *StrLenPtr = Str - 2;
       unsigned StrLen = (((unsigned) StrLenPtr[0])
                          | (((unsigned) StrLenPtr[1]) << 8)) - 1;
-      IdentifiersLoaded[ID - 1] = &Context.Idents.get(Str, Str + StrLen);
+      IdentifiersLoaded[ID - 1]=&PP.getIdentifierTable().get(Str, Str + StrLen);
 
       // Turn on lookup into the on-disk hash table, if we have an
       // on-disk hash table.
@@ -1883,19 +1886,19 @@
     return DeclarationName(GetSelector(Record, Idx));
 
   case DeclarationName::CXXConstructorName:
-    return Context.DeclarationNames.getCXXConstructorName(
+    return Context->DeclarationNames.getCXXConstructorName(
                                                       GetType(Record[Idx++]));
 
   case DeclarationName::CXXDestructorName:
-    return Context.DeclarationNames.getCXXDestructorName(
+    return Context->DeclarationNames.getCXXDestructorName(
                                                       GetType(Record[Idx++]));
 
   case DeclarationName::CXXConversionFunctionName:
-    return Context.DeclarationNames.getCXXConversionFunctionName(
+    return Context->DeclarationNames.getCXXConversionFunctionName(
                                                       GetType(Record[Idx++]));
 
   case DeclarationName::CXXOperatorName:
-    return Context.DeclarationNames.getCXXOperatorName(
+    return Context->DeclarationNames.getCXXOperatorName(
                                        (OverloadedOperatorKind)Record[Idx++]);
 
   case DeclarationName::CXXUsingDirective:
@@ -1940,7 +1943,7 @@
 
 DiagnosticBuilder PCHReader::Diag(SourceLocation Loc, unsigned DiagID) {
   return PP.getDiagnostics().Report(FullSourceLoc(Loc,
-                                                  Context.getSourceManager()),
+                                                  PP.getSourceManager()),
                                     DiagID);
 }
 
diff --git a/lib/Frontend/PCHReaderDecl.cpp b/lib/Frontend/PCHReaderDecl.cpp
index 2df87bf..fc14a26 100644
--- a/lib/Frontend/PCHReaderDecl.cpp
+++ b/lib/Frontend/PCHReaderDecl.cpp
@@ -160,7 +160,7 @@
   Params.reserve(NumParams);
   for (unsigned I = 0; I != NumParams; ++I)
     Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
-  FD->setParams(Reader.getContext(), &Params[0], NumParams);
+  FD->setParams(*Reader.getContext(), &Params[0], NumParams);
 }
 
 void PCHDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
@@ -184,7 +184,7 @@
   Params.reserve(NumParams);
   for (unsigned I = 0; I != NumParams; ++I)
     Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
-  MD->setMethodParams(Reader.getContext(), &Params[0], NumParams);
+  MD->setMethodParams(*Reader.getContext(), &Params[0], NumParams);
 }
 
 void PCHDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {
@@ -202,13 +202,13 @@
   Protocols.reserve(NumProtocols);
   for (unsigned I = 0; I != NumProtocols; ++I)
     Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
-  ID->setProtocolList(&Protocols[0], NumProtocols, Reader.getContext());
+  ID->setProtocolList(&Protocols[0], NumProtocols, *Reader.getContext());
   unsigned NumIvars = Record[Idx++];
   llvm::SmallVector<ObjCIvarDecl *, 16> IVars;
   IVars.reserve(NumIvars);
   for (unsigned I = 0; I != NumIvars; ++I)
     IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
-  ID->setIVarList(&IVars[0], NumIvars, Reader.getContext());
+  ID->setIVarList(&IVars[0], NumIvars, *Reader.getContext());
   ID->setCategoryList(
                cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
   ID->setForwardDecl(Record[Idx++]);
@@ -232,7 +232,7 @@
   ProtoRefs.reserve(NumProtoRefs);
   for (unsigned I = 0; I != NumProtoRefs; ++I)
     ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
-  PD->setProtocolList(&ProtoRefs[0], NumProtoRefs, Reader.getContext());
+  PD->setProtocolList(&ProtoRefs[0], NumProtoRefs, *Reader.getContext());
 }
 
 void PCHDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) {
@@ -246,7 +246,7 @@
   ClassRefs.reserve(NumClassRefs);
   for (unsigned I = 0; I != NumClassRefs; ++I)
     ClassRefs.push_back(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
-  CD->setClassList(Reader.getContext(), &ClassRefs[0], NumClassRefs);
+  CD->setClassList(*Reader.getContext(), &ClassRefs[0], NumClassRefs);
 }
 
 void PCHDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) {
@@ -256,7 +256,7 @@
   ProtoRefs.reserve(NumProtoRefs);
   for (unsigned I = 0; I != NumProtoRefs; ++I)
     ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
-  FPD->setProtocolList(&ProtoRefs[0], NumProtoRefs, Reader.getContext());
+  FPD->setProtocolList(&ProtoRefs[0], NumProtoRefs, *Reader.getContext());
 }
 
 void PCHDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) {
@@ -267,7 +267,7 @@
   ProtoRefs.reserve(NumProtoRefs);
   for (unsigned I = 0; I != NumProtoRefs; ++I)
     ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
-  CD->setProtocolList(&ProtoRefs[0], NumProtoRefs, Reader.getContext());
+  CD->setProtocolList(&ProtoRefs[0], NumProtoRefs, *Reader.getContext());
   CD->setNextClassCategory(cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
   CD->setLocEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
 }
@@ -372,7 +372,7 @@
   Params.reserve(NumParams);
   for (unsigned I = 0; I != NumParams; ++I)
     Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
-  BD->setParams(Reader.getContext(), &Params[0], NumParams);  
+  BD->setParams(*Reader.getContext(), &Params[0], NumParams);  
 }
 
 std::pair<uint64_t, uint64_t> 
@@ -400,17 +400,17 @@
 
 #define SIMPLE_ATTR(Name)                       \
  case Attr::Name:                               \
-   New = ::new (Context) Name##Attr();          \
+   New = ::new (*Context) Name##Attr();         \
    break
 
 #define STRING_ATTR(Name)                                       \
  case Attr::Name:                                               \
-   New = ::new (Context) Name##Attr(ReadString(Record, Idx));   \
+   New = ::new (*Context) Name##Attr(ReadString(Record, Idx));  \
    break
 
 #define UNSIGNED_ATTR(Name)                             \
  case Attr::Name:                                       \
-   New = ::new (Context) Name##Attr(Record[Idx++]);     \
+   New = ::new (*Context) Name##Attr(Record[Idx++]);    \
    break
 
   Attr *Attrs = 0;
@@ -428,12 +428,12 @@
     STRING_ATTR(AsmLabel);
     
     case Attr::Blocks:
-      New = ::new (Context) BlocksAttr(
+      New = ::new (*Context) BlocksAttr(
                                   (BlocksAttr::BlocksAttrTypes)Record[Idx++]);
       break;
       
     case Attr::Cleanup:
-      New = ::new (Context) CleanupAttr(
+      New = ::new (*Context) CleanupAttr(
                                   cast<FunctionDecl>(GetDecl(Record[Idx++])));
       break;
 
@@ -449,14 +449,14 @@
       std::string Type = ReadString(Record, Idx);
       unsigned FormatIdx = Record[Idx++];
       unsigned FirstArg = Record[Idx++];
-      New = ::new (Context) FormatAttr(Type, FormatIdx, FirstArg);
+      New = ::new (*Context) FormatAttr(Type, FormatIdx, FirstArg);
       break;
     }
 
     SIMPLE_ATTR(GNUInline);
     
     case Attr::IBOutletKind:
-      New = ::new (Context) IBOutletAttr();
+      New = ::new (*Context) IBOutletAttr();
       break;
 
     SIMPLE_ATTR(NoReturn);
@@ -469,7 +469,7 @@
       llvm::SmallVector<unsigned, 16> ArgNums;
       ArgNums.insert(ArgNums.end(), &Record[Idx], &Record[Idx] + Size);
       Idx += Size;
-      New = ::new (Context) NonNullAttr(&ArgNums[0], Size);
+      New = ::new (*Context) NonNullAttr(&ArgNums[0], Size);
       break;
     }
 
@@ -492,7 +492,7 @@
     SIMPLE_ATTR(Used);
     
     case Attr::Visibility:
-      New = ::new (Context) VisibilityAttr(
+      New = ::new (*Context) VisibilityAttr(
                               (VisibilityAttr::VisibilityTypes)Record[Idx++]);
       break;
 
@@ -574,96 +574,96 @@
     break;
   case pch::DECL_TRANSLATION_UNIT:
     assert(Index == 0 && "Translation unit must be at index 0");
-    D = Context.getTranslationUnitDecl();
+    D = Context->getTranslationUnitDecl();
     break;
   case pch::DECL_TYPEDEF:
-    D = TypedefDecl::Create(Context, 0, SourceLocation(), 0, QualType());
+    D = TypedefDecl::Create(*Context, 0, SourceLocation(), 0, QualType());
     break;
   case pch::DECL_ENUM:
-    D = EnumDecl::Create(Context, 0, SourceLocation(), 0, 0);
+    D = EnumDecl::Create(*Context, 0, SourceLocation(), 0, 0);
     break;
   case pch::DECL_RECORD:
-    D = RecordDecl::Create(Context, TagDecl::TK_struct, 0, SourceLocation(),
+    D = RecordDecl::Create(*Context, TagDecl::TK_struct, 0, SourceLocation(),
                            0, 0);
     break;
   case pch::DECL_ENUM_CONSTANT:
-    D = EnumConstantDecl::Create(Context, 0, SourceLocation(), 0, QualType(),
+    D = EnumConstantDecl::Create(*Context, 0, SourceLocation(), 0, QualType(),
                                  0, llvm::APSInt());
     break;
   case pch::DECL_FUNCTION:
-    D = FunctionDecl::Create(Context, 0, SourceLocation(), DeclarationName(), 
+    D = FunctionDecl::Create(*Context, 0, SourceLocation(), DeclarationName(), 
                              QualType());
     break;
   case pch::DECL_OBJC_METHOD:
-    D = ObjCMethodDecl::Create(Context, SourceLocation(), SourceLocation(), 
+    D = ObjCMethodDecl::Create(*Context, SourceLocation(), SourceLocation(), 
                                Selector(), QualType(), 0);
     break;
   case pch::DECL_OBJC_INTERFACE:
-    D = ObjCInterfaceDecl::Create(Context, 0, SourceLocation(), 0);
+    D = ObjCInterfaceDecl::Create(*Context, 0, SourceLocation(), 0);
     break;
   case pch::DECL_OBJC_IVAR:
-    D = ObjCIvarDecl::Create(Context, 0, SourceLocation(), 0, QualType(),
+    D = ObjCIvarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(),
                              ObjCIvarDecl::None);
     break;
   case pch::DECL_OBJC_PROTOCOL:
-    D = ObjCProtocolDecl::Create(Context, 0, SourceLocation(), 0);
+    D = ObjCProtocolDecl::Create(*Context, 0, SourceLocation(), 0);
     break;
   case pch::DECL_OBJC_AT_DEFS_FIELD:
-    D = ObjCAtDefsFieldDecl::Create(Context, 0, SourceLocation(), 0, 
+    D = ObjCAtDefsFieldDecl::Create(*Context, 0, SourceLocation(), 0, 
                                     QualType(), 0);
     break;
   case pch::DECL_OBJC_CLASS:
-    D = ObjCClassDecl::Create(Context, 0, SourceLocation());
+    D = ObjCClassDecl::Create(*Context, 0, SourceLocation());
     break;
   case pch::DECL_OBJC_FORWARD_PROTOCOL:
-    D = ObjCForwardProtocolDecl::Create(Context, 0, SourceLocation());
+    D = ObjCForwardProtocolDecl::Create(*Context, 0, SourceLocation());
     break;
   case pch::DECL_OBJC_CATEGORY:
-    D = ObjCCategoryDecl::Create(Context, 0, SourceLocation(), 0);
+    D = ObjCCategoryDecl::Create(*Context, 0, SourceLocation(), 0);
     break;
   case pch::DECL_OBJC_CATEGORY_IMPL:
-    D = ObjCCategoryImplDecl::Create(Context, 0, SourceLocation(), 0, 0);
+    D = ObjCCategoryImplDecl::Create(*Context, 0, SourceLocation(), 0, 0);
     break;
   case pch::DECL_OBJC_IMPLEMENTATION:
-    D = ObjCImplementationDecl::Create(Context, 0, SourceLocation(), 0, 0);
+    D = ObjCImplementationDecl::Create(*Context, 0, SourceLocation(), 0, 0);
     break;
   case pch::DECL_OBJC_COMPATIBLE_ALIAS:
-    D = ObjCCompatibleAliasDecl::Create(Context, 0, SourceLocation(), 0, 0);
+    D = ObjCCompatibleAliasDecl::Create(*Context, 0, SourceLocation(), 0, 0);
     break;
   case pch::DECL_OBJC_PROPERTY:
-    D = ObjCPropertyDecl::Create(Context, 0, SourceLocation(), 0, QualType());
+    D = ObjCPropertyDecl::Create(*Context, 0, SourceLocation(), 0, QualType());
     break;
   case pch::DECL_OBJC_PROPERTY_IMPL:
-    D = ObjCPropertyImplDecl::Create(Context, 0, SourceLocation(),
+    D = ObjCPropertyImplDecl::Create(*Context, 0, SourceLocation(),
                                      SourceLocation(), 0, 
                                      ObjCPropertyImplDecl::Dynamic, 0);
     break;
   case pch::DECL_FIELD:
-    D = FieldDecl::Create(Context, 0, SourceLocation(), 0, QualType(), 0, 
+    D = FieldDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 
                           false);
     break;
   case pch::DECL_VAR:
-    D = VarDecl::Create(Context, 0, SourceLocation(), 0, QualType(),
+    D = VarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(),
                         VarDecl::None, SourceLocation());
     break;
 
   case pch::DECL_IMPLICIT_PARAM:
-    D = ImplicitParamDecl::Create(Context, 0, SourceLocation(), 0, QualType());
+    D = ImplicitParamDecl::Create(*Context, 0, SourceLocation(), 0, QualType());
     break;
 
   case pch::DECL_PARM_VAR:
-    D = ParmVarDecl::Create(Context, 0, SourceLocation(), 0, QualType(), 
+    D = ParmVarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 
                             VarDecl::None, 0);
     break;
   case pch::DECL_ORIGINAL_PARM_VAR:
-    D = OriginalParmVarDecl::Create(Context, 0, SourceLocation(), 0,
+    D = OriginalParmVarDecl::Create(*Context, 0, SourceLocation(), 0,
                                     QualType(), QualType(), VarDecl::None, 0);
     break;
   case pch::DECL_FILE_SCOPE_ASM:
-    D = FileScopeAsmDecl::Create(Context, 0, SourceLocation(), 0);
+    D = FileScopeAsmDecl::Create(*Context, 0, SourceLocation(), 0);
     break;
   case pch::DECL_BLOCK:
-    D = BlockDecl::Create(Context, 0, SourceLocation());
+    D = BlockDecl::Create(*Context, 0, SourceLocation());
     break;
   }
 
diff --git a/lib/Frontend/PCHReaderStmt.cpp b/lib/Frontend/PCHReaderStmt.cpp
index af3e026..217bdf5 100644
--- a/lib/Frontend/PCHReaderStmt.cpp
+++ b/lib/Frontend/PCHReaderStmt.cpp
@@ -134,7 +134,7 @@
 unsigned PCHStmtReader::VisitCompoundStmt(CompoundStmt *S) {
   VisitStmt(S);
   unsigned NumStmts = Record[Idx++];
-  S->setStmts(Reader.getContext(), 
+  S->setStmts(*Reader.getContext(), 
               &StmtStack[StmtStack.size() - NumStmts], NumStmts);
   S->setLBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
   S->setRBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
@@ -271,7 +271,7 @@
     Decls.reserve(Record.size() - Idx);
     for (unsigned N = Record.size(); Idx != N; ++Idx)
       Decls.push_back(Reader.GetDecl(Record[Idx]));
-    S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Reader.getContext(),
+    S->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader.getContext(),
                                                    &Decls[0], Decls.size())));
   }
   return 0;
@@ -367,7 +367,7 @@
 
   // Read string data  
   llvm::SmallVector<char, 16> Str(&Record[Idx], &Record[Idx] + Len);
-  E->setStrData(Reader.getContext(), &Str[0], Len);
+  E->setStrData(*Reader.getContext(), &Str[0], Len);
   Idx += Len;
 
   // Read source locations
@@ -425,7 +425,7 @@
 
 unsigned PCHStmtReader::VisitCallExpr(CallExpr *E) {
   VisitExpr(E);
-  E->setNumArgs(Reader.getContext(), Record[Idx++]);
+  E->setNumArgs(*Reader.getContext(), Record[Idx++]);
   E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
   E->setCallee(cast<Expr>(StmtStack[StmtStack.size() - E->getNumArgs() - 1]));
   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
@@ -953,7 +953,7 @@
       break;
 
     case pch::EXPR_STRING_LITERAL:
-      S = StringLiteral::CreateEmpty(Context, 
+      S = StringLiteral::CreateEmpty(*Context, 
                                      Record[PCHStmtReader::NumExprFields + 1]);
       break;
 
@@ -978,7 +978,7 @@
       break;
 
     case pch::EXPR_CALL:
-      S = new (Context) CallExpr(Context, Empty);
+      S = new (Context) CallExpr(*Context, Empty);
       break;
 
     case pch::EXPR_MEMBER:
@@ -1018,7 +1018,7 @@
       break;
 
     case pch::EXPR_DESIGNATED_INIT:
-      S = DesignatedInitExpr::CreateEmpty(Context, 
+      S = DesignatedInitExpr::CreateEmpty(*Context,
                                      Record[PCHStmtReader::NumExprFields] - 1);
      
       break;
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index f124298..4f4d3a3 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -1657,17 +1657,8 @@
     ClearSourceMgr = true;
     break;
   }
-  case RunPreprocessorOnly: {        // Just lex as fast as we can, no output.
-    llvm::TimeRegion Timer(ClangFrontendTimer);
-    Token Tok;
-    // Start parsing the specified input file.
-    PP.EnterMainSourceFile();
-    do {
-      PP.Lex(Tok);
-    } while (Tok.isNot(tok::eof));
-    ClearSourceMgr = true;
+  case RunPreprocessorOnly:
     break;
-  }
       
   case GeneratePTH: {
     llvm::TimeRegion Timer(ClangFrontendTimer);
@@ -1683,12 +1674,8 @@
     break;
   }
       
-  case ParseNoop: {                  // -parse-noop
-    llvm::TimeRegion Timer(ClangFrontendTimer);
-    ParseFile(PP, new MinimalAction(PP));
-    ClearSourceMgr = true;
+  case ParseNoop:
     break;
-  }
     
   case ParsePrintCallbacks: {
     llvm::TimeRegion Timer(ClangFrontendTimer);
@@ -1754,7 +1741,7 @@
   }
 
   llvm::OwningPtr<ASTContext> ContextOwner;
-  if (Consumer) {
+  if (Consumer)
     ContextOwner.reset(new ASTContext(PP.getLangOptions(),
                                       PP.getSourceManager(),
                                       PP.getTargetInfo(),
@@ -1764,52 +1751,71 @@
                                       /* size_reserve = */0,
                        /* InitializeBuiltins = */ImplicitIncludePCH.empty()));
      
-    if (!ImplicitIncludePCH.empty()) {
-      // The user has asked us to include a precompiled header. Load
-      // the precompiled header into the AST context.
-      llvm::OwningPtr<PCHReader> Reader(new PCHReader(PP, *ContextOwner.get()));
-      switch (Reader->ReadPCH(ImplicitIncludePCH)) {
-      case PCHReader::Success: {
-        // Attach the PCH reader to the AST context as an external AST
-        // source, so that declarations will be deserialized from the
-        // PCH file as needed.
-        llvm::OwningPtr<ExternalASTSource> Source(Reader.take());
+  if (!ImplicitIncludePCH.empty()) {
+    // The user has asked us to include a precompiled header. Load
+    // the precompiled header into the AST context.
+    llvm::OwningPtr<PCHReader> Reader(new PCHReader(PP, ContextOwner.get()));
+    switch (Reader->ReadPCH(ImplicitIncludePCH)) {
+    case PCHReader::Success: {
+      // Attach the PCH reader to the AST context as an external AST
+      // source, so that declarations will be deserialized from the
+      // PCH file as needed.
+      llvm::OwningPtr<ExternalASTSource> Source(Reader.take());
+      if (ContextOwner)
         ContextOwner->setExternalSource(Source);
 
-        // Clear out the predefines buffer, because all of the
-        // predefines are already in the PCH file.
-        PP.setPredefines("");
-        break;
-      }
-
-      case PCHReader::Failure:
-        // Unrecoverable failure: don't even try to process the input
-        // file.
-        return;
-
-      case PCHReader::IgnorePCH:
-        // No suitable PCH file could be found. Just ignore the
-        // -include-pch option entirely.
-        
-        // We delayed the initialization of builtins in the hope of
-        // loading the PCH file. Since the PCH file could not be
-        // loaded, initialize builtins now.
-        ContextOwner->InitializeBuiltins(PP.getIdentifierTable());
-        break;
-      }
-
-      // Finish preprocessor initialization. We do this now (rather
-      // than earlier) because this initialization creates new source
-      // location entries in the source manager, which must come after
-      // the source location entries for the PCH file.
-      if (InitializeSourceManager(PP, InFile))
-        return;
+      // Clear out the predefines buffer, because all of the
+      // predefines are already in the PCH file.
+      PP.setPredefines("");
+      break;
     }
 
-    ParseAST(PP, Consumer.get(), *ContextOwner.get(), Stats, 
-             CompleteTranslationUnit);
+    case PCHReader::Failure:
+      // Unrecoverable failure: don't even try to process the input
+      // file.
+      return;
+
+    case PCHReader::IgnorePCH:
+      // No suitable PCH file could be found. Just ignore the
+      // -include-pch option entirely.
+      
+      // We delayed the initialization of builtins in the hope of
+      // loading the PCH file. Since the PCH file could not be
+      // loaded, initialize builtins now.
+      if (ContextOwner)
+        ContextOwner->InitializeBuiltins(PP.getIdentifierTable());
+      break;
+    }
+
+    // Finish preprocessor initialization. We do this now (rather
+    // than earlier) because this initialization creates new source
+    // location entries in the source manager, which must come after
+    // the source location entries for the PCH file.
+    if (InitializeSourceManager(PP, InFile))
+      return;
   }
 
+
+  // If we have an ASTConsumer, run the parser with it.
+  if (Consumer)
+    ParseAST(PP, Consumer.get(), *ContextOwner.get(), Stats, 
+             CompleteTranslationUnit);
+
+  if (PA == RunPreprocessorOnly) {    // Just lex as fast as we can, no output.
+    llvm::TimeRegion Timer(ClangFrontendTimer);
+    Token Tok;
+    // Start parsing the specified input file.
+    PP.EnterMainSourceFile();
+    do {
+      PP.Lex(Tok);
+    } while (Tok.isNot(tok::eof));
+    ClearSourceMgr = true;
+  } else if (PA == ParseNoop) {                  // -parse-noop
+    llvm::TimeRegion Timer(ClangFrontendTimer);
+    ParseFile(PP, new MinimalAction(PP));
+    ClearSourceMgr = true;
+  }
+  
   if (FixItRewrite)
     FixItRewrite->WriteFixedFile(InFile, OutputFile);
   
