diff options
Diffstat (limited to 'lib/Target/X86/X86MCInstLower.cpp')
-rw-r--r-- | lib/Target/X86/X86MCInstLower.cpp | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/Target/X86/X86MCInstLower.cpp b/lib/Target/X86/X86MCInstLower.cpp index c718b1c..5c3f9af 100644 --- a/lib/Target/X86/X86MCInstLower.cpp +++ b/lib/Target/X86/X86MCInstLower.cpp @@ -765,6 +765,8 @@ static void LowerSTACKMAP(MCStreamer &OutStreamer, OutStreamer.EmitInstruction(MCInstBuilder(X86::NOOP)); } +// Lower a patchpoint of the form: +// [<def>], <id>, <numBytes>, <target>, <numArgs> static void LowerPATCHPOINT(MCStreamer &OutStreamer, X86MCInstLower &MCInstLowering, StackMaps &SM, @@ -813,17 +815,20 @@ static void LowerPATCHPOINT(MCStreamer &OutStreamer, getStackMapEndMOP(MI.operands_begin(), MI.operands_end()), isAnyRegCC && hasDef); - // Emit MOV to materialize the target address and the CALL to target. - // This is encoded with 12-13 bytes, depending on which register is used. - // We conservatively assume that it is 12 bytes and emit in worst case one - // extra NOP byte. - unsigned EncodedBytes = 12; - OutStreamer.EmitInstruction(MCInstBuilder(X86::MOV64ri) - .addReg(MI.getOperand(ScratchIdx).getReg()) - .addImm(MI.getOperand(StartIdx + 2).getImm())); - OutStreamer.EmitInstruction(MCInstBuilder(X86::CALL64r) - .addReg(MI.getOperand(ScratchIdx).getReg())); - + unsigned EncodedBytes = 0; + int64_t CallTarget = MI.getOperand(StartIdx + 2).getImm(); + if (CallTarget) { + // Emit MOV to materialize the target address and the CALL to target. + // This is encoded with 12-13 bytes, depending on which register is used. + // We conservatively assume that it is 12 bytes and emit in worst case one + // extra NOP byte. + EncodedBytes = 12; + OutStreamer.EmitInstruction(MCInstBuilder(X86::MOV64ri) + .addReg(MI.getOperand(ScratchIdx).getReg()) + .addImm(CallTarget)); + OutStreamer.EmitInstruction(MCInstBuilder(X86::CALL64r) + .addReg(MI.getOperand(ScratchIdx).getReg())); + } // Emit padding. unsigned NumNOPBytes = MI.getOperand(StartIdx + 1).getImm(); assert(NumNOPBytes >= EncodedBytes && |