<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><br><div><div>On Mar 31, 2014, at 1:53 AM, Kostya Serebryany <<a href="mailto:kcc@google.com">kcc@google.com</a>> wrote:</div><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>This is what I see on 483.xalancbmk:</div><div><div> 15 __llvm_prf_names 0036fcb0  00000000010abf40  00000000010abf40  00cabf40  2**5</div><div> 16 __llvm_prf_data 001b77e0  000000000141bc00  000000000141bc00  0101bc00  2**5</div>
<div> 32 __llvm_prf_cnts 00123468  0000000001af2fe0  0000000001af2fe0  014f2fe0  2**5</div></div><div><br></div><div>__llvm_prf_names is larger than the other two combined. </div><div>483.xalancbmk is C++ and the function names are long. The same is true for most of the code we care about.<br>
</div><div>Can't we use function PCs instead of function names in this table (and retrieve the function names from debug info)?</div></div></div></div></blockquote><div><br></div>That’s a bit surprising. We should check to make sure there isn’t anything obviously wrong.</div><div><br></div><div><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><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">

<br>
  - __llvm_prf_data is 32B per function, and has pointers into the<br>
    other two sections.  This section is necessary to avoid static<br>
    initialization (implemented on Darwin, not quite on ELF).<br>
<br>
  - __llvm_prf_names is the mangled name of every function.  It should<br>
    be on the same order of magnitude as __llvm_prf_data.  This<br>
    section is convenient for writing out the profile, since the names<br>
    are effectively placed in one big char array whose bounds are known<br>
    at link time.<br>
<br>
  - __llvm_prf_cnts is 8B per region counter.  Each function has one<br>
    at entry and roughly one per CFG-relevant AST node (for, if, etc.).<br>
    This section is convenient for writing out the profile, since the<br>
    counters are effectively placed in one big array whose bounds are<br>
    known at link time.  However, I don't think the data in this<br>
    section needs to be explicitly stored in the executable if we can<br>
    somehow make it act like .bss (or the like).<br></blockquote><div><br></div><div>Why can't we simply create this buffer at startup? </div><div>We solve similar task in asan, so it's definitely possible. </div></div></div></div></blockquote><br></div><div>We need this to work for environments where minimal runtime support is available (e.g., in kernel code). We used to call malloc() to create some data structures at runtime but that prevented us from using it from kernel code. I’m hoping the additional size will not be such a problem that we have to implement separate solutions for different environments.</div></body></html>