<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 19, 2017 at 7:36 PM, Vedant Kumar <span dir="ltr"><<a href="mailto:vsk@apple.com" target="_blank">vsk@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span class=""><blockquote type="cite"><div>On Jun 19, 2017, at 7:29 PM, Vedant Kumar <<a href="mailto:vsk@apple.com" target="_blank">vsk@apple.com</a>> wrote:</div><br class="m_-797942483301224589Apple-interchange-newline"><div><div style="word-wrap:break-word"><br><div><blockquote type="cite"><div>On Jun 19, 2017, at 4:32 PM, Friedman, Eli <<a href="mailto:efriedma@codeaurora.org" target="_blank">efriedma@codeaurora.org</a>> wrote:</div><br class="m_-797942483301224589Apple-interchange-newline"><div>
  
    
  
  <div text="#000000" bgcolor="#FFFFFF">
    <div class="m_-797942483301224589moz-cite-prefix">On 6/18/2017 3:51 PM, Vedant Kumar
      wrote:<br>
    </div>
    <blockquote type="cite">
      <div>
        <div>
          <blockquote type="cite">
            <div>
              <div>My experience:<br>
                <br>
                1. You have to specify -DLLVM_USE_LINKER=gold (or maybe
                lld works; I didn't try).  If you link with binutils ld,
                the program will generate broken profile information.
                 Apparently, the linked binary is missing the
                __llvm_prf_names section.  This took me half a day to
                figure out.  This issue isn't documented anywhere, and
                the only error message I got was "Assertion
                `!Key.empty()' failed." from llvm-cov.</div>
            </div>
          </blockquote>
          <div><br>
          </div>
          <div>I expect llvm-cov to print out "Failed to load coverage:
            <reason>" in this situation. There was some work done
            to tighten up error reporting in ProfileData and its clients
            in r270020. If your host toolchain does have these changes,
            please file a bug, and I'll have it fixed.</div>
        </div>
      </div>
    </blockquote>
    <br>
    Host toolchain is trunk clang... but using system binutils (which is
    2.24 on my Ubuntu 14.04 system... and apparently that's too old per
    David Li's response).  Anyway, filed
    <a class="m_-797942483301224589moz-txt-link-freetext" href="https://bugs.llvm.org/show_bug.cgi?id=33517" target="_blank">https://bugs.llvm.org/show_<wbr>bug.cgi?id=33517</a> .<br></div></div></blockquote><div><br></div><div>I've updated the clang docs re: 'Source based code coverage' to reflect this issue. I've also tightened up our error reporting a bit so we fail earlier with something better than an assertion message (r<span>305765, </span>r305767).</div><br><blockquote type="cite"><div><div text="#000000" bgcolor="#FFFFFF"><blockquote type="cite"><div><div>
          <blockquote type="cite">
            <div>
              <div>2. The generated binaries are big and slow.
                 Comparing to a build without coverage, llc becomes 8x
                larger overall (text section becomes roughly 2x larger).
                 And check-llvm-codegen-arm goes from 3 seconds to 250
                seconds.<br>
              </div>
            </div>
          </blockquote>
          <div><br>
          </div>
          <div>The binary size increase comes from coverage mapping
            data, counter increment instrumentation, and profiling
            metadata.</div>
          <div><br>
          </div>
          <div>The coverage mapping section is highly compressible, but
            exploiting the compressibility has proven to be tricky. I
            filed: <a href="http://llvm.org/PR33499" target="_blank">llvm.org/PR33499</a>.</div>
        </div>
      </div>
    </blockquote>
    <br>
    If I'm cross-compiling for a target where the space matters, can I
    rid of the data for the copy on the device using "strip -R
    __llvm_covmap" or something like that, then use llvm-cov on the
    original?<br></div></div></blockquote><div><br></div><div>I haven't tried this but I expect it to work. Instrumented programs don't reference the __llvm_covmap section.</div><div><br></div></div></div></div></blockquote></span></div></div></blockquote><div><br></div><div><br></div><div>Right. The user can also use objcopy -only-section=__llvm_covmap <in> <out> to copy the covmap section into a smaller file, and feed that later to the coverage tool.</div><div><br></div><div>David</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><span class=""><blockquote type="cite"><div><div style="word-wrap:break-word"><div><div></div><blockquote type="cite"><div><div text="#000000" bgcolor="#FFFFFF">
    
    <blockquote type="cite">
      <div>
        <div>
          <div>Coverage makes use of frontend-based instrumentation,
            which is much less efficient than the IR-based kind. If we
            can find a way to map counters inserted by IR PGO to AST
            nodes, we could improve the situation. I filed: <a href="http://llvm.org/PR33500" target="_blank">llvm.org/PR33500</a>.</div>
        </div>
      </div>
    </blockquote>
    <br>
    This would be nice... but I assume it's hard. :)<br></div></div></blockquote><div><br></div><div>It seems like it is. At a high level, you'd need some way to associate the counters placed by IR PGO instrumentation to the counters that clang expects to see while walking an AST. I don't have a concrete design for this in mind.</div><br><blockquote type="cite"><div><div text="#000000" bgcolor="#FFFFFF"><blockquote type="cite"><div><div>
          <div>We can reduce testing time by *not* instrumented basic
            tools like count, not, FileCheck etc. I filed: <a href="http://llvm.org/PR33501" target="_blank">llvm.org/PR33501</a>.</div>
          <div><br>
          </div>
          <blockquote type="cite">
            <div>
              <div>3. The generated profile information takes
                up a lot of space: llc generates a 90MB profraw file.<br>
              </div>
            </div>
          </blockquote>
          <div><br>
          </div>
          <div>I don't have any ideas about how to fix this. You can
            decrease the space overhead for raw profiles by altering <span>LLVM_PROFILE_</span><span>MERGE_P</span><span>O<wbr>OL_SIZE from 4 to a lower value.</span></div>
        </div>
      </div>
    </blockquote>
    <br>
    Disk space is cheap, but the I/O takes a long time.  I guess it's
    specifically bad for LLVM's "make check", maybe not so bad for other
    cases.<br></div></div></blockquote><div><br></div><div>You can speed up "make check" a bit by using non-instrumented versions of count, not, FileCheck, etc.</div></div></div></div></blockquote><div><br></div></span>Ah, sorry for mentioning this twice.</div><div><br></div><div>On another note, I'm looking into the "N mismatched functions" warnings issue, and suspect that it happens when there are conflicting definitions of the same function in different binaries. The issue doesn't seem to occur when using profiles from just one binary to generate a report for that binary. I'll dig into this a bit more and update PR33502.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>vedant</div></font></span><span class=""><div><br><blockquote type="cite"><div><div style="word-wrap:break-word"><div><div><br></div><div>vedant</div><br><blockquote type="cite"><div><div text="#000000" bgcolor="#FFFFFF">
    
    <blockquote type="cite">
      <div>
        <div>
          <blockquote type="cite">
            <div>
              <div>4. When prepare-code-coverage-<wbr>artifact.py
                invokes llvm-profdata for the profiles generated by
                "make check", it takes 50GB of memory to process about
                1.5GB of profiles.  Is it supposed to use that much?<br>
              </div>
            </div>
          </blockquote>
          <div><br>
          </div>
          <div>By default, llvm-profdata uses <span>hardware_concurrency()
              to determine the number of threads to use to merge
              profiles. You can change the default by passing
              -j/--num-threads to llvm-profdata. I'm open to changing
              the 'prep' script to use -j4 or something like that.</span></div>
          <br>
        </div>
      </div>
    </blockquote>
    <br>
    Oh, so it's using a couple gigabytes per thread multiplied by 24
    cores?  Okay, now I'm not so worried. :)<br><p>-Eli<br>
    </p>
    <pre class="m_-797942483301224589moz-signature" cols="72">-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project</pre>
  </div>

</div></blockquote></div><br></div></div></blockquote></div><br></span></div></blockquote></div><br></div></div>