<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:SimSun;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:SimSun;
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hello,<o:p></o:p></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.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#include <stdio.h><o:p></o:p></p>
<p class="MsoNormal">#include <stdarg.h><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">void<o:p></o:p></p>
<p class="MsoNormal">__attribute__((ms_abi))<o:p></o:p></p>
<p class="MsoNormal">Foo_va_list (<o:p></o:p></p>
<p class="MsoNormal"> int VaNum,<o:p></o:p></p>
<p class="MsoNormal"> const char *Format,<o:p></o:p></p>
<p class="MsoNormal"> ...<o:p></o:p></p>
<p class="MsoNormal"> )<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal"> va_list Marker;<o:p></o:p></p>
<p class="MsoNormal"> long long Value;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> va_start (Marker, Format);<o:p></o:p></p>
<p class="MsoNormal"> for (int i = 0; i < VaNum; i++ ) {<o:p></o:p></p>
<p class="MsoNormal"> Value = va_arg (Marker, int);<o:p></o:p></p>
<p class="MsoNormal"> printf("Value = 0x%llx\n", Value);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"> va_end (Marker);<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int main() <o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></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);<o:p></o:p></p>
<p class="MsoNormal"> return 0;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The expected output are:<o:p></o:p></p>
<p class="MsoNormal">Value = 0x0<o:p></o:p></p>
<p class="MsoNormal">Value = 0x1<o:p></o:p></p>
<p class="MsoNormal">Value = 0x2<o:p></o:p></p>
<p class="MsoNormal">Value = 0x3<o:p></o:p></p>
<p class="MsoNormal">Value = 0x4<o:p></o:p></p>
<p class="MsoNormal">Value = 0x5<o:p></o:p></p>
<p class="MsoNormal">Value = 0x6<o:p></o:p></p>
<p class="MsoNormal">Value = 0x7<o:p></o:p></p>
<p class="MsoNormal">Value = 0x8<o:p></o:p></p>
<p class="MsoNormal">Value = 0x9<o:p></o:p></p>
<p class="MsoNormal">Value = 0xa<o:p></o:p></p>
<p class="MsoNormal">Value = 0xb<o:p></o:p></p>
<p class="MsoNormal">Value = 0xc<o:p></o:p></p>
<p class="MsoNormal">Value = 0xd<o:p></o:p></p>
<p class="MsoNormal">Value = 0xe<o:p></o:p></p>
<p class="MsoNormal">Value = 0xf<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">But the real output are:<o:p></o:p></p>
<p class="MsoNormal">Value = 0x0<o:p></o:p></p>
<p class="MsoNormal">Value = 0x1<o:p></o:p></p>
<p class="MsoNormal">Value = 0x2<o:p></o:p></p>
<p class="MsoNormal">Value = 0x3<o:p></o:p></p>
<p class="MsoNormal">Value = 0x4<o:p></o:p></p>
<p class="MsoNormal">Value = 0x5<o:p></o:p></p>
<p class="MsoNormal">Value = 0x0<o:p></o:p></p>
<p class="MsoNormal">Value = 0x1<o:p></o:p></p>
<p class="MsoNormal">Value = 0x2<o:p></o:p></p>
<p class="MsoNormal">Value = 0x3<o:p></o:p></p>
<p class="MsoNormal">Value = 0x4<o:p></o:p></p>
<p class="MsoNormal">Value = 0x5<o:p></o:p></p>
<p class="MsoNormal">Value = 0x6<o:p></o:p></p>
<p class="MsoNormal">Value = 0x7<o:p></o:p></p>
<p class="MsoNormal">Value = 0x8<o:p></o:p></p>
<p class="MsoNormal">Value = 0x9<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></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.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Arial",sans-serif">Steven Shi</span></b><b><span style="font-size:10.0pt;font-family:"Arial",sans-serif"><o:p></o:p></span></b></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Arial",sans-serif">Intel\SSG\STO\UEFI Firmware</span></b><b><span style="font-size:12.0pt;font-family:"Arial",sans-serif"><o:p></o:p></span></b></p>
<p class="MsoNormal"><b><span style="font-family:"Arial",sans-serif"><o:p> </o:p></span></b></p>
<p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"><span style="font-size:9.0pt;font-family:"Arial",sans-serif">Tel: +86 021-61166522<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align:justify;text-justify:inter-ideograph"><span style="font-size:9.0pt;font-family:"Arial",sans-serif">iNet: 821-6522<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>