|
| 1 | +From f76abe65e6d07fea5e838c4f8c9a9421c16debb0 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Valentin Churavy < [email protected]> |
| 3 | +Date: Thu, 5 Jul 2018 12:37:50 -0400 |
| 4 | +Subject: [PATCH] Fix unwind info relocation with large code model on AArch64 |
| 5 | + |
| 6 | +--- |
| 7 | + lib/MC/MCObjectFileInfo.cpp | 2 ++ |
| 8 | + .../AArch64/ELF_ARM64_large-relocations.s | 20 +++++++++++++++++++ |
| 9 | + 2 files changed, 22 insertions(+) |
| 10 | + create mode 100644 test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_large-relocations.s |
| 11 | + |
| 12 | +diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp |
| 13 | +index 328f000f37c..938b35f20d1 100644 |
| 14 | +--- a/lib/MC/MCObjectFileInfo.cpp |
| 15 | ++++ b/lib/MC/MCObjectFileInfo.cpp |
| 16 | +@@ -291,6 +291,8 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) { |
| 17 | + break; |
| 18 | + case Triple::ppc64: |
| 19 | + case Triple::ppc64le: |
| 20 | ++ case Triple::aarch64: |
| 21 | ++ case Triple::aarch64_be: |
| 22 | + case Triple::x86_64: |
| 23 | + FDECFIEncoding = dwarf::DW_EH_PE_pcrel | |
| 24 | + (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4); |
| 25 | +diff --git a/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_large-relocations.s b/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_large-relocations.s |
| 26 | +new file mode 100644 |
| 27 | +index 00000000000..66f28dabd79 |
| 28 | +--- /dev/null |
| 29 | ++++ b/test/ExecutionEngine/RuntimeDyld/AArch64/ELF_ARM64_large-relocations.s |
| 30 | +@@ -0,0 +1,20 @@ |
| 31 | ++# RUN: llvm-mc -triple=arm64-none-linux-gnu -large-code-model -filetype=obj -o %T/large-reloc.o %s |
| 32 | ++# RUN: llvm-rtdyld -triple=arm64-none-linux-gnu -verify -map-section large-reloc.o,.eh_frame=0x10000 -map-section large-reloc.o,.text=0xffff000000000000 -check=%s %T/large-reloc.o |
| 33 | ++# RUN-BE: llvm-mc -triple=aarch64_be-none-linux-gnu -large-code-model -filetype=obj -o %T/be-large-reloc.o %s |
| 34 | ++# RUN-BE: llvm-rtdyld -triple=aarch64_be-none-linux-gnu -verify -map-section be-large-reloc.o,.eh_frame=0x10000 -map-section be-large-reloc.o,.text=0xffff000000000000 -check=%s %T/be-large-reloc.o |
| 35 | ++ |
| 36 | ++ .text |
| 37 | ++ .globl g |
| 38 | ++ .p2align 2 |
| 39 | ++ .type g,@function |
| 40 | ++g: |
| 41 | ++ .cfi_startproc |
| 42 | ++ mov x0, xzr |
| 43 | ++ ret |
| 44 | ++ .Lfunc_end0: |
| 45 | ++ .size g, .Lfunc_end0-g |
| 46 | ++ .cfi_endproc |
| 47 | ++ |
| 48 | ++# Skip the CIE and load the 8 bytes PC begin pointer. |
| 49 | ++# Assuming the CIE and the FDE length are both 4 bytes. |
| 50 | ++# rtdyld-check: *{8}(section_addr(large-reloc.o, .eh_frame) + (*{4}(section_addr(large-reloc.o, .eh_frame))) + 0xc) = g - (section_addr(large-reloc.o, .eh_frame) + (*{4}(section_addr(large-reloc.o, .eh_frame))) + 0xc) |
| 51 | +-- |
| 52 | +2.18.0 |
| 53 | + |
0 commit comments