From f2ee78ccdf5ee025eaef2d61e00bad8ed2699507 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Mon, 22 Oct 2018 16:52:14 +0000 Subject: Merging r344264: ------------------------------------------------------------------------ r344264 | mstorsjo | 2018-10-11 10:45:51 -0700 (Thu, 11 Oct 2018) | 8 lines [COFF] Set proper pointer size alignment for LocalImportChunk When these are accessed with load/store instructions on ARM64, it becomes strictly necessary to have them properly aligned. This fixes PR39228. Differential Revision: https://reviews.llvm.org/D53128 ------------------------------------------------------------------------ llvm-svn: 344920 --- lld/COFF/Chunks.h | 4 +++- lld/test/COFF/arm64-localimport-align.s | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 lld/test/COFF/arm64-localimport-align.s diff --git a/lld/COFF/Chunks.h b/lld/COFF/Chunks.h index 9e89653..b3199d8 100644 --- a/lld/COFF/Chunks.h +++ b/lld/COFF/Chunks.h @@ -345,7 +345,9 @@ private: // See comments for DefinedLocalImport class. class LocalImportChunk : public Chunk { public: - explicit LocalImportChunk(Defined *S) : Sym(S) {} + explicit LocalImportChunk(Defined *S) : Sym(S) { + Alignment = Config->is64() ? 8 : 4; + } size_t getSize() const override; void getBaserels(std::vector *Res) override; void writeTo(uint8_t *Buf) const override; diff --git a/lld/test/COFF/arm64-localimport-align.s b/lld/test/COFF/arm64-localimport-align.s new file mode 100644 index 0000000..4fbc79e --- /dev/null +++ b/lld/test/COFF/arm64-localimport-align.s @@ -0,0 +1,24 @@ +// REQUIRES: aarch64 +// RUN: llvm-mc -filetype=obj -triple=aarch64-windows %s -o %t.obj +// RUN: lld-link -entry:main -subsystem:console %t.obj -out:%t.exe +// Don't check the output, just make sure it links fine and doesn't +// error out due to a misaligned load. + .text + .globl main + .globl myfunc +main: + adrp x8, __imp_myfunc + ldr x0, [x8, :lo12:__imp_myfunc] + br x0 + ret +myfunc: + ret + + .section .rdata, "dr" + // Start the .rdata section with a 4 byte chunk, to expose the alignment + // of the next chunk in the section. +mydata: + .byte 42 + // The synthesized LocalImportChunk gets stored here in the .rdata + // section, but needs to get proper 8 byte alignment since it is a + // pointer, just like regular LookupChunks in the IAT. -- cgit v1.1