diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-14 03:30:59 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-14 03:30:59 +0000 |
| commit | 5c546a1437eb67a7a72fc157ff9da21849d4efbf (patch) | |
| tree | 02e84f3900b200cba9a63de020907fa2a96cf562 /lld/COFF/DLL.cpp | |
| parent | f9cbd039bdb8e19478afd822efd7060c8fa0228e (diff) | |
| download | bcm5719-llvm-5c546a1437eb67a7a72fc157ff9da21849d4efbf.tar.gz bcm5719-llvm-5c546a1437eb67a7a72fc157ff9da21849d4efbf.zip | |
COFF: In chunks, store the offset from the start of the output section. NFC.
This is more convenient than the offset from the start of the file as we
don't have to worry about it changing when we move the output section.
This is a port of r245008 from ELF.
llvm-svn: 245018
Diffstat (limited to 'lld/COFF/DLL.cpp')
| -rw-r--r-- | lld/COFF/DLL.cpp | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/lld/COFF/DLL.cpp b/lld/COFF/DLL.cpp index 3b2e368bebe..5d6c136bc92 100644 --- a/lld/COFF/DLL.cpp +++ b/lld/COFF/DLL.cpp @@ -50,8 +50,8 @@ public: } void writeTo(uint8_t *Buf) override { - write16le(Buf + FileOff, Hint); - memcpy(Buf + FileOff + 2, Name.data(), Name.size()); + write16le(Buf + OutputSectionOff, Hint); + memcpy(Buf + OutputSectionOff + 2, Name.data(), Name.size()); } private: @@ -66,7 +66,7 @@ public: size_t getSize() const override { return ptrSize(); } void writeTo(uint8_t *Buf) override { - write32le(Buf + FileOff, HintName->getRVA()); + write32le(Buf + OutputSectionOff, HintName->getRVA()); } Chunk *HintName; @@ -84,9 +84,9 @@ public: // An import-by-ordinal slot has MSB 1 to indicate that // this is import-by-ordinal (and not import-by-name). if (Config->is64()) { - write64le(Buf + FileOff, (1ULL << 63) | Ordinal); + write64le(Buf + OutputSectionOff, (1ULL << 63) | Ordinal); } else { - write32le(Buf + FileOff, (1ULL << 31) | Ordinal); + write32le(Buf + OutputSectionOff, (1ULL << 31) | Ordinal); } } @@ -100,7 +100,7 @@ public: size_t getSize() const override { return sizeof(ImportDirectoryTableEntry); } void writeTo(uint8_t *Buf) override { - auto *E = (coff_import_directory_table_entry *)(Buf + FileOff); + auto *E = (coff_import_directory_table_entry *)(Buf + OutputSectionOff); E->ImportLookupTableRVA = LookupTab->getRVA(); E->NameRVA = DLLName->getRVA(); E->ImportAddressTableRVA = AddressTab->getRVA(); @@ -156,7 +156,7 @@ public: } void writeTo(uint8_t *Buf) override { - auto *E = (delay_import_directory_table_entry *)(Buf + FileOff); + auto *E = (delay_import_directory_table_entry *)(Buf + OutputSectionOff); E->Attributes = 1; E->Name = DLLName->getRVA(); E->ModuleHandle = ModuleHandle->getRVA(); @@ -219,10 +219,10 @@ public: size_t getSize() const override { return sizeof(ThunkX64); } void writeTo(uint8_t *Buf) override { - memcpy(Buf + FileOff, ThunkX64, sizeof(ThunkX64)); - write32le(Buf + FileOff + 36, Imp->getRVA() - RVA - 40); - write32le(Buf + FileOff + 43, Desc->getRVA() - RVA - 47); - write32le(Buf + FileOff + 48, Helper->getRVA() - RVA - 52); + memcpy(Buf + OutputSectionOff, ThunkX64, sizeof(ThunkX64)); + write32le(Buf + OutputSectionOff + 36, Imp->getRVA() - RVA - 40); + write32le(Buf + OutputSectionOff + 43, Desc->getRVA() - RVA - 47); + write32le(Buf + OutputSectionOff + 48, Helper->getRVA() - RVA - 52); } Defined *Imp = nullptr; @@ -238,10 +238,10 @@ public: size_t getSize() const override { return sizeof(ThunkX86); } void writeTo(uint8_t *Buf) override { - memcpy(Buf + FileOff, ThunkX86, sizeof(ThunkX86)); - write32le(Buf + FileOff + 3, Imp->getRVA() + Config->ImageBase); - write32le(Buf + FileOff + 8, Desc->getRVA() + Config->ImageBase); - write32le(Buf + FileOff + 13, Helper->getRVA() - RVA - 17); + memcpy(Buf + OutputSectionOff, ThunkX86, sizeof(ThunkX86)); + write32le(Buf + OutputSectionOff + 3, Imp->getRVA() + Config->ImageBase); + write32le(Buf + OutputSectionOff + 8, Desc->getRVA() + Config->ImageBase); + write32le(Buf + OutputSectionOff + 13, Helper->getRVA() - RVA - 17); } void getBaserels(std::vector<Baserel> *Res) override { @@ -262,9 +262,9 @@ public: void writeTo(uint8_t *Buf) override { if (Config->is64()) { - write64le(Buf + FileOff, Thunk->getRVA() + Config->ImageBase); + write64le(Buf + OutputSectionOff, Thunk->getRVA() + Config->ImageBase); } else { - write32le(Buf + FileOff, Thunk->getRVA() + Config->ImageBase); + write32le(Buf + OutputSectionOff, Thunk->getRVA() + Config->ImageBase); } } @@ -290,7 +290,7 @@ public: } void writeTo(uint8_t *Buf) override { - auto *E = (export_directory_table_entry *)(Buf + FileOff); + auto *E = (export_directory_table_entry *)(Buf + OutputSectionOff); E->NameRVA = DLLName->getRVA(); E->OrdinalBase = 0; E->AddressTableEntries = MaxOrdinal + 1; @@ -316,7 +316,7 @@ public: void writeTo(uint8_t *Buf) override { for (Export &E : Config->Exports) { auto *D = cast<Defined>(E.Sym->repl()); - write32le(Buf + FileOff + E.Ordinal * 4, D->getRVA()); + write32le(Buf + OutputSectionOff + E.Ordinal * 4, D->getRVA()); } } @@ -330,7 +330,7 @@ public: size_t getSize() const override { return Chunks.size() * 4; } void writeTo(uint8_t *Buf) override { - uint8_t *P = Buf + FileOff; + uint8_t *P = Buf + OutputSectionOff; for (Chunk *C : Chunks) { write32le(P, C->getRVA()); P += 4; @@ -347,7 +347,7 @@ public: size_t getSize() const override { return Size * 2; } void writeTo(uint8_t *Buf) override { - uint8_t *P = Buf + FileOff; + uint8_t *P = Buf + OutputSectionOff; for (Export &E : Config->Exports) { if (E.Noname) continue; |

