diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2015-03-24 21:31:36 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2015-03-24 21:31:36 +0000 |
commit | fb911942f1434f3d1750f83f25f5e42c80e60638 (patch) | |
tree | 1678c4a4f0182e4029a86d135aa4a1b7d09e3c41 /lib/ReaderWriter/MachO/WriterMachO.cpp |
Notes
Diffstat (limited to 'lib/ReaderWriter/MachO/WriterMachO.cpp')
-rw-r--r-- | lib/ReaderWriter/MachO/WriterMachO.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/ReaderWriter/MachO/WriterMachO.cpp b/lib/ReaderWriter/MachO/WriterMachO.cpp new file mode 100644 index 000000000000..de1c0e38063b --- /dev/null +++ b/lib/ReaderWriter/MachO/WriterMachO.cpp @@ -0,0 +1,72 @@ +//===- lib/ReaderWriter/MachO/WriterMachO.cpp -----------------------------===// +// +// The LLVM Linker +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "ExecutableAtoms.hpp" +#include "MachONormalizedFile.h" +#include "lld/Core/File.h" +#include "lld/Core/Writer.h" +#include "lld/ReaderWriter/MachOLinkingContext.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/FileOutputBuffer.h" +#include "llvm/Support/MachO.h" +#include "llvm/Support/raw_ostream.h" +#include <system_error> + +using lld::mach_o::normalized::NormalizedFile; + +namespace lld { +namespace mach_o { + +class MachOWriter : public Writer { +public: + MachOWriter(const MachOLinkingContext &ctxt) : _context(ctxt) { } + + std::error_code writeFile(const lld::File &file, StringRef path) override { + // Construct empty normalized file from atoms. + ErrorOr<std::unique_ptr<NormalizedFile>> nFile = + normalized::normalizedFromAtoms(file, _context); + if (std::error_code ec = nFile.getError()) + return ec; + + // For testing, write out yaml form of normalized file. + if (_context.printAtoms()) { + std::unique_ptr<Writer> yamlWriter = createWriterYAML(_context); + yamlWriter->writeFile(file, "-"); + } + + // Write normalized file as mach-o binary. + return writeBinary(*nFile->get(), path); + } + + bool createImplicitFiles(std::vector<std::unique_ptr<File> > &r) override { + // When building main executables, add _main as required entry point. + if (_context.outputTypeHasEntry()) + r.emplace_back(new CEntryFile(_context)); + // If this can link with dylibs, need helper function (dyld_stub_binder). + if (_context.needsStubsPass()) + r.emplace_back(new StubHelperFile(_context)); + // Final linked images can access a symbol for their mach_header. + if (_context.outputMachOType() != llvm::MachO::MH_OBJECT) + r.emplace_back(new MachHeaderAliasFile(_context)); + + return true; + } +private: + const MachOLinkingContext &_context; + }; + + +} // namespace mach_o + +std::unique_ptr<Writer> createWriterMachO(const MachOLinkingContext &context) { + return std::unique_ptr<Writer>(new lld::mach_o::MachOWriter(context)); +} + +} // namespace lld |