blob: 49e65f63151df68f9f8dca38e42029ebce66d66f [file] [log] [blame]
Lang Hamesb1b67f42015-10-24 08:20:51 +00001//===---- 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
17namespace lld {
18namespace 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//
24class SectCreateFile : public File {
25public:
Lang Hamesb1b67f42015-10-24 08:20:51 +000026 class SectCreateAtom : public SimpleDefinedAtom {
27 public:
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
Pete Cooper8ad55fb2016-03-22 17:15:50 +000034 ~SectCreateAtom() override = default;
35
Lang Hamesb1b67f42015-10-24 08:20:51 +000036 uint64_t size() const override { return _content->getBufferSize(); }
37
38 Scope scope() const override { return scopeGlobal; }
39
40 ContentType contentType() const override { return typeSectCreate; }
41
42 SectionChoice sectionChoice() const override { return sectionCustomRequired; }
43
44 StringRef customSectionName() const override { return _combinedName; }
45
46 DeadStripKind deadStrip() const override { return deadStripNever; }
47
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
54 StringRef segmentName() const { return _segName; }
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
Pete Cooperf0c0f3c2016-01-14 22:55:38 +000064 SectCreateFile() : File("sectcreate", kindSectCreateObject) {}
Lang Hamesb1b67f42015-10-24 08:20:51 +000065
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
Pete Cooper8ad55fb2016-03-22 17:15:50 +000072 const AtomRange<DefinedAtom> defined() const override {
Lang Hamesb1b67f42015-10-24 08:20:51 +000073 return _definedAtoms;
74 }
75
Pete Cooper8ad55fb2016-03-22 17:15:50 +000076 const AtomRange<UndefinedAtom> undefined() const override {
Lang Hamesb1b67f42015-10-24 08:20:51 +000077 return _noUndefinedAtoms;
78 }
79
Pete Cooper8ad55fb2016-03-22 17:15:50 +000080 const AtomRange<SharedLibraryAtom> sharedLibrary() const override {
Lang Hamesb1b67f42015-10-24 08:20:51 +000081 return _noSharedLibraryAtoms;
82 }
83
Pete Cooper8ad55fb2016-03-22 17:15:50 +000084 const AtomRange<AbsoluteAtom> absolute() const override {
Lang Hamesb1b67f42015-10-24 08:20:51 +000085 return _noAbsoluteAtoms;
86 }
87
Pete Cooper8ad55fb2016-03-22 17:15:50 +000088 void clearAtoms() override {
89 _definedAtoms.clear();
90 _noUndefinedAtoms.clear();
91 _noSharedLibraryAtoms.clear();
92 _noAbsoluteAtoms.clear();
93 }
94
Lang Hamesb1b67f42015-10-24 08:20:51 +000095private:
96 AtomVector<DefinedAtom> _definedAtoms;
97};
98
99} // namespace mach_o
100} // namespace lld
101
102#endif // LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H