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 | |
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 0000000000000..de1c0e38063b6 --- /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  | 
