diff options
Diffstat (limited to 'lld/lib/ReaderWriter/MachO')
-rw-r--r-- | lld/lib/ReaderWriter/MachO/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp | 7 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/MachO/GOTPass.hpp | 2 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp | 22 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/MachO/ReferenceKinds.cpp | 15 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/MachO/ReferenceKinds.h | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/MachO/StubsPass.hpp | 25 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/MachO/WriterMachO.cpp | 132 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp | 137 |
9 files changed, 113 insertions, 233 deletions
diff --git a/lld/lib/ReaderWriter/MachO/CMakeLists.txt b/lld/lib/ReaderWriter/MachO/CMakeLists.txt index db64d87ec3a..c23ca186dbb 100644 --- a/lld/lib/ReaderWriter/MachO/CMakeLists.txt +++ b/lld/lib/ReaderWriter/MachO/CMakeLists.txt @@ -1,7 +1,6 @@ add_lld_library(lldMachO MachOTargetInfo.cpp WriterMachO.cpp - WriterOptionsMachO.cpp ReferenceKinds.cpp ) diff --git a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp index ac80059624c..fb1e575652c 100644 --- a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp +++ b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp @@ -15,8 +15,7 @@ #include "lld/Core/UndefinedAtom.h" #include "lld/Core/File.h" #include "lld/Core/Reference.h" - -#include "lld/ReaderWriter/WriterMachO.h" +#include "lld/Core/TargetInfo.h" #include "SimpleAtoms.hpp" @@ -30,10 +29,10 @@ namespace mach_o { // class CRuntimeFile : public SimpleFile { public: - CRuntimeFile(const WriterOptionsMachO &options) + CRuntimeFile(const MachOTargetInfo &ti) : SimpleFile("C runtime"), _undefMain(*this, "_main") { // only main executables need _main - if ( options.outputKind() == WriterOptionsMachO::outputDynamicExecutable) + if (ti.getLinkerOptions()._outputKind == OutputKind::Executable) this->addAtom(_undefMain); } diff --git a/lld/lib/ReaderWriter/MachO/GOTPass.hpp b/lld/lib/ReaderWriter/MachO/GOTPass.hpp index 6a7c451e448..9618302ede4 100644 --- a/lld/lib/ReaderWriter/MachO/GOTPass.hpp +++ b/lld/lib/ReaderWriter/MachO/GOTPass.hpp @@ -29,7 +29,7 @@ public: return true; } - virtual bool isGOTAccess(Reference::Kind, bool& canBypassGOT) { + virtual bool isGOTAccess(int32_t, bool& canBypassGOT) { return false; } diff --git a/lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp b/lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp index d24680a7b91..f37496612fa 100644 --- a/lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp +++ b/lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp @@ -41,7 +41,25 @@ uint32_t MachOTargetInfo::getCPUSubType() const { } } -class GenericMachOTargetInfo final : public MachOTargetInfo { +bool MachOTargetInfo::addEntryPointLoadCommand() const { + switch (_options._outputKind) { + case OutputKind::Executable: + return true; + default: + return false; + } +} + +bool MachOTargetInfo::addUnixThreadLoadCommand() const { + switch (_options._outputKind) { + case OutputKind::Executable: + return true; + default: + return false; + } +} + +class GenericMachOTargetInfo LLVM_FINAL : public MachOTargetInfo { public: GenericMachOTargetInfo(const LinkerOptions &lo) : MachOTargetInfo(lo) {} @@ -49,6 +67,8 @@ public: virtual uint64_t getPageZeroSize() const { return getPageSize(); } virtual StringRef getEntry() const { + if (_options._outputKind != OutputKind::Executable) + return ""; if (!_options._entrySymbol.empty()) return _options._entrySymbol; return "_main"; diff --git a/lld/lib/ReaderWriter/MachO/ReferenceKinds.cpp b/lld/lib/ReaderWriter/MachO/ReferenceKinds.cpp index 6186aa2d234..5d21a88ad5d 100644 --- a/lld/lib/ReaderWriter/MachO/ReferenceKinds.cpp +++ b/lld/lib/ReaderWriter/MachO/ReferenceKinds.cpp @@ -12,6 +12,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/ADT/Triple.h" #include "llvm/Support/ErrorHandling.h" @@ -28,18 +29,16 @@ KindHandler::KindHandler() { KindHandler::~KindHandler() { } -KindHandler *KindHandler::makeHandler(WriterOptionsMachO::Architecture arch) { +KindHandler *KindHandler::makeHandler(llvm::Triple::ArchType arch) { switch( arch ) { - case WriterOptionsMachO::arch_x86_64: + case llvm::Triple::x86_64: return new KindHandler_x86_64(); - break; - case WriterOptionsMachO::arch_x86: + case llvm::Triple::x86: return new KindHandler_x86(); - break; - case WriterOptionsMachO::arch_armv6: - case WriterOptionsMachO::arch_armv7: + case llvm::Triple::arm: return new KindHandler_arm(); - break; + default: + llvm_unreachable("Unknown arch"); } } diff --git a/lld/lib/ReaderWriter/MachO/ReferenceKinds.h b/lld/lib/ReaderWriter/MachO/ReferenceKinds.h index 08118082649..fcae76e81e7 100644 --- a/lld/lib/ReaderWriter/MachO/ReferenceKinds.h +++ b/lld/lib/ReaderWriter/MachO/ReferenceKinds.h @@ -10,7 +10,8 @@ #include "lld/Core/LLVM.h" #include "lld/Core/Reference.h" -#include "lld/ReaderWriter/WriterMachO.h" + +#include "llvm/ADT/Triple.h" #ifndef LLD_READER_WRITER_MACHO_REFERENCE_KINDS_H_ #define LLD_READER_WRITER_MACHO_REFERENCE_KINDS_H_ @@ -28,7 +29,7 @@ class KindHandler { public: typedef Reference::Kind Kind; - static KindHandler *makeHandler(WriterOptionsMachO::Architecture arch); + static KindHandler *makeHandler(llvm::Triple::ArchType arch); virtual ~KindHandler(); virtual Kind stringToKind(StringRef str) = 0; virtual StringRef kindToString(Kind) = 0; diff --git a/lld/lib/ReaderWriter/MachO/StubsPass.hpp b/lld/lib/ReaderWriter/MachO/StubsPass.hpp index 71e76541f72..28453cf359e 100644 --- a/lld/lib/ReaderWriter/MachO/StubsPass.hpp +++ b/lld/lib/ReaderWriter/MachO/StubsPass.hpp @@ -28,19 +28,19 @@ namespace mach_o { class StubsPass : public lld::StubsPass { public: - StubsPass(const WriterOptionsMachO &options) - : _options(options), - _kindHandler(KindHandler::makeHandler(options.architecture())), + StubsPass(const MachOTargetInfo &ti) + : _targetInfo(ti), + _kindHandler(KindHandler::makeHandler(_targetInfo.getTriple().getArch())), _helperCommonAtom(nullptr), _helperCacheAtom(nullptr), _helperBinderAtom(nullptr) { } virtual bool noTextRelocs() { - return _options.noTextRelocations(); + return !_targetInfo.getLinkerOptions()._textRelocations; } - virtual bool isCallSite(Reference::Kind kind) { + virtual bool isCallSite(int32_t kind) { return _kindHandler->isCallSite(kind); } @@ -58,16 +58,15 @@ public: } const DefinedAtom* makeStub(const Atom& target) { - switch ( _options.architecture() ) { - case WriterOptionsMachO::arch_x86_64: + switch (_targetInfo.getTriple().getArch()) { + case llvm::Triple::x86_64: return makeStub_x86_64(target); - - case WriterOptionsMachO::arch_x86: + case llvm::Triple::x86: return makeStub_x86(target); - - case WriterOptionsMachO::arch_armv6: - case WriterOptionsMachO::arch_armv7: + case llvm::Triple::arm: return makeStub_arm(target); + default: + llvm_unreachable("Unknown arch"); } } @@ -151,7 +150,7 @@ private: } }; - const WriterOptionsMachO &_options; + const MachOTargetInfo &_targetInfo; KindHandler *_kindHandler; File _file; llvm::DenseMap<const Atom*, const DefinedAtom*> _targetToStub; diff --git a/lld/lib/ReaderWriter/MachO/WriterMachO.cpp b/lld/lib/ReaderWriter/MachO/WriterMachO.cpp index 0a833381a76..64a6be32fe9 100644 --- a/lld/lib/ReaderWriter/MachO/WriterMachO.cpp +++ b/lld/lib/ReaderWriter/MachO/WriterMachO.cpp @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// -#include "lld/ReaderWriter/WriterMachO.h" +#include "lld/ReaderWriter/Writer.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" @@ -23,12 +23,15 @@ #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/Triple.h" #include "lld/Core/DefinedAtom.h" #include "lld/Core/File.h" #include "lld/Core/InputFiles.h" +#include "lld/Core/LinkerOptions.h" #include "lld/Core/Reference.h" #include "lld/Core/SharedLibraryAtom.h" +#include "lld/ReaderWriter/MachOTargetInfo.h" #include <vector> #include <map> @@ -104,7 +107,7 @@ protected: class SectionChunk : public Chunk { public: static SectionChunk* make(DefinedAtom::ContentType, - const WriterOptionsMachO &options, + const MachOTargetInfo &ti, class MachOWriter &writer); virtual StringRef segmentName() const; virtual bool occupiesNoDiskSpace(); @@ -126,12 +129,12 @@ private: SectionChunk(StringRef seg, StringRef sect, uint32_t flags, - const WriterOptionsMachO &options, + const MachOTargetInfo &ti, class MachOWriter &writer); StringRef _segmentName; StringRef _sectionName; - const WriterOptionsMachO &_options; + const MachOTargetInfo &_targetInfo; class MachOWriter &_writer; uint32_t _flags; uint32_t _permissions; @@ -146,7 +149,7 @@ private: // class MachHeaderChunk : public Chunk { public: - MachHeaderChunk(const WriterOptionsMachO &options, + MachHeaderChunk(const MachOTargetInfo &ti, const File &file); virtual StringRef segmentName() const; virtual void write(uint8_t *fileBuffer); @@ -155,7 +158,7 @@ public: uint64_t loadCommandsSize(); private: - uint32_t filetype(WriterOptionsMachO::OutputKind kind); + uint32_t filetype(OutputKind); uint32_t magic(uint32_t cpuType); mach_header _mh; @@ -171,7 +174,7 @@ private: class LoadCommandsChunk : public Chunk { public: LoadCommandsChunk(MachHeaderChunk&, - const WriterOptionsMachO &options, + const MachOTargetInfo &, class MachOWriter&); virtual StringRef segmentName() const; virtual void write(uint8_t *fileBuffer); @@ -197,7 +200,7 @@ private: }; MachHeaderChunk &_mh; - const WriterOptionsMachO &_options; + const MachOTargetInfo &_targetInfo; class MachOWriter &_writer; segment_command *_linkEditSegment; symtab_command *_symbolTableLoadCommand; @@ -340,7 +343,7 @@ private: // class MachOWriter : public Writer { public: - MachOWriter(const WriterOptionsMachO &options); + MachOWriter(const MachOTargetInfo &ti); virtual error_code writeFile(const lld::File &file, StringRef path); virtual StubsPass *stubPass(); @@ -373,7 +376,7 @@ private: typedef llvm::DenseMap<const Atom*, uint64_t> AtomToAddress; - const WriterOptionsMachO &_options; + const MachOTargetInfo &_targetInfo; KindHandler *_referenceKindHandler; StubsPass _stubsPass; GOTPass _gotPass; @@ -459,46 +462,46 @@ void Chunk::assignFileOffset(uint64_t &curOffset, uint64_t &curAddress) { //===----------------------------------------------------------------------===// SectionChunk::SectionChunk(StringRef seg, StringRef sect, - uint32_t flags, const WriterOptionsMachO &options, + uint32_t flags, const MachOTargetInfo &ti, MachOWriter &writer) - : _segmentName(seg), _sectionName(sect), _options(options), + : _segmentName(seg), _sectionName(sect), _targetInfo(ti), _writer(writer), _flags(flags), _permissions(0) { } SectionChunk* SectionChunk::make(DefinedAtom::ContentType type, - const WriterOptionsMachO &options, + const MachOTargetInfo &ti, MachOWriter &writer) { switch ( type ) { case DefinedAtom::typeCode: return new SectionChunk("__TEXT", "__text", S_REGULAR | S_ATTR_PURE_INSTRUCTIONS, - options, writer); + ti, writer); break; case DefinedAtom::typeCString: return new SectionChunk("__TEXT", "__cstring", S_CSTRING_LITERALS, - options, writer); + ti, writer); break; case DefinedAtom::typeStub: return new SectionChunk("__TEXT", "__stubs", S_SYMBOL_STUBS | S_ATTR_PURE_INSTRUCTIONS, - options, writer); + ti, writer); break; case DefinedAtom::typeStubHelper: return new SectionChunk("__TEXT", "__stub_helper", S_REGULAR | S_ATTR_PURE_INSTRUCTIONS, - options, writer); + ti, writer); break; case DefinedAtom::typeLazyPointer: return new SectionChunk("__DATA", "__la_symbol_ptr", S_LAZY_SYMBOL_POINTERS, - options, writer); + ti, writer); break; case DefinedAtom::typeGOT: return new SectionChunk("__DATA", "__got", S_NON_LAZY_SYMBOL_POINTERS, - options, writer); + ti, writer); break; default: assert(0 && "TO DO: add support for more sections"); @@ -595,13 +598,12 @@ void SectionChunk::write(uint8_t *chunkBuffer) { // MachHeaderChunk //===----------------------------------------------------------------------===// -MachHeaderChunk::MachHeaderChunk(const WriterOptionsMachO &options, - const File &file) { +MachHeaderChunk::MachHeaderChunk(const MachOTargetInfo &ti, const File &file) { // Set up mach_header based on options - _mh.magic = this->magic(options.cpuType()); - _mh.cputype = options.cpuType(); - _mh.cpusubtype = options.cpuSubtype(); - _mh.filetype = this->filetype(options.outputKind()); + _mh.magic = this->magic(ti.getCPUType()); + _mh.cputype = ti.getCPUType(); + _mh.cpusubtype = ti.getCPUSubType(); + _mh.filetype = this->filetype(ti.getLinkerOptions()._outputKind); _mh.ncmds = 0; _mh.sizeofcmds = 0; _mh.flags = 0; @@ -639,22 +641,29 @@ uint32_t MachHeaderChunk::magic(uint32_t cpuType) { case CPU_TYPE_X86_64: return MH_MAGIC_64; } - assert(0 && "file cpu type not supported"); + llvm_unreachable("file CPU type not supported"); return 0; } -uint32_t MachHeaderChunk::filetype(WriterOptionsMachO::OutputKind kind) { +uint32_t MachHeaderChunk::filetype(OutputKind kind) { switch ( kind ) { - case WriterOptionsMachO::outputDynamicExecutable: - return MH_EXECUTE; - case WriterOptionsMachO::outputDylib: - return MH_DYLIB; - case WriterOptionsMachO::outputBundle: - return MH_BUNDLE; - case WriterOptionsMachO::outputObjectFile: - return MH_OBJECT; + case OutputKind::Executable: + return MH_EXECUTE; + case OutputKind::Relocatable: + return MH_OBJECT; + case OutputKind::Shared: + return MH_DYLIB; + case OutputKind::SharedStubs: + return MH_DYLIB_STUB; + case OutputKind::Bundle: + return MH_BUNDLE; + case OutputKind::Preload: + case OutputKind::DebugSymbols: + case OutputKind::Core: + break; } - assert(0 && "file outputkind not supported"); + llvm_unreachable("file OutputKind not supported"); + return 0; } @@ -664,9 +673,9 @@ uint32_t MachHeaderChunk::filetype(WriterOptionsMachO::OutputKind kind) { //===----------------------------------------------------------------------===// LoadCommandsChunk::LoadCommandsChunk(MachHeaderChunk &mh, - const WriterOptionsMachO &options, + const MachOTargetInfo &ti, MachOWriter& writer) - : _mh(mh), _options(options), _writer(writer), + : _mh(mh), _targetInfo(ti), _writer(writer), _linkEditSegment(nullptr), _symbolTableLoadCommand(nullptr), _entryPointLoadCommand(nullptr), _threadLoadCommand(nullptr), _dyldInfoLoadCommand(nullptr) { @@ -714,7 +723,7 @@ uint32_t LoadCommandsChunk::permissionsFromSections( void LoadCommandsChunk::computeSize(const lld::File &file) { const bool is64 = _writer.use64BitMachO(); // Main executables have a __PAGEZERO segment. - uint64_t pageZeroSize = _options.pageZeroSize(); + uint64_t pageZeroSize = _targetInfo.getPageZeroSize(); if ( pageZeroSize != 0 ) { assert(is64 || (pageZeroSize < 0xFFFFFFFF)); segment_command* pzSegCmd = new segment_command(0, is64); @@ -796,12 +805,11 @@ void LoadCommandsChunk::computeSize(const lld::File &file) { this->addLoadCommand(_dyldInfoLoadCommand); // Add entry point load command to main executables - if ( _options.addEntryPointLoadCommand() ) { + if (_targetInfo.addEntryPointLoadCommand()) { _entryPointLoadCommand = new entry_point_command(is64); this->addLoadCommand(_entryPointLoadCommand); - } - else if ( _options.addUnixThreadLoadCommand() ) { - _threadLoadCommand = new thread_command(_options.cpuType(), is64); + } else if (_targetInfo.addUnixThreadLoadCommand()) { + _threadLoadCommand = new thread_command(_targetInfo.getCPUType(), is64); this->addLoadCommand(_threadLoadCommand); } @@ -1295,10 +1303,10 @@ uint32_t SymbolStringsChunk::stringIndex(StringRef str) { // MachOWriter //===----------------------------------------------------------------------===// -MachOWriter::MachOWriter(const WriterOptionsMachO &options) - : _options(options), - _referenceKindHandler(KindHandler::makeHandler(_options.architecture())), - _stubsPass(options), _cRuntimeFile(options), +MachOWriter::MachOWriter(const MachOTargetInfo &ti) + : _targetInfo(ti), + _referenceKindHandler(KindHandler::makeHandler(ti.getTriple().getArch())), + _stubsPass(ti), _cRuntimeFile(ti), _bindingInfo(nullptr), _lazyBindingInfo(nullptr), _symbolTableChunk(nullptr), _stringsChunk(nullptr), _entryAtom(nullptr), _linkEditStartOffset(0), _linkEditStartAddress(0) { @@ -1339,7 +1347,7 @@ void MachOWriter::createChunks(const lld::File &file) { DefinedAtom::ContentType type = atom->contentType(); auto pos = map.find(type); if ( pos == map.end() ) { - SectionChunk *chunk = SectionChunk::make(type, _options, *this); + SectionChunk *chunk = SectionChunk::make(type, _targetInfo, *this); map[type] = chunk; chunk->appendAtom(atom); } @@ -1352,10 +1360,10 @@ void MachOWriter::createChunks(const lld::File &file) { // Make chunks in __TEXT for mach_header and load commands at start. - MachHeaderChunk *mhc = new MachHeaderChunk(_options, file); + MachHeaderChunk *mhc = new MachHeaderChunk(_targetInfo, file); _chunks.push_back(mhc); - _loadCommandsChunk = new LoadCommandsChunk(*mhc, _options, *this); + _loadCommandsChunk = new LoadCommandsChunk(*mhc, _targetInfo, *this); _chunks.push_back(_loadCommandsChunk); _paddingChunk = new LoadCommandPaddingChunk(*_loadCommandsChunk); @@ -1388,15 +1396,15 @@ void MachOWriter::addLinkEditChunk(LinkEditChunk *chunk) { void MachOWriter::buildAtomToAddressMap() { DEBUG_WITH_TYPE("WriterMachO-layout", llvm::dbgs() << "assign atom addresses:\n"); - const bool lookForEntry = - (_options.outputKind() == WriterOptionsMachO::outputDynamicExecutable); + const bool lookForEntry = _targetInfo.getLinkerOptions()._outputKind == + OutputKind::Executable; for (SectionChunk *chunk : _sectionChunks ) { for (const SectionChunk::AtomInfo &info : chunk->atoms() ) { _atomToAddress[info.atom] = chunk->address() + info.offsetInSection; if ( lookForEntry && (info.atom->contentType() == DefinedAtom::typeCode) && (info.atom->size() != 0) - && info.atom->name().equals(_options.entryPointName()) ) { + && info.atom->name() == _targetInfo.getEntry()) { _entryAtom = info.atom; } DEBUG_WITH_TYPE("WriterMachO-layout", llvm::dbgs() @@ -1419,7 +1427,7 @@ void MachOWriter::assignFileOffsets() { DEBUG_WITH_TYPE("WriterMachO-layout", llvm::dbgs() << "assign file offsets:\n"); uint64_t offset = 0; - uint64_t address = _options.pageZeroSize(); + uint64_t address = _targetInfo.getPageZeroSize(); for ( Chunk *chunk : _chunks ) { if ( chunk->segmentName().equals("__LINKEDIT") ) { _linkEditStartOffset = Chunk::alignTo(offset, 12); @@ -1457,7 +1465,7 @@ void MachOWriter::findSegment(StringRef segmentName, uint32_t *segIndex, const uint64_t kInvalidAddress = (uint64_t)(-1); StringRef lastSegName("__TEXT"); *segIndex = 0; - if ( _options.pageZeroSize() != 0 ) { + if ( _targetInfo.getPageZeroSize() != 0 ) { *segIndex = 1; } *segStartAddr = kInvalidAddress; @@ -1481,15 +1489,7 @@ void MachOWriter::findSegment(StringRef segmentName, uint32_t *segIndex, } bool MachOWriter::use64BitMachO() const { - switch ( _options.cpuType() ) { - case CPU_TYPE_ARM: - case CPU_TYPE_I386: - return false; - case CPU_TYPE_X86_64: - return true; - } - assert(0 && "unknown cpu type"); - return false; + return _targetInfo.getTriple().isArch64Bit(); } @@ -1542,8 +1542,8 @@ void MachOWriter::addFiles(InputFiles &inputFiles) { } // namespace mach_o -Writer* createWriterMachO(const WriterOptionsMachO &options) { - return new lld::mach_o::MachOWriter(options); +std::unique_ptr<Writer> createWriterMachO(const MachOTargetInfo &ti) { + return std::unique_ptr<Writer>(new lld::mach_o::MachOWriter(ti)); } } // namespace lld diff --git a/lld/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp b/lld/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp deleted file mode 100644 index bb831b42d3f..00000000000 --- a/lld/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp +++ /dev/null @@ -1,137 +0,0 @@ -//===- lib/ReaderWriter/MachO/WriterOptionsMachO.cpp ----------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lld/ReaderWriter/WriterMachO.h" - -#include "llvm/Support/Debug.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/system_error.h" - -#include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/StringRef.h" - -#include "MachOFormat.hpp" - -namespace lld { - -WriterOptionsMachO::WriterOptionsMachO() - : _outputkind(outputDynamicExecutable), - _architecture(arch_x86), - _pageZeroSize(0x1000), - _noTextRelocations(true) { -} - -WriterOptionsMachO::~WriterOptionsMachO() { -} - -StringRef WriterOptionsMachO::archName() const { - switch ( _architecture ) { - case arch_x86_64: - return StringRef("x86_64"); - case arch_x86: - return StringRef("i386"); - case arch_armv6: - return StringRef("armv6"); - case arch_armv7: - return StringRef("armv7"); - } - llvm_unreachable("unknown arch"); -} - -uint32_t WriterOptionsMachO::cpuType() const { - switch ( _architecture ) { - case arch_x86_64: - return mach_o::CPU_TYPE_X86_64; - case arch_x86: - return mach_o::CPU_TYPE_I386; - case arch_armv6: - case arch_armv7: - return mach_o::CPU_TYPE_ARM; - } - llvm_unreachable("unknown arch"); -} - -uint32_t WriterOptionsMachO::cpuSubtype() const { - switch ( _architecture ) { - case arch_x86_64: - return mach_o::CPU_SUBTYPE_X86_64_ALL; - case arch_x86: - return mach_o::CPU_SUBTYPE_X86_ALL; - case arch_armv6: - return mach_o::CPU_SUBTYPE_ARM_V6; - case arch_armv7: - return mach_o::CPU_SUBTYPE_ARM_V7; - } - llvm_unreachable("unknown arch"); -} - -uint64_t WriterOptionsMachO::pageZeroSize() const { - switch ( _outputkind ) { - case outputDynamicExecutable: - return _pageZeroSize; - case outputDylib: - case outputBundle: - case outputObjectFile: - assert(_pageZeroSize == 0); - return 0; - } - llvm_unreachable("unknown outputkind"); -} - -bool WriterOptionsMachO::addEntryPointLoadCommand() const { - switch ( _outputkind ) { - case outputDynamicExecutable: - // Only main executables have an entry point - return false; - case outputDylib: - case outputBundle: - case outputObjectFile: - return false; - } - llvm_unreachable("unknown outputkind"); -} - -bool WriterOptionsMachO::addUnixThreadLoadCommand() const { - switch ( _outputkind ) { - case outputDynamicExecutable: - // Only main executables have an entry point - return true; - case outputDylib: - case outputBundle: - case outputObjectFile: - return false; - } - llvm_unreachable("unknown outputkind"); -} - -StringRef WriterOptionsMachO::entryPointName() const { - switch ( _outputkind ) { - case outputDynamicExecutable: - // Only main executables have an entry point - if ( ! _customEntryPointName.empty() ) { - return _customEntryPointName; - } - else { - if ( true || this->addEntryPointLoadCommand() ) - return StringRef("_main"); - else - return StringRef("start"); - } - break; - case outputDylib: - case outputBundle: - case outputObjectFile: - return StringRef(); - } - llvm_unreachable("unknown outputkind"); -} - - -} // namespace lld - |