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;