diff options
-rw-r--r-- | lld/COFF/Chunks.cpp | 6 | ||||
-rw-r--r-- | lld/COFF/Chunks.h | 2 | ||||
-rw-r--r-- | lld/test/COFF/delayimports.test | 6 | ||||
-rw-r--r-- | lld/test/COFF/imports.test | 12 |
4 files changed, 16 insertions, 10 deletions
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp index c5cf80ec7758..aa2c0be3ef51 100644 --- a/lld/COFF/Chunks.cpp +++ b/lld/COFF/Chunks.cpp @@ -216,6 +216,12 @@ void StringChunk::writeTo(uint8_t *Buf) { memcpy(Buf + FileOff, Str.data(), Str.size()); } +ImportThunkChunk::ImportThunkChunk(Defined *S) : ImpSymbol(S) { + // Intel Optimization Manual says that all branch targets + // should be 16-byte aligned. MSVC linker does this too. + Align = 16; +} + void ImportThunkChunk::writeTo(uint8_t *Buf) { memcpy(Buf + FileOff, ImportThunkData, sizeof(ImportThunkData)); // The first two bytes is a JMP instruction. Fill its operand. diff --git a/lld/COFF/Chunks.h b/lld/COFF/Chunks.h index d44c02550836..37a6003cf8ec 100644 --- a/lld/COFF/Chunks.h +++ b/lld/COFF/Chunks.h @@ -198,7 +198,7 @@ static const uint8_t ImportThunkData[] = { // contents will be a JMP instruction to some __imp_ symbol. class ImportThunkChunk : public Chunk { public: - explicit ImportThunkChunk(Defined *S) : ImpSymbol(S) {} + explicit ImportThunkChunk(Defined *ImpSymbol); size_t getSize() const override { return sizeof(ImportThunkData); } void writeTo(uint8_t *Buf) override; diff --git a/lld/test/COFF/delayimports.test b/lld/test/COFF/delayimports.test index 5dff32a9ddab..6cc1c7b8a3d1 100644 --- a/lld/test/COFF/delayimports.test +++ b/lld/test/COFF/delayimports.test @@ -13,14 +13,14 @@ CHECK-NEXT: BoundDelayImportTable: 0x0 CHECK-NEXT: UnloadDelayImportTable: 0x0 CHECK-NEXT: Import { CHECK-NEXT: Symbol: ExitProcess (0) -CHECK-NEXT: Address: 0x2045 +CHECK-NEXT: Address: 0x2066 CHECK-NEXT: } CHECK-NEXT: Import { CHECK-NEXT: Symbol: (50) -CHECK-NEXT: Address: 0x209C +CHECK-NEXT: Address: 0x20BD CHECK-NEXT: } CHECK-NEXT: Import { CHECK-NEXT: Symbol: MessageBoxA (1) -CHECK-NEXT: Address: 0x20F3 +CHECK-NEXT: Address: 0x2114 CHECK-NEXT: } CHECK-NEXT: } diff --git a/lld/test/COFF/imports.test b/lld/test/COFF/imports.test index a336217b8fdf..90f5a2802f6e 100644 --- a/lld/test/COFF/imports.test +++ b/lld/test/COFF/imports.test @@ -12,13 +12,13 @@ TEXT-NEXT: movq $0, %rcx TEXT-NEXT: leaq -4108(%rip), %rdx TEXT-NEXT: leaq -4121(%rip), %r8 TEXT-NEXT: movl $0, %r9d -TEXT-NEXT: callq 27 +TEXT-NEXT: callq 60 TEXT-NEXT: movl $0, %ecx -TEXT-NEXT: callq 5 -TEXT-NEXT: callq 6 -TEXT-NEXT: jmpq *4111(%rip) -TEXT-NEXT: jmpq *4113(%rip) -TEXT-NEXT: jmpq *4115(%rip) +TEXT-NEXT: callq 18 +TEXT-NEXT: callq 29 +TEXT: jmpq *4098(%rip) +TEXT: jmpq *4090(%rip) +TEXT: jmpq *4082(%rip) IMPORT: Import { IMPORT-NEXT: Name: std64.dll |