Skip to content

Commit

Permalink
[ObjC][ARC] Fix target register for call expanded from CALL_RVMARKER …
Browse files Browse the repository at this point in the history
…on Windows

Fix regression #56952 for Clang CodeGen on Windows. In the Windows ABI the instruction sequence that is expanded from CALL_RVMARKER should use RCX as target register and not RDI.

Reviewed By: rnk, fhahn

Differential Revision: https://reviews.llvm.org/D134441
  • Loading branch information
weliveindetail committed Sep 27, 2022
1 parent e8aaf75 commit ed8409d
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
6 changes: 4 additions & 2 deletions llvm/lib/Target/X86/X86ExpandPseudo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,9 +224,11 @@ void X86ExpandPseudo::expandCALL_RVMARKER(MachineBasicBlock &MBB,
// Emit marker "movq %rax, %rdi". %rdi is not callee-saved, so it cannot be
// live across the earlier call. The call to the ObjC runtime function returns
// the first argument, so the value of %rax is unchanged after the ObjC
// runtime call.
// runtime call. On Windows targets, the runtime call follows the regular
// x64 calling convention and expects the first argument in %rcx.
auto TargetReg = STI->getTargetTriple().isOSWindows() ? X86::RCX : X86::RDI;
auto *Marker = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(X86::MOV64rr))
.addReg(X86::RDI, RegState::Define)
.addReg(TargetReg, RegState::Define)
.addReg(X86::RAX)
.getInstr();
if (MI.shouldUpdateCallSiteInfo())
Expand Down
7 changes: 7 additions & 0 deletions llvm/test/CodeGen/X86/call-rv-marker.ll
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
; RUN: llc -mtriple=x86_64-apple-macosx -verify-machineinstrs -o - %s | FileCheck --check-prefix=CHECK %s
; RUN: llc -mtriple=x86_64-windows-msvc -verify-machineinstrs -o - %s | FileCheck --check-prefix=WINABI %s

; TODO: support marker generation with GlobalISel
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
Expand Down Expand Up @@ -33,6 +34,12 @@ define ptr @rv_marker_1_retain() {
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: retq
;
; WINABI-LABEL: rv_marker_1_retain:
; WINABI: callq foo1
; WINABI-NEXT: movq %rax, %rcx
; WINABI-NEXT: callq objc_retainAutoreleasedReturnValue
; WINABI-NEXT: nop
;
entry:
%call = call ptr @foo1() [ "clang.arc.attachedcall"(ptr @objc_retainAutoreleasedReturnValue) ]
ret ptr %call
Expand Down

0 comments on commit ed8409d

Please sign in to comment.