Apply changes to migrate to LLVM Mar 6th 2011.

- API for name mangling. (Changing from non-public APIs to the
  public one)

- API changes for clang::Diagnostic::getNumErrors ->
  clang::Diagnostic::hasErrorOccurred

- API changes for clang::CharUnits and Quantity type.

- API changes libLLVMSystem -> libLLVMSupport.

- Change clang::Token::eom -> clang::Token::eod.

- Remove SourceRange parameter for DeclRefExpr::Create and
  MemberExpr::Create.

- Add const qualifier for several unsafe type cast.
diff --git a/Android.mk b/Android.mk
index 5ad1017..3c2a5b4 100644
--- a/Android.mk
+++ b/Android.mk
@@ -20,15 +20,14 @@
 	libLLVMipo	\
 	libLLVMBitWriter	\
 	libLLVMBitReader	\
-	libLLVMARMAsmPrinter	\
-	libLLVMX86AsmPrinter	\
-        libLLVMX86InstPrinter   \
-	libLLVMAsmPrinter	\
-	libLLVMMCParser	\
 	libLLVMARMCodeGen	\
+	libLLVMARMAsmPrinter	\
 	libLLVMARMInfo	\
 	libLLVMX86CodeGen	\
+	libLLVMX86AsmPrinter	\
 	libLLVMX86Info	\
+	libLLVMX86Utils	\
+	libLLVMAsmPrinter	\
 	libLLVMSelectionDAG	\
 	libLLVMCodeGen	\
 	libLLVMScalarOpts	\
@@ -39,6 +38,7 @@
 	libLLVMAnalysis	\
 	libLLVMTarget	\
 	libLLVMMC	\
+	libLLVMMCParser	\
 	libLLVMCore	\
 	libclangParse	\
 	libclangSema	\
@@ -48,8 +48,7 @@
 	libclangFrontend	\
 	libclangCodeGen	\
 	libclangBasic	\
-	libLLVMSupport	\
-	libLLVMSystem
+	libLLVMSupport
 
 # Static library libslang for host
 # ========================================================
diff --git a/llvm-rs-cc.cpp b/llvm-rs-cc.cpp
index f0c24ca..4eadfea 100644
--- a/llvm-rs-cc.cpp
+++ b/llvm-rs-cc.cpp
@@ -31,12 +31,14 @@
 #include "clang/Frontend/TextDiagnosticPrinter.h"
 
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/IntrusiveRefCntPtr.h"
+#include "llvm/ADT/OwningPtr.h"
 
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/MemoryBuffer.h"
-
-#include "llvm/System/Path.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/system_error.h"
 
 #include "slang.h"
 #include "slang_assert.h"
@@ -336,14 +338,18 @@
   clang::TextDiagnosticPrinter *DiagClient =
     new clang::TextDiagnosticPrinter(llvm::errs(), clang::DiagnosticOptions());
   DiagClient->setPrefix(Argv0);
-  clang::Diagnostic Diags(DiagClient);
+
+  llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagIDs(
+    new clang::DiagnosticIDs());
+
+  clang::Diagnostic Diags(DiagIDs, DiagClient, true);
 
   slang::Slang::GlobalInitialization();
 
   ParseArguments(ArgVector, Inputs, Opts, Diags);
 
   // Exits when there's any error occurred during parsing the arguments
-  if (Diags.getNumErrors() > 0)
+  if (Diags.hasErrorOccurred())
     return 1;
 
   if (Opts.mShowHelp) {
@@ -426,8 +432,9 @@
                               llvm::SmallVectorImpl<const char*> &ArgVector,
                               std::set<std::string> &SavedStrings) {
   const char *FName = Arg + 1;
-  llvm::MemoryBuffer *MemBuf = llvm::MemoryBuffer::getFile(FName);
-  if (!MemBuf) {
+  llvm::OwningPtr<llvm::MemoryBuffer> MemBuf;
+  if (llvm::MemoryBuffer::getFile(FName, MemBuf)) {
+    // Unable to open the file
     ArgVector.push_back(SaveStringInSet(SavedStrings, Arg));
     return;
   }
@@ -477,7 +484,6 @@
     }
     CurArg.push_back(*P);
   }
-  delete MemBuf;
 }
 
 // ExpandArgsFromBuf -
diff --git a/llvm-rs-link.cpp b/llvm-rs-link.cpp
index 7815644..a634518 100644
--- a/llvm-rs-link.cpp
+++ b/llvm-rs-link.cpp
@@ -34,6 +34,7 @@
 #include "llvm/Support/StandardPasses.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Support/ToolOutputFile.h"
+#include "llvm/Support/system_error.h"
 
 #include "llvm/Target/TargetData.h"
 
@@ -102,13 +103,13 @@
 }
 
 static inline MemoryBuffer *LoadFileIntoMemory(const std::string &F) {
-  std::string Err;
-  MemoryBuffer *MB = MemoryBuffer::getFile(F, &Err);
+  llvm::OwningPtr<MemoryBuffer> MB;
 
-  if (MB == NULL)
-    errs() << "Failed to load `" << F << "' (" << Err << ")\n";
+  if (llvm::error_code EC = MemoryBuffer::getFile(F, MB)) {
+    errs() << "Failed to load `" << F << "' (" + EC.message() + ")\n";
+  }
 
-  return MB;
+  return MB.take();
 }
 
 static inline Module *ParseBitcodeFromMemoryBuffer(MemoryBuffer *MB,
diff --git a/slang.cpp b/slang.cpp
index 0672c06..02e7e45 100644
--- a/slang.cpp
+++ b/slang.cpp
@@ -24,6 +24,7 @@
 #include "clang/AST/ASTConsumer.h"
 #include "clang/AST/ASTContext.h"
 
+#include "clang/Basic/DiagnosticIDs.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Basic/FileSystemOptions.h"
 #include "clang/Basic/LangOptions.h"
@@ -43,6 +44,8 @@
 
 #include "clang/Parse/ParseAST.h"
 
+#include "llvm/ADT/IntrusiveRefCntPtr.h"
+
 #include "llvm/Bitcode/ReaderWriter.h"
 
 // More force linking
@@ -57,8 +60,7 @@
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/ToolOutputFile.h"
-
-#include "llvm/System/Path.h"
+#include "llvm/Support/Path.h"
 
 #include "llvm/Target/TargetSelect.h"
 
@@ -170,11 +172,9 @@
 }
 
 void Slang::createDiagnostic() {
-  mDiagnostics =
-      llvm::IntrusiveRefCntPtr<clang::Diagnostic>(new clang::Diagnostic());
   mDiagClient = new DiagnosticBuffer();
-  // This takes the ownership of mDiagClient.
-  mDiagnostics->setClient(mDiagClient);
+  mDiagIDs = new clang::DiagnosticIDs();
+  mDiagnostics = new clang::Diagnostic(mDiagIDs, mDiagClient, true);
   initDiagnostic();
   return;
 }
@@ -199,20 +199,18 @@
 }
 
 void Slang::createFileManager() {
-  mFileMgr.reset(new clang::FileManager());
   mFileSysOpt.reset(new clang::FileSystemOptions());
+  mFileMgr.reset(new clang::FileManager(*mFileSysOpt));
 }
 
 void Slang::createSourceManager() {
-  mSourceMgr.reset(new clang::SourceManager(*mDiagnostics,
-                                            *mFileMgr,
-                                            *mFileSysOpt));
+  mSourceMgr.reset(new clang::SourceManager(*mDiagnostics, *mFileMgr));
   return;
 }
 
 void Slang::createPreprocessor() {
   // Default only search header file in current dir
-  clang::HeaderSearch *HS = new clang::HeaderSearch(*mFileMgr, *mFileSysOpt);
+  clang::HeaderSearch *HS = new clang::HeaderSearch(*mFileMgr);
 
   mPP.reset(new clang::Preprocessor(*mDiagnostics,
                                     LangOpts,
@@ -228,7 +226,7 @@
   std::vector<clang::DirectoryLookup> SearchList;
   for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) {
     if (const clang::DirectoryEntry *DE =
-            mFileMgr->getDirectory(mIncludePaths[i], *mFileSysOpt)) {
+            mFileMgr->getDirectory(mIncludePaths[i])) {
       SearchList.push_back(clang::DirectoryLookup(DE,
                                                   clang::SrcMgr::C_System,
                                                   false,
@@ -313,7 +311,7 @@
 
   mSourceMgr->clearIDTables();
 
-  const clang::FileEntry *File = mFileMgr->getFile(InputFile, *mFileSysOpt);
+  const clang::FileEntry *File = mFileMgr->getFile(InputFile);
   if (File)
     mSourceMgr->createMainFileID(File);
 
@@ -377,8 +375,8 @@
 }
 
 int Slang::generateDepFile() {
-  if (mDiagnostics->getNumErrors() > 0)
-    return mDiagnostics->getNumErrors();
+  if (mDiagnostics->hasErrorOccurred())
+    return 1;
   if (mDOS.get() == NULL)
     return 1;
 
@@ -413,19 +411,19 @@
   mPP->EndSourceFile();
 
   // Declare success if no error
-  if (mDiagnostics->getNumErrors() == 0)
+  if (!mDiagnostics->hasErrorOccurred())
     mDOS->keep();
 
   // Clean up after compilation
   mPP.reset();
   mDOS.reset();
 
-  return mDiagnostics->getNumErrors();
+  return mDiagnostics->hasErrorOccurred() ? 1 : 0;
 }
 
 int Slang::compile() {
-  if (mDiagnostics->getNumErrors() > 0)
-    return mDiagnostics->getNumErrors();
+  if (mDiagnostics->hasErrorOccurred())
+    return 1;
   if (mOS.get() == NULL)
     return 1;
 
@@ -445,7 +443,7 @@
   mDiagClient->EndSourceFile();
 
   // Declare success if no error
-  if (mDiagnostics->getNumErrors() == 0)
+  if (!mDiagnostics->hasErrorOccurred())
     mOS->keep();
 
   // The compilation ended, clear
@@ -454,7 +452,7 @@
   mPP.reset();
   mOS.reset();
 
-  return mDiagnostics->getNumErrors();
+  return mDiagnostics->hasErrorOccurred() ? 1 : 0;
 }
 
 void Slang::reset() {
diff --git a/slang.h b/slang.h
index ced1266..9f7c46a 100644
--- a/slang.h
+++ b/slang.h
@@ -76,6 +76,8 @@
 
   // The diagnostics engine instance (for status reporting during compilation)
   llvm::IntrusiveRefCntPtr<clang::Diagnostic> mDiagnostics;
+  // The diagnostics id
+  llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> mDiagIDs;
   // The clients of diagnostics engine. The ownership is taken by the
   // mDiagnostics after creation.
   DiagnosticBuffer *mDiagClient;
diff --git a/slang_diagnostic_buffer.cpp b/slang_diagnostic_buffer.cpp
index c6a5e43..6b70cfe 100644
--- a/slang_diagnostic_buffer.cpp
+++ b/slang_diagnostic_buffer.cpp
@@ -32,12 +32,12 @@
 
 void DiagnosticBuffer::HandleDiagnostic(clang::Diagnostic::Level DiagLevel,
                                         const clang::DiagnosticInfo &Info) {
-  const clang::FullSourceLoc &FSLoc = Info.getLocation();
+  const clang::SourceLocation &SrcLoc = Info.getLocation();
   // 100 is enough for storing general diagnosis message
   llvm::SmallString<100> Buf;
 
-  if (FSLoc.isValid()) {
-    FSLoc.print(*mSOS, FSLoc.getManager());
+  if (SrcLoc.isValid()) {
+    SrcLoc.print(*mSOS, Info.getSourceManager());
     (*mSOS) << ": ";
   }
 
diff --git a/slang_rs.cpp b/slang_rs.cpp
index a6a5c50..c5aadff 100644
--- a/slang_rs.cpp
+++ b/slang_rs.cpp
@@ -22,11 +22,13 @@
 #include <utility>
 #include <vector>
 
+#include "clang/Basic/SourceLocation.h"
+
 #include "clang/Frontend/FrontendDiagnostic.h"
 
 #include "clang/Sema/SemaDiagnostic.h"
 
-#include "llvm/System/Path.h"
+#include "llvm/Support/Path.h"
 
 #include "os_sep.h"
 #include "slang_rs_backend.h"
@@ -164,7 +166,8 @@
 
   Diag.setDiagnosticMapping(
       clang::diag::ext_typecheck_convert_discards_qualifiers,
-      clang::diag::MAP_ERROR);
+      clang::diag::MAP_ERROR,
+      clang::SourceLocation());
 
   mDiagErrorInvalidOutputDepParameter =
       Diag.getCustomDiagID(clang::Diagnostic::Error,
diff --git a/slang_rs_context.cpp b/slang_rs_context.cpp
index 38315ac..1f7d533 100644
--- a/slang_rs_context.cpp
+++ b/slang_rs_context.cpp
@@ -21,6 +21,7 @@
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclBase.h"
+#include "clang/AST/Mangle.h"
 #include "clang/AST/Type.h"
 
 #include "clang/Basic/Linkage.h"
@@ -57,8 +58,7 @@
       mLLVMContext(llvm::getGlobalContext()),
       mLicenseNote(NULL),
       version(0),
-      mMangleCtx(*(new clang::CodeGen::MangleContext(Ctx,
-          *(&PP.getDiagnostics())))) {
+      mMangleCtx(Ctx.createMangleContext()) {
   slangAssert(mGeneratedFileNames && "Must supply GeneratedFileNames");
 
   // For #pragma rs export_type
diff --git a/slang_rs_context.h b/slang_rs_context.h
index 251790c..91b1aa1 100644
--- a/slang_rs_context.h
+++ b/slang_rs_context.h
@@ -23,8 +23,9 @@
 #include <string>
 
 #include "clang/Lex/Preprocessor.h"
-#include "Mangle.h"
+#include "clang/AST/Mangle.h"
 
+#include "llvm/ADT/OwningPtr.h"
 #include "llvm/ADT/StringSet.h"
 #include "llvm/ADT/StringMap.h"
 
@@ -79,7 +80,7 @@
   std::string mReflectJavaPathName;
 
   int version;
-  clang::CodeGen::MangleContext &mMangleCtx;
+  llvm::OwningPtr<clang::MangleContext> mMangleCtx;
 
   bool processExportVar(const clang::VarDecl *VD);
   bool processExportFunc(const clang::FunctionDecl *FD);
@@ -98,8 +99,8 @@
 
   inline clang::Preprocessor &getPreprocessor() const { return mPP; }
   inline clang::ASTContext &getASTContext() const { return mCtx; }
-  inline clang::CodeGen::MangleContext &getMangleContext() const {
-    return mMangleCtx;
+  inline clang::MangleContext &getMangleContext() const {
+    return *mMangleCtx;
   }
   inline const llvm::TargetData *getTargetData() const { return mTargetData; }
   inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; }
diff --git a/slang_rs_export_element.cpp b/slang_rs_export_element.cpp
index 9887f0b..1ebc655 100644
--- a/slang_rs_export_element.cpp
+++ b/slang_rs_export_element.cpp
@@ -94,7 +94,7 @@
                                    "your macro)");
       RSExportVectorType *EVT =
           RSExportVectorType::Create(Context,
-                                     static_cast<clang::ExtVectorType*>(
+                                     static_cast<const clang::ExtVectorType*>(
                                          T->getCanonicalTypeInternal()
                                              .getTypePtr()),
                                      TypeName,
diff --git a/slang_rs_export_func.h b/slang_rs_export_func.h
index cff3442..aedd3af 100644
--- a/slang_rs_export_func.h
+++ b/slang_rs_export_func.h
@@ -21,6 +21,9 @@
 #include <string>
 
 #include "llvm/ADT/StringRef.h"
+#include "llvm/Support/raw_ostream.h"
+
+#include "clang/AST/Decl.h"
 
 #include "slang_assert.h"
 #include "slang_rs_export_type.h"
@@ -58,10 +61,9 @@
     mShouldMangle = Context->getMangleContext().shouldMangleDeclName(FD);
 
     if (mShouldMangle) {
-      llvm::SmallString<256> Buffer;
-      Context->getMangleContext().mangleName(FD, Buffer);
-
-      mMangledName = Buffer.str();
+      llvm::raw_string_ostream BufStm(mMangledName);
+      Context->getMangleContext().mangleName(FD, BufStm);
+      BufStm.flush();
     }
 
     return;
diff --git a/slang_rs_export_type.cpp b/slang_rs_export_type.cpp
index 962958a..7171e88 100644
--- a/slang_rs_export_type.cpp
+++ b/slang_rs_export_type.cpp
@@ -132,7 +132,8 @@
 
   switch (T->getTypeClass()) {
     case clang::Type::Builtin: {
-      const clang::BuiltinType *BT = UNSAFE_CAST_TYPE(clang::BuiltinType, T);
+      const clang::BuiltinType *BT =
+        UNSAFE_CAST_TYPE(const clang::BuiltinType, T);
 
       switch (BT->getKind()) {
 #define ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname)  \
@@ -222,7 +223,8 @@
         return NULL;
       }
 
-      const clang::PointerType *PT = UNSAFE_CAST_TYPE(clang::PointerType, T);
+      const clang::PointerType *PT =
+        UNSAFE_CAST_TYPE(const clang::PointerType, T);
       const clang::Type *PointeeType = GET_POINTEE_TYPE(PT);
 
       if (PointeeType->getTypeClass() == clang::Type::Pointer)
@@ -238,7 +240,7 @@
     }
     case clang::Type::ExtVector: {
       const clang::ExtVectorType *EVT =
-          UNSAFE_CAST_TYPE(clang::ExtVectorType, T);
+          UNSAFE_CAST_TYPE(const clang::ExtVectorType, T);
       // Only vector with size 2, 3 and 4 are supported.
       if (EVT->getNumElements() < 2 || EVT->getNumElements() > 4)
         return NULL;
@@ -255,7 +257,7 @@
     }
     case clang::Type::ConstantArray: {
       const clang::ConstantArrayType *CAT =
-          UNSAFE_CAST_TYPE(clang::ConstantArrayType, T);
+          UNSAFE_CAST_TYPE(const clang::ConstantArrayType, T);
 
       return ConstantArrayTypeExportableHelper(CAT, SPS, Diags, SM, VD,
                                                TopLevelRecord);
@@ -339,7 +341,8 @@
 
   switch (T->getTypeClass()) {
     case clang::Type::Builtin: {
-      const clang::BuiltinType *BT = UNSAFE_CAST_TYPE(clang::BuiltinType, T);
+      const clang::BuiltinType *BT =
+        UNSAFE_CAST_TYPE(const clang::BuiltinType, T);
 
       switch (BT->getKind()) {
 #define ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname)  \
@@ -397,7 +400,7 @@
     }
     case clang::Type::ExtVector: {
       const clang::ExtVectorType *EVT =
-          UNSAFE_CAST_TYPE(clang::ExtVectorType, T);
+          UNSAFE_CAST_TYPE(const clang::ExtVectorType, T);
       return RSExportVectorType::GetTypeName(EVT);
       break;
     }
@@ -476,7 +479,7 @@
     }
     case clang::Type::Pointer: {
       ET = RSExportPointerType::Create(Context,
-                                       UNSAFE_CAST_TYPE(clang::PointerType, T),
+                                       UNSAFE_CAST_TYPE(const clang::PointerType, T),
                                        TypeName);
       // FIXME: free the name (allocated in RSExportType::GetTypeName)
       delete [] TypeName.data();
@@ -484,14 +487,14 @@
     }
     case clang::Type::ExtVector: {
       ET = RSExportVectorType::Create(Context,
-                                      UNSAFE_CAST_TYPE(clang::ExtVectorType, T),
+                                      UNSAFE_CAST_TYPE(const clang::ExtVectorType, T),
                                       TypeName);
       break;
     }
     case clang::Type::ConstantArray: {
       ET = RSExportConstantArrayType::Create(
               Context,
-              UNSAFE_CAST_TYPE(clang::ConstantArrayType, T));
+              UNSAFE_CAST_TYPE(const clang::ConstantArrayType, T));
       break;
     }
     default: {
@@ -694,7 +697,8 @@
 
   switch (T->getTypeClass()) {
     case clang::Type::Builtin: {
-      const clang::BuiltinType *BT = UNSAFE_CAST_TYPE(clang::BuiltinType, T);
+      const clang::BuiltinType *BT =
+        UNSAFE_CAST_TYPE(const clang::BuiltinType, T);
       switch (BT->getKind()) {
 #define ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname)  \
         case builtin_type: {                                  \
@@ -897,7 +901,7 @@
   if ((ElementType->getTypeClass() != clang::Type::Builtin))
     return llvm::StringRef();
 
-  const clang::BuiltinType *BT = UNSAFE_CAST_TYPE(clang::BuiltinType,
+  const clang::BuiltinType *BT = UNSAFE_CAST_TYPE(const clang::BuiltinType,
                                                   ElementType);
   if ((EVT->getNumElements() < 1) ||
       (EVT->getNumElements() > 4))
@@ -1150,7 +1154,7 @@
                              TypeName,
                              RD->hasAttr<clang::PackedAttr>(),
                              mIsArtificial,
-                             (RL->getSize() >> 3));
+                             (RL->getSize() / 8).getQuantity());
   unsigned int Index = 0;
 
   for (clang::RecordDecl::field_iterator FI = RD->field_begin(),
diff --git a/slang_rs_object_ref_count.cpp b/slang_rs_object_ref_count.cpp
index 4ae79b9..090f12b 100644
--- a/slang_rs_object_ref_count.cpp
+++ b/slang_rs_object_ref_count.cpp
@@ -20,6 +20,7 @@
 
 #include "clang/AST/DeclGroup.h"
 #include "clang/AST/Expr.h"
+#include "clang/AST/NestedNameSpecifier.h"
 #include "clang/AST/OperationKinds.h"
 #include "clang/AST/Stmt.h"
 #include "clang/AST/StmtVisitor.h"
@@ -278,15 +279,18 @@
       new(C) clang::UnaryOperator(RefRSVar,
                                   clang::UO_AddrOf,
                                   ClearObjectFDArgType,
+                                  clang::VK_RValue,
+                                  clang::OK_Ordinary,
                                   Loc);
 
   clang::Expr *RefRSClearObjectFD =
       clang::DeclRefExpr::Create(C,
-                                 NULL,
-                                 ClearObjectFD->getQualifierRange(),
+                                 clang::NestedNameSpecifierLoc(),
                                  ClearObjectFD,
                                  ClearObjectFD->getLocation(),
-                                 ClearObjectFDType);
+                                 ClearObjectFDType,
+                                 clang::VK_RValue,
+                                 NULL);
 
   clang::Expr *RSClearObjectFP =
       clang::ImplicitCastExpr::Create(C,
@@ -302,6 +306,7 @@
                              &AddrRefRSVar,
                              1,
                              ClearObjectFD->getCallResultType(),
+                             clang::VK_RValue,
                              Loc);
 
   return RSClearObjectCall;
@@ -321,14 +326,12 @@
     clang::ASTContext &C,
     clang::DeclContext *DC,
     clang::Expr *RefRSStruct,
-    clang::SourceRange Range,
     clang::SourceLocation Loc);
 
 static clang::Stmt *ClearArrayRSObject(
     clang::ASTContext &C,
     clang::DeclContext *DC,
     clang::Expr *RefRSArr,
-    clang::SourceRange Range,
     clang::SourceLocation Loc) {
   const clang::Type *BaseType = RefRSArr->getType().getTypePtr();
   slangAssert(BaseType->isArrayType());
@@ -390,11 +393,12 @@
   // Init -> "rsIntIter = 0"
   clang::DeclRefExpr *RefrsIntIter =
       clang::DeclRefExpr::Create(C,
-                                 NULL,
-                                 Range,
+                                 clang::NestedNameSpecifierLoc(),
                                  IIVD,
                                  Loc,
-                                 C.IntTy);
+                                 C.IntTy,
+                                 clang::VK_RValue,
+                                 NULL);
 
   clang::Expr *Int0 = clang::IntegerLiteral::Create(C,
       llvm::APInt(C.getTypeSize(C.IntTy), 0), C.IntTy, Loc);
@@ -404,6 +408,8 @@
                                    Int0,
                                    clang::BO_Assign,
                                    C.IntTy,
+                                   clang::VK_RValue,
+                                   clang::OK_Ordinary,
                                    Loc);
 
   // Cond -> "rsIntIter < NumArrayElements"
@@ -415,6 +421,8 @@
                                    NumArrayElementsExpr,
                                    clang::BO_LT,
                                    C.IntTy,
+                                   clang::VK_RValue,
+                                   clang::OK_Ordinary,
                                    Loc);
 
   // Inc -> "rsIntIter++"
@@ -422,6 +430,8 @@
       new(C) clang::UnaryOperator(RefrsIntIter,
                                   clang::UO_PostInc,
                                   C.IntTy,
+                                  clang::VK_RValue,
+                                  clang::OK_Ordinary,
                                   Loc);
 
   // Body -> "rsClearObject(&VD[rsIntIter]);"
@@ -439,6 +449,8 @@
       new(C) clang::ArraySubscriptExpr(RefRSArrPtr,
                                        RefrsIntIter,
                                        BaseType->getCanonicalTypeInternal(),
+                                       clang::VK_RValue,
+                                       clang::OK_Ordinary,
                                        Loc);
 
   RSExportPrimitiveType::DataType DT =
@@ -447,10 +459,10 @@
   clang::Stmt *RSClearObjectCall = NULL;
   if (BaseType->isArrayType()) {
     RSClearObjectCall =
-        ClearArrayRSObject(C, DC, RefRSArrPtrSubscript, Range, Loc);
+        ClearArrayRSObject(C, DC, RefRSArrPtrSubscript, Loc);
   } else if (DT == RSExportPrimitiveType::DataTypeUnknown) {
     RSClearObjectCall =
-        ClearStructRSObject(C, DC, RefRSArrPtrSubscript, Range, Loc);
+        ClearStructRSObject(C, DC, RefRSArrPtrSubscript, Loc);
   } else {
     RSClearObjectCall = ClearSingleRSObject(C, RefRSArrPtrSubscript, Loc);
   }
@@ -514,7 +526,6 @@
     clang::ASTContext &C,
     clang::DeclContext *DC,
     clang::Expr *RefRSStruct,
-    clang::SourceRange Range,
     clang::SourceLocation Loc) {
   const clang::Type *BaseType = RefRSStruct->getType().getTypePtr();
 
@@ -559,13 +570,14 @@
           clang::MemberExpr::Create(C,
                                     RefRSStruct,
                                     false,
-                                    NULL,
-                                    Range,
+                                    clang::NestedNameSpecifierLoc(),
                                     FD,
                                     FoundDecl,
                                     clang::DeclarationNameInfo(),
                                     NULL,
-                                    OrigType->getCanonicalTypeInternal());
+                                    OrigType->getCanonicalTypeInternal(),
+                                    clang::VK_RValue,
+                                    clang::OK_Ordinary);
 
       slangAssert(StmtCount < FieldsToDestroy);
 
@@ -573,7 +585,6 @@
         StmtArray[StmtCount++] = ClearArrayRSObject(C,
                                                     DC,
                                                     RSObjectMember,
-                                                    Range,
                                                     Loc);
       } else {
         StmtArray[StmtCount++] = ClearSingleRSObject(C,
@@ -590,25 +601,24 @@
           clang::MemberExpr::Create(C,
                                     RefRSStruct,
                                     false,
-                                    NULL,
-                                    Range,
+                                    clang::NestedNameSpecifierLoc(),
                                     FD,
                                     FoundDecl,
                                     clang::DeclarationNameInfo(),
                                     NULL,
-                                    OrigType->getCanonicalTypeInternal());
+                                    OrigType->getCanonicalTypeInternal(),
+                                    clang::VK_RValue,
+                                    clang::OK_Ordinary);
 
       if (IsArrayType) {
         StmtArray[StmtCount++] = ClearArrayRSObject(C,
                                                     DC,
                                                     RSObjectMember,
-                                                    Range,
                                                     Loc);
       } else {
         StmtArray[StmtCount++] = ClearStructRSObject(C,
                                                      DC,
                                                      RSObjectMember,
-                                                     Range,
                                                      Loc);
       }
     }
@@ -640,11 +650,12 @@
 
   clang::Expr *RefRSSetObjectFD =
       clang::DeclRefExpr::Create(C,
-                                 NULL,
-                                 SetObjectFD->getQualifierRange(),
+                                 clang::NestedNameSpecifierLoc(),
                                  SetObjectFD,
                                  Loc,
-                                 SetObjectFDType);
+                                 SetObjectFDType,
+                                 clang::VK_RValue,
+                                 NULL);
 
   clang::Expr *RSSetObjectFP =
       clang::ImplicitCastExpr::Create(C,
@@ -658,6 +669,8 @@
   ArgList[0] = new(C) clang::UnaryOperator(DstExpr,
                                            clang::UO_AddrOf,
                                            SetObjectFDArgType[0],
+                                           clang::VK_RValue,
+                                           clang::OK_Ordinary,
                                            Loc);
   ArgList[1] = SrcExpr;
 
@@ -667,6 +680,7 @@
                              ArgList,
                              2,
                              SetObjectFD->getCallResultType(),
+                             clang::VK_RValue,
                              Loc);
 
   return RSSetObjectCall;
@@ -684,7 +698,6 @@
                                            clang::Expr *SrcArr,
                                            clang::SourceLocation Loc) {
   clang::DeclContext *DC = NULL;
-  clang::SourceRange Range;
   const clang::Type *BaseType = DstArr->getType().getTypePtr();
   slangAssert(BaseType->isArrayType());
 
@@ -722,11 +735,12 @@
   // Init -> "rsIntIter = 0"
   clang::DeclRefExpr *RefrsIntIter =
       clang::DeclRefExpr::Create(C,
-                                 NULL,
-                                 Range,
+                                 clang::NestedNameSpecifierLoc(),
                                  IIVD,
                                  Loc,
-                                 C.IntTy);
+                                 C.IntTy,
+                                 clang::VK_RValue,
+                                 NULL);
 
   clang::Expr *Int0 = clang::IntegerLiteral::Create(C,
       llvm::APInt(C.getTypeSize(C.IntTy), 0), C.IntTy, Loc);
@@ -736,6 +750,8 @@
                                    Int0,
                                    clang::BO_Assign,
                                    C.IntTy,
+                                   clang::VK_RValue,
+                                   clang::OK_Ordinary,
                                    Loc);
 
   // Cond -> "rsIntIter < NumArrayElements"
@@ -747,6 +763,8 @@
                                    NumArrayElementsExpr,
                                    clang::BO_LT,
                                    C.IntTy,
+                                   clang::VK_RValue,
+                                   clang::OK_Ordinary,
                                    Loc);
 
   // Inc -> "rsIntIter++"
@@ -754,6 +772,8 @@
       new(C) clang::UnaryOperator(RefrsIntIter,
                                   clang::UO_PostInc,
                                   C.IntTy,
+                                  clang::VK_RValue,
+                                  clang::OK_Ordinary,
                                   Loc);
 
   // Body -> "rsSetObject(&Dst[rsIntIter], Src[rsIntIter]);"
@@ -771,6 +791,8 @@
       new(C) clang::ArraySubscriptExpr(DstArrPtr,
                                        RefrsIntIter,
                                        BaseType->getCanonicalTypeInternal(),
+                                       clang::VK_RValue,
+                                       clang::OK_Ordinary,
                                        Loc);
 
   clang::Expr *SrcArrPtr =
@@ -785,6 +807,8 @@
       new(C) clang::ArraySubscriptExpr(SrcArrPtr,
                                        RefrsIntIter,
                                        BaseType->getCanonicalTypeInternal(),
+                                       clang::VK_RValue,
+                                       clang::OK_Ordinary,
                                        Loc);
 
   RSExportPrimitiveType::DataType DT =
@@ -827,7 +851,6 @@
                                             clang::Expr *LHS,
                                             clang::Expr *RHS,
                                             clang::SourceLocation Loc) {
-  clang::SourceRange Range;
   clang::QualType QT = LHS->getType();
   const clang::Type *T = QT.getTypePtr();
   slangAssert(T->isStructureType());
@@ -864,25 +887,27 @@
         clang::MemberExpr::Create(C,
                                   LHS,
                                   false,
-                                  NULL,
-                                  Range,
+                                  clang::NestedNameSpecifierLoc(),
                                   FD,
                                   FoundDecl,
                                   clang::DeclarationNameInfo(),
                                   NULL,
-                                  OrigType->getCanonicalTypeInternal());
+                                  OrigType->getCanonicalTypeInternal(),
+                                  clang::VK_RValue,
+                                  clang::OK_Ordinary);
 
     clang::MemberExpr *SrcMember =
         clang::MemberExpr::Create(C,
                                   RHS,
                                   false,
-                                  NULL,
-                                  Range,
+                                  clang::NestedNameSpecifierLoc(),
                                   FD,
                                   FoundDecl,
                                   clang::DeclarationNameInfo(),
                                   NULL,
-                                  OrigType->getCanonicalTypeInternal());
+                                  OrigType->getCanonicalTypeInternal(),
+                                  clang::VK_RValue,
+                                  clang::OK_Ordinary);
 
     if (FT->isArrayType()) {
       FT = FT->getArrayElementTypeNoTypeQual();
@@ -916,7 +941,8 @@
   // we just do a straight-up assignment (which will still preserve all
   // the proper RS object reference counts).
   clang::BinaryOperator *CopyStruct =
-      new(C) clang::BinaryOperator(LHS, RHS, clang::BO_Assign, QT, Loc);
+      new(C) clang::BinaryOperator(LHS, RHS, clang::BO_Assign, QT,
+                                   clang::VK_RValue, clang::OK_Ordinary, Loc);
   StmtArray[StmtCount++] = CopyStruct;
 
   clang::CompoundStmt *CS =
@@ -976,11 +1002,12 @@
     const clang::Type *T = RSExportType::GetTypeOfDecl(VD);
     clang::DeclRefExpr *RefRSVar =
         clang::DeclRefExpr::Create(C,
-                                   NULL,
-                                   VD->getQualifierRange(),
+                                   clang::NestedNameSpecifierLoc(),
                                    VD,
                                    Loc,
-                                   T->getCanonicalTypeInternal());
+                                   T->getCanonicalTypeInternal(),
+                                   clang::VK_RValue,
+                                   NULL);
 
     clang::Stmt *RSSetObjectOps =
         CreateStructRSSetObject(C, Diags, RefRSVar, InitExpr, Loc);
@@ -1000,11 +1027,12 @@
 
   clang::Expr *RefRSSetObjectFD =
       clang::DeclRefExpr::Create(C,
-                                 NULL,
-                                 SetObjectFD->getQualifierRange(),
+                                 clang::NestedNameSpecifierLoc(),
                                  SetObjectFD,
                                  Loc,
-                                 SetObjectFDType);
+                                 SetObjectFDType,
+                                 clang::VK_RValue,
+                                 NULL);
 
   clang::Expr *RSSetObjectFP =
       clang::ImplicitCastExpr::Create(C,
@@ -1017,16 +1045,19 @@
   const clang::Type *T = RSExportType::GetTypeOfDecl(VD);
   clang::DeclRefExpr *RefRSVar =
       clang::DeclRefExpr::Create(C,
-                                 NULL,
-                                 VD->getQualifierRange(),
+                                 clang::NestedNameSpecifierLoc(),
                                  VD,
                                  Loc,
-                                 T->getCanonicalTypeInternal());
+                                 T->getCanonicalTypeInternal(),
+                                 clang::VK_RValue,
+                                 NULL);
 
   clang::Expr *ArgList[2];
   ArgList[0] = new(C) clang::UnaryOperator(RefRSVar,
                                            clang::UO_AddrOf,
                                            SetObjectFDArgType[0],
+                                           clang::VK_RValue,
+                                           clang::OK_Ordinary,
                                            Loc);
   ArgList[1] = InitExpr;
 
@@ -1036,6 +1067,7 @@
                              ArgList,
                              2,
                              SetObjectFD->getCallResultType(),
+                             clang::VK_RValue,
                              Loc);
 
   AppendAfterStmt(C, mCS, DS, RSSetObjectCall);
@@ -1065,21 +1097,21 @@
   slangAssert(VD);
   clang::ASTContext &C = VD->getASTContext();
   clang::DeclContext *DC = VD->getDeclContext();
-  clang::SourceRange Range = VD->getQualifierRange();
   clang::SourceLocation Loc = VD->getLocation();
   const clang::Type *T = RSExportType::GetTypeOfDecl(VD);
 
   // Reference expr to target RS object variable
   clang::DeclRefExpr *RefRSVar =
       clang::DeclRefExpr::Create(C,
-                                 NULL,
-                                 Range,
+                                 clang::NestedNameSpecifierLoc(),
                                  VD,
                                  Loc,
-                                 T->getCanonicalTypeInternal());
+                                 T->getCanonicalTypeInternal(),
+                                 clang::VK_RValue,
+                                 NULL);
 
   if (T->isArrayType()) {
-    return ClearArrayRSObject(C, DC, RefRSVar, Range, Loc);
+    return ClearArrayRSObject(C, DC, RefRSVar, Loc);
   }
 
   RSExportPrimitiveType::DataType DT =
@@ -1087,7 +1119,7 @@
 
   if (DT == RSExportPrimitiveType::DataTypeUnknown ||
       DT == RSExportPrimitiveType::DataTypeIsStruct) {
-    return ClearStructRSObject(C, DC, RefRSVar, Range, Loc);
+    return ClearStructRSObject(C, DC, RefRSVar, Loc);
   }
 
   slangAssert((RSExportPrimitiveType::IsRSObjectType(DT)) &&
diff --git a/slang_rs_pragma_handler.cpp b/slang_rs_pragma_handler.cpp
index 2da2c9d..077ddab 100644
--- a/slang_rs_pragma_handler.cpp
+++ b/slang_rs_pragma_handler.cpp
@@ -90,7 +90,7 @@
     if (PragmaToken.isNot(clang::tok::l_paren))
       return;
 
-    while (PragmaToken.isNot(clang::tok::eom)) {
+    while (PragmaToken.isNot(clang::tok::eod)) {
       // Lex package name
       PP.LexUnexpandedToken(PragmaToken);
 
@@ -100,7 +100,7 @@
         PackageName.append(Spelling);
 
       // Pre-mature end (syntax error will be triggered by preprocessor later)
-      if (PragmaToken.is(clang::tok::eom) || PragmaToken.is(clang::tok::eof)) {
+      if (PragmaToken.is(clang::tok::eod) || PragmaToken.is(clang::tok::eof)) {
         break;
       } else {
         // Next token is ')' (end of pragma)
@@ -108,10 +108,10 @@
         if (NextTok.is(clang::tok::r_paren)) {
           mContext->addPragma(this->getName(), PackageName);
           mContext->setReflectJavaPackageName(PackageName);
-          // Lex until meets clang::tok::eom
+          // Lex until meets clang::tok::eod
           do {
             PP.LexUnexpandedToken(PragmaToken);
-          } while (PragmaToken.isNot(clang::tok::eom));
+          } while (PragmaToken.isNot(clang::tok::eod));
           break;
         }
       }
@@ -191,7 +191,7 @@
   if (PragmaToken.isNot(clang::tok::l_paren))
     return;
 
-  while (PragmaToken.isNot(clang::tok::eom)) {
+  while (PragmaToken.isNot(clang::tok::eod)) {
     // Lex variable name
     PP.LexUnexpandedToken(PragmaToken);
     if (PragmaToken.is(clang::tok::identifier))
@@ -199,7 +199,7 @@
     else
       break;
 
-    slangAssert(PragmaToken.isNot(clang::tok::eom));
+    slangAssert(PragmaToken.isNot(clang::tok::eod));
 
     PP.LexUnexpandedToken(PragmaToken);
 
@@ -217,9 +217,9 @@
   PP.LexUnexpandedToken(PragmaToken);
 
   // Should be end immediately
-  if (PragmaToken.isNot(clang::tok::eom))
+  if (PragmaToken.isNot(clang::tok::eod))
     fprintf(stderr, "RSPragmaHandler::handleNonParamPragma: "
-                    "expected a clang::tok::eom\n");
+                    "expected a clang::tok::eod\n");
   return;
 }
 
@@ -293,7 +293,7 @@
 
   do {
     PP.LexUnexpandedToken(PragmaToken);
-  } while (PragmaToken.isNot(clang::tok::eom));
+  } while (PragmaToken.isNot(clang::tok::eod));
 }
 
 }  // namespace slang
diff --git a/slang_utils.cpp b/slang_utils.cpp
index a029166..342496f 100644
--- a/slang_utils.cpp
+++ b/slang_utils.cpp
@@ -18,7 +18,7 @@
 
 #include <string>
 
-#include "llvm/System/Path.h"
+#include "llvm/Support/Path.h"
 
 namespace slang {