forked from OSchip/llvm-project
63 lines
2.1 KiB
C++
63 lines
2.1 KiB
C++
//===- 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, PowerPC, 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 Address in the current layout
|
|
virtual bool findAtomAddrByName(StringRef name, uint64_t &addr) = 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;
|
|
/// associates a file offset to the segment, section and the atom
|
|
virtual void assignFileOffsets() = 0;
|
|
|
|
public:
|
|
Layout() {}
|
|
|
|
virtual ~Layout() { }
|
|
};
|
|
} // end namespace elf
|
|
} // end namespace lld
|
|
|
|
#endif
|