Convert file handle* methods to llvm::Error instead of std::error_code. NFC.

This updates most of the file handling methods in the linking context and
resolver to use the new API.

llvm-svn: 264924
This commit is contained in:
Pete Cooper 2016-03-30 20:56:54 +00:00
parent 37529887b7
commit 3c40b5b750
5 changed files with 46 additions and 37 deletions

View File

@ -208,7 +208,7 @@ public:
/// errors for any differences between the context state and a loaded file.
/// For example, we can error if we try to load a file which is a different
/// arch from that being linked.
virtual std::error_code handleLoadedFile(File &file) = 0;
virtual llvm::Error handleLoadedFile(File &file) = 0;
/// @}
protected:

View File

@ -42,13 +42,13 @@ public:
// Handle files, this adds atoms from the current file thats
// being processed by the resolver
ErrorOr<bool> handleFile(File &);
llvm::Expected<bool> handleFile(File &);
// Handle an archive library file.
ErrorOr<bool> handleArchiveFile(File &);
llvm::Expected<bool> handleArchiveFile(File &);
// Handle a shared library file.
std::error_code handleSharedLibrary(File &);
llvm::Error handleSharedLibrary(File &);
/// @brief do work of merging and resolving and return list
bool resolve();
@ -56,7 +56,7 @@ public:
std::unique_ptr<SimpleFile> resultFile() { return std::move(_result); }
private:
typedef std::function<ErrorOr<bool>(StringRef)> UndefCallback;
typedef std::function<llvm::Expected<bool>(StringRef)> UndefCallback;
bool undefinesAdded(int begin, int end);
File *getFile(int &index);
@ -67,7 +67,7 @@ private:
void deadStripOptimize();
bool checkUndefines();
void removeCoalescedAwayAtoms();
ErrorOr<bool> forEachUndefines(File &file, UndefCallback callback);
llvm::Expected<bool> forEachUndefines(File &file, UndefCallback callback);
void markLive(const Atom *atom);

View File

@ -407,7 +407,7 @@ public:
void finalizeInputFiles() override;
std::error_code handleLoadedFile(File &file) override;
llvm::Error handleLoadedFile(File &file) override;
bool customAtomOrderer(const DefinedAtom *left, const DefinedAtom *right,
bool &leftBeforeRight) const;

View File

@ -19,6 +19,7 @@
#include "lld/Core/UndefinedAtom.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
@ -29,9 +30,9 @@
namespace lld {
ErrorOr<bool> Resolver::handleFile(File &file) {
llvm::Expected<bool> Resolver::handleFile(File &file) {
if (auto ec = _ctx.handleLoadedFile(file))
return ec;
return std::move(ec);
bool undefAdded = false;
for (auto &atom : file.defined().owning_ptrs())
doDefinedAtom(std::move(atom));
@ -46,7 +47,8 @@ ErrorOr<bool> Resolver::handleFile(File &file) {
return undefAdded;
}
ErrorOr<bool> Resolver::forEachUndefines(File &file, UndefCallback callback) {
llvm::Expected<bool> Resolver::forEachUndefines(File &file,
UndefCallback callback) {
size_t i = _undefineIndex[&file];
bool undefAdded = false;
do {
@ -61,8 +63,8 @@ ErrorOr<bool> Resolver::forEachUndefines(File &file, UndefCallback callback) {
continue;
}
auto undefAddedOrError = callback(undefName);
if (undefAddedOrError.getError())
return undefAddedOrError;
if (auto ec = undefAddedOrError.takeError())
return std::move(ec);
undefAdded |= undefAddedOrError.get();
}
} while (i < _undefines.size());
@ -70,9 +72,10 @@ ErrorOr<bool> Resolver::forEachUndefines(File &file, UndefCallback callback) {
return undefAdded;
}
ErrorOr<bool> Resolver::handleArchiveFile(File &file) {
llvm::Expected<bool> Resolver::handleArchiveFile(File &file) {
ArchiveLibraryFile *archiveFile = cast<ArchiveLibraryFile>(&file);
return forEachUndefines(file, [&](StringRef undefName) -> ErrorOr<bool> {
return forEachUndefines(file,
[&](StringRef undefName) -> llvm::Expected<bool> {
if (File *member = archiveFile->find(undefName)) {
member->setOrdinal(_ctx.getNextOrdinalAndIncrement());
return handleFile(*member);
@ -81,23 +84,23 @@ ErrorOr<bool> Resolver::handleArchiveFile(File &file) {
});
}
std::error_code Resolver::handleSharedLibrary(File &file) {
llvm::Error Resolver::handleSharedLibrary(File &file) {
// Add all the atoms from the shared library
SharedLibraryFile *sharedLibrary = cast<SharedLibraryFile>(&file);
auto undefAddedOrError = handleFile(*sharedLibrary);
if (undefAddedOrError.getError())
return undefAddedOrError.getError();
if (auto ec = undefAddedOrError.takeError())
return std::move(ec);
undefAddedOrError =
forEachUndefines(file, [&](StringRef undefName) -> ErrorOr<bool> {
forEachUndefines(file, [&](StringRef undefName) -> llvm::Expected<bool> {
auto atom = sharedLibrary->exports(undefName);
if (atom.get())
doSharedLibraryAtom(std::move(atom));
return false;
});
if (undefAddedOrError.getError())
return undefAddedOrError.getError();
return std::error_code();
if (auto ec = undefAddedOrError.takeError())
return std::move(ec);
return llvm::Error();
}
bool Resolver::doUndefinedAtom(OwningAtomPtr<UndefinedAtom> atom) {
@ -247,9 +250,11 @@ bool Resolver::resolveUndefines() {
assert(!file->hasOrdinal());
file->setOrdinal(_ctx.getNextOrdinalAndIncrement());
auto undefAddedOrError = handleFile(*file);
if (undefAddedOrError.getError()) {
llvm::errs() << "Error in " + file->path()
<< ": " << undefAddedOrError.getError().message() << "\n";
if (auto EC = undefAddedOrError.takeError()) {
// FIXME: This should be passed to logAllUnhandledErrors but it needs
// to be passed a Twine instead of a string.
llvm::errs() << "Error in " + file->path() << ": ";
logAllUnhandledErrors(std::move(EC), llvm::errs(), std::string());
return false;
}
undefAdded = undefAddedOrError.get();
@ -259,9 +264,11 @@ bool Resolver::resolveUndefines() {
if (!file->hasOrdinal())
file->setOrdinal(_ctx.getNextOrdinalAndIncrement());
auto undefAddedOrError = handleArchiveFile(*file);
if (undefAddedOrError.getError()) {
llvm::errs() << "Error in " + file->path()
<< ": " << undefAddedOrError.getError().message() << "\n";
if (auto EC = undefAddedOrError.takeError()) {
// FIXME: This should be passed to logAllUnhandledErrors but it needs
// to be passed a Twine instead of a string.
llvm::errs() << "Error in " + file->path() << ": ";
logAllUnhandledErrors(std::move(EC), llvm::errs(), std::string());
return false;
}
undefAdded = undefAddedOrError.get();
@ -271,8 +278,10 @@ bool Resolver::resolveUndefines() {
if (!file->hasOrdinal())
file->setOrdinal(_ctx.getNextOrdinalAndIncrement());
if (auto EC = handleSharedLibrary(*file)) {
llvm::errs() << "Error in " + file->path()
<< ": " << EC.message() << "\n";
// FIXME: This should be passed to logAllUnhandledErrors but it needs
// to be passed a Twine instead of a string.
llvm::errs() << "Error in " + file->path() << ": ";
logAllUnhandledErrors(std::move(EC), llvm::errs(), std::string());
return false;
}
break;

View File

@ -1040,10 +1040,10 @@ void MachOLinkingContext::finalizeInputFiles() {
elements.push_back(llvm::make_unique<GroupEnd>(numLibs));
}
std::error_code MachOLinkingContext::handleLoadedFile(File &file) {
llvm::Error MachOLinkingContext::handleLoadedFile(File &file) {
auto *machoFile = dyn_cast<MachOFile>(&file);
if (!machoFile)
return std::error_code();
return llvm::Error();
// Check that the arch of the context matches that of the file.
// Also set the arch of the context if it didn't have one.
@ -1051,7 +1051,7 @@ std::error_code MachOLinkingContext::handleLoadedFile(File &file) {
_arch = machoFile->arch();
} else if (machoFile->arch() != arch_unknown && machoFile->arch() != _arch) {
// Archs are different.
return make_dynamic_error_code(file.path() +
return llvm::make_error<GenericError>(file.path() +
Twine(" cannot be linked due to incompatible architecture"));
}
@ -1061,7 +1061,7 @@ std::error_code MachOLinkingContext::handleLoadedFile(File &file) {
_os = machoFile->OS();
} else if (machoFile->OS() != OS::unknown && machoFile->OS() != _os) {
// OSes are different.
return make_dynamic_error_code(file.path() +
return llvm::make_error<GenericError>(file.path() +
Twine(" cannot be linked due to incompatible operating systems"));
}
@ -1078,7 +1078,7 @@ std::error_code MachOLinkingContext::handleLoadedFile(File &file) {
// The file is built with simulator objc, so make sure that the context
// is also building with simulator support.
if (_os != OS::iOS_simulator)
return make_dynamic_error_code(file.path() +
return llvm::make_error<GenericError>(file.path() +
Twine(" cannot be linked. It contains ObjC built for the simulator"
" while we are linking a non-simulator target"));
assert((_objcConstraint == objc_unknown ||
@ -1090,7 +1090,7 @@ std::error_code MachOLinkingContext::handleLoadedFile(File &file) {
// The file is built without simulator objc, so make sure that the
// context is also building without simulator support.
if (_os == OS::iOS_simulator)
return make_dynamic_error_code(file.path() +
return llvm::make_error<GenericError>(file.path() +
Twine(" cannot be linked. It contains ObjC built for a non-simulator"
" target while we are linking a simulator target"));
assert((_objcConstraint == objc_unknown ||
@ -1107,10 +1107,10 @@ std::error_code MachOLinkingContext::handleLoadedFile(File &file) {
} else if (machoFile->swiftVersion() &&
machoFile->swiftVersion() != _swiftVersion) {
// Swift versions are different.
return make_dynamic_error_code("different swift versions");
return llvm::make_error<GenericError>("different swift versions");
}
return std::error_code();
return llvm::Error();
}
} // end namespace lld