<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Aug 20, 2013 at 8:57 PM, Morrison, Michael <span dir="ltr"><<a href="mailto:Michael_Morrison@playstation.sony.com" target="_blank">Michael_Morrison@playstation.sony.com</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">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="">Our main concern is picking the path forward that is most preferred by the community.  Given the discussion thus far, it sounds like the two front-runners are:<br></p><p><u></u></p>
<p><u></u> <u></u></p>
<p>1a)  Maintain the documentation in Doxygen.  Any other formats required (HTML, XML, etc) can be generated on-the-fly from the Doxygen comments as needed.</p></div></div></blockquote><div><br></div><div>This has the advantage that -Wdocumentation will ensure that the docs and prototypes/argument lists are in sync; I'm not sure how significant that is since the code in these headers is mostly "write only" and not subject to continual maintenance and evolution (at least, not to the extent of "regular code").</div>
<div><br></div><div>Dmitri's point about formatting bears further investigation. You may want to do a similar check for reST (although reST is quite rich already, so hopefully nothing will be missing); however, reST is extensible from Sphinx plugins (e.g. custom directives/roles) so there will always be a way to work around any particular issue.</div>
<div><br></div><div><div>One concern for both approaches is how much code will be necessary to translate Doxygen/Sphinx formatted text into the desired output format. Will a simple "map this XML element to this other one" table be enough, or will it require a lot of nasty hand-coded stuff ("for ordered lists do this, for unordered lists do that, for italic do some other thing, for monospace do yet another thing, etc")?</div>
</div><div><br></div><div> </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"><div lang="EN-US" link="blue" vlink="purple">
<p><u></u><u></u></p>
<p><u></u> 2)  Maintain the documentation in reST/Doxygen. Any other formats required can be generated on-the-fly from the reST as needed.  (Also, it seems that Sphynx has good plugins and support for converting to other formats.)</p>
</div></blockquote><div><br></div><div>Having worked on the Sphinx docs a lot, I have a fairly good idea of the extent of what Sphinx can do, and I can envision an easy-to-maintain way to handle these docs. Using reST "field lists" <<a href="http://docutils.sourceforge.net/docs/user/rst/quickref.html#field-lists">http://docutils.sourceforge.net/docs/user/rst/quickref.html#field-lists</a>> and other reST features, you could capture it in a "highly semantic" form like this:</div>
<div><br></div><div>:Header: x86intrin.h</div><div>:Prototype: __m256 _mm256_round_ps(__m256 v, const int m);</div><div>:Instruction: VROUNDPS</div><div>:Description:</div><div>   Rounds the values stored in a packed 256-bit vector [8 x float] as</div>
<div>   specified by the byte operand. The source values are rounded to integer</div><div>   values and returned as floating point values.</div><div>:Parameters:</div><div>   v</div><div>      A 256-bit vector of [8 x float] values.</div>
<div>   m</div><div>      An immediate byte operand specifying how the rounding is to be performed.</div><div>      Bits [7:4] are reserved.</div><div>      Bit [3] is a precision exception value:</div><div>                      0: A normal PE exception is used</div>
<div>                      1: The PE field is not updated</div><div>      Bit [2] is a rounding control source:</div><div>                      0: MXCSR:RC</div><div>                      1: Use the RC field value</div><div>
      Bit [1:0] contain the rounding control definition:</div><div>                      00: Nearest</div><div>                      01: Downward (toward negative infinity)</div><div>                      10: Upward (toward positive infinity)</div>
<div>                      11: Truncated</div><div>:Returns:</div><div>   A 256-bit vector of [8 x float] containing the rounded values.</div><div><br></div><div>Most of the structure in the above snippet will be represented in the docutils XML representation. I'm not very familiar with Doxygen markup, but my understanding is that it wouldn't be possible to semantically capture the equivalent of the :Header: field (unless something like that is already hardcoded into doxygen). I use the term "semantically" to indicate that it's not just a piece of text marked up to be formatted in a specific way, but instead associates a specific semantic intent to the text, which can then be programmatically extracted/manipulated.</div>
<div><br></div><div>I'm not sure how important a "semantic" representation is though. What sort of information needs to be emitted for the Microsoft tooltip format? Is it just a blob of arbitrary formatted text, or does it actually require separating things like "which header should be included to get this definition"?</div>
<div><br></div><div><br></div><div>-- Sean Silva </div><div> </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">
<div lang="EN-US" link="blue" vlink="purple"><div><p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="" style="text-autospace:none"><span style="font-size:10pt;font-family:Helv,sans-serif;color:purple">Cheers,<u></u><u></u></span></p>
<p class="" style="text-autospace:none"><span style="font-size:10pt;font-family:Helv,sans-serif;color:purple">Michael<u></u><u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class=""><b><span style="font-size:10pt;font-family:Tahoma,sans-serif">From:</span></b><span style="font-size:10pt;font-family:Tahoma,sans-serif"> Sean Silva [mailto:<a href="mailto:silvas@purdue.edu" target="_blank">silvas@purdue.edu</a>]
<br>
<b>Sent:</b> Monday, 19 August, 2013 18:35<br>
<b>To:</b> Morrison, Michael<br>
<b>Cc:</b> <a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a>; Rafael Ávila de Espíndola; <a href="mailto:me@filcab.net" target="_blank">me@filcab.net</a><br>
<b>Subject:</b> Re: [cfe-dev] Documenting Clang: question about how best to deliver the doc<u></u><u></u></span></p><div><div class="h5">
<p class=""><u></u> <u></u></p>
<div>
<p class=""><u></u> <u></u></p>
<div>
<p class="" style="margin-bottom:12pt"><u></u> <u></u></p>
<div>
<p class="">On Mon, Aug 19, 2013 at 5:39 PM, Morrison, Michael <<a href="mailto:Michael_Morrison@playstation.sony.com" target="_blank">Michael_Morrison@playstation.sony.com</a>> wrote:<u></u><u></u></p>
<div>
<div>
<p class="">As some of you know, we at Sony Computer Entertainment America have been working on various aspects of LLVM, including Clang and its toolchain.  As part of our work, we have created
 documentation for our customers about using Clang, and we would like to share the fruits of our work with the Clang and LLVM communities.<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">As our first documentation submission, we plan to provide our *CPU Intrinsics Guide*, which documents the Clang intrinsics for x86intrin.h, along with several builtin and sync types. 
 I've included a sample of what we document for one of the intrinsics below.<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">Our question for the community is:  what documentation format is most helpful and desired for this information?  We currently have two main possibilities in mind (with three variants
 for the first option):<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">1) Add the documentation for each intrinsic to the header file:<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">- 1a) Using Doxygen tagging.  One benefit of this approach is that the documentation is available for the developer within a code-development/editing system.  One potential difficulty
 with this approach is that the intrinsics header file becomes much larger, which could increase compile times.<u></u><u></u></p>
</div>
</div>
<div>
<p class=""><u></u> <u></u></p>
</div>
<div>
<p class="">As Eli mentioned, it would be nice to get some performance numbers.<u></u><u></u></p>
</div>
<div>
<p class=""><u></u> <u></u></p>
</div>
<blockquote style="border-style:none none none solid;border-left-color:rgb(204,204,204);border-left-width:1pt;padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class=""> <u></u><u></u></p>
<p class="">- 1b) Using Microsoft's annotation grammar.  We might be able to contain this annotation grammar within Doxygen tagging that deviates somewhat from the LLVM Doxygen style.  This
 approach allows us to generate XML output for the Microsoft Visual Studio Tooltip class.  The benefit of this approach is that the documentation is available for the developer within Visual Studio, without his or her having to open the specific header file. 
 Like option (1a), one potential difficulty with this approach is that the intrinsics header file becomes much larger, which could increase compile times.<u></u><u></u></p>
</div>
</div>
</blockquote>
<div>
<p class=""><u></u> <u></u></p>
</div>
<div>
<p class="">Is generating MSVS Tooltip XML output a hard requirement for your use case? If so, can you estimate how much effort it is to convert to that format given each of these options? My suspicion is that keeping this info in reST or even just
 a structured XML file converted to reST with a Sphinx plugin for docs generation will be the easiest solution; in both cases, it should be a fairly straightforward Python script to slurp in the file and spit out XML (the `docutils` library that Sphinx is based
 on and that reads in the reST has a nice XML-based internal representation of the reST document).<u></u><u></u></p>
</div>
<div>
<p class=""> <u></u><u></u></p>
</div>
<blockquote style="border-style:none none none solid;border-left-color:rgb(204,204,204);border-left-width:1pt;padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class=""> <u></u><u></u></p>
<p class="">- 1c) Using TblGen to maintain both the intrinsics definitions and their documentation, from which we generate the header file with both.  With this approach, we could implement
 either option (1a), (1b), or both, and have a single point of maintenance.  This option has the same benefits and drawbacks as (1a) and (1b).<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">2) Add the documentation in reST and Sphynx format (to match existing Clang and LLVM documentation) to the Clang Web site.  The main benefit of this approach is that the documentation
 is available to anyone on the Web.<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">Thus, we come to you today to ask your opinion on which approach we should take.  We're open to providing one or more of the formats, as desired, or considering a different option
 that one of you might make.<u></u><u></u></p>
</div>
</div>
</blockquote>
<div>
<p class=""><u></u> <u></u></p>
</div>
<div>
<p class="">In what format is the documentation currently?<u></u><u></u></p>
</div>
<div>
<p class=""><u></u> <u></u></p>
</div>
<div>
<p class="">-- Sean Silva<u></u><u></u></p>
</div>
<div>
<p class=""> <u></u><u></u></p>
</div>
<blockquote style="border-style:none none none solid;border-left-color:rgb(204,204,204);border-left-width:1pt;padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class=""> <u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">Sample intrinsic documentation (ASCII formatted for forum viewing)<u></u><u></u></p>
<p class="">-------------------------------<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">_mm256_round_ps<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">SYNOPSIS<u></u><u></u></p>
<p class="">#include <x86intrin.h><u></u><u></u></p>
<p class="">__m256 _mm256_round_ps(__m256 v, const int m);<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">INSTRUCTION<u></u><u></u></p>
<p class="">VROUNDPS<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">DESCRIPTION<u></u><u></u></p>
<p class="">Rounds the values stored in a packed 256-bit vector [8 x float] as specified by the byte operand. The source values are rounded to integer values and returned as floating point
 values.<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">PARAMETERS<u></u><u></u></p>
<p class="">v              A 256-bit vector of [8 x float] values.<u></u><u></u></p>
<p class="">m            An immediate byte operand specifying how the rounding is to be performed.<u></u><u></u></p>
<p class="">                Bits [7:4] are reserved.<u></u><u></u></p>
<p class="">                Bit [3] is a precision exception value:<u></u><u></u></p>
<p class="">                                0: A normal PE exception is used<u></u><u></u></p>
<p class="">                                1: The PE field is not updated<u></u><u></u></p>
<p class="">                Bit [2] is a rounding control source:<u></u><u></u></p>
<p class="">                                0: MXCSR:RC<u></u><u></u></p>
<p class="">                                1: Use the RC field value<u></u><u></u></p>
<p class="">                Bit [1:0] contain the rounding control definition:<u></u><u></u></p>
<p class="">                                00: Nearest<u></u><u></u></p>
<p class="">                                01: Downward (toward negative infinity)<u></u><u></u></p>
<p class="">                                10: Upward (toward positive infinity)<u></u><u></u></p>
<p class="">                                11: Truncated<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">RETURNS<u></u><u></u></p>
<p class="">A 256-bit vector of [8 x float] containing the rounded values.<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="">-------------------------------<u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class=""> <u></u><u></u></p>
<p class="" style="text-autospace:none">
<span style="font-size:10pt;font-family:Helv,sans-serif;color:purple">Cheers,</span><u></u><u></u></p>
<p class="" style="text-autospace:none">
<span style="font-size:10pt;font-family:Helv,sans-serif;color:purple">Michael</span><u></u><u></u></p>
<p class=""><span style="font-size:14pt;font-family:'Cambria Math',serif">△</span><span style="font-size:14pt;font-family:Arial,sans-serif">○</span><span style="font-size:14pt;font-family:Helv,sans-serif">×</span><span style="font-size:14pt;font-family:Arial,sans-serif">□</span><span style="font-size:14pt;font-family:'Tms Rmn',serif">
</span><span style="font-family:'Tms Rmn',serif">   </span><span style="font-family:'MS Mincho'">お疲れ様です</span><u></u><u></u></p>
<p class=""> <u></u><u></u></p>
</div>
</div>
<p class="" style="margin-bottom:12pt"><br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><u></u><u></u></p>
</blockquote>
</div>
<p class=""><u></u> <u></u></p>
</div>
</div>
</div></div></div>
</div>

<br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div></div>