1 //===---- lib/ReaderWriter/MachO/SectCreateFile.h ---------------*- c++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H
10 #define LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H
12 #include "lld/Core/DefinedAtom.h"
13 #include "lld/Core/Simple.h"
14 #include "lld/ReaderWriter/MachOLinkingContext.h"
20 // A FlateNamespaceFile instance may be added as a resolution source of last
21 // resort, depending on how -flat_namespace and -undefined are set.
23 class SectCreateFile : public File {
25 class SectCreateAtom : public SimpleDefinedAtom {
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)) {}
33 ~SectCreateAtom() override = default;
35 uint64_t size() const override { return _content->getBufferSize(); }
37 Scope scope() const override { return scopeGlobal; }
39 ContentType contentType() const override { return typeSectCreate; }
41 SectionChoice sectionChoice() const override { return sectionCustomRequired; }
43 StringRef customSectionName() const override { return _combinedName; }
45 DeadStripKind deadStrip() const override { return deadStripNever; }
47 ArrayRef<uint8_t> rawContent() const override {
49 reinterpret_cast<const uint8_t*>(_content->getBufferStart());
50 return ArrayRef<uint8_t>(data, _content->getBufferSize());
53 StringRef segmentName() const { return _segName; }
54 StringRef sectionName() const { return _sectName; }
57 std::string _combinedName;
60 std::unique_ptr<MemoryBuffer> _content;
63 SectCreateFile() : File("sectcreate", kindSectCreateObject) {}
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)));
71 const AtomRange<DefinedAtom> defined() const override {
75 const AtomRange<UndefinedAtom> undefined() const override {
76 return _noUndefinedAtoms;
79 const AtomRange<SharedLibraryAtom> sharedLibrary() const override {
80 return _noSharedLibraryAtoms;
83 const AtomRange<AbsoluteAtom> absolute() const override {
84 return _noAbsoluteAtoms;
87 void clearAtoms() override {
88 _definedAtoms.clear();
89 _noUndefinedAtoms.clear();
90 _noSharedLibraryAtoms.clear();
91 _noAbsoluteAtoms.clear();
95 AtomVector<DefinedAtom> _definedAtoms;
101 #endif // LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H