Merge "Fix slang to compile with LLVM r275480"
am: 1689f351bf

Change-Id: I69f07fd5196534fcb7efc9a378557c0a4f546573
diff --git a/BitWriter_2_9/BitcodeWriter.cpp b/BitWriter_2_9/BitcodeWriter.cpp
index 5a905f8..caee7de 100644
--- a/BitWriter_2_9/BitcodeWriter.cpp
+++ b/BitWriter_2_9/BitcodeWriter.cpp
@@ -479,10 +479,10 @@
     Vals.push_back(GV.hasSection() ? SectionMap[GV.getSection()] : 0);
     if (GV.isThreadLocal() ||
         GV.getVisibility() != GlobalValue::DefaultVisibility ||
-        GV.hasUnnamedAddr()) {
+        GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None) {
       Vals.push_back(getEncodedVisibility(GV));
       Vals.push_back(GV.isThreadLocal());
-      Vals.push_back(GV.hasUnnamedAddr());
+      Vals.push_back(GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);
     } else {
       AbbrevToUse = SimpleGVarAbbrev;
     }
@@ -504,7 +504,7 @@
     Vals.push_back(F.hasSection() ? SectionMap[F.getSection()] : 0);
     Vals.push_back(getEncodedVisibility(F));
     Vals.push_back(F.hasGC() ? GCMap[F.getGC()] : 0);
-    Vals.push_back(F.hasUnnamedAddr());
+    Vals.push_back(F.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);
 
     unsigned AbbrevToUse = 0;
     Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse);
@@ -609,7 +609,7 @@
   if (VE.hasMDString()) {
     // Abbrev for METADATA_STRING.
     BitCodeAbbrev *Abbv = new BitCodeAbbrev();
-    Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING));
+    Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING_OLD));
     Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
     Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
     MDSAbbrev = Stream.EmitAbbrev(Abbv);
@@ -667,7 +667,7 @@
     Record.append(MDS->bytes_begin(), MDS->bytes_end());
 
     // Emit the finished record.
-    Stream.EmitRecord(bitc::METADATA_STRING, Record, MDSAbbrev);
+    Stream.EmitRecord(bitc::METADATA_STRING_OLD, Record, MDSAbbrev);
     Record.clear();
   }
 
diff --git a/BitWriter_2_9_func/BitcodeWriter.cpp b/BitWriter_2_9_func/BitcodeWriter.cpp
index 4ef7ac2..3ed3380 100644
--- a/BitWriter_2_9_func/BitcodeWriter.cpp
+++ b/BitWriter_2_9_func/BitcodeWriter.cpp
@@ -122,13 +122,13 @@
 static unsigned GetEncodedOrdering(AtomicOrdering Ordering) {
   switch (Ordering) {
   default: llvm_unreachable("Unknown atomic ordering");
-  case NotAtomic: return bitc::ORDERING_NOTATOMIC;
-  case Unordered: return bitc::ORDERING_UNORDERED;
-  case Monotonic: return bitc::ORDERING_MONOTONIC;
-  case Acquire: return bitc::ORDERING_ACQUIRE;
-  case Release: return bitc::ORDERING_RELEASE;
-  case AcquireRelease: return bitc::ORDERING_ACQREL;
-  case SequentiallyConsistent: return bitc::ORDERING_SEQCST;
+  case AtomicOrdering::NotAtomic: return bitc::ORDERING_NOTATOMIC;
+  case AtomicOrdering::Unordered: return bitc::ORDERING_UNORDERED;
+  case AtomicOrdering::Monotonic: return bitc::ORDERING_MONOTONIC;
+  case AtomicOrdering::Acquire: return bitc::ORDERING_ACQUIRE;
+  case AtomicOrdering::Release: return bitc::ORDERING_RELEASE;
+  case AtomicOrdering::AcquireRelease: return bitc::ORDERING_ACQREL;
+  case AtomicOrdering::SequentiallyConsistent: return bitc::ORDERING_SEQCST;
   }
 }
 
@@ -477,10 +477,10 @@
     Vals.push_back(GV.hasSection() ? SectionMap[GV.getSection()] : 0);
     if (GV.isThreadLocal() ||
         GV.getVisibility() != GlobalValue::DefaultVisibility ||
-        GV.hasUnnamedAddr()) {
+        GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None) {
       Vals.push_back(getEncodedVisibility(GV));
       Vals.push_back(GV.isThreadLocal());
-      Vals.push_back(GV.hasUnnamedAddr());
+      Vals.push_back(GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);
     } else {
       AbbrevToUse = SimpleGVarAbbrev;
     }
@@ -502,7 +502,7 @@
     Vals.push_back(F.hasSection() ? SectionMap[F.getSection()] : 0);
     Vals.push_back(getEncodedVisibility(F));
     Vals.push_back(F.hasGC() ? GCMap[F.getGC()] : 0);
-    Vals.push_back(F.hasUnnamedAddr());
+    Vals.push_back(F.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);
 
     unsigned AbbrevToUse = 0;
     Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse);
@@ -607,7 +607,7 @@
   if (VE.hasMDString()) {
     // Abbrev for METADATA_STRING.
     BitCodeAbbrev *Abbv = new BitCodeAbbrev();
-    Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING));
+    Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING_OLD));
     Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
     Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
     MDSAbbrev = Stream.EmitAbbrev(Abbv);
@@ -665,7 +665,7 @@
     Record.append(MDS->bytes_begin(), MDS->bytes_end());
 
     // Emit the finished record.
-    Stream.EmitRecord(bitc::METADATA_STRING, Record, MDSAbbrev);
+    Stream.EmitRecord(bitc::METADATA_STRING_OLD, Record, MDSAbbrev);
     Record.clear();
   }
 
diff --git a/BitWriter_3_2/BitcodeWriter.cpp b/BitWriter_3_2/BitcodeWriter.cpp
index 7618198..c57dd45 100644
--- a/BitWriter_3_2/BitcodeWriter.cpp
+++ b/BitWriter_3_2/BitcodeWriter.cpp
@@ -121,13 +121,13 @@
 
 static unsigned GetEncodedOrdering(AtomicOrdering Ordering) {
   switch (Ordering) {
-  case NotAtomic: return bitc::ORDERING_NOTATOMIC;
-  case Unordered: return bitc::ORDERING_UNORDERED;
-  case Monotonic: return bitc::ORDERING_MONOTONIC;
-  case Acquire: return bitc::ORDERING_ACQUIRE;
-  case Release: return bitc::ORDERING_RELEASE;
-  case AcquireRelease: return bitc::ORDERING_ACQREL;
-  case SequentiallyConsistent: return bitc::ORDERING_SEQCST;
+  case AtomicOrdering::NotAtomic: return bitc::ORDERING_NOTATOMIC;
+  case AtomicOrdering::Unordered: return bitc::ORDERING_UNORDERED;
+  case AtomicOrdering::Monotonic: return bitc::ORDERING_MONOTONIC;
+  case AtomicOrdering::Acquire: return bitc::ORDERING_ACQUIRE;
+  case AtomicOrdering::Release: return bitc::ORDERING_RELEASE;
+  case AtomicOrdering::AcquireRelease: return bitc::ORDERING_ACQREL;
+  case AtomicOrdering::SequentiallyConsistent: return bitc::ORDERING_SEQCST;
   }
   llvm_unreachable("Invalid ordering");
 }
@@ -490,10 +490,11 @@
     Vals.push_back(GV.hasSection() ? SectionMap[GV.getSection()] : 0);
     if (GV.isThreadLocal() ||
         GV.getVisibility() != GlobalValue::DefaultVisibility ||
-        GV.hasUnnamedAddr() || GV.isExternallyInitialized()) {
+        GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
+        GV.isExternallyInitialized()) {
       Vals.push_back(getEncodedVisibility(GV));
       Vals.push_back(getEncodedThreadLocalMode(GV));
-      Vals.push_back(GV.hasUnnamedAddr());
+      Vals.push_back(GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);
       Vals.push_back(GV.isExternallyInitialized());
     } else {
       AbbrevToUse = SimpleGVarAbbrev;
@@ -516,7 +517,7 @@
     Vals.push_back(F.hasSection() ? SectionMap[F.getSection()] : 0);
     Vals.push_back(getEncodedVisibility(F));
     Vals.push_back(F.hasGC() ? GCMap[F.getGC()] : 0);
-    Vals.push_back(F.hasUnnamedAddr());
+    Vals.push_back(F.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);
 
     unsigned AbbrevToUse = 0;
     Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse);
@@ -636,7 +637,7 @@
   if (VE.hasMDString()) {
     // Abbrev for METADATA_STRING.
     BitCodeAbbrev *Abbv = new BitCodeAbbrev();
-    Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING));
+    Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING_OLD));
     Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
     Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
     MDSAbbrev = Stream.EmitAbbrev(Abbv);
@@ -694,7 +695,7 @@
     Record.append(MDS->bytes_begin(), MDS->bytes_end());
 
     // Emit the finished record.
-    Stream.EmitRecord(bitc::METADATA_STRING, Record, MDSAbbrev);
+    Stream.EmitRecord(bitc::METADATA_STRING_OLD, Record, MDSAbbrev);
     Record.clear();
   }
 
diff --git a/llvm-rs-as.cpp b/llvm-rs-as.cpp
index 5f3a901..95f19ee 100644
--- a/llvm-rs-as.cpp
+++ b/llvm-rs-as.cpp
@@ -103,9 +103,9 @@
 
 int main(int argc, char **argv) {
   // Print a stack trace if we signal out.
-  sys::PrintStackTraceOnErrorSignal();
+  sys::PrintStackTraceOnErrorSignal(argv[0]);
   PrettyStackTraceProgram X(argc, argv);
-  LLVMContext &Context = getGlobalContext();
+  LLVMContext Context;
   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
   cl::ParseCommandLineOptions(argc, argv, "llvm .ll -> .bc assembler\n");
 
diff --git a/llvm-rs-cc.cpp b/llvm-rs-cc.cpp
index 5da6315..2a2e486 100644
--- a/llvm-rs-cc.cpp
+++ b/llvm-rs-cc.cpp
@@ -33,6 +33,7 @@
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/StringSaver.h"
+#include "llvm/Support/TargetSelect.h"
 #include "llvm/Target/TargetMachine.h"
 
 #include "os_sep.h"
diff --git a/slang.cpp b/slang.cpp
index 516144d..aaac196 100644
--- a/slang.cpp
+++ b/slang.cpp
@@ -86,8 +86,8 @@
 
 namespace {
 
-static const char *kRSTriple32 = "armv7-none-linux-gnueabi";
-static const char *kRSTriple64 = "aarch64-none-linux-gnueabi";
+static const char *kRSTriple32 = "renderscript32-none-linux-gnueabi";
+static const char *kRSTriple64 = "renderscript64-none-linux-gnueabi";
 
 }  // namespace
 
@@ -124,6 +124,10 @@
 // bcc.cpp)
 const llvm::StringRef Slang::PragmaMetadataName = "#pragma";
 
+static llvm::LLVMContext globalContext;
+
+llvm::LLVMContext &getGlobalLLVMContext() { return globalContext; }
+
 static inline llvm::tool_output_file *
 OpenOutputFile(const char *OutputFile,
                llvm::sys::fs::OpenFlags Flags,
@@ -149,15 +153,10 @@
 }
 
 void Slang::createTarget(uint32_t BitWidth) {
-  std::vector<std::string> features;
-
   if (BitWidth == 64) {
     mTargetOpts->Triple = kRSTriple64;
   } else {
     mTargetOpts->Triple = kRSTriple32;
-    // Treat long as a 64-bit type for our 32-bit RS code.
-    features.push_back("+long64");
-    mTargetOpts->FeaturesAsWritten = features;
   }
 
   mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagEngine,
@@ -253,7 +252,7 @@
   LangOpts.RTTI = 0;  // Turn off the RTTI information support
   LangOpts.LineComment = 1;
   LangOpts.C99 = 1;
-  LangOpts.Renderscript = 1;
+  LangOpts.RenderScript = 1;
   LangOpts.LaxVectorConversions = 0;  // Do not bitcast vectors!
   LangOpts.CharIsSigned = 1;  // Signed char is our default.
 
@@ -439,9 +438,9 @@
 
 void Slang::setDebugMetadataEmission(bool EmitDebug) {
   if (EmitDebug)
-    CodeGenOpts.setDebugInfo(clang::CodeGenOptions::FullDebugInfo);
+    CodeGenOpts.setDebugInfo(clang::codegenoptions::FullDebugInfo);
   else
-    CodeGenOpts.setDebugInfo(clang::CodeGenOptions::NoDebugInfo);
+    CodeGenOpts.setDebugInfo(clang::codegenoptions::NoDebugInfo);
 }
 
 void Slang::setOptimizationLevel(llvm::CodeGenOpt::Level OptimizationLevel) {
diff --git a/slang.h b/slang.h
index faf6f8a..fcff79a 100644
--- a/slang.h
+++ b/slang.h
@@ -72,6 +72,8 @@
 class RSContext;
 class RSExportRecordType;
 
+llvm::LLVMContext &getGlobalLLVMContext();
+
 class Slang : public clang::ModuleLoader {
  public:
   enum OutputType {
diff --git a/slang_backend.cpp b/slang_backend.cpp
index 81de4fd..b9999d5 100644
--- a/slang_backend.cpp
+++ b/slang_backend.cpp
@@ -95,11 +95,7 @@
     llvm::PassManagerBuilder PMBuilder;
     PMBuilder.OptLevel = mCodeGenOpts.OptimizationLevel;
     PMBuilder.SizeLevel = mCodeGenOpts.OptimizeSize;
-    if (mCodeGenOpts.UnitAtATime) {
-      PMBuilder.DisableUnitAtATime = 0;
-    } else {
-      PMBuilder.DisableUnitAtATime = 1;
-    }
+    PMBuilder.DisableUnitAtATime = 0; // TODO Pirama confirm if this is right
 
     if (mCodeGenOpts.UnrollLoops) {
       PMBuilder.DisableUnrollLoops = 0;
@@ -226,7 +222,7 @@
       mRefCount(mContext->getASTContext()),
       mASTChecker(Context, Context->getTargetAPI(), IsFilterscript),
       mForEachHandler(Context),
-      mLLVMContext(llvm::getGlobalContext()), mDiagEngine(*DiagEngine),
+      mLLVMContext(slang::getGlobalLLVMContext()), mDiagEngine(*DiagEngine),
       mCodeGenOpts(CodeGenOpts), mPragmas(Pragmas) {
   mGen = CreateLLVMCodeGen(mDiagEngine, "", HeaderSearchOpts, PreprocessorOpts,
       mCodeGenOpts, mLLVMContext);
@@ -432,7 +428,7 @@
     if (getTargetAPI() >= SLANG_FEATURE_SINGLE_SOURCE_API) {
       if (FD && FD->hasBody() &&
           !Slang::IsLocInRSHeaderFile(FD->getLocation(), mSourceMgr)) {
-        if (FD->hasAttr<clang::KernelAttr>()) {
+        if (FD->hasAttr<clang::RenderScriptKernelAttr>()) {
           // Log functions with attribute "kernel" by their names, and assign
           // them slot numbers. Any other function cannot be used in a
           // rsForEach() or rsForEachWithOptions() call, including old-style
@@ -537,7 +533,7 @@
             static_cast<const RSExportPrimitiveType*>(ET);
         ExportVarInfo.push_back(
             llvm::MDString::get(
-              mLLVMContext, llvm::utostr_32(PT->getType())));
+              mLLVMContext, llvm::utostr(PT->getType())));
         if (PT->isRSObjectType()) {
           countsAsRSObject = true;
         }
@@ -553,7 +549,7 @@
       case RSExportType::ExportClassMatrix: {
         ExportVarInfo.push_back(
             llvm::MDString::get(
-              mLLVMContext, llvm::utostr_32(
+              mLLVMContext, llvm::utostr(
                   /* TODO Strange value.  This pushes just a number, quite
                    * different than the other cases.  What is this used for?
                    * These are the metadata values that some partner drivers
@@ -586,7 +582,7 @@
 
     if (countsAsRSObject) {
       mRSObjectSlotsMetadata->addOperand(llvm::MDNode::get(mLLVMContext,
-          llvm::MDString::get(mLLVMContext, llvm::utostr_32(slotCount))));
+          llvm::MDString::get(mLLVMContext, llvm::utostr(slotCount))));
     }
 
     slotCount++;
@@ -763,7 +759,7 @@
 
     ExportForEachInfo.push_back(
         llvm::MDString::get(mLLVMContext,
-                            llvm::utostr_32(EFE->getSignatureMetadata())));
+                            llvm::utostr(EFE->getSignatureMetadata())));
 
     mExportForEachSignatureMetadata->addOperand(
         llvm::MDNode::get(mLLVMContext, ExportForEachInfo));
@@ -804,14 +800,14 @@
 
     addString(Idx++, (*I)->getNameReduce());
 
-    addOperand(Idx++, llvm::MDString::get(mLLVMContext, llvm::utostr_32((*I)->getAccumulatorTypeSize())));
+    addOperand(Idx++, llvm::MDString::get(mLLVMContext, llvm::utostr((*I)->getAccumulatorTypeSize())));
 
     llvm::SmallVector<llvm::Metadata *, 2> Accumulator;
     Accumulator.push_back(
       llvm::MDString::get(mLLVMContext, (*I)->getNameAccumulator()));
     Accumulator.push_back(llvm::MDString::get(
       mLLVMContext,
-      llvm::utostr_32((*I)->getAccumulatorSignatureMetadata())));
+      llvm::utostr((*I)->getAccumulatorSignatureMetadata())));
     addOperand(Idx++, llvm::MDTuple::get(mLLVMContext, Accumulator));
 
     addString(Idx++, (*I)->getNameInitializer(), false);
diff --git a/slang_rs_check_ast.cpp b/slang_rs_check_ast.cpp
index 52626bc..e417b62 100644
--- a/slang_rs_check_ast.cpp
+++ b/slang_rs_check_ast.cpp
@@ -151,29 +151,14 @@
     return;
   }
 
-  if (FD->hasAttr<clang::KernelAttr>()) {
-    // Validate that the kernel attribute is not used with static.
-    if (FD->getStorageClass() == clang::SC_Static) {
-      Context->ReportError(FD->getLocation(),
-                           "Invalid use of attribute kernel with "
-                           "static function declaration: %0")
-        << FD->getName();
-      mValid = false;
-    }
-
-    // We allow no arguments to the attribute, or an expected single
-    // argument. If there is an expected single argument, we verify
-    // that it is one of the recognized kernel kinds.
-    llvm::StringRef KernelKind =
-      FD->getAttr<clang::KernelAttr>()->getKernelKind();
-
-    if (!KernelKind.empty()) {
-      Context->ReportError(FD->getLocation(),
-                           "Unknown kernel attribute argument '%0' "
-                           "in declaration of function '%1'")
-        << KernelKind << FD->getName();
-      mValid = false;
-    }
+  // Validate that the kernel attribute is not used with static.
+  if (FD->hasAttr<clang::RenderScriptKernelAttr>() &&
+      FD->getStorageClass() == clang::SC_Static) {
+    Context->ReportError(FD->getLocation(),
+                         "Invalid use of attribute kernel with "
+                         "static function declaration: %0")
+      << FD->getName();
+    mValid = false;
   }
 
   clang::QualType resultType = FD->getReturnType().getCanonicalType();
diff --git a/slang_rs_context.cpp b/slang_rs_context.cpp
index 0e3ee53..53da2ef 100644
--- a/slang_rs_context.cpp
+++ b/slang_rs_context.cpp
@@ -57,8 +57,8 @@
       mPragmas(Pragmas),
       mTargetAPI(TargetAPI),
       mVerbose(Verbose),
-      mDataLayout(nullptr),
-      mLLVMContext(llvm::getGlobalContext()),
+      mDataLayout(Target.getDataLayout()),
+      mLLVMContext(slang::getGlobalLLVMContext()),
       mLicenseNote(nullptr),
       mRSPackageName("android.renderscript"),
       version(0),
@@ -69,7 +69,7 @@
   AddPragmaHandlers(PP, this);
 
   // Prepare target data
-  mDataLayout = new llvm::DataLayout(Target.getDataLayoutString());
+  // mDataLayout = Target.getDataLayout();
 
   // Reserve slot 0 for the root kernel.
   mExportForEach.push_back(nullptr);
@@ -134,7 +134,7 @@
     }
 
     // New-style kernels with attribute "kernel" should come first in the list
-    if (FD->hasAttr<clang::KernelAttr>()) {
+    if (FD->hasAttr<clang::RenderScriptKernelAttr>()) {
       mFirstOldStyleKernel = mExportForEach.insert(mFirstOldStyleKernel, EFE) + 1;
       slangAssert((mTargetAPI < SLANG_FEATURE_SINGLE_SOURCE_API ||
                    getForEachSlotNumber(FD->getName()) ==
@@ -401,7 +401,6 @@
 
 RSContext::~RSContext() {
   delete mLicenseNote;
-  delete mDataLayout;
   for (ExportableList::iterator I = mExportables.begin(),
           E = mExportables.end();
        I != E;
diff --git a/slang_rs_context.h b/slang_rs_context.h
index e6b4e8c..ff6cdac 100644
--- a/slang_rs_context.h
+++ b/slang_rs_context.h
@@ -85,7 +85,7 @@
   unsigned int mTargetAPI;
   bool mVerbose;
 
-  llvm::DataLayout *mDataLayout;
+  const llvm::DataLayout &mDataLayout;
   llvm::LLVMContext &mLLVMContext;
 
   ExportableList mExportables;
@@ -146,7 +146,7 @@
   inline clang::MangleContext &getMangleContext() const {
     return *mMangleCtx;
   }
-  inline const llvm::DataLayout *getDataLayout() const { return mDataLayout; }
+  inline const llvm::DataLayout &getDataLayout() const { return mDataLayout; }
   inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; }
   inline const clang::SourceManager *getSourceManager() const {
     return &mPP.getSourceManager();
diff --git a/slang_rs_export_foreach.cpp b/slang_rs_export_foreach.cpp
index f7483e3..67b178e 100644
--- a/slang_rs_export_foreach.cpp
+++ b/slang_rs_export_foreach.cpp
@@ -73,7 +73,7 @@
   mResultType = FD->getReturnType().getCanonicalType();
   // Compute kernel functions are defined differently when the
   // "__attribute__((kernel))" is set.
-  if (FD->hasAttr<clang::KernelAttr>()) {
+  if (FD->hasAttr<clang::RenderScriptKernelAttr>()) {
     valid &= validateAndConstructKernelParams(Context, FD);
   } else {
     valid &= validateAndConstructOldStyleParams(Context, FD);
@@ -434,8 +434,8 @@
   }
 
   // Anything tagged as a kernel("") is definitely used with ForEach.
-  if (auto *Kernel = FD->getAttr<clang::KernelAttr>()) {
-    return Kernel->getKernelKind().empty();
+  if (FD->hasAttr<clang::RenderScriptKernelAttr>()) {
+    return true;
   }
 
   if (RSSpecialFunc::isGraphicsRootRSFunc(targetAPI, FD)) {
@@ -469,7 +469,7 @@
 unsigned RSExportForEach::getNumInputs(unsigned int targetAPI,
                                        const clang::FunctionDecl *FD) {
   unsigned numInputs = 0;
-  for (const clang::ParmVarDecl* param : FD->params()) {
+  for (const clang::ParmVarDecl* param : FD->parameters()) {
     if (!isSpecialKernelParameter(param->getName())) {
       numInputs++;
     }
diff --git a/slang_rs_export_func.cpp b/slang_rs_export_func.cpp
index 519ac59..7803908 100644
--- a/slang_rs_export_func.cpp
+++ b/slang_rs_export_func.cpp
@@ -138,7 +138,7 @@
     return false;
 
   const llvm::StructLayout *ParamTySL =
-      getRSContext()->getDataLayout()->getStructLayout(ParamTy);
+      getRSContext()->getDataLayout().getStructLayout(ParamTy);
 
   unsigned Index = 0;
   for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(),
@@ -161,7 +161,7 @@
 
     // Check size
     size_t T1Size = F->getType()->getAllocSize();
-    size_t T2Size = getRSContext()->getDataLayout()->getTypeAllocSize(T2);
+    size_t T2Size = getRSContext()->getDataLayout().getTypeAllocSize(T2);
 
     if (T1Size != T2Size)
       return false;
diff --git a/slang_rs_export_type.cpp b/slang_rs_export_type.cpp
index 7d07130..f229b44 100644
--- a/slang_rs_export_type.cpp
+++ b/slang_rs_export_type.cpp
@@ -937,11 +937,11 @@
 }
 
 size_t RSExportType::getStoreSize() const {
-  return getRSContext()->getDataLayout()->getTypeStoreSize(getLLVMType());
+  return getRSContext()->getDataLayout().getTypeStoreSize(getLLVMType());
 }
 
 size_t RSExportType::getAllocSize() const {
-    return getRSContext()->getDataLayout()->getTypeAllocSize(getLLVMType());
+    return getRSContext()->getDataLayout().getTypeAllocSize(getLLVMType());
 }
 
 RSExportType::RSExportType(RSContext *Context,
diff --git a/slang_rs_foreach_lowering.cpp b/slang_rs_foreach_lowering.cpp
index 6e9991e..743833d 100644
--- a/slang_rs_foreach_lowering.cpp
+++ b/slang_rs_foreach_lowering.cpp
@@ -385,7 +385,7 @@
                                            unsigned int targetAPI) {
   slangAssert(FD && FD->hasBody());
 
-  mInsideKernel = FD->hasAttr<clang::KernelAttr>();
+  mInsideKernel = FD->hasAttr<clang::RenderScriptKernelAttr>();
   VisitStmt(FD->getBody());
 }
 
diff --git a/slang_rs_reflection.cpp b/slang_rs_reflection.cpp
index da55705..2c48c24 100644
--- a/slang_rs_reflection.cpp
+++ b/slang_rs_reflection.cpp
@@ -1980,7 +1980,7 @@
       Level++;
     }
     std::string IndexVarName("ct");
-    IndexVarName.append(llvm::utostr_32(Level));
+    IndexVarName.append(llvm::utostr(Level));
 
     mOut.indent() << "for (int " << IndexVarName << " = 0; " << IndexVarName
                   << " < " << ECAT->getNumElement() << "; " << IndexVarName << "++)";
diff --git a/slang_rs_reflection_cpp.cpp b/slang_rs_reflection_cpp.cpp
index e0a78f2..4c59073 100644
--- a/slang_rs_reflection_cpp.cpp
+++ b/slang_rs_reflection_cpp.cpp
@@ -789,7 +789,7 @@
     Level++;
   }
   std::string IndexVarName("ct");
-  IndexVarName.append(llvm::utostr_32(Level));
+  IndexVarName.append(llvm::utostr(Level));
 
   C.indent() << "for (int " << IndexVarName << " = 0; " <<
                       IndexVarName << " < " << ECAT->getSize() << "; " <<
diff --git a/slang_rs_special_func.cpp b/slang_rs_special_func.cpp
index 56ae590..e89b83a 100644
--- a/slang_rs_special_func.cpp
+++ b/slang_rs_special_func.cpp
@@ -26,7 +26,7 @@
 
 bool RSSpecialFunc::isGraphicsRootRSFunc(unsigned int targetAPI,
                                          const clang::FunctionDecl *FD) {
-  if (FD->hasAttr<clang::KernelAttr>()) {
+  if (FD->hasAttr<clang::RenderScriptKernelAttr>()) {
     return false;
   }
 
diff --git a/tests/F_kernel_badattr/stderr.txt.expect b/tests/F_kernel_badattr/stderr.txt.expect
index 0d206ad..cbbb736 100644
--- a/tests/F_kernel_badattr/stderr.txt.expect
+++ b/tests/F_kernel_badattr/stderr.txt.expect
@@ -1,4 +1,4 @@
-kernel_badattr.rs:8:27: error: 'kernel' attribute requires a string
-kernel_badattr.rs:12:20: error: 'kernel' attribute takes no more than 1 argument
-kernel_badattr.rs:4:46: error: Unknown kernel attribute argument 'unimplemented' in declaration of function 'kernel'
-kernel_badattr.rs:16:39: error: Unknown kernel attribute argument 'reduce' in declaration of function 'kernel4'
+kernel_badattr.rs:4:20: error: 'kernel' attribute takes no arguments
+kernel_badattr.rs:8:20: error: 'kernel' attribute takes no arguments
+kernel_badattr.rs:12:20: error: 'kernel' attribute takes no arguments
+kernel_badattr.rs:16:20: error: 'kernel' attribute takes no arguments