1 //===---- lib/ReaderWriter/MachO/SectCreateFile.h ---------------*- c++ -*-===// 2 // 3 // The LLVM Linker 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H 11 #define LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H 12 13 #include "lld/Core/DefinedAtom.h" 14 #include "lld/Core/Simple.h" 15 #include "lld/ReaderWriter/MachOLinkingContext.h" 16 17 namespace lld { 18 namespace mach_o { 19 20 // 21 // A FlateNamespaceFile instance may be added as a resolution source of last 22 // resort, depending on how -flat_namespace and -undefined are set. 23 // 24 class SectCreateFile : public File { 25 public: 26 class SectCreateAtom : public SimpleDefinedAtom { 27 public: SectCreateAtom(const File & file,StringRef segName,StringRef sectName,std::unique_ptr<MemoryBuffer> content)28 SectCreateAtom(const File &file, StringRef segName, StringRef sectName, 29 std::unique_ptr<MemoryBuffer> content) 30 : SimpleDefinedAtom(file), 31 _combinedName((segName + "/" + sectName).str()), 32 _content(std::move(content)) {} 33 34 ~SectCreateAtom() override = default; 35 size()36 uint64_t size() const override { return _content->getBufferSize(); } 37 scope()38 Scope scope() const override { return scopeGlobal; } 39 contentType()40 ContentType contentType() const override { return typeSectCreate; } 41 sectionChoice()42 SectionChoice sectionChoice() const override { return sectionCustomRequired; } 43 customSectionName()44 StringRef customSectionName() const override { return _combinedName; } 45 deadStrip()46 DeadStripKind deadStrip() const override { return deadStripNever; } 47 rawContent()48 ArrayRef<uint8_t> rawContent() const override { 49 const uint8_t *data = 50 reinterpret_cast<const uint8_t*>(_content->getBufferStart()); 51 return ArrayRef<uint8_t>(data, _content->getBufferSize()); 52 } 53 segmentName()54 StringRef segmentName() const { return _segName; } sectionName()55 StringRef sectionName() const { return _sectName; } 56 57 private: 58 std::string _combinedName; 59 StringRef _segName; 60 StringRef _sectName; 61 std::unique_ptr<MemoryBuffer> _content; 62 }; 63 SectCreateFile()64 SectCreateFile() : File("sectcreate", kindSectCreateObject) {} 65 addSection(StringRef seg,StringRef sect,std::unique_ptr<MemoryBuffer> content)66 void addSection(StringRef seg, StringRef sect, 67 std::unique_ptr<MemoryBuffer> content) { 68 _definedAtoms.push_back( 69 new (allocator()) SectCreateAtom(*this, seg, sect, std::move(content))); 70 } 71 defined()72 const AtomRange<DefinedAtom> defined() const override { 73 return _definedAtoms; 74 } 75 undefined()76 const AtomRange<UndefinedAtom> undefined() const override { 77 return _noUndefinedAtoms; 78 } 79 sharedLibrary()80 const AtomRange<SharedLibraryAtom> sharedLibrary() const override { 81 return _noSharedLibraryAtoms; 82 } 83 absolute()84 const AtomRange<AbsoluteAtom> absolute() const override { 85 return _noAbsoluteAtoms; 86 } 87 clearAtoms()88 void clearAtoms() override { 89 _definedAtoms.clear(); 90 _noUndefinedAtoms.clear(); 91 _noSharedLibraryAtoms.clear(); 92 _noAbsoluteAtoms.clear(); 93 } 94 95 private: 96 AtomVector<DefinedAtom> _definedAtoms; 97 }; 98 99 } // namespace mach_o 100 } // namespace lld 101 102 #endif // LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H 103