diff options
| author | Davide Italiano <davide@freebsd.org> | 2016-01-14 01:30:21 +0000 |
|---|---|---|
| committer | Davide Italiano <davide@freebsd.org> | 2016-01-14 01:30:21 +0000 |
| commit | 0d4fbae0e7cad9c024e33e33ad33ed366975215d (patch) | |
| tree | 1771d9c7ce9ca19d3f3cb721c0b0b1be97ee1869 | |
| parent | 3463e696fb4253a8cf16d3b5198480bbb4b10af2 (diff) | |
| download | bcm5719-llvm-0d4fbae0e7cad9c024e33e33ad33ed366975215d.tar.gz bcm5719-llvm-0d4fbae0e7cad9c024e33e33ad33ed366975215d.zip | |
[ELF/AArch64] Support R_AARCH64_LDST128_ABS_LO12_NC relocation.
llvm-svn: 257731
| -rw-r--r-- | lld/ELF/Target.cpp | 4 | ||||
| -rw-r--r-- | lld/test/ELF/aarch64-relocs.s | 16 |
2 files changed, 20 insertions, 0 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 6d42dbe86e5..10ce7255037 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -1269,6 +1269,7 @@ bool AArch64TargetInfo::needsCopyRel(uint32_t Type, const SymbolBody &S) const { case R_AARCH64_LDST8_ABS_LO12_NC: case R_AARCH64_LDST32_ABS_LO12_NC: case R_AARCH64_LDST64_ABS_LO12_NC: + case R_AARCH64_LDST128_ABS_LO12_NC: if (auto *SS = dyn_cast<SharedSymbol<ELF64LE>>(&S)) return SS->Sym.getType() == STT_OBJECT; return false; @@ -1376,6 +1377,9 @@ void AArch64TargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd, checkAlignment<8>(SA, Type); or32le(Loc, (SA & 0xFF8) << 7); break; + case R_AARCH64_LDST128_ABS_LO12_NC: + or32le(Loc, (SA & 0x0FF8) << 6); + break; case R_AARCH64_LDST8_ABS_LO12_NC: or32le(Loc, (SA & 0xFFF) << 10); break; diff --git a/lld/test/ELF/aarch64-relocs.s b/lld/test/ELF/aarch64-relocs.s index 56b04a67911..bc00679e7e8 100644 --- a/lld/test/ELF/aarch64-relocs.s +++ b/lld/test/ELF/aarch64-relocs.s @@ -120,3 +120,19 @@ foo8: # CHECK: Disassembly of section .R_AARCH64_LDST8_ABS_LO12_NC: # CHECK-NEXT: ldst8: # CHECK-NEXT: 11044: ab 21 81 39 ldrsb x11, [x13, #72] + +.section .R_AARCH64_LDST128_ABS_LO12_NC,"ax",@progbits +ldst128: + ldr q20, [x19, #:lo12:foo128] +foo128: + .asciz "foo" + .size mystr, 3 + +# S = 0x1104c, A = 0x4 +# R = ((S + A) & 0xFF8) << 6 = 0x00001400 +# 0x00001400 | 0x3dc00274 = 0x3dc01674 +# CHECK: Disassembly of section .R_AARCH64_LDST128_ABS_LO12_NC: +# CHECK: ldst128: +# CHECK: 1104c: 74 16 c0 3d ldr q20, [x19, #80] +#foo128: +# 11050: 66 6f 6f 00 .word |

