[PATCH] D27479: ELF/AArch64: Refactor R_AARCH64_LDST{8, 15, 32, 64, 128}_ABS_LO12_NC Relocations
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 7 06:03:51 PST 2016
LGTM.
We can always move the function and tweak it after commit.
Cheers,
Rafael
Adhemerval Zanella via Phabricator <reviews at reviews.llvm.org> writes:
> zatrazz removed rL LLVM as the repository for this revision.
> zatrazz updated this revision to Diff 80580.
> zatrazz added a comment.
>
> Updated patch based on previous comments.
>
>
> https://reviews.llvm.org/D27479
>
> Files:
> ELF/Target.cpp
>
>
> Index: ELF/Target.cpp
> ===================================================================
> --- ELF/Target.cpp
> +++ ELF/Target.cpp
> @@ -1326,7 +1326,15 @@
> write32le(L, (read32le(L) & ~Mask) | ImmLo | ImmHi);
> }
>
> -static inline void updateAArch64Add(uint8_t *L, uint64_t Imm) {
> +// Return the bits [Start, End] from Val shifted Start bits. For instance,
> +// getBits<4,8>(0xF0) returns 0xF.
> +template <uint8_t Start, uint8_t End> static uint64_t getBits(uint64_t Val) {
> + uint64_t Mask = ((uint64_t)1 << (End + 1 - Start)) - 1;
> + return (Val >> Start) & Mask;
> +}
> +
> +// Update the immediate field in a ldr, str, and add instruction.
> +static inline void updateAArch64LdStrAdd(uint8_t *L, uint64_t Imm) {
> or32le(L, (Imm & 0xFFF) << 10);
> }
>
> @@ -1349,7 +1357,7 @@
> write64le(Loc, Val);
> break;
> case R_AARCH64_ADD_ABS_LO12_NC:
> - updateAArch64Add(Loc, Val);
> + updateAArch64LdStrAdd(Loc, Val);
> break;
> case R_AARCH64_ADR_GOT_PAGE:
> case R_AARCH64_ADR_PREL_PG_HI21:
> @@ -1377,20 +1385,20 @@
> checkAlignment<8>(Loc, Val, Type);
> or32le(Loc, (Val & 0xFF8) << 7);
> break;
> - case R_AARCH64_LDST128_ABS_LO12_NC:
> - or32le(Loc, (Val & 0x0FF8) << 6);
> + case R_AARCH64_LDST8_ABS_LO12_NC:
> + updateAArch64LdStrAdd(Loc, getBits<0, 11>(Val));
> break;
> case R_AARCH64_LDST16_ABS_LO12_NC:
> - or32le(Loc, (Val & 0x0FFE) << 9);
> - break;
> - case R_AARCH64_LDST8_ABS_LO12_NC:
> - or32le(Loc, (Val & 0xFFF) << 10);
> + updateAArch64LdStrAdd(Loc, getBits<1, 11>(Val));
> break;
> case R_AARCH64_LDST32_ABS_LO12_NC:
> - or32le(Loc, (Val & 0xFFC) << 8);
> + updateAArch64LdStrAdd(Loc, getBits<2, 11>(Val));
> break;
> case R_AARCH64_LDST64_ABS_LO12_NC:
> - or32le(Loc, (Val & 0xFF8) << 7);
> + updateAArch64LdStrAdd(Loc, getBits<3, 11>(Val));
> + break;
> + case R_AARCH64_LDST128_ABS_LO12_NC:
> + updateAArch64LdStrAdd(Loc, getBits<4, 11>(Val));
> break;
> case R_AARCH64_MOVW_UABS_G0_NC:
> or32le(Loc, (Val & 0xFFFF) << 5);
> @@ -1410,11 +1418,11 @@
> break;
> case R_AARCH64_TLSLE_ADD_TPREL_HI12:
> checkInt<24>(Loc, Val, Type);
> - updateAArch64Add(Loc, Val >> 12);
> + updateAArch64LdStrAdd(Loc, Val >> 12);
> break;
> case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
> case R_AARCH64_TLSDESC_ADD_LO12_NC:
> - updateAArch64Add(Loc, Val);
> + updateAArch64LdStrAdd(Loc, Val);
> break;
> default:
> fatal(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
>
>
> Index: ELF/Target.cpp
> ===================================================================
> --- ELF/Target.cpp
> +++ ELF/Target.cpp
> @@ -1326,7 +1326,15 @@
> write32le(L, (read32le(L) & ~Mask) | ImmLo | ImmHi);
> }
>
> -static inline void updateAArch64Add(uint8_t *L, uint64_t Imm) {
> +// Return the bits [Start, End] from Val shifted Start bits. For instance,
> +// getBits<4,8>(0xF0) returns 0xF.
> +template <uint8_t Start, uint8_t End> static uint64_t getBits(uint64_t Val) {
> + uint64_t Mask = ((uint64_t)1 << (End + 1 - Start)) - 1;
> + return (Val >> Start) & Mask;
> +}
> +
> +// Update the immediate field in a ldr, str, and add instruction.
> +static inline void updateAArch64LdStrAdd(uint8_t *L, uint64_t Imm) {
> or32le(L, (Imm & 0xFFF) << 10);
> }
>
> @@ -1349,7 +1357,7 @@
> write64le(Loc, Val);
> break;
> case R_AARCH64_ADD_ABS_LO12_NC:
> - updateAArch64Add(Loc, Val);
> + updateAArch64LdStrAdd(Loc, Val);
> break;
> case R_AARCH64_ADR_GOT_PAGE:
> case R_AARCH64_ADR_PREL_PG_HI21:
> @@ -1377,20 +1385,20 @@
> checkAlignment<8>(Loc, Val, Type);
> or32le(Loc, (Val & 0xFF8) << 7);
> break;
> - case R_AARCH64_LDST128_ABS_LO12_NC:
> - or32le(Loc, (Val & 0x0FF8) << 6);
> + case R_AARCH64_LDST8_ABS_LO12_NC:
> + updateAArch64LdStrAdd(Loc, getBits<0, 11>(Val));
> break;
> case R_AARCH64_LDST16_ABS_LO12_NC:
> - or32le(Loc, (Val & 0x0FFE) << 9);
> - break;
> - case R_AARCH64_LDST8_ABS_LO12_NC:
> - or32le(Loc, (Val & 0xFFF) << 10);
> + updateAArch64LdStrAdd(Loc, getBits<1, 11>(Val));
> break;
> case R_AARCH64_LDST32_ABS_LO12_NC:
> - or32le(Loc, (Val & 0xFFC) << 8);
> + updateAArch64LdStrAdd(Loc, getBits<2, 11>(Val));
> break;
> case R_AARCH64_LDST64_ABS_LO12_NC:
> - or32le(Loc, (Val & 0xFF8) << 7);
> + updateAArch64LdStrAdd(Loc, getBits<3, 11>(Val));
> + break;
> + case R_AARCH64_LDST128_ABS_LO12_NC:
> + updateAArch64LdStrAdd(Loc, getBits<4, 11>(Val));
> break;
> case R_AARCH64_MOVW_UABS_G0_NC:
> or32le(Loc, (Val & 0xFFFF) << 5);
> @@ -1410,11 +1418,11 @@
> break;
> case R_AARCH64_TLSLE_ADD_TPREL_HI12:
> checkInt<24>(Loc, Val, Type);
> - updateAArch64Add(Loc, Val >> 12);
> + updateAArch64LdStrAdd(Loc, Val >> 12);
> break;
> case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
> case R_AARCH64_TLSDESC_ADD_LO12_NC:
> - updateAArch64Add(Loc, Val);
> + updateAArch64LdStrAdd(Loc, Val);
> break;
> default:
> fatal(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
More information about the llvm-commits
mailing list