<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><html>On Apr 14, 2008, at 14:25, Jon Sargeant wrote:</html><br class="Apple-interchange-newline"><blockquote type="cite">Duncan Sands wrote:<br><blockquote type="cite"></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">What is the correct procedure for translating a function signature from  <span class="Apple-style-span" style="-webkit-text-stroke-width: -1; ">a high-order language to LLVM?</span></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">you have to do it carefully so that LLVM will end up producing object code <span class="Apple-style-span" style="-webkit-text-stroke-width: -1; ">that conforms to the platform ABI.  For example, suppose you are using cdecl with a small struct (a pair of ints, say).  Then your function should get two integer parameters, which LLVM will assign to registers.  If using a large struct then use byval which will pass it on the stack.</span></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I know this is painful, hopefully LLVM will get some helpers for this one <span class="Apple-style-span" style="-webkit-text-stroke-width: -1; ">day.  The reason is that some ABIs make distinctions that don't exist at the LLVM level.  For example at least one ABI says that "complex" ( { double, double } ) should be passed differently to a struct containing a pair of doubles.</span></blockquote><br>Ugh, this isn't what I wanted to hear.  Passing "complex" differently than a structure containing two doubles is a bad design, but alas, calling conventions are beyond our control.  How many special cases like this are there?</blockquote><div><br></div><div>llvm-gcc is probably your best reference on this matter.</div><br><blockquote type="cite">If "complex" is the only special case, LLVM could provide a complex type, which behaves like {double,double} in all respects except for calls.  I recommend handling calling conventions entirely in the back end.</blockquote><div><br></div><div>This would be convenient, but is unfortunately not realistic. Consider that platform calling conventions are generally defined in terms of C data types. Since LLVM's data types are by design lower-level than C, they are insufficient to specify platform calling conventions. Therefore, the LLVM IR needs to be annotated. This is done through a variety of mechanisms:</div><div><br></div><ul class="MailOutline"><li>'cc'</li><li>'byval'</li><li>'sret'</li><li>aggregate return</li><li>breaking up structs into multiple parameters</li><li>merging structs fields into single parameters</li><li>probably more.</li></ul><div><br></div><div>On the other hand, you need only consider this complexity when interoperating with C/C++; your language's own functions need only be self-consistent.</div><div><br></div></div><div apple-content-edited="true"><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; 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 style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; 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; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; 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; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; 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; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; 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; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Trebuchet MS; 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>— Gordon</div></span></span></span></span></span></div></span> </div><br></body></html>