#include "lld/Core/Atom.h"
#include "lld/Core/File.h"
#include "lld/Core/Reference.h"
+#include "llvm/Support/Error.h"
#include <vector>
namespace lld {
virtual ~Pass() { }
/// Do the actual work of the Pass.
- virtual std::error_code perform(SimpleFile &mergedFile) = 0;
+ virtual llvm::Error perform(SimpleFile &mergedFile) = 0;
protected:
// Only subclassess can be instantiated.
#include "lld/Core/LLVM.h"
#include "lld/Core/Pass.h"
+#include "llvm/Support/Error.h"
#include <memory>
#include <vector>
_passes.push_back(std::move(pass));
}
- std::error_code runOnFile(SimpleFile &file) {
+ llvm::Error runOnFile(SimpleFile &file) {
for (std::unique_ptr<Pass> &pass : _passes)
- if (std::error_code EC = pass->perform(file))
+ if (llvm::Error EC = pass->perform(file))
return EC;
- return std::error_code();
+ return llvm::Error();
}
private:
#include "llvm/Option/Arg.h"
#include "llvm/Option/Option.h"
#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/Error.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
ScopedTask passTask(getDefaultDomain(), "Passes");
PassManager pm;
ctx.addPasses(pm);
- if (std::error_code ec = pm.runOnFile(*merged)) {
- diagnostics << "Failed to write file '" << ctx.outputPath()
- << "': " << ec.message() << "\n";
+ if (auto ec = pm.runOnFile(*merged)) {
+ // FIXME: This should be passed to logAllUnhandledErrors but it needs
+ // to be passed a Twine instead of a string.
+ diagnostics << "Failed to run passes on file '" << ctx.outputPath()
+ << "': ";
+ logAllUnhandledErrors(std::move(ec), diagnostics, std::string());
return false;
}
}
private:
- std::error_code perform(SimpleFile &mergedFile) override {
+ llvm::Error perform(SimpleFile &mergedFile) override {
DEBUG(llvm::dbgs() << "MachO Compact Unwind pass\n");
std::map<const Atom *, CompactUnwindEntry> unwindLocs;
// Skip rest of pass if no unwind info.
if (unwindLocs.empty() && dwarfFrames.empty())
- return std::error_code();
+ return llvm::Error();
// FIXME: if there are more than 4 personality functions then we need to
// defer to DWARF info for the ones we don't put in the list. They should
return atom->contentType() == DefinedAtom::typeCompactUnwindInfo;
});
- return std::error_code();
+ return llvm::Error();
}
void collectCompactUnwindEntries(
}
private:
- std::error_code perform(SimpleFile &mergedFile) override {
+ llvm::Error perform(SimpleFile &mergedFile) override {
// Scan all references in all atoms.
for (const DefinedAtom *atom : mergedFile.defined()) {
for (const Reference *ref : *atom) {
for (const GOTEntryAtom *slot : entries)
mergedFile.addAtom(*slot);
- return std::error_code();
+ return llvm::Error();
}
bool shouldReplaceTargetWithGOTAtom(const Atom *target, bool canBypassGOT) {
}
/// Perform the actual pass
-std::error_code LayoutPass::perform(SimpleFile &mergedFile) {
+llvm::Error LayoutPass::perform(SimpleFile &mergedFile) {
DEBUG(llvm::dbgs() << "******** Laying out atoms:\n");
// sort the atoms
ScopedTask task(getDefaultDomain(), "LayoutPass");
});
DEBUG(llvm::dbgs() << "******** Finished laying out atoms\n");
- return std::error_code();
+ return llvm::Error();
}
void addLayoutPass(PassManager &pm, const MachOLinkingContext &ctx) {
LayoutPass(const Registry ®istry, SortOverride sorter);
/// Sorts atoms in mergedFile by content type then by command line order.
- std::error_code perform(SimpleFile &mergedFile) override;
+ llvm::Error perform(SimpleFile &mergedFile) override;
~LayoutPass() override = default;
_file.setOrdinal(_ctx.getNextOrdinalAndIncrement());
}
- std::error_code perform(SimpleFile &mergedFile) override {
+ llvm::Error perform(SimpleFile &mergedFile) override {
// Add the image info.
mergedFile.addAtom(*getImageInfo());
- return std::error_code();
+ return llvm::Error();
}
private:
_file.setOrdinal(_ctx.getNextOrdinalAndIncrement());
}
- std::error_code perform(SimpleFile &mergedFile) override {
+ llvm::Error perform(SimpleFile &mergedFile) override {
// Scan all references in all atoms.
for (const DefinedAtom *atom : mergedFile.defined()) {
for (const Reference *ref : *atom) {
}
// Exit early if no shims needed.
if (_targetToShim.empty())
- return std::error_code();
+ return llvm::Error();
// Sort shim atoms so the layout order is stable.
std::vector<const DefinedAtom *> shims;
for (const DefinedAtom *shim : shims)
mergedFile.addAtom(*shim);
- return std::error_code();
+ return llvm::Error();
}
private:
_file.setOrdinal(_ctx.getNextOrdinalAndIncrement());
}
- std::error_code perform(SimpleFile &mergedFile) override {
+ llvm::Error perform(SimpleFile &mergedFile) override {
// Skip this pass if output format uses text relocations instead of stubs.
if (!this->noTextRelocs())
- return std::error_code();
+ return llvm::Error();
// Scan all references in all atoms.
for (const DefinedAtom *atom : mergedFile.defined()) {
// Exit early if no stubs needed.
if (_targetToUses.empty())
- return std::error_code();
+ return llvm::Error();
// First add help-common and GOT slots used by lazy binding.
SimpleDefinedAtom *helperCommonAtom =
lazyOffset += target->name().size() + 12;
}
- return std::error_code();
+ return llvm::Error();
}
private:
}
private:
- std::error_code perform(SimpleFile &mergedFile) override {
+ llvm::Error perform(SimpleFile &mergedFile) override {
bool allowTLV = _ctx.minOS("10.7", "1.0");
for (const DefinedAtom *atom : mergedFile.defined()) {
continue;
if (!allowTLV)
- return make_dynamic_error_code(
+ return llvm::make_error<GenericError>(
"targeted OS version does not support use of thread local "
"variables in " + atom->name() + " for architecture " +
_ctx.archName());
for (const TLVPEntryAtom *slot : entries)
mergedFile.addAtom(*slot);
- return std::error_code();
+ return llvm::Error();
}
const DefinedAtom *makeTLVPEntry(const Atom *target) {