diff options
author | Chris Lattner <sabre@nondot.org> | 2010-05-18 21:40:18 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-05-18 21:40:18 +0000 |
commit | 6db0363bdcc81cbb98d5c3731e528655f8baa36e (patch) | |
tree | 330e92c2985a0a7a7393ecb5583f37249c59843a | |
parent | 28dad2a5caccf579f7430acd3af8fa6e6f8b575e (diff) |
make mcinstlower remove all but the first operand to CALL64pcrel32.
The register use operands (e.g. the first argument is passed in a
register) is currently being modeled as a normal register use,
instead of correctly being an implicit use. This causes the operand
to get propagated onto the mcinst, which was causing the encoder to
emit a rex prefix byte, which generates an invalid call.
This fixes rdar://7998435
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104062 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/AsmPrinter/X86MCInstLower.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp index ad9308321f..f5e9601343 100644 --- a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp +++ b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp @@ -329,7 +329,17 @@ void X86MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { LowerSubReg32_Op0(OutMI, X86::MOV32r0); // MOV64r0 -> MOV32r0 LowerUnaryToTwoAddr(OutMI, X86::XOR32rr); // MOV32r0 -> XOR32rr break; - + + // CALL64pcrel32 - This instruction has register inputs modeled as normal + // uses instead of implicit uses. As such, truncate off all but the first + // operand (the callee). FIXME: Change isel. + case X86::CALL64pcrel32: { + MCOperand Saved = OutMI.getOperand(0); + OutMI = MCInst(); + OutMI.setOpcode(X86::CALL64pcrel32); + OutMI.addOperand(Saved); + break; + } // The assembler backend wants to see branches in their small form and relax // them to their large form. The JIT can only handle the large form because |