blob: 5236071e0e0260b757c9c820e0b407945ec0706f [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
34 uint64_t size() const override { return _content->getBufferSize(); }
35
36 Scope scope() const override { return scopeGlobal; }
37
38 ContentType contentType() const override { return typeSectCreate; }
39
40 SectionChoice sectionChoice() const override { return sectionCustomRequired; }
41
42 StringRef customSectionName() const override { return _combinedName; }
43
44 DeadStripKind deadStrip() const override { return deadStripNever; }
45
46 ArrayRef<uint8_t> rawContent() const override {
47 const uint8_t *data =
48 reinterpret_cast<const uint8_t*>(_content->getBufferStart());
49 return ArrayRef<uint8_t>(data, _content->getBufferSize());
50 }
51
52 StringRef segmentName() const { return _segName; }
53 StringRef sectionName() const { return _sectName; }
54
55 private:
56 std::string _combinedName;
57 StringRef _segName;
58 StringRef _sectName;
59 std::unique_ptr<MemoryBuffer> _content;
60 };
61
Pete Cooperf0c0f3c2016-01-14 22:55:38 +000062 SectCreateFile() : File("sectcreate", kindSectCreateObject) {}
Lang Hamesb1b67f42015-10-24 08:20:51 +000063
64 void addSection(StringRef seg, StringRef sect,
65 std::unique_ptr<MemoryBuffer> content) {
66 _definedAtoms.push_back(
67 new (allocator()) SectCreateAtom(*this, seg, sect, std::move(content)));
68 }
69
Eugene Zelenko6e43b492015-11-04 02:11:57 +000070 const AtomVector<DefinedAtom> &defined() const override {
Lang Hamesb1b67f42015-10-24 08:20:51 +000071 return _definedAtoms;
72 }
73
Eugene Zelenko6e43b492015-11-04 02:11:57 +000074 const AtomVector<UndefinedAtom> &undefined() const override {
Lang Hamesb1b67f42015-10-24 08:20:51 +000075 return _noUndefinedAtoms;
76 }
77
Eugene Zelenko6e43b492015-11-04 02:11:57 +000078 const AtomVector<SharedLibraryAtom> &sharedLibrary() const override {
Lang Hamesb1b67f42015-10-24 08:20:51 +000079 return _noSharedLibraryAtoms;
80 }
81
Eugene Zelenko6e43b492015-11-04 02:11:57 +000082 const AtomVector<AbsoluteAtom> &absolute() const override {
Lang Hamesb1b67f42015-10-24 08:20:51 +000083 return _noAbsoluteAtoms;
84 }
85
86private:
87 AtomVector<DefinedAtom> _definedAtoms;
88};
89
90} // namespace mach_o
91} // namespace lld
92
93#endif // LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H