From ddbe812bccba947c95027c4af7aebf79e7274b83 Mon Sep 17 00:00:00 2001 From: Igor Kudrin Date: Thu, 5 Aug 2021 13:55:32 +0700 Subject: [PATCH] [ARM][llvm-objdump] Annotate PC-relative memory operands This implements `MCInstrAnalysis::evaluateMemoryOperandAddress()` for Arm so that the disassembler can print the target address of memory operands that use PC+immediate addressing. Differential Revision: https://reviews.llvm.org/D105979 --- llvm/lib/Target/ARM/ARMInstrFormats.td | 4 +- llvm/lib/Target/ARM/ARMInstrInfo.td | 16 +- llvm/lib/Target/ARM/ARMInstrThumb.td | 2 +- llvm/lib/Target/ARM/ARMInstrThumb2.td | 11 +- .../ARM/MCTargetDesc/ARMMCTargetDesc.cpp | 165 ++++++++++++++++++ .../tools/llvm-objdump/ELF/ARM/literal-arm.s | 66 +++++++ .../llvm-objdump/ELF/ARM/literal-thumb.s | 24 +++ .../llvm-objdump/ELF/ARM/literal-thumb2.s | 116 ++++++++++++ 8 files changed, 390 insertions(+), 14 deletions(-) create mode 100644 llvm/test/tools/llvm-objdump/ELF/ARM/literal-arm.s create mode 100644 llvm/test/tools/llvm-objdump/ELF/ARM/literal-thumb.s create mode 100644 llvm/test/tools/llvm-objdump/ELF/ARM/literal-thumb2.s diff --git a/llvm/lib/Target/ARM/ARMInstrFormats.td b/llvm/lib/Target/ARM/ARMInstrFormats.td index 85da7c5a535e..a881a59d6281 100644 --- a/llvm/lib/Target/ARM/ARMInstrFormats.td +++ b/llvm/lib/Target/ARM/ARMInstrFormats.td @@ -1385,8 +1385,8 @@ class ThumbXI pattern> - : Thumb2I; + string opc, string asm, list pattern, AddrMode am = AddrModeNone> + : Thumb2I; class T2Ii12 pattern> : Thumb2I; diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index 7466cecb9b33..eeab4ce6d3eb 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -5391,14 +5391,16 @@ def CDP2 : ABXI<0b1110, (outs), (ins p_imm:$cop, imm0_15:$opc1, } class ACI pattern, IndexMode im = IndexModeNone> - : I pattern, IndexMode im = IndexModeNone, + AddrMode am = AddrModeNone> + : I { let Inst{27-25} = 0b110; } class ACInoP pattern, IndexMode im = IndexModeNone> - : InoP pattern, IndexMode im = IndexModeNone, + AddrMode am = AddrModeNone> + : InoP { let Inst{31-28} = 0b1111; let Inst{27-25} = 0b110; @@ -5407,7 +5409,8 @@ class ACInoP pattern> { def _OFFSET : ACI<(outs), (ins p_imm:$cop, c_imm:$CRd, addrmode5:$addr), - asm, "\t$cop, $CRd, $addr", pattern> { + asm, "\t$cop, $CRd, $addr", pattern, IndexModeNone, + AddrMode5> { bits<13> addr; bits<4> cop; bits<4> CRd; @@ -5478,7 +5481,8 @@ multiclass LdStCop pattern> { } multiclass LdSt2Cop pattern> { def _OFFSET : ACInoP<(outs), (ins p_imm:$cop, c_imm:$CRd, addrmode5:$addr), - asm, "\t$cop, $CRd, $addr", pattern> { + asm, "\t$cop, $CRd, $addr", pattern, IndexModeNone, + AddrMode5> { bits<13> addr; bits<4> cop; bits<4> CRd; diff --git a/llvm/lib/Target/ARM/ARMInstrThumb.td b/llvm/lib/Target/ARM/ARMInstrThumb.td index ef07b2839bc9..0305d13c61c5 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb.td @@ -168,6 +168,7 @@ def thumb_cb_target : Operand { let EncoderMethod = "getThumbCBTargetOpValue"; let DecoderMethod = "DecodeThumbCmpBROperand"; } +} // OperandType = "OPERAND_PCREL" // t_addrmode_pc :=