From 8b39341fb095a17a155db8cb3460b2853ab0f4d1 Mon Sep 17 00:00:00 2001 From: Sean Fertile Date: Thu, 12 Mar 2020 10:21:42 -0400 Subject: [PATCH] [PowerPC][AIX] Fix printing of program counter for AIX assembly. Program counter on AIX is the dollar-sign. Differential Revision:https://reviews.llvm.org/D75627 --- .../Target/PowerPC/MCTargetDesc/PPCInstPrinter.cpp | 11 +++++--- llvm/test/CodeGen/PowerPC/aix-print-pc.mir | 31 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 llvm/test/CodeGen/PowerPC/aix-print-pc.mir diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCInstPrinter.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCInstPrinter.cpp index 2ff3f5d..4dc2b35 100644 --- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCInstPrinter.cpp +++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCInstPrinter.cpp @@ -418,9 +418,14 @@ void PPCInstPrinter::printBranchOperand(const MCInst *MI, unsigned OpNo, if (!MI->getOperand(OpNo).isImm()) return printOperand(MI, OpNo, O); - // 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 << "."; + // Branches can take an immediate operand. This is used by the branch + // selection pass to print, for example `.+8` (for ELF) or `$+8` (for AIX) to + // express an eight byte displacement from the program counter. + if (!TT.isOSAIX()) + O << "."; + else + O << "$"; + int32_t Imm = SignExtend32<32>((unsigned)MI->getOperand(OpNo).getImm() << 2); if (Imm >= 0) O << "+"; diff --git a/llvm/test/CodeGen/PowerPC/aix-print-pc.mir b/llvm/test/CodeGen/PowerPC/aix-print-pc.mir new file mode 100644 index 0000000..c736d13 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-print-pc.mir @@ -0,0 +1,31 @@ +# RUN: llc -x mir -mtriple powerpc-unknown-aix-xcoff --verify-machineinstrs \ +# RUN: -start-before=ppc-branch-select < %s | FileCheck %s +# +# RUN: llc -x mir -mtriple powerpc64-unknown-aix-xcoff --verify-machineinstrs \ +# RUN: -start-before=ppc-branch-select < %s | FileCheck %s + +# Test uses a long branch to force printing of a branch that uses the program +# counter as an operand. ($PC + 8) + +--- +name: print_program_counter +machineFunctionInfo: {} +body: | + bb.0.entry: + successors: %bb.1(0x30000000), %bb.2(0x50000000) + liveins: $r3 + renamable $cr0 = CMPLWI killed renamable $r3, 0 + BCC 76, killed renamable $cr0, %bb.1 + bb.2: + renamable $r3 = LI 2 + INLINEASM &".space 32760", 1 + BLR implicit $lr, implicit $rm, implicit killed $r3 + bb.1: + renamable $r3 = LI 1 + INLINEASM &".space 32760", 1 + BLR implicit $lr, implicit $rm, implicit killed $r3 + +# CHECK-LABEL: .print_program_counter: +# CHECK: cmplwi +# CHECK-NEXT: bne {{[0-9]}}, $+8 + -- 2.7.4