| //===- lib/ReaderWriter/MachO/ExecutableAtoms.hpp -------------------------===// |
| // |
| // The LLVM Linker |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H |
| #define LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H |
| |
| #include "Atoms.h" |
| |
| #include "llvm/Support/MachO.h" |
| |
| #include "lld/Core/ArchiveLibraryFile.h" |
| #include "lld/Core/DefinedAtom.h" |
| #include "lld/Core/File.h" |
| #include "lld/Core/LinkingContext.h" |
| #include "lld/Core/Reference.h" |
| #include "lld/Core/Simple.h" |
| #include "lld/Core/UndefinedAtom.h" |
| #include "lld/ReaderWriter/MachOLinkingContext.h" |
| |
| namespace lld { |
| namespace mach_o { |
| |
| |
| // |
| // CEntryFile adds an UndefinedAtom for "_main" so that the Resolving |
| // phase will fail if "_main" is undefined. |
| // |
| class CEntryFile : public SimpleFile { |
| public: |
| CEntryFile(const MachOLinkingContext &context) |
| : SimpleFile("C entry"), |
| _undefMain(*this, context.entrySymbolName()) { |
| this->addAtom(_undefMain); |
| } |
| |
| private: |
| SimpleUndefinedAtom _undefMain; |
| }; |
| |
| |
| // |
| // StubHelperFile adds an UndefinedAtom for "dyld_stub_binder" so that |
| // the Resolveing phase will fail if "dyld_stub_binder" is undefined. |
| // |
| class StubHelperFile : public SimpleFile { |
| public: |
| StubHelperFile(const MachOLinkingContext &context) |
| : SimpleFile("stub runtime"), |
| _undefBinder(*this, context.binderSymbolName()) { |
| this->addAtom(_undefBinder); |
| } |
| |
| private: |
| SimpleUndefinedAtom _undefBinder; |
| }; |
| |
| |
| // |
| // MachHeaderAliasFile lazily instantiates the magic symbols that mark the start |
| // of the mach_header for final linked images. |
| // |
| class MachHeaderAliasFile : public ArchiveLibraryFile { |
| public: |
| MachHeaderAliasFile(const MachOLinkingContext &context) |
| : ArchiveLibraryFile("mach_header symbols") { |
| switch (context.outputMachOType()) { |
| case llvm::MachO::MH_EXECUTE: |
| _machHeaderSymbolName = "__mh_execute_header"; |
| break; |
| case llvm::MachO::MH_DYLIB: |
| _machHeaderSymbolName = "__mh_dylib_header"; |
| break; |
| case llvm::MachO::MH_BUNDLE: |
| _machHeaderSymbolName = "__mh_bundle_header"; |
| break; |
| case llvm::MachO::MH_DYLINKER: |
| _machHeaderSymbolName = "__mh_dylinker_header"; |
| break; |
| case llvm::MachO::MH_PRELOAD: |
| _machHeaderSymbolName = "__mh_preload_header"; |
| break; |
| default: |
| llvm_unreachable("no mach_header symbol for file type"); |
| } |
| } |
| |
| std::error_code |
| parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override { |
| return std::error_code(); |
| } |
| |
| const File *find(StringRef sym, bool dataSymbolOnly) const override { |
| if (sym.equals("___dso_handle") || sym.equals(_machHeaderSymbolName)) { |
| _definedAtoms._atoms.push_back(new (_alloc) MachODefinedAtom( |
| *this, sym, DefinedAtom::scopeLinkageUnit, |
| DefinedAtom::typeMachHeader, DefinedAtom::mergeNo, false, false, |
| ArrayRef<uint8_t>(), DefinedAtom::Alignment(12,0))); |
| return this; |
| } |
| return nullptr; |
| } |
| |
| const atom_collection<DefinedAtom> &defined() const override { |
| return _definedAtoms; |
| } |
| const atom_collection<UndefinedAtom> &undefined() const override { |
| return _undefinedAtoms; |
| } |
| |
| const atom_collection<SharedLibraryAtom> &sharedLibrary() const override { |
| return _sharedLibraryAtoms; |
| } |
| |
| const atom_collection<AbsoluteAtom> &absolute() const override { |
| return _absoluteAtoms; |
| } |
| |
| |
| private: |
| mutable atom_collection_vector<DefinedAtom> _definedAtoms; |
| atom_collection_vector<UndefinedAtom> _undefinedAtoms; |
| atom_collection_vector<SharedLibraryAtom> _sharedLibraryAtoms; |
| atom_collection_vector<AbsoluteAtom> _absoluteAtoms; |
| StringRef _machHeaderSymbolName; |
| mutable llvm::BumpPtrAllocator _alloc; |
| }; |
| |
| } // namespace mach_o |
| } // namespace lld |
| |
| #endif // LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H |