<div class="gmail_quote">On Wed, Jan 7, 2009 at 12:41 PM, Don <span dir="ltr">&lt;<a href="mailto:nospam@nospam.com">nospam@nospam.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Tomas Lindquist Olsen wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="Wj3C7c">
On Fri, Jan 2, 2009 at 9:21 AM, Don &lt;<a href="mailto:nospam@nospam.com" target="_blank">nospam@nospam.com</a> &lt;mailto:<a href="mailto:nospam@nospam.com" target="_blank">nospam@nospam.com</a>&gt;&gt; wrote:<br>
<br>
 &nbsp; &nbsp;Duane Bailey wrote:<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;I am currently porting LDC &nbsp;to PowerPC and, hopefully,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;eventually the POWER and CELL platforms as well. The first bit<br>
 &nbsp; &nbsp; &nbsp; &nbsp;requires me to port the inline assembler, allowing me to<br>
<br>
 &nbsp; &nbsp;review the problems that the D language presents LLVM.<br>
 &nbsp; &nbsp;Cool!!!!<br>
<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;LLVM is not a toy virtual machine. It is, perhaps, the most<br>
 &nbsp; &nbsp; &nbsp; &nbsp;flexible and powerful compiler toolset ever, spanning massive<br>
 &nbsp; &nbsp; &nbsp; &nbsp;numbers of computing platforms. It even supports (in a limited<br>
 &nbsp; &nbsp; &nbsp; &nbsp;manner) the PIC16 platform, require insane constraints: there<br>
 &nbsp; &nbsp; &nbsp; &nbsp;are no registers, memory can only be accessed in one byte<br>
 &nbsp; &nbsp; &nbsp; &nbsp;amounts, and some processors only have 35 instructions.<br>
<br>
<br>
 &nbsp; &nbsp;That&#39;s pretty impressive. I&#39;m currently using a PIC, but it&#39;s so<br>
 &nbsp; &nbsp;memory-limited it&#39;s hard to believe D ever being workable on it.<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;LLVM, however, is not able to do everything. For some reason,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;its current API does not allow the restriction of prologue and<br>
 &nbsp; &nbsp; &nbsp; &nbsp;epilogue generation; to allow so would not make sense: &nbsp;the<br>
 &nbsp; &nbsp; &nbsp; &nbsp;language itself depends on the maintenance of the stack. The<br>
 &nbsp; &nbsp; &nbsp; &nbsp;only way to establish a &#39;naked&#39; function in *c* is to &#39;omit&#39; the<br>
 &nbsp; &nbsp; &nbsp; &nbsp;frame pointer—technically not allowed in most OS&#39;s ABIs—and then<br>
 &nbsp; &nbsp; &nbsp; &nbsp;explicitly avoid using all variables (and hence the stack), OR<br>
 &nbsp; &nbsp; &nbsp; &nbsp;to use top level assembly to write the assembly yourself.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Now, neither of those options are really what D should use, but<br>
 &nbsp; &nbsp; &nbsp; &nbsp;I have some other recommendations based on this. &#39;naked&#39;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;functions should not be allowed to have any D, except to<br>
 &nbsp; &nbsp; &nbsp; &nbsp;reference arguments passed to it. In other words, it should not<br>
 &nbsp; &nbsp; &nbsp; &nbsp;touch the stack. in fact, there&#39;s really no reason at all to<br>
 &nbsp; &nbsp; &nbsp; &nbsp;have the &#39;naked&#39; statement in the inline assembly. It&#39;s not &nbsp;a<br>
 &nbsp; &nbsp; &nbsp; &nbsp;property of the assembly, it&#39;s a property of the *function*. And<br>
 &nbsp; &nbsp; &nbsp; &nbsp;because D code should not be used (except perhaps for macros?),<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&#39;naked&#39; functions should intrinsically be assembly functions.<br>
<br>
<br>
 &nbsp; &nbsp;I agree with this. Mixing run-time D and naked asm doesn&#39;t make any<br>
 &nbsp; &nbsp;sense. But, something which I&#39;ve done which is _very_ useful is to<br>
 &nbsp; &nbsp;mixin CTFE functions. You get something like:<br>
<br>
 &nbsp; &nbsp;void foo() {<br>
 &nbsp; &nbsp; asm {<br>
 &nbsp; &nbsp; naked;<br>
 &nbsp; &nbsp; }<br>
 &nbsp; &nbsp; mixin(someasm(&quot;EBX&quot;)); // becomes asm {mov EAX, EBX; }<br>
 &nbsp; &nbsp; asm { ret; }<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;char [] someasm(char [] c) {<br>
 &nbsp; &nbsp; return &quot;asm { mov EAX,&quot; ~ c ~&quot;; }&quot;;<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;I see this as crucial functionality since it gives you an<br>
 &nbsp; &nbsp;unbelievably powerful macro language in the assembler.<br>
<br>
<br></div></div><div class="Ih2E3d">
it should be no problem to merge asm blocks in a function, the only problem is mixing normal dcode in there as well.<br>
I&#39;ve decided to make this an error in LDC since there is no sensible way to implement D-style function parameters *and* make sure the function really is naked. function parameters in llvm are ssa values, so you manually have to alloca a stack slot and copy the argument into that to make sure the parameter is an l-value<br>

</div></blockquote>
<br>
I don&#39;t understand those last two sentences. Does it mean that you&#39;d only allow &#39;naked&#39; on extern(C) functions? Or only that mixing D and naked asm would be illegal?</blockquote><div><br>Sorry, I can see I was a bit unclear. All I meant was that I can&#39;t sensibly implement naked and allow arbitrary D code in the mix as well, it&#39;s either or... naked should eventually work fine for any calling conventions, it&#39;ll just bail out with an error if you try and mix D in between the asm blocks.<br>
&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
By the way, in DMD, mixing naked and D code only works if you put a &quot;push EBP; mov &nbsp; EBP, ESP;&quot; before the first bit of D code, which isn&#39;t documented anywhere as far as I know; and I don&#39;t know how to make inner functions work. So it&#39;s pretty much unspecified behaviour right now.<div class="Ih2E3d">
</div></blockquote><div><br>nested delegates inside naked functions pose some problems, since they will modify the stack frame as well (like allowing full access to function parameters, like taking the address of one, which was what I was trying to talk about in my reply)<br>
<br>Consider taking the address of a parameter that is passed by value in EAX, this will allocate a stack slot...<br><br></div></div>Hope I was a bit more clear this time :)<br>