diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h
index 5634bf4..921aff1 100644
--- a/include/clang/AST/Expr.h
+++ b/include/clang/AST/Expr.h
@@ -1844,8 +1844,19 @@
       BuiltinLoc(BLoc),
       RParenLoc(RPLoc) { }
   
+  /// \brief Create an empty __builtin_va_start expression.
+  explicit VAArgExpr(EmptyShell Empty) : Expr(VAArgExprClass, Empty) { }
+
   const Expr *getSubExpr() const { return cast<Expr>(Val); }
   Expr *getSubExpr() { return cast<Expr>(Val); }
+  void setSubExpr(Expr *E) { Val = E; }
+
+  SourceLocation getBuiltinLoc() const { return BuiltinLoc; }
+  void setBuiltinLoc(SourceLocation L) { BuiltinLoc = L; }
+  
+  SourceLocation getRParenLoc() const { return RParenLoc; }
+  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
+
   virtual SourceRange getSourceRange() const {
     return SourceRange(BuiltinLoc, RParenLoc);
   }  
@@ -2306,19 +2317,28 @@
 ///
 class ExtVectorElementExpr : public Expr {
   Stmt *Base;
-  IdentifierInfo &Accessor;
+  IdentifierInfo *Accessor;
   SourceLocation AccessorLoc;
 public:
   ExtVectorElementExpr(QualType ty, Expr *base, IdentifierInfo &accessor,
                        SourceLocation loc)
     : Expr(ExtVectorElementExprClass, ty), 
-      Base(base), Accessor(accessor), AccessorLoc(loc) {}
+      Base(base), Accessor(&accessor), AccessorLoc(loc) {}
                      
+  /// \brief Build an empty vector element expression.
+  explicit ExtVectorElementExpr(EmptyShell Empty)
+    : Expr(ExtVectorElementExprClass, Empty) { }
+
   const Expr *getBase() const { return cast<Expr>(Base); }
   Expr *getBase() { return cast<Expr>(Base); }
-  
-  IdentifierInfo &getAccessor() const { return Accessor; }
-  
+  void setBase(Expr *E) { Base = E; }
+
+  IdentifierInfo &getAccessor() const { return *Accessor; }
+  void setAccessor(IdentifierInfo *II) { Accessor = II; }
+
+  SourceLocation getAccessorLoc() const { return AccessorLoc; }
+  void setAccessorLoc(SourceLocation L) { AccessorLoc = L; }
+
   /// getNumElements - Get the number of components being selected.
   unsigned getNumElements() const;
   
diff --git a/include/clang/Frontend/PCHBitCodes.h b/include/clang/Frontend/PCHBitCodes.h
index a944f09..10169b3 100644
--- a/include/clang/Frontend/PCHBitCodes.h
+++ b/include/clang/Frontend/PCHBitCodes.h
@@ -418,7 +418,15 @@
       /// \brief An ImplicitCastExpr record.
       EXPR_IMPLICIT_CAST,
       /// \brief A CStyleCastExpr record.
-      EXPR_CSTYLE_CAST
+      EXPR_CSTYLE_CAST,
+      /// FIXME: CompoundLiteralExpr
+      /// \brief An ExtVectorElementExpr record.
+      EXPR_EXT_VECTOR_ELEMENT,
+      /// FIXME: InitListExpr
+      /// FIXME: DesignatedInitExpr
+      /// FIXME: ImplicitValueInitExpr
+      /// \brief A VAArgExpr record.
+      EXPR_VA_ARG
     };
     /// @}
   }
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 99e07c4..91b6dc9 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -1372,8 +1372,8 @@
 
 /// containsDuplicateElements - Return true if any element access is repeated.
 bool ExtVectorElementExpr::containsDuplicateElements() const {
-  const char *compStr = Accessor.getName();
-  unsigned length = Accessor.getLength();
+  const char *compStr = Accessor->getName();
+  unsigned length = Accessor->getLength();
 
   // Halving swizzles do not contain duplicate elements.
   if (!strcmp(compStr, "hi") || !strcmp(compStr, "lo") || 
@@ -1398,7 +1398,7 @@
 /// getEncodedElementAccess - We encode the fields as a llvm ConstantArray.
 void ExtVectorElementExpr::getEncodedElementAccess(
                                   llvm::SmallVectorImpl<unsigned> &Elts) const {
-  const char *compStr = Accessor.getName();
+  const char *compStr = Accessor->getName();
   if (*compStr == 's')
     compStr++;
  
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index f9290ba..bd1ed1f 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -257,6 +257,8 @@
     unsigned VisitImplicitCastExpr(ImplicitCastExpr *E);
     unsigned VisitExplicitCastExpr(ExplicitCastExpr *E);
     unsigned VisitCStyleCastExpr(CStyleCastExpr *E);
+    unsigned VisitExtVectorElementExpr(ExtVectorElementExpr *E);
+    unsigned VisitVAArgExpr(VAArgExpr *E);
   };
 }
 
@@ -437,6 +439,23 @@
   return 1;
 }
 
+unsigned PCHStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
+  VisitExpr(E);
+  E->setBase(ExprStack.back());
+  E->setAccessor(Reader.GetIdentifierInfo(Record, Idx));
+  E->setAccessorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
+  return 1;
+}
+
+unsigned PCHStmtReader::VisitVAArgExpr(VAArgExpr *E) {
+  VisitExpr(E);
+  E->setSubExpr(ExprStack.back());
+  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
+  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
+  return 1;
+}
+
+
 // FIXME: use the diagnostics machinery
 static bool Error(const char *Str) {
   std::fprintf(stderr, "%s\n", Str);
@@ -1949,6 +1968,15 @@
     case pch::EXPR_CSTYLE_CAST:
       E = new (Context) CStyleCastExpr(Empty);
       break;
+
+    case pch::EXPR_EXT_VECTOR_ELEMENT:
+      E = new (Context) ExtVectorElementExpr(Empty);
+      break;
+
+    case pch::EXPR_VA_ARG:
+      // FIXME: untested; we need function bodies first
+      E = new (Context) VAArgExpr(Empty);
+      break;
     }
 
     // We hit an EXPR_STOP, so we're done with this expression.
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp
index 0321e4c..612eb23 100644
--- a/lib/Frontend/PCHWriter.cpp
+++ b/lib/Frontend/PCHWriter.cpp
@@ -464,6 +464,8 @@
     void VisitImplicitCastExpr(ImplicitCastExpr *E);
     void VisitExplicitCastExpr(ExplicitCastExpr *E);
     void VisitCStyleCastExpr(CStyleCastExpr *E);
+    void VisitExtVectorElementExpr(ExtVectorElementExpr *E);
+    void VisitVAArgExpr(VAArgExpr *E);
   };
 }
 
@@ -637,6 +639,22 @@
   Code = pch::EXPR_CSTYLE_CAST;
 }
 
+void PCHStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
+  VisitExpr(E);
+  Writer.WriteSubExpr(E->getBase());
+  Writer.AddIdentifierRef(&E->getAccessor(), Record);
+  Writer.AddSourceLocation(E->getAccessorLoc(), Record);
+  Code = pch::EXPR_EXT_VECTOR_ELEMENT;
+}
+
+void PCHStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
+  VisitExpr(E);
+  Writer.WriteSubExpr(E->getSubExpr());
+  Writer.AddSourceLocation(E->getBuiltinLoc(), Record);
+  Writer.AddSourceLocation(E->getRParenLoc(), Record);
+  Code = pch::EXPR_VA_ARG;
+}
+
 //===----------------------------------------------------------------------===//
 // PCHWriter Implementation
 //===----------------------------------------------------------------------===//
diff --git a/test/PCH/exprs.c b/test/PCH/exprs.c
index 49f74dd..6d5a969 100644
--- a/test/PCH/exprs.c
+++ b/test/PCH/exprs.c
@@ -60,3 +60,6 @@
 
 // CStyleCastExpr
 void_ptr vp1 = &integer;
+
+// ExtVectorElementExpr
+ext_vector_element *double_ptr5 = &floating;
diff --git a/test/PCH/exprs.h b/test/PCH/exprs.h
index 016c4c6..9637b6e 100644
--- a/test/PCH/exprs.h
+++ b/test/PCH/exprs.h
@@ -56,3 +56,7 @@
 // CStyleCastExpr
 typedef typeof((void *)0) void_ptr;
 
+// ExtVectorElementExpr
+typedef __attribute__(( ext_vector_type(2) )) double double2;
+double2 vec2;
+typedef typeof(vec2.x) ext_vector_element;
