<div dir="ltr">Hey Ben,<div><br></div><div>Thank you for your comments. I've put my response inline.</div><div><br></div><div>Cheers,</div><div>TB</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 17, 2016 at 6:29 AM, Craig, Ben via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><span>
On 6/16/2016 2:48 PM, Mehdi Amini via llvm-dev wrote:<br>
</span><blockquote type="cite">
<br>
<div>
<blockquote type="cite"><span>
<div>On Jun 16, 2016, at 9:01 AM, TB Schardl via
llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>
wrote:</div>
<span></span>
</span><span><div>
<div dir="ltr"><span><br>
<div style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6667px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">The CSI framework inserts instrumentation hooks at salient locations throughout the compiled code of a program-under-test, such as function entry and exit points, basic-block entry and exit points, before and after each memory operation, etc. Tool writers can instrument a program-under-test simply by first writing a library that defines the semantics of relevant hooks</span></div>
<div style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6667px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">and then statically linking their compiled library with the program-under-test.</span></div>
<br>
<div style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6667px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">At first glance, this brute-force method of inserting hooks at every salient location in the program-under-test seems to be replete with overheads. CSI overcomes these overheads through the use of link-time-optimization (LTO), which is now readily available in most major compilers, including GCC and LLVM. Using LTO, instrumentation hooks that are not used by a particular tool can be elided, allowing the overheads of these hooks to be avoided when the</span></div>
</span></div>
</div>
</span></blockquote><span>
<div><br>
</div>
<div>I don't understand this flow: the front-end emits all the
possible instrumentation but the useless calls to the runtime
will be removed during the link?</div>
<div>It means that the final binary is specialized for a given
tool right? What is the advantage of generating this useless
instrumentation in the first place then? I'm missing a piece
here...</div>
<br>
</span></div>
</blockquote>
Suppose I want to build a production build, and one build for each
of ASAN, MSAN, UBSAN, and TSAN.<br>
<br>
With the current approach, I need to compile my source five
different times, and link five different times.<br>
<br>
With the CSI approach (assuming it was the backing technology behind
the sanitizers), I need to compile twice (once for production, once
for instrumentation), then LTO-link five times. I can reuse my .o
files across the sanitizer types.<br></div></blockquote><div><br></div><div>This reduction in the number of compile operations needed, and in the number intermediate object/bitcode files produced, is indeed an advantage of the CSI approach. </div><div><br></div><div>As an aside, we've been experimenting with linking CSI-instrumented bitcodes against the "null tool," which implements every instrumentation hook as a nop, and comparing the performance of those binaries against production binaries. Our preliminary tests have shown some promising results. For generating main executables, using LTO to link CSI-instrumented bitcodes with the null tool produces executables that are as fast as the production executables. For generating dynamic libraries, however, using LTO to link the CSI-instrumented bitcode of a dynamic library with the null tool seems to produce a binary that is slower than production. (The Apache HTTP server benchmark we've tried runs roughly 30% slower when using such null-tool-instrumented dynamic libraries.) These results suggest that using LTO to link CSI-instrumented bitcodes with the null tool is almost, but not quite, able to produce binaries with production performance, which would allow tool users to only compile their sources once.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000">
<br>
It's possible that the math doesn't really work out in practice if
the cost of the LTO-link dwarfs the compile times.<span><font color="#888888"><br>
<pre 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>
</font></span></div>
<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div></div>