summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/MachO/ExecutableAtoms.h
diff options
context:
space:
mode:
authorDavide Italiano <davide@freebsd.org>2015-04-14 21:06:56 +0000
committerDavide Italiano <davide@freebsd.org>2015-04-14 21:06:56 +0000
commitb60453fe2975d7b3b7cf764ffa48b7cbedd4f47e (patch)
tree5475c3633ce20bc21cac3b38fae03390cb47e0dd /lld/lib/ReaderWriter/MachO/ExecutableAtoms.h
parentebaf28d13de293ff22dc49a5f40a0540c0aae4bb (diff)
downloadbcm5719-llvm-b60453fe2975d7b3b7cf764ffa48b7cbedd4f47e.tar.gz
bcm5719-llvm-b60453fe2975d7b3b7cf764ffa48b7cbedd4f47e.zip
Rename ExecutableAtom.hpp to ExecutableAtom.h
This is for consistency with what's used elsewhere in lld tree. llvm-svn: 234943
Diffstat (limited to 'lld/lib/ReaderWriter/MachO/ExecutableAtoms.h')
-rw-r--r--lld/lib/ReaderWriter/MachO/ExecutableAtoms.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.h b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.h
new file mode 100644
index 00000000000..2e99af903db
--- /dev/null
+++ b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.h
@@ -0,0 +1,133 @@
+//===- lib/ReaderWriter/MachO/ExecutableAtoms.h ---------------------------===//
+//
+// 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_EXECUTABLE_ATOMS_H
+#define LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H
+
+#include "Atoms.h"
+
+#include "llvm/Support/MachO.h"
+
+#include "lld/Core/ArchiveLibraryFile.h"
+#include "lld/Core/DefinedAtom.h"
+#include "lld/Core/File.h"
+#include "lld/Core/LinkingContext.h"
+#include "lld/Core/Reference.h"
+#include "lld/Core/Simple.h"
+#include "lld/Core/UndefinedAtom.h"
+#include "lld/ReaderWriter/MachOLinkingContext.h"
+
+namespace lld {
+namespace mach_o {
+
+
+//
+// CEntryFile adds an UndefinedAtom for "_main" so that the Resolving
+// phase will fail if "_main" is undefined.
+//
+class CEntryFile : public SimpleFile {
+public:
+ CEntryFile(const MachOLinkingContext &context)
+ : SimpleFile("C entry"),
+ _undefMain(*this, context.entrySymbolName()) {
+ this->addAtom(_undefMain);
+ }
+
+private:
+ SimpleUndefinedAtom _undefMain;
+};
+
+
+//
+// StubHelperFile adds an UndefinedAtom for "dyld_stub_binder" so that
+// the Resolveing phase will fail if "dyld_stub_binder" is undefined.
+//
+class StubHelperFile : public SimpleFile {
+public:
+ StubHelperFile(const MachOLinkingContext &context)
+ : SimpleFile("stub runtime"),
+ _undefBinder(*this, context.binderSymbolName()) {
+ this->addAtom(_undefBinder);
+ }
+
+private:
+ SimpleUndefinedAtom _undefBinder;
+};
+
+
+//
+// MachHeaderAliasFile lazily instantiates the magic symbols that mark the start
+// of the mach_header for final linked images.
+//
+class MachHeaderAliasFile : public ArchiveLibraryFile {
+public:
+ MachHeaderAliasFile(const MachOLinkingContext &context)
+ : ArchiveLibraryFile("mach_header symbols") {
+ switch (context.outputMachOType()) {
+ case llvm::MachO::MH_EXECUTE:
+ _machHeaderSymbolName = "__mh_execute_header";
+ break;
+ case llvm::MachO::MH_DYLIB:
+ _machHeaderSymbolName = "__mh_dylib_header";
+ break;
+ case llvm::MachO::MH_BUNDLE:
+ _machHeaderSymbolName = "__mh_bundle_header";
+ break;
+ case llvm::MachO::MH_DYLINKER:
+ _machHeaderSymbolName = "__mh_dylinker_header";
+ break;
+ case llvm::MachO::MH_PRELOAD:
+ _machHeaderSymbolName = "__mh_preload_header";
+ break;
+ default:
+ llvm_unreachable("no mach_header symbol for file type");
+ }
+ }
+
+ std::error_code
+ parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
+ return std::error_code();
+ }
+
+ File *find(StringRef sym, bool dataSymbolOnly) override {
+ if (sym.equals("___dso_handle") || sym.equals(_machHeaderSymbolName)) {
+ _definedAtoms.push_back(new (allocator()) MachODefinedAtom(
+ *this, sym, DefinedAtom::scopeLinkageUnit,
+ DefinedAtom::typeMachHeader, DefinedAtom::mergeNo, false, false,
+ ArrayRef<uint8_t>(), DefinedAtom::Alignment(4096)));
+ return this;
+ }
+ return nullptr;
+ }
+
+ 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:
+ mutable AtomVector<DefinedAtom> _definedAtoms;
+ StringRef _machHeaderSymbolName;
+};
+
+} // namespace mach_o
+} // namespace lld
+
+#endif // LLD_READER_WRITER_MACHO_EXECUTABLE_ATOMS_H
OpenPOWER on IntegriCloud