Commit f2ee78cc authored by Tom Stellard's avatar Tom Stellard
Browse files

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
parent dfebe573
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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;
+24 −0
Original line number Diff line number Diff line
// 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.