diff options
author | Tim Northover <tnorthover@apple.com> | 2014-04-24 12:12:10 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2014-04-24 12:12:10 +0000 |
commit | d4b4f400e85470a1e8c0b90f23080f9c9c563603 (patch) | |
tree | d8cf394419b6e942861dd77356aacdd6f99932d1 /lib/Target/ARM64/MCTargetDesc/ARM64AsmBackend.cpp | |
parent | 92f4b34653f303aa94a06969dcc72d74c614ea23 (diff) | |
download | llvm-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.cpp | 9 |
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"); |