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