diff options
Diffstat (limited to 'lld/ELF/Writer.h')
-rw-r--r-- | lld/ELF/Writer.h | 61 |
1 files changed, 6 insertions, 55 deletions
diff --git a/lld/ELF/Writer.h b/lld/ELF/Writer.h index 1feb68bdf4b..5302d6bf3a3 100644 --- a/lld/ELF/Writer.h +++ b/lld/ELF/Writer.h @@ -10,65 +10,16 @@ #ifndef LLD_ELF_WRITER_H #define LLD_ELF_WRITER_H -#include "Chunks.h" -#include "SymbolTable.h" -#include "llvm/Support/FileOutputBuffer.h" - namespace lld { namespace elf2 { -// OutputSection represents a section in an output file. It's a -// container of chunks. OutputSection and Chunk are 1:N relationship. -// Chunks cannot belong to more than one OutputSections. The writer -// creates multiple OutputSections and assign them unique, -// non-overlapping file offsets and VAs. -class OutputSection { -public: - OutputSection(StringRef Name) : Name(Name), Header({}) {} - void setVA(uint64_t); - void setFileOffset(uint64_t); - template <class ELFT> void addSectionChunk(SectionChunk<ELFT> *C); - std::vector<Chunk *> &getChunks() { return Chunks; } - template <class ELFT> - void writeHeaderTo(llvm::object::Elf_Shdr_Impl<ELFT> *SHdr); - - // Returns the size of the section in the output file. - uint64_t getSize() { return Header.sh_size; } - -private: - StringRef Name; - llvm::ELF::Elf64_Shdr Header; - std::vector<Chunk *> Chunks; -}; - -// The writer writes a SymbolTable result to a file. -template <class ELFT> class Writer { -public: - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; - - explicit Writer(SymbolTable *Symtab); - ~Writer(); - void write(StringRef Path); - -private: - void createSections(); - void assignAddresses(); - void openFile(StringRef OutputPath); - void writeHeader(); - void writeSections(); - - SymbolTable *Symtab; - std::unique_ptr<llvm::FileOutputBuffer> Buffer; - llvm::SpecificBumpPtrAllocator<OutputSection> CAlloc; - std::vector<OutputSection *> OutputSections; - uint64_t FileSize; - uint64_t SizeOfHeaders; - uintX_t SectionHeaderOff; +class OutputSection; +class SymbolTable; - std::vector<std::unique_ptr<Chunk>> Chunks; -}; +template <class ELFT> +void writeResult(SymbolTable *Symtab, StringRef Path); -} // namespace elf2 -} // namespace lld +} +} #endif |