summaryrefslogtreecommitdiff
path: root/lib/Target/ARM64/MCTargetDesc/ARM64AsmBackend.cpp
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2014-04-24 12:12:10 +0000
committerTim Northover <tnorthover@apple.com>2014-04-24 12:12:10 +0000
commitd4b4f400e85470a1e8c0b90f23080f9c9c563603 (patch)
treed8cf394419b6e942861dd77356aacdd6f99932d1 /lib/Target/ARM64/MCTargetDesc/ARM64AsmBackend.cpp
parent92f4b34653f303aa94a06969dcc72d74c614ea23 (diff)
downloadllvm-d4b4f400e85470a1e8c0b90f23080f9c9c563603.tar.gz
llvm-d4b4f400e85470a1e8c0b90f23080f9c9c563603.tar.bz2
llvm-d4b4f400e85470a1e8c0b90f23080f9c9c563603.tar.xz
AArch64/ARM64: disentangle the "B.CC" and "LDR lit" operands
These can have different relocations in ELF. In particular both: b.eq global ldr x0, global are valid, giving different relocations. The only possible way to distinguish them is via a different fixup, so the operands had to be separated throughout the backend. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207105 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM64/MCTargetDesc/ARM64AsmBackend.cpp')
-rw-r--r--lib/Target/ARM64/MCTargetDesc/ARM64AsmBackend.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/Target/ARM64/MCTargetDesc/ARM64AsmBackend.cpp b/lib/Target/ARM64/MCTargetDesc/ARM64AsmBackend.cpp
index 55ba91d726..c9b95a2c16 100644
--- a/lib/Target/ARM64/MCTargetDesc/ARM64AsmBackend.cpp
+++ b/lib/Target/ARM64/MCTargetDesc/ARM64AsmBackend.cpp
@@ -45,9 +45,10 @@ public:
{ "fixup_arm64_ldst_imm12_scale4", 10, 12, 0 },
{ "fixup_arm64_ldst_imm12_scale8", 10, 12, 0 },
{ "fixup_arm64_ldst_imm12_scale16", 10, 12, 0 },
+ { "fixup_arm64_ldr_pcrel_imm19", 5, 19, PCRelFlagVal },
{ "fixup_arm64_movw", 5, 16, 0 },
{ "fixup_arm64_pcrel_branch14", 5, 14, PCRelFlagVal },
- { "fixup_arm64_pcrel_imm19", 5, 19, PCRelFlagVal },
+ { "fixup_arm64_pcrel_branch19", 5, 19, PCRelFlagVal },
{ "fixup_arm64_pcrel_branch26", 0, 26, PCRelFlagVal },
{ "fixup_arm64_pcrel_call26", 0, 26, PCRelFlagVal },
{ "fixup_arm64_tlsdesc_call", 0, 0, 0 }
@@ -101,7 +102,8 @@ static unsigned getFixupKindNumBytes(unsigned Kind) {
case ARM64::fixup_arm64_ldst_imm12_scale4:
case ARM64::fixup_arm64_ldst_imm12_scale8:
case ARM64::fixup_arm64_ldst_imm12_scale16:
- case ARM64::fixup_arm64_pcrel_imm19:
+ case ARM64::fixup_arm64_ldr_pcrel_imm19:
+ case ARM64::fixup_arm64_pcrel_branch19:
return 3;
case ARM64::fixup_arm64_pcrel_adr_imm21:
@@ -133,7 +135,8 @@ static uint64_t adjustFixupValue(unsigned Kind, uint64_t Value) {
return AdrImmBits(Value & 0x1fffffULL);
case ARM64::fixup_arm64_pcrel_adrp_imm21:
return AdrImmBits((Value & 0x1fffff000ULL) >> 12);
- case ARM64::fixup_arm64_pcrel_imm19:
+ case ARM64::fixup_arm64_ldr_pcrel_imm19:
+ case ARM64::fixup_arm64_pcrel_branch19:
// Signed 21-bit immediate
if (SignedValue > 2097151 || SignedValue < -2097152)
report_fatal_error("fixup value out of range");