<div dir="ltr">The Windows x64 ABI rules say that anything larger than 8 bytes is passed by reference.[1] Because MSVC doesn't support the __int128 type on x64, nobody has made sure that the LLVM i128 type is passed in a way that follows the local ABI rules. I think LLVM should probably pass i128 the same way it passes <2 x i64> on Win64, which is indirectly in memory.<div><br></div><div>Until LLVM is fixed, you can work around the problem by passing i128 by pointer, which you're probably already doing. Given that we will ultimately pass it by pointer in order to obey the ABI, it's a pretty reasonable workaround.<br><div><div><br></div><div>[1] <a href="https://msdn.microsoft.com/en-us/library/ms235286.aspx">https://msdn.microsoft.com/en-us/library/ms235286.aspx</a></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Dec 21, 2016 at 4:35 AM, Stefan de Bruijn via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="m_-2858258810813778399WordSection1">
<p class="MsoNormal">Hi, <u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I’ve been attempting to call a C++ function from LLVM code. The LLVM code is JIT’ted and executed from C++. Basically my idea was as follows:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">-- LLVM IR code –<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">; ModuleID = 'native'<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">define i32 @main(i32, i8**) {<u></u><u></u></p>
<p class="MsoNormal">code:<u></u><u></u></p>
<p class="MsoNormal">  call void @"Helper::Test"(i128 128932)<u></u><u></u></p>
<p class="MsoNormal">  ret i32 0<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">-- C++ code – <u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">struct int128 <u></u><u></u></p>
<p class="MsoNormal">{<u></u><u></u></p>
<p class="MsoNormal">    uint64_t v1; <u></u><u></u></p>
<p class="MsoNormal">    uint64_t v2; <u></u><u></u></p>
<p class="MsoNormal">    // … code omitted… *1<u></u><u></u></p>
<p class="MsoNormal">};<u></u><u></u></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black"><u></u> <u></u></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:blue">struct</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> </span><span style="font-size:10.0pt;font-family:Consolas;color:#2b91af">Helper</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><u></u><u></u></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">{<u></u><u></u></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">       
</span><span style="font-size:10.0pt;font-family:Consolas;color:blue">static</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">void</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> Test(</span><span style="font-size:10.0pt;font-family:Consolas;color:#2b91af">int128</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> </span><span style="font-size:10.0pt;font-family:Consolas;color:gray">value</span><span style="font-size:10.0pt;font-family:Consolas;color:black">)<u></u><u></u></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        {<u></u><u></u></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        }<u></u><u></u></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">};<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">If I try to execute the code, I notice that MSVC++ seems to expect a pointer. Most notably, if you implement the copy constructor: int128(const int128& o) { … } , the address of o will be 128932 . As for assembler output, I noticed that
 %ecx is set to the value, %edx is zero’d and then the method is called. <u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">As evidenced by the resulting crash, this is apparently not the right way to do something like this… Obviously, I can also try to pass the value by pointer - but will then get issues with return values. Alternatively, I can introduce a
 2x64-bit structure, fill that with the int128 and pass that.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">My question is: what’s the correct way to do something like this?
<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Kind regards,<u></u><u></u></p>
<p class="MsoNormal">Stefan.<u></u><u></u></p>
</div>
</div>

<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>