Propagate deadStripOptimize()'s failure to the caller.

We want to make the program to exit with non-zero exit code if there's an error
during dead stripping.

llvm-svn: 192771
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp
index 8b211cb..7fdb6f5 100644
--- a/lld/lib/Core/Resolver.cpp
+++ b/lld/lib/Core/Resolver.cpp
@@ -363,11 +363,11 @@
 
 
 // remove all atoms not actually used
-void Resolver::deadStripOptimize() {
+bool Resolver::deadStripOptimize() {
   ScopedTask task(getDefaultDomain(), "deadStripOptimize");
   // only do this optimization with -dead_strip
   if (!_context.deadStrip())
-    return;
+    return true;
 
   // clear liveness on all atoms
   _liveAtoms.clear();
@@ -386,10 +386,10 @@
   // Or, use list of names that are dead stip roots.
   for (const StringRef &name : _context.deadStripRoots()) {
     const Atom *symAtom = _symbolTable.findByName(name);
-    if (symAtom->definition() == Atom::definitionUndefined) {
+    if (!symAtom || symAtom->definition() == Atom::definitionUndefined) {
       llvm::errs() << "Dead strip root '" << symAtom->name()
                    << "' is not defined\n";
-      return;
+      return false;
     }
     _deadStripRoots.insert(symAtom);
   }
@@ -402,6 +402,7 @@
   // now remove all non-live atoms from _atoms
   _atoms.erase(std::remove_if(_atoms.begin(), _atoms.end(),
                               NotLive(_liveAtoms)), _atoms.end());
+  return true;
 }
 
 
@@ -473,7 +474,8 @@
   if (!this->resolveUndefines())
     return false;
   this->updateReferences();
-  this->deadStripOptimize();
+  if (!this->deadStripOptimize())
+    return false;
   if (this->checkUndefines(false)) {
     if (!_context.allowRemainingUndefines())
       return false;