diff options
author | Tom Stellard <tstellar@redhat.com> | 2018-10-22 16:52:14 +0000 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2018-10-22 16:52:14 +0000 |
commit | f2ee78ccdf5ee025eaef2d61e00bad8ed2699507 (patch) | |
tree | b538724d94caf68e44d4469ccd25eff0523b7084 | |
parent | dfebe573431425a385738e5644ea417d67f87689 (diff) | |
download | llvm-f2ee78ccdf5ee025eaef2d61e00bad8ed2699507.zip llvm-f2ee78ccdf5ee025eaef2d61e00bad8ed2699507.tar.gz llvm-f2ee78ccdf5ee025eaef2d61e00bad8ed2699507.tar.bz2 |
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
-rw-r--r-- | lld/COFF/Chunks.h | 4 | ||||
-rw-r--r-- | lld/test/COFF/arm64-localimport-align.s | 24 |
2 files changed, 27 insertions, 1 deletions
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<Baserel> *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. |