blob: 5236071e0e0260b757c9c820e0b407945ec0706f [file] [log] [blame]
//===---- lib/ReaderWriter/MachO/SectCreateFile.h ---------------*- c++ -*-===//
//
// The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H
#define LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H
#include "lld/Core/DefinedAtom.h"
#include "lld/Core/Simple.h"
#include "lld/ReaderWriter/MachOLinkingContext.h"
namespace lld {
namespace mach_o {
//
// A FlateNamespaceFile instance may be added as a resolution source of last
// resort, depending on how -flat_namespace and -undefined are set.
//
class SectCreateFile : public File {
public:
class SectCreateAtom : public SimpleDefinedAtom {
public:
SectCreateAtom(const File &file, StringRef segName, StringRef sectName,
std::unique_ptr<MemoryBuffer> content)
: SimpleDefinedAtom(file),
_combinedName((segName + "/" + sectName).str()),
_content(std::move(content)) {}
uint64_t size() const override { return _content->getBufferSize(); }
Scope scope() const override { return scopeGlobal; }
ContentType contentType() const override { return typeSectCreate; }
SectionChoice sectionChoice() const override { return sectionCustomRequired; }
StringRef customSectionName() const override { return _combinedName; }
DeadStripKind deadStrip() const override { return deadStripNever; }
ArrayRef<uint8_t> rawContent() const override {
const uint8_t *data =
reinterpret_cast<const uint8_t*>(_content->getBufferStart());
return ArrayRef<uint8_t>(data, _content->getBufferSize());
}
StringRef segmentName() const { return _segName; }
StringRef sectionName() const { return _sectName; }
private:
std::string _combinedName;
StringRef _segName;
StringRef _sectName;
std::unique_ptr<MemoryBuffer> _content;
};
SectCreateFile() : File("sectcreate", kindSectCreateObject) {}
void addSection(StringRef seg, StringRef sect,
std::unique_ptr<MemoryBuffer> content) {
_definedAtoms.push_back(
new (allocator()) SectCreateAtom(*this, seg, sect, std::move(content)));
}
const AtomVector<DefinedAtom> &defined() const override {
return _definedAtoms;
}
const AtomVector<UndefinedAtom> &undefined() const override {
return _noUndefinedAtoms;
}
const AtomVector<SharedLibraryAtom> &sharedLibrary() const override {
return _noSharedLibraryAtoms;
}
const AtomVector<AbsoluteAtom> &absolute() const override {
return _noAbsoluteAtoms;
}
private:
AtomVector<DefinedAtom> _definedAtoms;
};
} // namespace mach_o
} // namespace lld
#endif // LLD_READER_WRITER_MACHO_SECTCREATE_FILE_H