From: Martin Storsjo Date: Thu, 11 Oct 2018 17:45:51 +0000 (+0000) Subject: [COFF] Set proper pointer size alignment for LocalImportChunk X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=21eb363302bec770adf67b2494aa30ff2bcf5d65;p=platform%2Fupstream%2Fllvm.git [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: 344264 --- diff --git a/lld/COFF/Chunks.h b/lld/COFF/Chunks.h index bdfff7c..64a6626 100644 --- a/lld/COFF/Chunks.h +++ b/lld/COFF/Chunks.h @@ -368,7 +368,9 @@ public: // 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.