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