aboutsummaryrefslogtreecommitdiff
path: root/lib/ReaderWriter/ELF/Chunk.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ReaderWriter/ELF/Chunk.h')
-rw-r--r--lib/ReaderWriter/ELF/Chunk.h73
1 files changed, 41 insertions, 32 deletions
diff --git a/lib/ReaderWriter/ELF/Chunk.h b/lib/ReaderWriter/ELF/Chunk.h
index 2658d023b3a9..f223b6c54163 100644
--- a/lib/ReaderWriter/ELF/Chunk.h
+++ b/lib/ReaderWriter/ELF/Chunk.h
@@ -25,32 +25,33 @@ 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), _ctx(ctx) {}
- Chunk(StringRef name, Kind kind, const ELFLinkingContext &context)
- : _name(name), _kind(kind), _fsize(0), _msize(0), _alignment(0), _order(0),
- _ordinal(1), _start(0), _fileoffset(0), _context(context) {}
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,41 +60,49 @@ 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?
+
+ // Returns 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;
+ virtual void doPreFlight() {}
+
// Finalize the chunk before writing
- virtual void finalize() = 0;
+ virtual void finalize() {}
protected:
StringRef _name;
Kind _kind;
- uint64_t _fsize;
- uint64_t _msize;
- uint64_t _alignment;
- uint32_t _order;
- uint64_t _ordinal;
- uint64_t _start;
- uint64_t _fileoffset;
- const ELFLinkingContext &_context;
+ const ELFLinkingContext &_ctx;
+ uint64_t _fsize = 0;
+ uint64_t _msize = 0;
+ uint64_t _alignment = 1;
+ uint32_t _order = 0;
+ uint64_t _ordinal = 1;
+ uint64_t _start = 0;
+ uint64_t _fileoffset = 0;
};
} // end namespace elf