diff options
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/Chunk.h | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Chunk.h b/lld/lib/ReaderWriter/ELF/Chunk.h index bcd7cb5011a..aa5fbd82a2c 100644 --- a/lld/lib/ReaderWriter/ELF/Chunk.h +++ b/lld/lib/ReaderWriter/ELF/Chunk.h @@ -25,32 +25,34 @@ class ELFLinkingContext; namespace elf { class ELFWriter; - template <class ELFT> class TargetLayout; /// \brief A chunk is a contiguous region of space -template<class ELFT> -class Chunk { +template <class ELFT> class Chunk { public: - /// \brief Describes the type of Chunk - enum Kind : uint8_t{ ELFHeader, ///< ELF Header - ProgramHeader, ///< Program Header - SectionHeader, ///< Section header - ELFSegment, ///< Segment - ELFSection, ///< Section - AtomSection, ///< A section containing atoms. - Expression ///< A linker script expression + enum Kind : uint8_t { + ELFHeader, ///< ELF Header + ProgramHeader, ///< Program Header + SectionHeader, ///< Section header + ELFSegment, ///< Segment + ELFSection, ///< Section + AtomSection, ///< A section containing atoms + Expression ///< A linker script expression }; + /// \brief the ContentType of the chunk - enum ContentType : uint8_t{ Unknown, Header, Code, Data, Note, TLS }; + enum ContentType : uint8_t { Unknown, Header, Code, Data, Note, TLS }; Chunk(StringRef name, Kind kind, const ELFLinkingContext &ctx) : _name(name), _kind(kind), _fsize(0), _msize(0), _alignment(0), _order(0), _ordinal(1), _start(0), _fileoffset(0), _ctx(ctx) {} + virtual ~Chunk() {} + // The name of the chunk StringRef name() const { return _name; } + // Kind of chunk Kind kind() const { return _kind; } virtual uint64_t fileSize() const { return _fsize; } @@ -59,27 +61,35 @@ public: virtual uint64_t alignment() const { return _alignment; } // The ordinal value of the chunk - uint64_t ordinal() const { return _ordinal;} - void setOrdinal(uint64_t newVal) { _ordinal = newVal;} + uint64_t ordinal() const { return _ordinal; } + void setOrdinal(uint64_t newVal) { _ordinal = newVal; } + // The order in which the chunk would appear in the output file - uint64_t order() const { return _order; } - void setOrder(uint32_t order) { _order = order; } + uint64_t order() const { return _order; } + void setOrder(uint32_t order) { _order = order; } + // Output file offset of the chunk - uint64_t fileOffset() const { return _fileoffset; } - void setFileOffset(uint64_t offset) { _fileoffset = offset; } + uint64_t fileOffset() const { return _fileoffset; } + void setFileOffset(uint64_t offset) { _fileoffset = offset; } + // Output start address of the chunk virtual void setVirtualAddr(uint64_t start) { _start = start; } virtual uint64_t virtualAddr() const { return _start; } + // Memory size of the chunk uint64_t memSize() const { return _msize; } void setMemSize(uint64_t msize) { _msize = msize; } + // Whats the contentType of the chunk? virtual int getContentType() const = 0; + // Writer the chunk virtual void write(ELFWriter *writer, TargetLayout<ELFT> &layout, llvm::FileOutputBuffer &buffer) = 0; + // Finalize the chunk before assigning offsets/virtual addresses virtual void doPreFlight() = 0; + // Finalize the chunk before writing virtual void finalize() = 0; |

