https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64384

Matheus Izvekov <mizvekov at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mizvekov at gmail dot com

--- Comment #7 from Matheus Izvekov <mizvekov at gmail dot com> ---
So this is still a problem in GCC 10.1.

Per
https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=vs-2019
What GCC does would be correct according to that spec. But in practice, MSVC
does different, and windows DLLs expect what MSVC does.

So I have stumbled on this problem with D3D12, calling
GetCPUDescriptorHandleForHeapStart method on ID3D12DescriptorHeap object.

Here is definition of this method from SDK:

```
virtual D3D12_CPU_DESCRIPTOR_HANDLE STDMETHODCALLTYPE 
GetCPUDescriptorHandleForHeapStart( void) = 0;
```

Returned aggregate is just a boxed SIZE_T:
```
typedef struct D3D12_CPU_DESCRIPTOR_HANDLE { SIZE_T ptr; }  
D3D12_CPU_DESCRIPTOR_HANDLE;
```

So it should be possible to return on register, but instead here is code from
that method (MASM syntax, taken from D3D12.dll):
```
CDescriptorHeap::GetCPUDescriptorHandleForHeapStart:
00007FF83AD6A3F0  mov         rax,qword ptr [rcx+0D0h]  
00007FF83AD6A3F7  mov         qword ptr [rdx],rax
00007FF83AD6A3FA  mov         rax,rdx  
00007FF83AD6A3FD  ret  
```

Reply via email to