ARM: Better disassembly for pc-relative LDR.
authorJim Grosbach <grosbach@apple.com>
Tue, 30 Oct 2012 01:04:51 +0000 (01:04 +0000)
committerJim Grosbach <grosbach@apple.com>
Tue, 30 Oct 2012 01:04:51 +0000 (01:04 +0000)
When the operand is a plain immediate rather than a label, print it
as [pc, #imm] like we do for the Thumb2 wide encoding variant.

rdar://12154503

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166991 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrThumb.td
lib/Target/ARM/ARMInstrThumb2.td
lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp
lib/Target/ARM/InstPrinter/ARMInstPrinter.h
test/MC/ARM/basic-thumb-instructions.s
test/MC/Disassembler/ARM/marked-up-thumb.txt
test/MC/Disassembler/ARM/thumb-printf.txt
test/MC/Disassembler/ARM/thumb-tests.txt
test/MC/Disassembler/ARM/thumb1.txt

index e171f8b0929577ebeae78c471b79e780e419cd69..a5c0bc6740e67b729d89dbb6b4ae5ff4b777f194 100644 (file)
@@ -223,6 +223,7 @@ def t_addrmode_sp : Operand<i32>,
 def t_addrmode_pc : Operand<i32> {
   let EncoderMethod = "getAddrModePCOpValue";
   let DecoderMethod = "DecodeThumbAddrModePC";
+  let PrintMethod = "printThumbLdrLabelOperand";
 }
 
 //===----------------------------------------------------------------------===//
index 94bc23eb7759a8991428186a4093a1d3f9098d17..8e8489a26e66985f2ae2de3e7628185f1110c4ea 100644 (file)
@@ -159,7 +159,7 @@ def t2addrmode_imm12 : Operand<i32>,
 // t2ldrlabel  := imm12
 def t2ldrlabel : Operand<i32> {
   let EncoderMethod = "getAddrModeImm12OpValue";
-  let PrintMethod = "printT2LdrLabelOperand";
+  let PrintMethod = "printThumbLdrLabelOperand";
 }
 
 def t2ldr_pcrel_imm12_asmoperand : AsmOperandClass {let Name = "MemPCRelImm12";}
index 7eac5ee5fa2626697246e6afc82a7a6f29b6ba76..dcc41d93f5ceafb1757bec431195951a3e61592a 100644 (file)
@@ -283,8 +283,8 @@ void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
   }
 }
 
-void ARMInstPrinter::printT2LdrLabelOperand(const MCInst *MI, unsigned OpNum,
-                                       raw_ostream &O) {
+void ARMInstPrinter::printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
+                                               raw_ostream &O) {
   const MCOperand &MO1 = MI->getOperand(OpNum);
   if (MO1.isExpr())
     O << *MO1.getExpr();
index 73d7bfd28502eb54615e1e5329d2600c52ced3a7..b7bab5fdcd8e4fdd60ace21add2e0e751acaea67 100644 (file)
@@ -126,7 +126,8 @@ public:
   void printRotImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
 
   void printPCLabel(const MCInst *MI, unsigned OpNum, raw_ostream &O);
-  void printT2LdrLabelOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
+  void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
+                                 raw_ostream &O);
   void printFBits16(const MCInst *MI, unsigned OpNum, raw_ostream &O);
   void printFBits32(const MCInst *MI, unsigned OpNum, raw_ostream &O);
   void printVectorIndex(const MCInst *MI, unsigned OpNum, raw_ostream &O);
index 4ee34ce6b4c81b6b67ef0cea55f7be513ddfe980..22e21da88e40d7578d6445d58804dbf1cf500416 100644 (file)
@@ -259,8 +259,8 @@ _func:
 
 @ CHECK: ldr   r1, _foo                @ encoding: [A,0x49]
              @   fixup A - offset: 0, value: _foo, kind: fixup_arm_thumb_cp
-@ CHECK: ldr     r3, #604                @ encoding: [0x97,0x4b]
-@ CHECK: ldr     r3, #368                @ encoding: [0x5c,0x4b]
+@ CHECK: ldr     r3, [pc, #604]         @ encoding: [0x97,0x4b]
+@ CHECK: ldr     r3, [pc, #368]         @ encoding: [0x5c,0x4b]
 
 @------------------------------------------------------------------------------
 @ LDR (register)
index d7807cde8b405b539d6e14529bbe435b3df43808..65be28618bac4d0473019ae4a87f979d068d04d3 100644 (file)
@@ -1,5 +1,5 @@
 # RUN: llvm-mc -triple=thumbv7-apple-darwin -mcpu=cortex-a8 -mdis < %s | FileCheck %s
-# CHECK: ldr   <reg:r4>, <imm:#32>
+# CHECK: ldr  <reg:r4>, <mem:[pc, <imm:#32>]>
 0x08 0x4c
 # CHECK: push  {<reg:r1>, <reg:r2>, <reg:r7>}
 0x86 0xb4
index 8158a73edcb5f98ea9764fa628b81fe6a83a5186..ca820444adc768bf4e62526320554fd34b94d724 100644 (file)
@@ -7,17 +7,17 @@
 # CHECK-NEXT:  add     r3, sp, #20
 # CHECK-NEXT:  ldr     r5, [r3], #4
 # CHECK-NEXT:  str     r3, [sp]
-# CHECK-NEXT:  ldr     r3, #52
+# CHECK-NEXT:  ldr     r3, [pc, #52]
 # CHECK-NEXT:  add     r3, pc
 # CHECK-NEXT:  ldr     r0, [r3]
 # CHECK-NEXT:  ldr     r4, [r0]
-# CHECK-NEXT:  ldr     r0, #48
+# CHECK-NEXT:  ldr     r0, [pc, #48]
 # CHECK-NEXT:  add     r0, pc
 # CHECK-NEXT:  ldr     r0, [r0]
 # CHECK-NEXT:  ldr     r0, [r0]
 # CHECK-NEXT:  blx     #191548
 # CHECK-NEXT:  cbnz    r0, #6
-# CHECK-NEXT:  ldr     r1, #40
+# CHECK-NEXT:  ldr     r1, [pc, #40]
 # CHECK-NEXT:  add     r1, pc
 # CHECK-NEXT:  ldr     r1, [r1]
 # CHECK-NEXT:  b       #0
index c08585a3719766efb63478e2ed691fc40ddbe01a..757ce6e3977bd36d496ced2241883917bdda6818 100644 (file)
@@ -30,7 +30,7 @@
 # CHECK:       ldm     r0!, {r1}
 0x02 0xc8
 
-# CHECK:       ldr     r5, #432
+# CHECK:       ldr     r5, [pc, #432]
 0x6c 0x4d
 
 # CHECK:       str     r0, [r3]
index 5b7026231096c5d9a4f7c3f2d172f15db8d8dad5..de9596aab732cc16709d58d0db890c7416f0a476 100644 (file)
 # CHECK: ldr r1, [sp]
 # CHECK: ldr r2, [sp, #24]
 # CHECK: ldr r3, [sp, #1020]
+# CHECK: ldr r1, [pc, #12]
 
 
 0x29 0x68
 0x00 0x99
 0x06 0x9a
 0xff 0x9b
+0x03 0x49
 
 #------------------------------------------------------------------------------
 # LDR (register)