[llvm-bugs] [Bug 47465] New: [Windows][AArch64] Arguments not passed in the correct register

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Sep 8 10:51:38 PDT 2020


https://bugs.llvm.org/show_bug.cgi?id=47465

            Bug ID: 47465
           Summary: [Windows][AArch64] Arguments not passed in the correct
                    register
           Product: clang
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P
         Component: LLVM Codegen
          Assignee: unassignedclangbugs at nondot.org
          Reporter: Richard.Townsend at arm.com
                CC: llvm-bugs at lists.llvm.org, neeilans at live.com,
                    richard-llvm at metafoo.co.uk

Created attachment 23938
  --> https://bugs.llvm.org/attachment.cgi?id=23938&action=edit
Reproducer

When compiling the attached file (constructed from a failing Chromium test),
Clang allocates space for the return value in X8 when calling the
RetValShouldNotBePassedInX8 instance member function (compiled with clang
--target=aarch64-windows-msvc -Os, reproducer at https://godbolt.org/z/rG5vqj). 

main:                                   ; @main
        sub     sp, sp, #80                     ; =80
        str     x30, [sp, #64]                  ; 8-byte Folded Spill
        adrp    x8, "??_7B@@6B@"
        add     x8, x8, "??_7B@@6B@"
        str     x8, [sp, #72]
        add     x0, sp, #72                     ; =72 (x0 contains $this)
        add     x8, sp, #8                      ; =8 (Return space allocated in
x8)
        bl      "?RetValShouldNotBePassedInX8 at B@@UEAA?AUBAR_STRUCT@@XZ"
        ldr     w0, [sp, #8]
        ldr     x30, [sp, #64]                  ; 8-byte Folded Reload
        add     sp, sp, #80                     ; =80
        ret

MSVC's output (https://godbolt.org/z/x9aPjG):

|main|  PROC
|$LN8|
        str         lr,[sp,#-0x10]!
        sub         sp,sp,#0x40
        add         x1,sp,#8 (Return space allocated in x1)
        mov         x0,sp (x0 contains $this)
        bl          |virtual BAR_STRUCT B::RetValShouldNotBePassedInX8(void)
__ptr64|
        ldr         w0,[sp,#8]
        add         sp,sp,#0x40
        ldr         lr,[sp],#0x10
        ret

I reached out to Microsoft and they've confirmed that non-static member
functions always pass the return address in x1, and not x8[1]. They've updated
the official ABI documentation[2] to reflect this. This issue doesn't appear to
crop up very much in production because normally the value that's returned is
not aggregate by their definition (in which case, the return value address is
passed in x1 and everything's fine), but some Chromium/Edge components (in
particular the dawn_end2end_tests test suite) are affected and crash because of
this. 


[1]
https://developercommunity.visualstudio.com/content/problem/1152955/arm64-abi-inconsistent-handling-of-abi-structs.html
[2]
https://docs.microsoft.com/en-us/cpp/build/arm64-windows-abi-conventions?view=vs-2019#return-values

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200908/2db1b2dd/attachment.html>


More information about the llvm-bugs mailing list