]> granicus.if.org Git - llvm/commitdiff
[PowerPC] Fix printing of negative offsets in call instruction dissasembly.
authorSean Fertile <sfertile@ca.ibm.com>
Tue, 12 Feb 2019 17:48:22 +0000 (17:48 +0000)
committerSean Fertile <sfertile@ca.ibm.com>
Tue, 12 Feb 2019 17:48:22 +0000 (17:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353865 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp
lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp
lib/Target/PowerPC/PPCInstrInfo.td
test/tools/llvm-objdump/PowerPC/branch-offset.s [new file with mode: 0644]
test/tools/llvm-objdump/PowerPC/lit.local.cfg [new file with mode: 0644]

index 8f96951e26971fea427342f18147378301a3b0d9..9fb37c58e85f1236d219738a1d56207fd3a1040e 100644 (file)
@@ -60,6 +60,14 @@ extern "C" void LLVMInitializePowerPCDisassembler() {
                                          createPPCLEDisassembler);
 }
 
+static DecodeStatus DecodePCRel24BranchTarget(MCInst &Inst, unsigned Imm,
+                                              uint64_t Addr,
+                                              const void *Decoder) {
+  int32_t Offset = SignExtend32<24>(Imm);
+  Inst.addOperand(MCOperand::createImm(Offset));
+  return MCDisassembler::Success;
+}
+
 // FIXME: These can be generated by TableGen from the existing register
 // encoding values!
 
index f4fcf58cedcbe69f92200a3d3a4be512318d8b38..49e73891bc3049bed0701f1b6bd37ed36c459cba 100644 (file)
@@ -381,8 +381,11 @@ void PPCInstPrinter::printBranchOperand(const MCInst *MI, unsigned OpNo,
 
   // Branches can take an immediate operand.  This is used by the branch
   // selection pass to print .+8, an eight byte displacement from the PC.
-  O << ".+";
-  printAbsBranchOperand(MI, OpNo, O);
+  O << ".";
+  int32_t Imm = MI->getOperand(OpNo).getImm() << 2;
+  if (Imm >= 0)
+    O << "+";
+  O << Imm;
 }
 
 void PPCInstPrinter::printAbsBranchOperand(const MCInst *MI, unsigned OpNo,
index 7672f8da0fce073d9f61e00b1a1ae55790344b7e..e54292aee286a2b08a649522188c8833e76d78ea 100644 (file)
@@ -736,7 +736,9 @@ def abscondbrtarget : Operand<OtherVT> {
 def calltarget : Operand<iPTR> {
   let PrintMethod = "printBranchOperand";
   let EncoderMethod = "getDirectBrEncoding";
+  let DecoderMethod = "DecodePCRel24BranchTarget";
   let ParserMatchClass = PPCDirectBrAsmOperand;
+  let OperandType = "OPERAND_PCREL";
 }
 def abscalltarget : Operand<iPTR> {
   let PrintMethod = "printAbsBranchOperand";
diff --git a/test/tools/llvm-objdump/PowerPC/branch-offset.s b/test/tools/llvm-objdump/PowerPC/branch-offset.s
new file mode 100644 (file)
index 0000000..b0b3f05
--- /dev/null
@@ -0,0 +1,43 @@
+# RUN: llvm-mc -triple=powerpc64le-unknown-linux -filetype=obj %s -o %t.o
+# RUN: llvm-objdump -d %t.o | FileCheck %s
+
+# RUN: llvm-mc -triple=powerpc64-unknown-linux -filetype=obj %s -o %t.o
+# RUN: llvm-objdump -d %t.o | FileCheck %s
+
+# RUN: llvm-mc -triple=powerpc-unknown-linux -filetype=obj %s -o %t.o
+# RUN: llvm-objdump -d %t.o | FileCheck %s
+
+# CHECK: 0000000000000000 callee_back:
+# CHECK: 18: {{.*}} bl .-24
+# CHECK: 20: {{.*}} bl .+16
+# CHECK: 0000000000000030 callee_forward:
+
+        .text
+        .global caller
+        .type caller,@function
+        .type callee_forward,@function
+        .type callee_back,@function
+
+        .p2align 4
+callee_back:
+        li 3, 55
+        blr
+
+        .p2align 4
+caller:
+.Lgep:
+        addis 2, 12, .TOC.-.Lgep@ha
+        addi 2, 2, .TOC.-.Lgep@l
+.Llep:
+        .localentry caller, .Llep-.Lgep
+        bl callee_back
+        mr 31, 3
+        bl callee_forward
+        add 3, 3, 31
+        blr
+
+        .p2align 4
+callee_forward:
+        li 3, 66
+        blr
+
diff --git a/test/tools/llvm-objdump/PowerPC/lit.local.cfg b/test/tools/llvm-objdump/PowerPC/lit.local.cfg
new file mode 100644 (file)
index 0000000..b775107
--- /dev/null
@@ -0,0 +1,2 @@
+if not 'PowerPC' in config.root.targets:
+      config.unsupported = True