From 38348fa26548fdcdbc1ae18c6e612d67f103ee37 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Tue, 22 Sep 2020 11:42:37 +0100 Subject: [PATCH] AArch64: treat MC expressions as 2s complement arithmetic. We had a couple of over-zealous diagnostics that meant IR with a reasonable and valid interpretation was rejected. --- .../AArch64/MCTargetDesc/AArch64AsmBackend.cpp | 16 ---------------- llvm/test/CodeGen/AArch64/2s-complement-asm.ll | 9 +++++++++ 2 files changed, 9 insertions(+), 16 deletions(-) create mode 100644 llvm/test/CodeGen/AArch64/2s-complement-asm.ll diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp index dc44980ce218..a355cbf30d31 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp @@ -154,19 +154,6 @@ static unsigned AdrImmBits(unsigned Value) { return (hi19 << 5) | (lo2 << 29); } -static bool valueFitsIntoFixupKind(unsigned Kind, uint64_t Value) { - unsigned NumBits; - switch(Kind) { - case FK_Data_1: NumBits = 8; break; - case FK_Data_2: NumBits = 16; break; - case FK_Data_4: NumBits = 32; break; - case FK_Data_8: NumBits = 64; break; - default: return true; - } - return isUIntN(NumBits, Value) || - isIntN(NumBits, static_cast(Value)); -} - static uint64_t adjustFixupValue(const MCFixup &Fixup, const MCValue &Target, uint64_t Value, MCContext &Ctx, const Triple &TheTriple, bool IsResolved) { @@ -341,9 +328,6 @@ static uint64_t adjustFixupValue(const MCFixup &Fixup, const MCValue &Target, case FK_Data_2: case FK_Data_4: case FK_Data_8: - if (!valueFitsIntoFixupKind(Fixup.getTargetKind(), Value)) - Ctx.reportError(Fixup.getLoc(), "fixup value too large for data type!"); - LLVM_FALLTHROUGH; case FK_SecRel_2: case FK_SecRel_4: return Value; diff --git a/llvm/test/CodeGen/AArch64/2s-complement-asm.ll b/llvm/test/CodeGen/AArch64/2s-complement-asm.ll new file mode 100644 index 000000000000..cf646d136020 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/2s-complement-asm.ll @@ -0,0 +1,9 @@ +; RUN: llc -mtriple=arm64-apple-ios %s -filetype=obj -o - | llvm-objdump --macho --section __DATA,__data - | FileCheck %s + +; CHECK: Contents of (__DATA,__data) section +; CHECK: 0000002a 59ed145d +@other = global i32 42 +@var = global i32 sub(i32 646102975, + i32 add (i32 trunc(i64 sub(i64 ptrtoint(i32* @var to i64), + i64 ptrtoint(i32* @other to i64)) to i32), + i32 3432360802))