<div dir="ltr">This RFC and the patches listed below are now obsolete. I have written up the bitcode format discussed with Duncan and others, which I've copied below but the link to the doc with potentially better formatting is:<div><a href="https://drive.google.com/file/d/0B036uwnWM6RWdnBLakxmeDdOeXc/view">https://drive.google.com/file/d/0B036uwnWM6RWdnBLakxmeDdOeXc/view</a>.<div><br></div><div>Duncan, can you take a look and make sure this properly describes the format changes we discussed?<br><div><br></div><div>I just sent a patch which implements the part of the bitcode format changes that apply to the lazy function reader: <a href="http://reviews.llvm.org/D12536">http://reviews.llvm.org/D12536</a>. The current patch does not contain any of the ThinLTO specific changes, which will be sent as a follow-on patch.</div><div><div><br></div><div>I've additionally created a site that contains links to all the existing ThinLTO related RFCs and patches, which I will try to keep updated:</div><div><a href="https://sites.google.com/site/llvmthinlto">https://sites.google.com/site/llvmthinlto</a><br></div><div><br></div><div>Thanks,</div><div>Teresa</div><div><br></div></div></div><div><span id="docs-internal-guid-39038591-8a12-eb16-36a7-e16974a0269c"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:3pt"><span style="font-size:34.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">ThinLTO Bitcode Format Design</span></p><br><h1 dir="ltr" style="line-height:1.38;margin-top:20pt;margin-bottom:6pt"><span style="font-size:26.6666666666667px;font-family:Arial;color:rgb(0,0,0);font-weight:400;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Bitcode Format Changes to Support ThinLTO</span></h1><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">During importing, ThinLTO needs the following information for a potentially imported function:</span></p><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Summary information to determine import profitability (e.g. inst count, hotness, etc)</span></p></li><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Location of function IR (path to module, bitcode offset)</span></p></li><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Import source module unique identifier (for consistent renaming of promoted locals)</span><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""><br class=""></span></p></li></ul><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">ThinLTO interaction with function summary/index:</span></p><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Phase-1 compile (-c -fthinlto) produces summary info and records function bitcode offsets</span></p></li><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Phase-2 link aggregates all function summary and index information into combined index file, assigns unique module ids, records module paths and ids in combined index file</span></p></li><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Phase-3 parallel backend processes independently use combined index for function importing decisions and mechanics</span></p></li></ul><h1 dir="ltr" style="line-height:1.38;margin-top:20pt;margin-bottom:6pt"><span style="font-size:26.6666666666667px;font-family:Arial;color:rgb(0,0,0);font-weight:400;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Lazy Reader Support</span></h1><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">The existing function lazy reader builds an index of function blocks bitcode offsets on the fly while initially walking through (and skipping) function blocks. ThinLTO also needs an index of function blocks but we don’t want to pay the cost of building this on the fly each time a function is imported. The bitcode indexes of function records will therefore be added to ValueSymbolTable (VST) function records, and the existing lazy function reader will be changed to use this index rather than building it on the fly. Then ThinLTO importing can easily leverage the same infrastructure as lazy function reading.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Specifically, augment the existing lazy reader with the function bitcode index:</span></p><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Build lazy reader’s DeferredFunctionInfo map (maps from Function* to function block bitcode offset) from index rather than by parsing the function blocks, use during currently lazy reading as well as ThinLTO importing.</span></p></li><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Means that bitcode index is needed before the function blocks in the bitcode (phase-ordering issue discussed below)</span></p></li><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Include bitcode offset with ValueSymbolTable (VST) function records</span></p></li></ul><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Function offset needed in bitcode before function blocks (in order to use for lazy function reading). However, we don’t have function offsets when this part of bitcode being encoded/written. This requires some kind of backpatching. There are several approaches:</span></p><ol style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:decimal;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Backpatching a bitcode offset precludes encoding it as a VBR, since we don’t know how many chunks are required. This means any backpatched bitcode offsets must be 64-bit fixed. Doing this for every function VST record can result in high overhead.</span></p></li><li dir="ltr" style="list-style-type:decimal;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Could encode the function blocks twice, once before the VST in a temp stream to get each bitcode offset into the stream of function blocks, then again into the final location in the real output stream (or copy over the pre-encoded function blocks at the final location). This has time overhead, but allows VBRs to be used for encoding the offsets (which are offsets from the start of the function blocks, not from the start of the file).</span></p></li><li dir="ltr" style="list-style-type:decimal;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Encode the VST after the function blocks, but place a new forward declaration VST record at the point where we previously had the VST (before the function blocks). Only the one forward decl record needs to be backpatched with a 64-bit fixed offset (can likely get by with a 32-bit word offset as the real VST block should be word aligned). The reader needs to be taught to jump to and parse the real VST when seeing the forward decl VST, and to jump back after reading it.</span></p></li></ol><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Proposal #3 above (forward decl VST) is the approach that was agreed to and is being implemented. The first patch will implement this new forward decl VST, add the bitcode offsets to the real VST, and change the lazy reader to use the bitcode offsets from the VST instead of building up the DeferredFunctionInfo on the fly.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">The new VST bitcode (used by the lazy function reader even without ThinLTO) are shown below:</span></p><br><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">A.c:</span></p><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  A1() {...}</span></p><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  static A2() {...} </span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:16pt"><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">BitOffset</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  0      <MODULE_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><span class="" style="white-space:pre">       </span></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">     ...</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           // MODULE_CODE_VSTOFFSET: [wordoffset(32-bit fixed)]</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <VSTOFFSET </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">20</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">/>   </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">// 20*32 = 640</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(255,0,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">320</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">        <FUNCTION_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              ...</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </FUNCTION_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">480</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">        <FUNCTION_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              ...</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </FUNCTION_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">640</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">        <VALUE_SYMTAB></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">// VST_FNENTRY: [valueid, funcoffset(VBR), namechar x N]</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <FNENTRY 0, </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(255,0,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">10</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">, “A1”/>  </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(255,0,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">// 10*32 = 320</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <FNENTRY 1, </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">15</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">, “A2”/>  </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">// 15*32 = 480</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              ...</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </VALUE_SYMTAB></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">         </MODULE_BLOCK></span></p><br><h1 dir="ltr" style="line-height:1.38;margin-top:20pt;margin-bottom:6pt"><span style="font-size:26.6666666666667px;font-family:Arial;color:rgb(0,0,0);font-weight:400;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">ThinLTO-Specific Bitcode Changes</span></h1><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">In addition to the VST changes above, for ThinLTO importing additional bitcode blocks are needed. These will initially only be generated under -fthinlto, unless other use cases are identified. The bitcode changes are summarized below.</span></p><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt"><span style="font-size:18.6666666666667px;font-family:Arial;color:rgb(67,67,67);font-weight:400;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Per-Module Bitcode</span></h3><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">This pertains to bitcode generated by the phase-1 compile step (-fthinlto -c). It includes one new block that holds summary information for the functions in that module, summarized below:</span></p><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Function summary info encoded in new FUNCTION_SUMMARY_BLOCK.</span></p></li><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:circle;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">One record per function with summary data containing: VST value id, islocal flag for phase-2 renaming decisions, summary info for importing decisions (e.g. instruction count). The summary information will evolve over time.</span></p></li></ul></ul><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Note that the summary block is only used to create the combined index in phase 2. It is not used when compiling that module through the phase 3 backend. The earlier example is expanded with the function summary block below:</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:16pt"><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">BitOffset</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  0     <MODULE_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><span class="" style="white-space:pre">   </span></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">     ...</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           // MODULE_CODE_VSTOFFSET: [wordoffset(32-bit fixed)]</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <VSTOFFSET </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">20</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">/>   </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">// 20*32 = 640</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(255,0,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">320</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">        <FUNCTION_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              ...</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </FUNCTION_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">480</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">        <FUNCTION_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              ...</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </FUNCTION_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">640</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">        <VALUE_SYMTAB></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              // VST_FNENTRY: [valueid, funcoffset(VBR), namechar x N]</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <FNENTRY 0, </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(255,0,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">10</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">, “A1”/>  </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(255,0,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">// 10*32 = 320</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <FNENTRY 1, </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">15</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">, “A2”/>  </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">// 15*32 = 480</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              ...</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </VALUE_SYMTAB></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <FUNCTION_SUMMARY_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              // FS_ENTRY: [valueid, islocal, instcount]</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">   </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <ENTRY 0, 0, 10/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(255,153,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">   </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <ENTRY 1, 1, 15/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </FUNCTION_SUMMARY_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">         </MODULE_BLOCK></span></p><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt"><span style="font-size:18.6666666666667px;font-family:Arial;color:rgb(67,67,67);font-weight:400;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Combined Index File Bitcode</span></h3><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">This pertains to the combined index file generated by the phase-2 link step, which is encoded as bitcode. This file contains a single MODULE_BLOCK with only 3 subblocks: the VST, a module path strtab, and a function summary block. Also note that the VST only contains entries for functions, and the record type used in the combined index is changed to include the VBR-encoded bitcode offset of the corresponding summary record in the summary block. This is to allow lazy reading of summary records from the combined index file during importing. That replaces the bitcode offset of the function summary block which is not needed in the combined index (it is obtained from the importee module’s VST when importing from that module).</span></p><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Module paths encoded in new MODULE_STRTAB_BLOCK.</span></p></li><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:circle;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">One record per module containing: unique module id assigned during phase-2 link and module path string</span></p></li></ul><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Function summary info encoded in new FUNCTION_SUMMARY_BLOCK.</span></p></li><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:circle;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">One record per function containing: VST value id, module id, summary info for importing decisions</span></p></li></ul><li dir="ltr" style="list-style-type:disc;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">VST:</span></p></li><ul style="margin-top:0pt;margin-bottom:0pt"><li dir="ltr" style="list-style-type:circle;font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;background-color:transparent"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">One record per function containing: value id, function summary offset, function name string</span></p></li></ul></ul><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Note that a VST forward decl record is not needed in the combined index, as the VST can be connected to the summary records later via the value ids (eager parsing of summary) or via the summary record offsets (lazy parsing of summary). When reading the summary eagerly, we just need to build a temporary map from value id to summary structure.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"> </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">BitOffset</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">  0     <MODULE_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <MODULE_STRTAB_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              // MST_ENTRY: [modid, namechar x N]</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <ENTRY 1, “A.o”/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <ENTRY 2, “B.o”/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </MODULE_STRTAB_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <FUNCTION_SUMMARY_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              // FS_ENTRY: [valueid, modid, islocal, instcount]</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">500</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <ENTRY 0, 2, 0, 100/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">550</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <ENTRY 1, 2, 0, 20/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">600</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <ENTRY 2, 1, 0, 10/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(255,0,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">650</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <ENTRY 3, 1, 1, 15/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </FUNCTION_SUMMARY_BLOCK></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           <VALUE_SYMTAB></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              // VST_FNENTRY: [valueid, funcsumoffset, namechar x N]</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <FNENTRY 2, </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">600</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">, “A1”/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <FNENTRY 3, </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(255,0,0);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">650</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">, “A2”/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <FNENTRY 0, </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,0,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">500</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">, “B2”/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              <FNENTRY 1, </span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(0,255,255);font-weight:700;vertical-align:baseline;white-space:pre-wrap;background-color:transparent">550</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">, “B2”/></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">              ...</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">           </VALUE_SYMTAB</span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br class=""></span><span style="font-size:13.3333333333333px;font-family:'Courier New';color:rgb(89,89,89);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">        </MODULE_BLOCK></span></p><br><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">Note that the value ids are reassigned here to be unique as they are no longer correlated with uses outside of the function summary records. They are not strictly necessary for correlating VST entries with function summary entries, but enable some sanity checking.</span></span><br></div><div><span><span style="font-size:14.6666666666667px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br></span></span></div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 13, 2015 at 7:49 AM, Teresa Johnson <span dir="ltr"><<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi all,<div><br></div><div>I updated the patches to remove the native object wrapper format. As suggested we will work on getting the ThinLTO framework in place using bitcode first, and then work on adding the native object support. As noted in this RFC and in the associated patch D11722, for now I have empty ThinLTO blocks with no records, since I wanted to get feedback on the overall block design first. The RFC discusses this in more detail, but one of the main ideas is to leverage the existing value symbol table block in the module to avoid duplicating function symbol strings, e.g.</div><div><br></div><div>I also wanted to call out another important design consideration here, since it is buried in the other RFC (ThinLTO File API and Data Structures), and has a big influence on the way I have designed the ThinLTO index and object file data structures. The ThinLTO index is read in compile/link steps when the rest of the Module IR is not, and vice versa. That is why I have separate data structures for reading/holding the ThinLTO index. The ThinLTO index in the module (generated during the initial -c compile step) is needed by other modules during the later parallel backend compile phase, and therefore it is only used in the linker plugin step to create the combined index file. The rest of the Module IR is not read during this step (eventually we may look at adding heavier weight whole program analysis under an option, but by default the Module, Functions, etc are not read or materialized). When the normal Module IR is read during the parallel backend compile step, the ThinLTO information in its own module is not read, as the importing pass will read the combined (global) index file instead. This is because a module is only interested in the ThinLTO index from other modules that it is considering importing from.</div><div><br></div><div>Right now I have 5 outstanding patches to put in the basic infrastructure/options for reading/writing the ThinLTO function indices:</div><div><br></div><div><span style="color:rgb(75,77,81);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap">D11721</span><span style="color:rgb(0,0,0);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap"> </span><a href="http://reviews.llvm.org/D11721" title="[ThinLTO] Data structures for holding ThinLTO function index/summary" style="text-decoration:none;color:rgb(24,85,157);display:inline;font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap" target="_blank">[ThinLTO] Data structures for holding ThinLTO function index/summary</a><br></div><div><span style="color:rgb(75,77,81);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap">D11722</span><span style="color:rgb(0,0,0);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap"> </span><a href="http://reviews.llvm.org/D11722" title="[ThinLTO] Bitcode reading/writing support for ThinLTO function summary/index" style="text-decoration:none;color:rgb(24,85,157);display:inline;font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap" target="_blank">[ThinLTO] Bitcode reading/writing support for ThinLTO function summary/index</a><br></div><div><span style="color:rgb(75,77,81);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap">D11723</span><span style="color:rgb(0,0,0);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap"> </span><a href="http://reviews.llvm.org/D11723" title="[ThinLTO] ThinLTO object file interfaces" style="color:rgb(24,85,157);display:inline;font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap" target="_blank">[ThinLTO] ThinLTO object file interfaces</a><br></div><div><span style="color:rgb(75,77,81);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap">D11907</span><span style="color:rgb(0,0,0);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap"> </span><a href="http://reviews.llvm.org/D11907" title="LLVM support for -fthinlto option." style="text-decoration:none;color:rgb(24,85,157);display:inline;font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap" target="_blank">LLVM support for -fthinlto option.</a><br></div><div><span style="color:rgb(75,77,81);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap">D11908</span><span style="color:rgb(0,0,0);font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap"> </span><a href="http://reviews.llvm.org/D11908" title="Clang support for -fthinlto." style="text-decoration:none;color:rgb(24,85,157);display:inline;font-family:'Segoe UI','Segoe UI Web Regular','Segoe UI Symbol','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;font-weight:bold;line-height:16.0029983520508px;white-space:nowrap" target="_blank">Clang support for -fthinlto.</a><br></div><div><br></div><div>Once the basic options support, data structs, and bitcode support goes in I can send patches for generating/emitting the function index and the combined function index (off by defaut, guarded by the -fthinlto option), and subsequently send patches for the function importing during the backend compile step. I've tried to break down the above infrastructure into small pieces for review, and plan to implement the rest via incremental patches.</div><div><br></div><div>Hope this clarifies the approach I'm taking! Looking forward to additional feedback on the approach and the patches.</div><div><br></div><div>Thanks,</div><div>Teresa</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 12, 2015 at 2:09 PM, Teresa Johnson <span dir="ltr"><<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Saw that, thanks! Responding now. Will update the patch with some changes and the wrapper stuff removed later today or very early tomorrow.<span><font color="#888888"><div>Teresa</div></font></span></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 12, 2015 at 2:07 PM, Philip Reames <span dir="ltr"><<a href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>I went ahead and replied to two of the
      review threads.  I only considered the parts which would be left
      without the native wrapped bitcode support.  <br><span><font color="#888888">
      <br>
      Philip</font></span><div><div><br>
      <br>
      On 08/12/2015 01:24 PM, Teresa Johnson wrote:<br>
    </div></div></div><div><div>
    <blockquote type="cite">
      <div dir="ltr">I can remove the native wrapper portions of the
        associated patch and add that later. Most of the support as I
        mentioned is for the bitcode handling anyway, but I wanted to
        include a skeleton of the native wrapper part. For the RFC, I
        wanted to show the end goal including how the native wrapper
        support would look (it in fact mostly leverages the same bitcode
        encoding, so there isn't a lot of difference, and hence there
        isn't a whole lot of extra code needed to support that). The
        bulk of the RFC deals with the bitcode format, and I would love
        some feedback on that.
        <div><br>
        </div>
        <div>Thanks,</div>
        <div>Teresa<br>
          <div class="gmail_extra"><br>
            <div class="gmail_quote">On Wed, Aug 12, 2015 at 11:50 AM,
              Philip Reames <span dir="ltr"><<a href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span>
              wrote:<br>
              <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                <div bgcolor="#FFFFFF" text="#000000">
                  <div>Alex already made what I consider to be the most
                    relevant point.  I would suggest removing the
                    unwanted functionality and asking again.  From my
                    perspective, native wrapped bitcode is only
                    interesting (and thus worth reviewing and/or talking
                    about) once the native bitcode version is in tree
                    and functional.  Frankly, I consider the native
                    wrapped bitcode to be an entirely orthogonal
                    proposal that shouldn't be tied to ThinLTO at all.  
                    <br>
                    <br>
                    Fair warning, I'm not going to be particularly
                    involved either way.  This is far enough from my own
                    immediate interests that I can't spare the cycles. 
                    I would suggest that you collaborate closely with
                    the Sony and Apple folks who are already *using* LTO
                    to find a proposal they're happy with.  Until you do
                    that, you are unlikely to make much progress.  <br>
                    <span><font color="#888888"> <br>
                        Philip</font></span>
                    <div>
                      <div><br>
                        <br>
                        On 08/12/2015 09:13 AM, Teresa Johnson wrote:<br>
                      </div>
                    </div>
                  </div>
                  <div>
                    <div>
                      <blockquote type="cite">
                        <div dir="ltr">
                          <div>Ping. Explicitly adding a few more people
                            who commented on the earlier (high-level)
                            ThinLTO RFC. I removed the body of the RFC
                            here since the original was large and had
                            trouble getting through the mailer. I also
                            updated the patch mentioned below so that it
                            was emailed to llvm-commits properly.<br>
                          </div>
                          <div><br>
                          </div>
                          <div>Thanks,</div>
                          <div>Teresa</div>
                          <div class="gmail_extra"><br>
                            <div class="gmail_quote">On Mon, Aug 3, 2015
                              at 11:59 AM, Teresa Johnson <span dir="ltr"><<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>></span>
                              wrote:<br>
                              <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                                <div dir="ltr">Hi Alex,
                                  <div><br>
                                  </div>
                                  <div>After outlining some of the
                                    rationale for using native-wrapped,
                                    there were a couple of responses
                                    that indicated native-wrapped
                                    support was reasonable, but they
                                    preferred to see bitcode-only first
                                    (Phillip and Rafael). This is
                                    essentially what this proposal and
                                    the patches do - I've implemented
                                    some of the basic support for
                                    looking for and parsing the
                                    native-wrapped sections, but the
                                    bitcode-only reading/writing support
                                    is more complete.</div>
                                  <div><br>
                                  </div>
                                  <div>In fact, as described in this
                                    RFC, I designed the native-wrapped
                                    format to utilize the same bitcode
                                    encoding for most of the ThinLTO
                                    information, so it uses most of the
                                    same underlying bitcode interfaces
                                    anyway. The additional support
                                    required for native-wrapped is not
                                    tremendous, and is similar to
                                    existing support in the LLVM tree
                                    for reading native-wrapped bitcode.</div>
                                  <div><br>
                                  </div>
                                  <div>We believe that there will be
                                    clang/llvm users who will find
                                    native-wrapped ThinLTO easier to use
                                    for the same reasons (e.g.
                                    compatibility with existing native
                                    toolchains), so I don't expect this
                                    to be Google specific.</div>
                                  <div><br>
                                  </div>
                                  <div>Thanks,</div>
                                  <div>Teresa</div>
                                </div>
                                <div>
                                  <div>
                                    <div class="gmail_extra"><br>
                                      <div class="gmail_quote">On Mon,
                                        Aug 3, 2015 at 12:26 PM, Alex
                                        Rosenberg <span dir="ltr"><<a href="mailto:alexr@leftfield.org" target="_blank">alexr@leftfield.org</a>></span>
                                        wrote:<br>
                                        <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                                          <div dir="auto">
                                            <div>I think I've read all
                                              the feedback posted
                                              regarding your May
                                              proposal. I have yet to
                                              see a single response that
                                              wants native object
                                              wrapped bitcode.</div>
                                            <div><br>
                                            </div>
                                            <div>If the only use for
                                              native object wrapped
                                              bitcode is for your
                                              project at Google, then it
                                              probably shouldn't go into
                                              the tree against all of
                                              these objections.<br>
                                              <br>
                                              Alex</div>
                                            <div>
                                              <div><br>
                                                On Aug 3, 2015, at 9:19
                                                AM, Teresa Johnson <<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>>

                                                wrote:<br>
                                                <br>
                                              </div>
                                              <blockquote type="cite">
                                                <div dir="ltr">As
                                                  discussed in the
                                                  high-level ThinLTO
                                                  RFC <span style="font-size:12.8000001907349px">(</span><a href="http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-May/086211.html" style="font-size:12.8000001907349px" target="_blank">http://lists.cs.uiuc.edu/pipermail/llvmdev/2015-May/086211.html</a><span style="font-size:12.8000001907349px">), we would like to add support for
                                                    native object
                                                    wrapped bitcode and
                                                    ThinLTO information.
                                                    Based on comments on
                                                    the mailing list, I
                                                    am adding support
                                                    for ThinLTO in both
                                                    normal bitcode
                                                    files, as well as
                                                    native-object
                                                    wrapped bitcode.</span>
                                                  <div><span style="font-size:12.8000001907349px"><br>
                                                    </span></div>
                                                  <div><span style="font-size:12.8000001907349px">The

                                                      following RFC
                                                      describes the
                                                      planned file
                                                      format of ThinLTO
                                                      information both
                                                      in the
                                                      bitcode-only and
                                                      native object
                                                      wrapped cases. It
                                                      doesn't yet define
                                                      the exact record
                                                      format, as I would
                                                      like feedback on
                                                      the overall block
                                                      design first.</span></div>
                                                  <div><span style="font-size:12.8000001907349px"><br>
                                                    </span></div>
                                                  <div><span style="font-size:12.8000001907349px">I've

                                                      also implemented
                                                      the support for
                                                      reading and
                                                      writing the
                                                      bitcode blocks in
                                                      the following
                                                      patch:</span></div>
                                                  <div><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D11722&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=oUy_PB_mSfRgDO7H7bZOR04gv_DMzX5rPO_lv4PHt60&s=WVxrKkHnjKr75fCQ-UkGke8dk6KpZcFCnLWVrJ3G188&e=" rel="noreferrer" style="font-size:12.8000001907349px" target="_blank">http://reviews.llvm.org/D11722</a></div>
                                                  <div><br>
                                                  </div>
                                                  <div>The ThinLTO data
                                                    structures and the
                                                    file APIs are
                                                    described in a
                                                    separate RFC I will
                                                    be sending
                                                    simultaneously, with
                                                    pointers to the
                                                    patches implementing
                                                    them.</div>
                                                  <div><br>
                                                  </div>
                                                  <div>Looking forward
                                                    to your feedback.
                                                    Thanks!</div>
                                                  <div>Teresa</div>
                                                  <div><br>
                                                  </div>
                                                  <div><span>
                                                      <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-align:center"><br>
                                                      </p>
                                                    </span></div>
                                                </div>
                                              </blockquote>
                                            </div>
                                          </div>
                                        </blockquote>
                                      </div>
                                    </div>
                                  </div>
                                </div>
                              </blockquote>
                            </div>
                            <br clear="all">
                            <div><br>
                            </div>
                            -- <br>
                            <div><span style="font-family:Times;font-size:medium">
                                <table cellpadding="0" cellspacing="0">
                                  <tbody>
                                    <tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small">
                                      <td style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px" nowrap>Teresa Johnson |</td>
                                      <td style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px" nowrap> Software
                                        Engineer |</td>
                                      <td style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px" nowrap> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td>
                                      <td style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px" nowrap> <a href="tel:408-460-2413" value="+14084602413" target="_blank">408-460-2413</a></td>
                                    </tr>
                                  </tbody>
                                </table>
                              </span></div>
                          </div>
                        </div>
                      </blockquote>
                      <br>
                    </div>
                  </div>
                </div>
              </blockquote>
            </div>
            <br>
            <br clear="all">
            <div><br>
            </div>
            -- <br>
            <div><span style="font-family:Times;font-size:medium">
                <table cellpadding="0" cellspacing="0">
                  <tbody>
                    <tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small">
                      <td style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px" nowrap>Teresa Johnson |</td>
                      <td style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px" nowrap> Software Engineer |</td>
                      <td style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px" nowrap> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td>
                      <td style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px" nowrap> <a href="tel:408-460-2413" value="+14084602413" target="_blank">408-460-2413</a></td>
                    </tr>
                  </tbody>
                </table>
              </span></div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
  </div></div></div>

</blockquote></div><br><br clear="all"><div><br></div>-- <br><div><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px">Teresa Johnson |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Software Engineer |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"> <a href="tel:408-460-2413" value="+14084602413" target="_blank">408-460-2413</a></td></tr></tbody></table></span></div>
</div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px">Teresa Johnson |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Software Engineer |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"> <a href="tel:408-460-2413" value="+14084602413" target="_blank">408-460-2413</a></td></tr></tbody></table></span></div>
</div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px">Teresa Johnson |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Software Engineer |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"> 408-460-2413</td></tr></tbody></table></span></div>
</div>