<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Jan 24, 2013 at 7:20 AM, Ahmed Bougacha <span dir="ltr"><<a href="mailto:ahmed.bougacha@gmail.com" target="_blank">ahmed.bougacha@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Thu, Jan 24, 2013 at 12:46 PM,  <<a href="mailto:nkavv@physics.auth.gr">nkavv@physics.auth.gr</a>> wrote:<br>

> Hi all,<br>
><br>
> i'm just starting out with LLVM (although i've been observing its evolution<br>
> since that first release some years ago :)<br>
><br>
> I would like to develop a backend for a generic assembly-like language,<br>
> called NAC (N-Address Code). More info on NAC can be found here:<br>
> <a href="http://www.nkavvadias.com/hercules/nac-refman.html" target="_blank">http://www.nkavvadias.com/hercules/nac-refman.html</a> (HTML)<br>
> <a href="http://www.nkavvadias.com/hercules/nac-refman.pdf" target="_blank">http://www.nkavvadias.com/hercules/nac-refman.pdf</a> (PDF)<br>
><br>
> You can consider NAC similar to an LLVM subset for hardware synthesis.<br>
> Although NAC was developed independently, certain decisions taken when<br>
> designing it, may or may not defer from other textual IRs like LLVM or PTX.<br>
><br>
> I have a number of questions:<br>
><br>
> 1) It seems to me that a template backend either the C backend or NVPTX are<br>
> possible starting points. However, only NVPTX makes use of tblgen which<br>
> removes some burder from the backend developer. I also think that a<br>
> tblgen-based backend like NVPTX is easier to maintain in the long term. What<br>
> do you think?<br>
<br>
</div>Hi Nikolaos,<br>
<br>
The C backend (that is by the way deprecated) is the exception rather<br>
than the rule: most targets use TableGen extensively (look at all the<br>
lib/Target/**/*.td).<br></blockquote><div><br></div><div>It really depends on your goals and the abstractions provided by the target IR.  For NVPTX, we use a traditional LLVM back-end approach (using TableGen and the SelectionDAG/MachineInstr/MC infrastructure) because PTX is low-level enough to be treated as an assembly language.  There are some higher-level features available in the language, but we do not use those.  If your IR is more like LLVM IR, then it may make sense to do some kind of direct translation from LLVM IR to your IR and bypass the traditional codegen approach.<br>
<br>Another point to consider is how much optimization you want.  For PTX, we have to walk a fine line compared to other back-ends because PTX is not the machine ISA.  A separate assembler is used to convert to the real machine ISA, and that assembler performs optimizations of its own!  We want to optimize the PTX we generate, but we also do not want to prevent optimizations that may be performed by the assembler.  If your IR is meant for optimization passes, then it may not make sense to perform all of the back-end optimizations available through LLVM, but just use the middle-end optimizations performed on LLVM IR directly.<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
As for your other questions, I'm no expert, but you might want to take<br>
a look at the available tutorials<br>
(<a href="http://llvm.org/docs/WritingAnLLVMBackend.html" target="_blank">http://llvm.org/docs/WritingAnLLVMBackend.html</a> and<br>
<a href="http://jonathan2251.github.com/lbd/" target="_blank">http://jonathan2251.github.com/lbd/</a>).<br>
<span class="HOEnZb"><font color="#888888"><br>
-- Ahmed Bougacha<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> 2) NAC uses the following statement form (for any given statement):<br>
><br>
> dst1, dst2, ..., dstm <= op src1, src2, ..., srcn;<br>
><br>
> which expresses an operation op with n source operands and m destination<br>
> operands. Do you think that tblgen supports such form or should I sanitize<br>
> it?<br>
><br>
> 3) The NAC memory model uses separate address spaces per array. A<br>
> general-use stack/heap might also be supported. Should I use dot directives<br>
> to declare each address space in use for a given translation unit/module?<br>
><br>
> 4) What is the maximum that I can get from tblgen? Which C++ source files<br>
> cannot be generated by .td files and always have to be coded by hand?<br>
><br>
> In the end, source code for the LLVM->NAC backend and a NAC interpreter will<br>
> be released, probably as third-party BSD-licensed tools.<br>
><br>
><br>
> Best regards<br>
> Nikolaos Kavvadias<br>
><br>
><br>
><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:LLVMdev@cs.uiuc.edu">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/mailman/listinfo/llvmdev</a><br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">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/mailman/listinfo/llvmdev</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div>
</div></div>