Merge "Fix/suppress potential nullptr dereference warnings."
diff --git a/lib/RSGlobalInfoPass.cpp b/lib/RSGlobalInfoPass.cpp
index 40d658b..d9e64f3 100644
--- a/lib/RSGlobalInfoPass.cpp
+++ b/lib/RSGlobalInfoPass.cpp
@@ -206,6 +206,10 @@
     llvm::Value *V = M.getOrInsertGlobal(kRsGlobalEntries, Int32Ty);
     llvm::GlobalVariable *GlobalEntries =
         llvm::dyn_cast<llvm::GlobalVariable>(V);
+    if (!GlobalEntries) {
+        // Abort when dynamic_cast failed?
+        return false;
+    }
     llvm::Constant *GlobalEntriesInit =
         llvm::ConstantInt::get(Int32Ty, NumGlobals);
     GlobalEntries->setInitializer(GlobalEntriesInit);
@@ -215,6 +219,10 @@
     V = M.getOrInsertGlobal(kRsGlobalNames, VoidPtrArrayTy);
     llvm::GlobalVariable *GlobalNames =
         llvm::dyn_cast<llvm::GlobalVariable>(V);
+    if (!GlobalNames) {
+        // Abort when dynamic_cast failed?
+        return false;
+    }
     llvm::Constant *GlobalNamesInit =
         llvm::ConstantArray::get(VoidPtrArrayTy, GVNames);
     GlobalNames->setInitializer(GlobalNamesInit);
@@ -224,6 +232,10 @@
     V = M.getOrInsertGlobal(kRsGlobalAddresses, VoidPtrArrayTy);
     llvm::GlobalVariable *GlobalAddresses =
         llvm::dyn_cast<llvm::GlobalVariable>(V);
+    if (!GlobalAddresses) {
+        // Abort when dynamic_cast failed?
+        return false;
+    }
     llvm::Constant *GlobalAddressesInit =
         llvm::ConstantArray::get(VoidPtrArrayTy, GVAddresses);
     GlobalAddresses->setInitializer(GlobalAddressesInit);
@@ -234,6 +246,10 @@
     V = M.getOrInsertGlobal(kRsGlobalSizes, SizeArrayTy);
     llvm::GlobalVariable *GlobalSizes =
         llvm::dyn_cast<llvm::GlobalVariable>(V);
+    if (!GlobalSizes) {
+        // Abort when dynamic_cast failed?
+        return false;
+    }
     llvm::Constant *GlobalSizesInit;
     if (PointerSizeInBits == 32) {
       GlobalSizesInit = llvm::ConstantDataArray::get(M.getContext(), GVSizes32);
@@ -247,6 +263,10 @@
     V = M.getOrInsertGlobal(kRsGlobalProperties, Int32ArrayTy);
     llvm::GlobalVariable *GlobalProperties =
         llvm::dyn_cast<llvm::GlobalVariable>(V);
+    if (!GlobalProperties) {
+        // Abort when dynamic_cast failed?
+        return false;
+    }
     llvm::Constant *GlobalPropertiesInit =
         llvm::ConstantDataArray::get(M.getContext(), GVProperties);
     GlobalProperties->setInitializer(GlobalPropertiesInit);
diff --git a/lib/RSInvokeHelperPass.cpp b/lib/RSInvokeHelperPass.cpp
index 99316ce..a22909f 100644
--- a/lib/RSInvokeHelperPass.cpp
+++ b/lib/RSInvokeHelperPass.cpp
@@ -177,6 +177,10 @@
         continue;
 
       llvm::StructType *argStructType = llvm::dyn_cast<llvm::StructType>(argType->getPointerElementType());
+      if (!argStructType) {
+          // Abort when dynamic_cast failed?
+          continue;
+      }
 
       for (unsigned int i = 0; i < argStructType->getNumElements(); i++) {
         llvm::Type *currentType = argStructType->getElementType(i);
diff --git a/lib/RSUtils.h b/lib/RSUtils.h
index e7ce1b5..f30f4d1 100644
--- a/lib/RSUtils.h
+++ b/lib/RSUtils.h
@@ -28,6 +28,9 @@
 namespace {
 
 static inline llvm::StringRef getUnsuffixedStructName(const llvm::StructType *T) {
+  if (!T) {
+      abort();  // exit?
+  }
 #ifdef _DEBUG
   // Bug: 22926131
   // When building with assertions enabled, LLVM cannot read the name of a
diff --git a/lib/RSX86TranslateGEPPass.cpp b/lib/RSX86TranslateGEPPass.cpp
index 52dee0d..113ca28 100644
--- a/lib/RSX86TranslateGEPPass.cpp
+++ b/lib/RSX86TranslateGEPPass.cpp
@@ -77,6 +77,7 @@
         if (!OpC) {
           ALOGE("Operand for struct type is not constant!");
           bccAssert(false);
+          return nullptr;  // NOLINT, unreached
         }
 
         // Offset = Offset + EltOffset for index into a struct