Mercurial > hg > CbC > CbC_llvm
diff lld/COFF/Writer.h @ 150:1d019706d866
LLVM10
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 15:10:13 +0900 |
parents | |
children | 2e18cbf3894f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lld/COFF/Writer.h Thu Feb 13 15:10:13 2020 +0900 @@ -0,0 +1,85 @@ +//===- Writer.h -------------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLD_COFF_WRITER_H +#define LLD_COFF_WRITER_H + +#include "Chunks.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/Object/COFF.h" +#include <chrono> +#include <cstdint> +#include <vector> + +namespace lld { +namespace coff { +static const int pageSize = 4096; + +void writeResult(); + +class PartialSection { +public: + PartialSection(StringRef n, uint32_t chars) + : name(n), characteristics(chars) {} + StringRef name; + unsigned characteristics; + std::vector<Chunk *> chunks; +}; + +// 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 RVAs. +class OutputSection { +public: + OutputSection(llvm::StringRef n, uint32_t chars) : name(n) { + header.Characteristics = chars; + } + void addChunk(Chunk *c); + void insertChunkAtStart(Chunk *c); + void merge(OutputSection *other); + void setPermissions(uint32_t c); + uint64_t getRVA() { return header.VirtualAddress; } + uint64_t getFileOff() { return header.PointerToRawData; } + void writeHeaderTo(uint8_t *buf); + void addContributingPartialSection(PartialSection *sec); + + // Returns the size of this section in an executable memory image. + // This may be smaller than the raw size (the raw size is multiple + // of disk sector size, so there may be padding at end), or may be + // larger (if that's the case, the loader reserves spaces after end + // of raw data). + uint64_t getVirtualSize() { return header.VirtualSize; } + + // Returns the size of the section in the output file. + uint64_t getRawSize() { return header.SizeOfRawData; } + + // Set offset into the string table storing this section name. + // Used only when the name is longer than 8 bytes. + void setStringTableOff(uint32_t v) { stringTableOff = v; } + + // N.B. The section index is one based. + uint32_t sectionIndex = 0; + + llvm::StringRef name; + llvm::object::coff_section header = {}; + + std::vector<Chunk *> chunks; + std::vector<Chunk *> origChunks; + + std::vector<PartialSection *> contribSections; + +private: + uint32_t stringTableOff = 0; +}; + +} // namespace coff +} // namespace lld + +#endif