<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">You are making a pretty strong case.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">There's a tactic used in some test subtrees that could help with the source-code-sharing part, which is to keep the shared stuff in an Inputs subdirectory and
 then have a lit test script in the parent directory with a .test suffix.  This lets you do stuff like:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">$ cat ./Inputs/foo.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">int main() {}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">$ cat ./foo-1.test<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">REQUIRES: win32<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">RUN: %clangcl /whatever %S/Inputs/foo.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">$ cat ./foo-2.test<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">UNSUPPORTED: win32<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">RUN: %clang â€“gdwarf-2 %S/Inputs/foo.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">and so forth, so the actual C/C++ source is shared but the scripting can be tuned as needed.  There's a trivial amount of lit magic to make lit ignore the Inputs
 subdirectory and run files with .test suffixes.  This should make it easier to have separate Windows and gdb-like scripting.  In fact you could even put the scripts in debugger-specific directories and work out lit magic to run only the relevant subdirectory's
 tests, which lets you avoid repeating the REQUIRES/UNSUPPORTED stuff everywhere.  We do architecture-specific test subdirectories this way, for example.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">--paulr<o:p></o:p></span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></a></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Zachary Turner [mailto:zturner@google.com]
<br>
<b>Sent:</b> Friday, September 08, 2017 11:37 AM<br>
<b>To:</b> Robinson, Paul; Adrian Prantl<br>
<b>Cc:</b> David Blaikie; llvm-dev@lists.llvm.org<br>
<b>Subject:</b> Re: [llvm-dev] Status of debuginfo-tests<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<div>
<p class="MsoNormal">On Fri, Sep 8, 2017 at 10:46 AM Robinson, Paul <<a href="mailto:paul.robinson@sony.com" target="_blank">paul.robinson@sony.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">Let me say up front that I sympathize deeply with the problem; debug<br>
info is an interface, and it is frequently unclear whether the goal of<br>
some bit of work is to test the producer or test the consumer of the<br>
interface.  In fact we end up using the producer to test the consumer,<br>
and (in the case at hand) using the consumer to test the producer.<br>
There are distinct analogies to testing compilers by seeing what the<br>
linker thinks, and testing linkers by seeing whether they can handle<br>
what the compiler produces.<br>
<br>
> I understand the desire to keep them as similar as possible, but I'm<br>
> still not really sold that massaging fickle text output into a different<br>
> text format is going to make things more scalable.  I'd like there to be<br>
> as few layers of text processing as possible.<br>
<br>
If the text output is fickle, then I'd think hiding the fickleness behind<br>
a wrapper we control would be preferable to updating dozens of tests when<br>
something changes.  Or if a debugger changes its presentation in version<br>
N+1, but people are still running tests with version N, persuading the<br>
wrapper to handle both would be less overall work than making every test<br>
accommodate both formats.<o:p></o:p></p>
</blockquote>
</div>
<div>
<div>
<div>
<p class="MsoNormal">But that's just my point.  There are clearly going to be tests where both formats don't even make sense because it's testing something specific to one debugger.  What if I want to test that we output correct exception information, so I
 send a .exr command to the debugger and get back this:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<pre><span style="color:#1E1E1E">0:000> .exr -1</span><o:p></o:p></pre>
<pre><span style="color:#1E1E1E">ExceptionAddress: 77a6db8b (ntdll!LdrpDoDebuggerBreak+0x0000002b)</span><o:p></o:p></pre>
<pre><span style="color:#1E1E1E">   ExceptionCode: 80000003 (Break instruction exception)</span><o:p></o:p></pre>
<pre><span style="color:#1E1E1E">  ExceptionFlags: 00000000</span><o:p></o:p></pre>
<pre><span style="color:#1E1E1E">NumberParameters: 1</span><o:p></o:p></pre>
<pre><span style="color:#1E1E1E">   Parameter[0]: 00000000</span><o:p></o:p></pre>
<div>
<pre><span style="font-family:"Arial","sans-serif""> What if I want to test that that the debugger can print a valid stack trace, so I send a kv command and get back this?<o:p></o:p></span></pre>
</div>
<div>
<pre><span style="font-family:"Arial","sans-serif""><o:p> </o:p></span></pre>
</div>
<div>
<pre><span style="color:#1E1E1E"> # ChildEBP RetAddr  Args to Child              </span><o:p></o:p></pre>
<pre><u><span style="color:#0066CC">00</span></u><span style="color:#1E1E1E"> 0198fa4c 77a2f5ca 55fe0b87 00000000 00000000 ntdll!LdrpDoDebuggerBreak+0x2b (FPO: [Non-Fpo])</span><o:p></o:p></pre>
<pre><u><span style="color:#0066CC">01</span></u><span style="color:#1E1E1E"> 0198fc8c 77a18a42 55fe0bef 00000000 00000000 ntdll!LdrpInitializeProcess+0x1967 (FPO: [Non-Fpo])</span><o:p></o:p></pre>
<pre><u><span style="color:#0066CC">02</span></u><span style="color:#1E1E1E"> 0198fce4 77a1886c 00000000 bad81aba 00000000 ntdll!_LdrpInitialize+0x180 (FPO: [Non-Fpo])</span><o:p></o:p></pre>
<pre><u><span style="color:#0066CC">03</span></u><span style="color:#1E1E1E"> 0198fcf4 00000000 0198fd08 779c0000 00000000 ntdll!LdrInitializeThunk+0x1c (FPO: [Non-Fpo])</span><o:p></o:p></pre>
</div>
<div>
<pre><span style="font-family:"Arial","sans-serif"">Whereas GDB would print something like<o:p></o:p></span></pre>
</div>
<pre>#0  m4_traceon (obs=0x24eb0, argc=1, argv=0x2b8c8)<o:p></o:p></pre>
<pre>    at builtin.c:993<o:p></o:p></pre>
<pre>#1  0x6e38 in expand_macro (sym=0x2b600) at macro.c:242<o:p></o:p></pre>
<pre>#2  0x6840 in expand_token (obs=0x0, t=177664, td=0xf7fffb08)<o:p></o:p></pre>
<pre>    at macro.c:71<o:p></o:p></pre>
<pre>(More stack frames follow...)<o:p></o:p></pre>
<pre><span style="font-family:"Arial","sans-serif"">I really don't want to get in the business of trying to convert the first format into the second format.  Not only is it a recipe for disaster, but it leads to worse diagnostics.  When my CHECK statement fails, I can't even see the original stack trace anymore, only a generic error message like "could not parse stack trace"</span><o:p></o:p></pre>
<pre><span style="font-family:"Arial","sans-serif""> </span><o:p></o:p></pre>
</div>
</div>
</div>
<div>
<div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal"><br>
> I also expect that on Windows we will end up having far more debug info<br>
> tests than other platforms, specifically because we don't have the<br>
> ability to write tests against the debugger (as it's proprietary /<br>
> closed source).<br>
<br>
I don't see how that follows. Sony runs the GDB test suite using clang as<br>
the compiler, and while that is certainly perverting a debugger test suite<br>
into being a compiler test suite, it has value in being a body of tests<br>
that exercise a variety of debug-info features.  GDB being open source is<br>
completely irrelevant to this use-case.  We treat it as closed.  We have<br>
local changes to the test suite, but not to GDB.  The expected results<br>
from the suite are based on GDB+GCC, which we treat as an oracle; then we<br>
don't bother with tests of debugger features that clearly don't depend on<br>
debug info, such as thread handling.<o:p></o:p></p>
</blockquote>
<div>
<p class="MsoNormal">GDB being open source is very relevant to this case, because it means you *have* GDB's test suite.  We don't have WinDbg or Visual Studio debugger's test suite.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal"><br>
Whatever CodeView/PDB tests you want to write, you can use MS tools as<br>
your oracle.  Maybe you can't leverage an existing test suite, but it<br>
doesn't mean you can't write tests.<o:p></o:p></p>
</blockquote>
<div>
<p class="MsoNormal">Right, it just means we will end up writing plenty of tests that test specific features of the debugger, something that would normally be handled in a debugger test suite, which we don't have.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
> I don't see a useful abstraction that glosses over these differences<br>
> that isn't a ton of work for minimal gain, given the frequency with<br>
> which we'd need to fall back to a custom test anyway.<br>
<br>
As I mentioned above, you seem to be heading in the direction of a<br>
completely separate project, rather than being able to usefully<br>
leverage anything from debuginfo-tests other than the basic idea.<br>
--paulr<o:p></o:p></p>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
<div>
<div>
<div>
<p class="MsoNormal">I don't entirely disagree with this assessment.  On the other hand, I don't see any reason to call it something other than "debuginfo-tests" or to put it somewhere else, since conceptually both things are the same.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Even in this case though, reusing the source code of the tests seems like a clear win since the high level ideas behind a test case often transcend consumer boundaries, even when the implementation doesn't.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Plus, there is more to be gained from sharing than just the tests themselves.  For example, I'm trying to get debuginfo-tests working properly with CMake in more idiomatic LLVM style.  If I go off and fork the tests into an entirely separate
 project, we wouldn't have that shared benefit. <o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>