summaryrefslogtreecommitdiff
path: root/lib/ReaderWriter/MachO/WriterMachO.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2015-03-24 21:31:36 +0000
committerDimitry Andric <dim@FreeBSD.org>2015-03-24 21:31:36 +0000
commitfb911942f1434f3d1750f83f25f5e42c80e60638 (patch)
tree1678c4a4f0182e4029a86d135aa4a1b7d09e3c41 /lib/ReaderWriter/MachO/WriterMachO.cpp
Notes
Diffstat (limited to 'lib/ReaderWriter/MachO/WriterMachO.cpp')
-rw-r--r--lib/ReaderWriter/MachO/WriterMachO.cpp72
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