<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 19, 2015 at 8:18 AM, Rodney M. Bates <span dir="ltr"><<a href="mailto:rodney_bates@lcwb.coop" target="_blank">rodney_bates@lcwb.coop</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">Have I correctly inferred below, how I build IR and debug info for<br>
a function type and a function (value), in particular, how to supply<br>
the names of the formal parameters?<br></blockquote><div><br>Generally good advice: <a href="http://llvm.org/docs/tutorial/LangImpl8.html">http://llvm.org/docs/tutorial/LangImpl8.html</a><br> </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">To create a function in llvm IR and give names to its formal parameters,<br>
I must:<br>
<br>
1. Build a LLVMTypeRef for the type of each formal and the function result.<br></blockquote><div><br>Sounds like you're using the C API. I'm not especially familiar with that, so answers may be vague.<br> </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">
2. Build a function type using LLVMFunctionType, from the results of 1.<br>
3. Build a function (an LLVMValueRef), using LLVMAddFunction, from the result of 2.<br>
4. Get the LLVMValueRef for each formal (apparently, these are constructed inside<br>
   LLVMAddFunction), using LLVMGetParam, from the result of 3.<br>
5. Set the formal name using LLVMSetValueName, from each result of 5.<br></blockquote><div><br>The names of LLVM IR values are purely aids for LLVM developers (such as yourself), they should never have any impact on the result of LLVM (in terms of machine asm/code - the textual LLVM IR will include the names, but again, this is just a debugging aid for you, the LLVM developer (it has no impact on the DWARF debug info LLVM emits))<br> </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">Which appears to imply that the formal names are part of the function,<br>
not the function type, and thus the function type could be reused for another<br>
function whose signature differs only in the names of the formals.  Also the<br>
function type could be used as the referent of a pointer type, which could<br>
then be used as the type of a variable, without any actual function at all.<br></blockquote><div><br>Sure.<br> </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">
<br>
To build corresponding debug info, I must:<br>
<br>
6. Build a llvm::DIArray, using llvm::getOrCreateArray, from the results of 4.<br>
7. Build a llvm::DIComposite type for the function, using<br>
   llvm::createSubroutineType, from the result of 6.<br>
8. Build a llvm::DIFunction using llvm::createFunction, from the result of 7.<br>
<br>
Here, I need the formal values, with names, first, before building the function<br>
type. </blockquote><div><br>I don't think you should need parameter names for createSubroutineType - it's just a type (composed of other types, no variable names, just type names).<br> </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"> This appears to imply that, in debug info, the formal names are also part<br>
of the function type,</blockquote><div><br>Shouldn't be. But the actual DWARF output doesn't necessarily have explicit function types - it just has a function with some formal parameters, each with a type and in a specified order.<br> </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"> which thus cannot be reused for a different function with<br>
different formal names.<br>
<br>
Can I build a DI function type without having an actual function of that type?<br>
This happens in my language.</blockquote><div><br>Not sure I understand. You mean your language has, say, a function pointer even though you have no function of that type. Certainly clang does this (try compiling something simple like "void (*x)();" in clang and look at the LLVM IR it produces - you'd want to produce something similar).<br><br>- David<br> </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"><span class=""><font color="#888888"><br>
<br>
-- <br>
Rodney Bates<br>
<a href="mailto:rodney.m.bates@acm.org" target="_blank">rodney.m.bates@acm.org</a><br>
______________________________<u></u>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvmdev</a><br>
</font></span></blockquote></div><br></div></div>