[lld] r197025 - [PECOFF] Writer: Remove BaseRelocAtom.
Rui Ueyama
ruiu at google.com
Wed Dec 11 02:44:04 PST 2013
Author: ruiu
Date: Wed Dec 11 04:44:04 2013
New Revision: 197025
URL: http://llvm.org/viewvc/llvm-project?rev=197025&view=rev
Log:
[PECOFF] Writer: Remove BaseRelocAtom.
No functionality change.
Modified:
lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=197025&r1=197024&r2=197025&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Wed Dec 11 04:44:04 2013
@@ -186,13 +186,10 @@ public:
uint64_t imageBaseAddress);
void printAtomAddresses(uint64_t baseAddr) const;
void addBaseRelocations(std::vector<uint64_t> &relocSites) const;
-
- uint64_t getVirtualAddress() {
- assert(_atomLayouts.size() > 0);
- return _atomLayouts[0]->_virtualAddr;
- }
+ uint64_t getVirtualAddress() { return _virtualAddress; }
void setVirtualAddress(uint32_t rva) {
+ _virtualAddress = rva;
for (AtomLayout *layout : _atomLayouts)
layout->_virtualAddr += rva;
}
@@ -209,8 +206,9 @@ public:
}
protected:
- explicit AtomChunk(Kind kind) : Chunk(kind) {}
+ explicit AtomChunk(Kind kind) : Chunk(kind), _virtualAddress(0) {}
std::vector<AtomLayout *> _atomLayouts;
+ uint64_t _virtualAddress;
};
/// A DataDirectoryChunk represents data directory entries that follows the PE
@@ -281,16 +279,6 @@ private:
StringRef name, const std::vector<const DefinedAtom *> &atoms) const;
};
-/// A BaseRelocAtom represents a base relocation block in ".reloc" section.
-class BaseRelocAtom : public coff::COFFLinkerInternalAtom {
-public:
- BaseRelocAtom(const File &file, uint64_t ordinal, std::vector<uint8_t> data)
- : COFFLinkerInternalAtom(file, ordinal, std::move(data)) {}
-
- virtual ContentType contentType() const { return typeData; }
- virtual Alignment alignment() const { return Alignment(2); }
-};
-
/// A BaseRelocChunk represents ".reloc" section.
///
/// .reloc section contains a list of addresses. If the PE/COFF loader decides
@@ -309,10 +297,12 @@ class BaseRelocChunk : public SectionChu
typedef std::map<uint64_t, std::vector<uint16_t>> PageOffsetT;
public:
- explicit BaseRelocChunk(const File &linkedFile)
- : SectionChunk(".reloc", characteristics), _file(linkedFile) {}
+ BaseRelocChunk(ChunkVectorT &chunks)
+ : SectionChunk(".reloc", characteristics),
+ _contents(createContents(chunks)) {}
- void setContents(ChunkVectorT &chunks);
+ virtual void write(uint8_t *buffer);
+ virtual uint64_t size() const { return _contents.size(); }
private:
// When loaded into memory, reloc section should be readable and writable.
@@ -321,6 +311,8 @@ private:
llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
llvm::COFF::IMAGE_SCN_MEM_DISCARDABLE;
+ std::vector<uint8_t> createContents(ChunkVectorT &chunks);
+
// Returns a list of RVAs that needs to be relocated if the binary is loaded
// at an address different from its preferred one.
std::vector<uint64_t> listRelocSites(ChunkVectorT &chunks) const;
@@ -329,12 +321,11 @@ private:
PageOffsetT groupByPage(const std::vector<uint64_t> &relocSites) const;
// Create the content of a relocation block.
- DefinedAtom *createBaseRelocBlock(const File &file, uint64_t ordinal,
- uint64_t pageAddr,
- const std::vector<uint16_t> &offsets);
+ std::vector<uint8_t>
+ createBaseRelocBlock(uint64_t pageAddr, const std::vector<uint16_t> &offsets);
mutable llvm::BumpPtrAllocator _alloc;
- const File &_file;
+ std::vector<uint8_t> _contents;
};
PEHeaderChunk::PEHeaderChunk(const PECOFFLinkingContext &context)
@@ -672,6 +663,10 @@ SectionHeaderTableChunk::createSectionHe
return header;
}
+void BaseRelocChunk::write(uint8_t *buffer) {
+ std::memcpy(buffer, &_contents[0], _contents.size());
+}
+
/// Creates .reloc section content from the other sections. The content of
/// .reloc is basically a list of relocation sites. The relocation sites are
/// divided into blocks. Each block represents the base relocation for a 4K
@@ -681,15 +676,17 @@ SectionHeaderTableChunk::createSectionHe
/// the base relocation. A block consists of a 32 bit page RVA and 16 bit
/// relocation entries which represent offsets in the page. That is a more
/// compact representation than a simple vector of 32 bit RVAs.
-void BaseRelocChunk::setContents(ChunkVectorT &chunks) {
+std::vector<uint8_t> BaseRelocChunk::createContents(ChunkVectorT &chunks) {
+ std::vector<uint8_t> contents;
std::vector<uint64_t> relocSites = listRelocSites(chunks);
PageOffsetT blocks = groupByPage(relocSites);
- uint64_t ordinal = 0;
for (auto &i : blocks) {
uint64_t pageAddr = i.first;
const std::vector<uint16_t> &offsetsInPage = i.second;
- appendAtom(createBaseRelocBlock(_file, ordinal++, pageAddr, offsetsInPage));
+ std::vector<uint8_t> block = createBaseRelocBlock(pageAddr, offsetsInPage);
+ contents.insert(contents.end(), block.begin(), block.end());
}
+ return contents;
}
// Returns a list of RVAs that needs to be relocated if the binary is loaded
@@ -714,9 +711,8 @@ BaseRelocChunk::groupByPage(const std::v
}
// Create the content of a relocation block.
-DefinedAtom *
-BaseRelocChunk::createBaseRelocBlock(const File &file, uint64_t ordinal,
- uint64_t pageAddr,
+std::vector<uint8_t>
+BaseRelocChunk::createBaseRelocBlock(uint64_t pageAddr,
const std::vector<uint16_t> &offsets) {
// Relocation blocks should be padded with IMAGE_REL_I386_ABSOLUTE to be
// aligned to a DWORD size boundary.
@@ -742,7 +738,7 @@ BaseRelocChunk::createBaseRelocBlock(con
*reinterpret_cast<ulittle16_t *>(ptr) = val;
ptr += sizeof(ulittle16_t);
}
- return new (_alloc) BaseRelocAtom(file, ordinal, std::move(contents));
+ return contents;
}
} // end anonymous namespace
@@ -866,8 +862,7 @@ void ExecutableWriter::build(const File
// relocated. So we can create the ".reloc" section which contains all the
// relocation sites.
if (_PECOFFLinkingContext.getBaseRelocationEnabled()) {
- BaseRelocChunk *baseReloc = new BaseRelocChunk(linkedFile);
- baseReloc->setContents(_chunks);
+ BaseRelocChunk *baseReloc = new BaseRelocChunk(_chunks);
if (baseReloc->size()) {
addSectionChunk(baseReloc, sectionTable);
dataDirectory->setField(DataDirectoryIndex::BASE_RELOCATION_TABLE,
More information about the llvm-commits
mailing list