Skip to content

Commit

Permalink
[x32] Emit callq for CALLpcrel32
Browse files Browse the repository at this point in the history
Summary:
In AT&T annotation for both x86_64 and x32 calls should be printed as
callq in assembly. It's only a matter of correct mnemonic, object output
is ok.

Test Plan: trivial test added

Reviewers: nadav, dschuff, craig.topper

Subscribers: llvm-commits, zinovy.nis

Differential Revision: http://reviews.llvm.org/D5213

llvm-svn: 217435
  • Loading branch information
Pavel Chupin committed Sep 9, 2014
1 parent 4abcfe2 commit e6617fc
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 4 deletions.
13 changes: 12 additions & 1 deletion llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
Expand Up @@ -53,8 +53,19 @@ void X86ATTInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
if (TSFlags & X86II::LOCK)
OS << "\tlock\n";

// Output CALLpcrel32 as "callq" in 64-bit mode.
// In Intel annotation it's always emitted as "call".
//
// TODO: Probably this hack should be redesigned via InstAlias in
// InstrInfo.td as soon as Requires clause is supported properly
// for InstAlias.
if (MI->getOpcode() == X86::CALLpcrel32 &&
(getAvailableFeatures() & X86::Mode64Bit) != 0) {
OS << "\tcallq\t";
printPCRelImm(MI, 0, OS);
}
// Try to print any aliases first.
if (!printAliasInstr(MI, OS))
else if (!printAliasInstr(MI, OS))
printInstruction(MI, OS);

// Next always print the annotation.
Expand Down
8 changes: 6 additions & 2 deletions llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.h
Expand Up @@ -15,6 +15,7 @@
#define LLVM_LIB_TARGET_X86_INSTPRINTER_X86ATTINSTPRINTER_H

#include "llvm/MC/MCInstPrinter.h"
#include "llvm/MC/MCSubtargetInfo.h"

namespace llvm {

Expand All @@ -23,8 +24,11 @@ class MCOperand;
class X86ATTInstPrinter final : public MCInstPrinter {
public:
X86ATTInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
const MCRegisterInfo &MRI)
: MCInstPrinter(MAI, MII, MRI) {}
const MCRegisterInfo &MRI, const MCSubtargetInfo &STI)
: MCInstPrinter(MAI, MII, MRI) {
// Initialize the set of available features.
setAvailableFeatures(STI.getFeatureBits());
}

void printRegName(raw_ostream &OS, unsigned RegNo) const override;
void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot) override;
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
Expand Up @@ -377,7 +377,7 @@ static MCInstPrinter *createX86MCInstPrinter(const Target &T,
const MCRegisterInfo &MRI,
const MCSubtargetInfo &STI) {
if (SyntaxVariant == 0)
return new X86ATTInstPrinter(MAI, MII, MRI);
return new X86ATTInstPrinter(MAI, MII, MRI, STI);
if (SyntaxVariant == 1)
return new X86IntelInstPrinter(MAI, MII, MRI);
return nullptr;
Expand Down
15 changes: 15 additions & 0 deletions llvm/test/CodeGen/X86/x86-64-call.ll
@@ -0,0 +1,15 @@
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mcpu=generic -mtriple=i686-pc-linux -verify-machineinstrs | FileCheck %s -check-prefix=IA32

; trivial test for correct call suffix

define i32 @far() nounwind uwtable {
entry:
; CHECK: callq
; IA32: calll
tail call void @foo() nounwind
ret i32 0
}

declare void @foo()

0 comments on commit e6617fc

Please sign in to comment.