<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Jan 7, 2016 at 11:15 PM, Shi, Steven via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">





<div lang="EN-US" link="#0563C1" vlink="#954F72">
<div>
<p class="MsoNormal"><span style="color:rgb(31,73,125)">For the variadic function error with AMD64 abi and windows calling convention on 64bits x86, I find it has been tracked in Bug 20847</span> (<span style="color:rgb(31,73,125)"><a href="https://llvm.org/bugs/show_bug.cgi?id=20847" target="_blank">https://llvm.org/bugs/show_bug.cgi?id=20847</a>)
 (<a href="http://reviews.llvm.org/D1622#inline-9345" target="_blank">http://reviews.llvm.org/D1622#inline-9345</a>). Do we still plan to fix it?<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:rgb(31,73,125)">You know, I meet exactly same va_arg mistake with llvm3.7 when I enable the Uefi firmware (</span><a href="http://www.uefi.org/" target="_blank">http://www.uefi.org/</a><span style="color:rgb(31,73,125)">) build with clang. The ms_abi
 is the Uefi firmware binary module standard interface. I really hope this bug fix can been checked in as soon as possible. If we cannot fix it in short time, could we offer a temporary fix patch based on llvm3.7?</span></p></div></div></blockquote><div><br></div><div>This is already fixed in clang trunk. Your code is rejected as follows:</div><div><br></div><div><div><stdin>:15:17: error: 'va_start' used in Win64 ABI function</div><div>                va_start (Marker, Format);</div><div>                ^</div></div><div><br></div><div>You need to use __builtin_ms_va_list, __builtin_ms_va_start, __builtin_ms_va_end to use ms_abi varargs semantics. (In particular, note that __builtin_ms_va_list is a different type from va_list, so this can't "just work" in the way you expect it to.)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="#0563C1" vlink="#954F72"><div><span class=""><div>
<p class="MsoNormal"><b><span style="font-size:10pt;font-family:Arial,sans-serif;color:rgb(31,73,125)">Steven Shi</span></b><b><span style="font-size:10pt;font-family:Arial,sans-serif;color:rgb(31,73,125)"><u></u><u></u></span></b></p>
<p class="MsoNormal"><b><span style="font-size:10pt;font-family:Arial,sans-serif;color:rgb(31,73,125)">Intel\SSG\STO\UEFI Firmware</span></b><b><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(31,73,125)"><u></u><u></u></span></b></p>
<p class="MsoNormal"><b><span style="font-family:Arial,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></b></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9pt;font-family:Arial,sans-serif;color:rgb(31,73,125)">Tel: <a href="tel:%2B86%20021-61166522" value="+862161166522" target="_blank">+86 021-61166522</a><u></u><u></u></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9pt;font-family:Arial,sans-serif;color:rgb(31,73,125)">iNet: 821-6522<u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span style="color:rgb(31,73,125)"><u></u> <u></u></span></p>
</span><div style="border-style:none none none solid;border-left-color:blue;border-left-width:1.5pt;padding:0in 0in 0in 4pt">
<div>
<div style="border-style:solid none none;border-top-color:rgb(225,225,225);border-top-width:1pt;padding:3pt 0in 0in">
<p class="MsoNormal"><a name="1372302986______replyseparator"></a><b>From:</b> Shi, Steven <br>
<b>Sent:</b> Thursday, January 07, 2016 11:07 PM<br>
<b>To:</b> '<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>'<br>
<b>Subject:</b> Is it a va_arg bug in clang?<u></u><u></u></p>
</div>
</div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Hello,<u></u><u></u></p>
<p class="MsoNormal">I’m trying to use the clang3.7 to compile  64bits x86 code with Microsoft ABI in Ubuntu 64bit, but I find the va_arg get the wrong variable argument from the va_list. Below is my test code.
<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">#include <stdio.h><u></u><u></u></p>
<p class="MsoNormal">#include <stdarg.h><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">void<u></u><u></u></p>
<p class="MsoNormal">__attribute__((ms_abi))<u></u><u></u></p>
<p class="MsoNormal">Foo_va_list (<u></u><u></u></p>
<p class="MsoNormal">    int                       VaNum,<u></u><u></u></p>
<p class="MsoNormal">    const char  *Format,<u></u><u></u></p>
<p class="MsoNormal">  ...<u></u><u></u></p>
<p class="MsoNormal">  )<u></u><u></u></p>
<p class="MsoNormal">{<u></u><u></u></p>
<p class="MsoNormal">                va_list  Marker;<u></u><u></u></p>
<p class="MsoNormal">                long long    Value;<u></u><u></u></p>
<p class="MsoNormal">                <u></u><u></u></p>
<p class="MsoNormal">                va_start (Marker, Format);<u></u><u></u></p>
<p class="MsoNormal">                for (int i = 0; i < VaNum; i++ ) {<u></u><u></u></p>
<p class="MsoNormal">                                Value = va_arg (Marker, int);<u></u><u></u></p>
<p class="MsoNormal">                                printf("Value = 0x%llx\n", Value);<u></u><u></u></p>
<p class="MsoNormal">                }<u></u><u></u></p>
<p class="MsoNormal">                va_end (Marker);<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">int main() <u></u><u></u></p>
<p class="MsoNormal">{<u></u><u></u></p>
<p class="MsoNormal">  Foo_va_list (16, "0123456789abcdef= %x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x \n", 0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf);<u></u><u></u></p>
<p class="MsoNormal">  return 0;<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">The expected output are:<u></u><u></u></p>
<p class="MsoNormal">Value = 0x0<u></u><u></u></p>
<p class="MsoNormal">Value = 0x1<u></u><u></u></p>
<p class="MsoNormal">Value = 0x2<u></u><u></u></p>
<p class="MsoNormal">Value = 0x3<u></u><u></u></p>
<p class="MsoNormal">Value = 0x4<u></u><u></u></p>
<p class="MsoNormal">Value = 0x5<u></u><u></u></p>
<p class="MsoNormal">Value = 0x6<u></u><u></u></p>
<p class="MsoNormal">Value = 0x7<u></u><u></u></p>
<p class="MsoNormal">Value = 0x8<u></u><u></u></p>
<p class="MsoNormal">Value = 0x9<u></u><u></u></p>
<p class="MsoNormal">Value = 0xa<u></u><u></u></p>
<p class="MsoNormal">Value = 0xb<u></u><u></u></p>
<p class="MsoNormal">Value = 0xc<u></u><u></u></p>
<p class="MsoNormal">Value = 0xd<u></u><u></u></p>
<p class="MsoNormal">Value = 0xe<u></u><u></u></p>
<p class="MsoNormal">Value = 0xf<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">But the real output are:<u></u><u></u></p>
<p class="MsoNormal">Value = 0x0<u></u><u></u></p>
<p class="MsoNormal">Value = 0x1<u></u><u></u></p>
<p class="MsoNormal">Value = 0x2<u></u><u></u></p>
<p class="MsoNormal">Value = 0x3<u></u><u></u></p>
<p class="MsoNormal">Value = 0x4<u></u><u></u></p>
<p class="MsoNormal">Value = 0x5<u></u><u></u></p>
<p class="MsoNormal">Value = 0x0<u></u><u></u></p>
<p class="MsoNormal">Value = 0x1<u></u><u></u></p>
<p class="MsoNormal">Value = 0x2<u></u><u></u></p>
<p class="MsoNormal">Value = 0x3<u></u><u></u></p>
<p class="MsoNormal">Value = 0x4<u></u><u></u></p>
<p class="MsoNormal">Value = 0x5<u></u><u></u></p>
<p class="MsoNormal">Value = 0x6<u></u><u></u></p>
<p class="MsoNormal">Value = 0x7<u></u><u></u></p>
<p class="MsoNormal">Value = 0x8<u></u><u></u></p>
<p class="MsoNormal">Value = 0x9<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">After I remove the Microsoft ABI definition __attribute__((ms_abi)) above  Foo_va_list () in the code, the output will become correct. I find GCC also have similar wrong behavior with __attribute__((ms_abi)). I don’t know how to make the
 __attribute__((ms_abi)) work correctly with va_arg.  I appreciate if any suggestion.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">  <u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><b><span style="font-size:10pt;font-family:Arial,sans-serif">Steven Shi<u></u><u></u></span></b></p>
<p class="MsoNormal"><b><span style="font-size:10pt;font-family:Arial,sans-serif">Intel\SSG\STO\UEFI Firmware</span></b><b><span style="font-size:12pt;font-family:Arial,sans-serif"><u></u><u></u></span></b></p>
<p class="MsoNormal"><b><span style="font-family:Arial,sans-serif"><u></u> <u></u></span></b></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9pt;font-family:Arial,sans-serif">Tel: <a href="tel:%2B86%20021-61166522" value="+862161166522" target="_blank">+86 021-61166522</a><u></u><u></u></span></p>
<p class="MsoNormal" style="text-align:justify"><span style="font-size:9pt;font-family:Arial,sans-serif">iNet: 821-6522<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div></div></div>
</div>
</div>

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