<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>On Aug 18, 2010, at 2:43 AM, Anton Korobeynikov wrote:</div><div><br class="Apple-interchange-newline"><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">Hello, Cameron<br><br><blockquote type="cite">Windows ABI requires the function prologue to call __chkstk if there is >= 4096 bytes allocated on the stack.<br></blockquote>The patch is invalid due to many reasons:<br>- It does the stuff in wrong place<br></span></blockquote><div><br></div><div>I put it in the same area as the mingw case, for __alloca, so I thought it was in the right place.</div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">- It clobbers eax which can be incoming arg reg in case of inreg<br>params / fast CC<br></span></blockquote><div><br></div><div>You're right it will clobber eax in the 32-bit case, so there'd have to be some code added to save/restore it.</div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">- __chkstk is same as __alloca call in mingw case, which is already implemented<br><br></span></blockquote><div><br></div><div>I'll have to take your word that __chkstk is the same as __alloca, but reading the documentation on Microsoft's website, it doesn't come across that way:</div><div><br></div><div>__alloca:</div><div><blockquote type="cite"><span class="Apple-style-span" style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px; "><div class="introduction"><p>Allocates memory on the stack. This function is deprecated because a more secure version is available; see <span><a href="http://msdn.microsoft.com/en-us/library/5471dc8s.aspx" style="color: rgb(19, 100, 196); text-decoration: none; ">_malloca</a></span>.<br></p></div><div id="syntaxSection" class="section"></div></span></blockquote></div><div>__chkstk:</div><div><blockquote type="cite"><span class="Apple-style-span" style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px; "><p>Called by the compiler when you have more than one page of local variables in your function.</p></span></blockquote></div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">Also, I don't recall offhand, but iirc this call had some special CC,<br>it clobbers quite alot of regs, etc.<br></span></blockquote></div><div><br></div><div>According to the Microsoft website:</div><div><br></div><div><blockquote type="cite"><span class="Apple-style-span" style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px; "><p>The __chkstk helper will not modify any registers other than R10, R11, and the condition codes. In particular, it will return RAX unchanged and leave all nonvolatile registers and argument-passing registers unmodified.</p></span></blockquote></div><div><span class="Apple-style-span" style="font-family: 'Segoe UI', Verdana, Arial; font-size: 13px; "><p><font class="Apple-style-span" color="#000000" face="Helvetica" size="3"><span class="Apple-style-span" style="background-color: transparent; font-size: 12px;">So, the only registers which are munged, in the 64-bit case, are the volatile ones.  I assumed that the 32-bit case would be similar.</span></font></p></span></div>The reason I didn't add this code to the mingw case is because that path never calls emitSPUpdate():  it relys on __alloca to do all the stack manipulation.  This didn't  appear to me that it would be valid, according to the Windows ABI.<div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div>Cameron Esfahani</div><div><a href="mailto:dirty@apple.com">dirty@apple.com</a></div><div><br class="khtml-block-placeholder"></div><div>"There are times in the life of a nation when the only place a decent man can find himself is in prison."</div><div><br class="khtml-block-placeholder"></div><br class="Apple-interchange-newline"></span>
</div>

<br></div></body></html>