summaryrefslogtreecommitdiff
path: root/lib/ReaderWriter/ELF/Layout.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ReaderWriter/ELF/Layout.h')
-rw-r--r--lib/ReaderWriter/ELF/Layout.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/ReaderWriter/ELF/Layout.h b/lib/ReaderWriter/ELF/Layout.h
new file mode 100644
index 000000000000..826cf5035d59
--- /dev/null
+++ b/lib/ReaderWriter/ELF/Layout.h
@@ -0,0 +1,59 @@
+//===- lib/ReaderWriter/ELF/Layout.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_ELF_LAYOUT_H
+#define LLD_READER_WRITER_ELF_LAYOUT_H
+
+#include "lld/Core/DefinedAtom.h"
+#include "lld/ReaderWriter/AtomLayout.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Object/ELF.h"
+#include "llvm/Support/Allocator.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/ELF.h"
+#include "llvm/Support/ErrorOr.h"
+
+namespace lld {
+namespace elf {
+
+/// \brief The ELFLayout is an abstract class for managing the final layout for
+/// the kind of binaries(Shared Libraries / Relocatables / Executables 0
+/// Each architecture (Hexagon, MIPS) would have a concrete
+/// subclass derived from Layout for generating each binary thats
+// needed by the lld linker
+class Layout {
+public:
+ typedef uint32_t SectionOrder;
+ typedef uint32_t SegmentType;
+ typedef uint32_t Flags;
+
+public:
+ /// Return the order the section would appear in the output file
+ virtual SectionOrder getSectionOrder(StringRef name, int32_t contentType,
+ int32_t contentPerm) = 0;
+ /// \brief Append the Atom to the layout and create appropriate sections.
+ /// \returns A reference to the atom layout or an error. The atom layout will
+ /// be updated as linking progresses.
+ virtual ErrorOr<const lld::AtomLayout *> addAtom(const Atom *atom) = 0;
+ /// find the Atom in the current layout
+ virtual const AtomLayout *findAtomLayoutByName(StringRef name) const = 0;
+ /// associates a section to a segment
+ virtual void assignSectionsToSegments() = 0;
+ /// associates a virtual address to the segment, section, and the atom
+ virtual void assignVirtualAddress() = 0;
+
+public:
+ Layout() {}
+
+ virtual ~Layout() { }
+};
+} // end namespace elf
+} // end namespace lld
+
+#endif