<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"MS Gothic";
        panose-1:2 11 6 9 7 2 5 8 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"\@MS Gothic";
        panose-1:2 11 6 9 7 2 5 8 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">It should be possible to dynamically load legacy pass manager plugins into lld on trunk.  Pass “-mllvm=-load=plugin.so” to lld (“-fuse-ld=lld -Wl,-mllvm=-load=plugin.so” to clang) for a plugin with an appropriate RegisterStandardPasses,
 and it should be called.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Dynamically loading pass plugins into gold is still in progress. (See
<a href="https://reviews.llvm.org/D77704" target="_blank">https://reviews.llvm.org/D77704</a>.)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">It’s also possible to statically link both legacy pass manager and new pass manager LTO pass plugins into LLVM; that should work for both gold and lld without any command-line flags at runtime.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">llvm/examples/Bye/ is a very simple pass plugin which supports running during LTO; it should serve as a reasonable template if you’re having trouble getting started.  It support both the legacy pass manager and the new pass manager; new
 pass manager isn’t enabled by default, so you can ignore the getByePluginInfo() etc. if you’re not interested in that.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">There’s a little documentation for pass plugins at <a href="http://llvm.org/docs/WritingAnLLVMPass.html#building-pass-plugins">
http://llvm.org/docs/WritingAnLLVMPass.html#building-pass-plugins</a> ; the documentation could probably use some work.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Note that all of this is only working on trunk; 10.0 doesn’t have the changes in question.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Eli<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-left:.5in"><b>From:</b> Teresa Johnson <tejohnson@google.com>
<br>
<b>Sent:</b> Thursday, April 23, 2020 10:16 AM<br>
<b>To:</b> y liu <ly820nha@gmail.com>; Eli Friedman <efriedma@quicinc.com><br>
<b>Cc:</b> llvm-dev <llvm-dev@lists.llvm.org><br>
<b>Subject:</b> [EXT] Re: [llvm-dev] how to add my own passes to LTO pass<o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-left:.5in">cc-ed llvm-dev back so others can hopefully help. I don't load passes via plugins so this is outside my area of expertise. But I have seen some recent patches fly by that are working on this.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<p class="MsoNormal" style="margin-left:.5in">I saw from an earlier question you posted that you are using gold. There is a patch under development/review to get pass plugins to work for LTO through gold. See <a href="https://reviews.llvm.org/D77704" target="_blank">https://reviews.llvm.org/D77704</a>.<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Eli (added) was working on adding support as well, here are a couple of patches he recently landed for this in LTO and lld:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><a href="https://reviews.llvm.org/D75879" target="_blank">https://reviews.llvm.org/D75879</a> (lld)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><a href="https://reviews.llvm.org/D76866">https://reviews.llvm.org/D76866</a> (LTO)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">I'm not completely sure what the status is at this point though. Eli is probably the best person to answer.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Teresa<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-left:.5in">On Wed, Apr 22, 2020 at 7:50 PM y liu <<a href="mailto:ly820nha@gmail.com">ly820nha@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal" style="margin-left:.5in">I‘m using LLVM 10, and register my pass by following code:<o:p></o:p></p>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal" style="margin-left:.5in;line-height:18.0pt;background:#1E1E1E">
<span style="font-size:13.5pt;font-family:Consolas;color:#569CD6">char</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"> </span><span style="font-size:13.5pt;font-family:Consolas;color:#4EC9B0">MyModulePass</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">::ID = </span><span style="font-size:13.5pt;font-family:Consolas;color:#B5CEA8">0</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">;<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in;line-height:18.0pt;background:#1E1E1E">
<span style="font-size:13.5pt;font-family:Consolas;color:#569CD6">static</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"> </span><span style="font-size:13.5pt;font-family:Consolas;color:#4EC9B0">RegisterPass</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"><</span><span style="font-size:13.5pt;font-family:Consolas;color:#4EC9B0">MyModulePass</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">> </span><span style="font-size:13.5pt;font-family:Consolas;color:#DCDCAA">X</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:13.5pt;font-family:Consolas;color:#CE9178">"MyModule"</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:13.5pt;font-family:Consolas;color:#CE9178">"MyModule pass"</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">);<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in;line-height:18.0pt;background:#1E1E1E">
<span style="font-size:13.5pt;font-family:Consolas;color:#569CD6">static</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"> </span><span style="font-size:13.5pt;font-family:Consolas;color:#569CD6">void</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"> </span><span style="font-size:13.5pt;font-family:Consolas;color:#DCDCAA">registerMyModulePass</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:13.5pt;font-family:Consolas;color:#569CD6">const</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"> </span><span style="font-size:13.5pt;font-family:Consolas;color:#4EC9B0">PassManagerBuilder</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"> </span><span style="font-size:13.5pt;font-family:Consolas;color:#569CD6">&</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">,<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in;line-height:18.0pt;background:#1E1E1E">
<span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">                         </span><span style="font-size:13.5pt;font-family:Consolas;color:#4EC9B0">legacy</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">::</span><span style="font-size:13.5pt;font-family:Consolas;color:#4EC9B0">PassManagerBase</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"> </span><span style="font-size:13.5pt;font-family:Consolas;color:#569CD6">&</span><span style="font-size:13.5pt;font-family:Consolas;color:#9CDCFE">PM</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">) {<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in;line-height:18.0pt;background:#1E1E1E">
<span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">  </span><span style="font-size:13.5pt;font-family:Consolas;color:#9CDCFE">PM</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">.</span><span style="font-size:13.5pt;font-family:Consolas;color:#DCDCAA">add</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:13.5pt;font-family:Consolas;color:#C586C0">new</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"> </span><span style="font-size:13.5pt;font-family:Consolas;color:#DCDCAA">MyModulePass</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">());<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in;line-height:18.0pt;background:#1E1E1E">
<span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">}<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in;line-height:18.0pt;background:#1E1E1E">
<span style="font-size:13.5pt;font-family:Consolas;color:#569CD6">static</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4"> RegisterStandardPasses<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in;line-height:18.0pt;background:#1E1E1E">
<span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">  </span><span style="font-size:13.5pt;font-family:Consolas;color:#DCDCAA">RegisterMyPass</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:13.5pt;font-family:Consolas;color:#4EC9B0">PassManagerBuilder</span><span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">::EP_FullLinkTimeOptimizationLast,<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in;line-height:18.0pt;background:#1E1E1E">
<span style="font-size:13.5pt;font-family:Consolas;color:#D4D4D4">                 registerMyModulePass);<o:p></o:p></span></p>
</div>
</div>
</div>
</div>
<div>
<div>
<div>
<p class="MsoNormal" style="margin-left:.5in">MyModulePass reles on helper.c.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">I want to use it for optimization after the link is compelte.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Now, I compile it manually with opt.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">For example:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Target: fun1.c fun2.c fun3.c main.c<br>
Pass: Mypass.so<br>
Dependency: helper.c<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><br>
fun1.c fun2.c fun3.c main.c ---> target.bc<br>
                   helper.c ---> helper.o<br>
<br>
target.bc helper.o ---> target-link.bc ----> opt Mypass.so  ---> target-opt.bc ---> target<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">I want to achieve my goals by LTO.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Teresa Johnson <<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>><span style="font-family:"MS Gothic"">于</span>2020<span style="font-family:"MS Gothic"">年</span>4<span style="font-family:"MS Gothic"">月</span>22<span style="font-family:"MS Gothic"">日</span>
<span style="font-family:"MS Gothic"">周三</span>23:11<span style="font-family:"MS Gothic"">写道:</span><o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-left:.5in">On Wed, Apr 22, 2020 at 5:12 AM y liu via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal" style="margin-left:.5in">Hi,<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-left:.5in">I have a module pass and I hope to use it to optimize a real-world program.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">I need LTO<span style="font-family:"MS Gothic"">,</span>and I have got LTO plugin.<o:p></o:p></p>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Do you mean the LLVM gold plugin (relevant when doing LTO links with gold or gnu ld), or are you trying to load your new pass via a pass plugin?<o:p></o:p></p>
</div>
</div>
</div>
</blockquote>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<div>
<p class="MsoNormal" style="margin-left:.5in"> Yes, it’s gold plugin, I need it to link .bc and .o files. I want to optimize the target after linking. <o:p></o:p></p>
</div>
</div>
</div>
</blockquote>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal" style="margin-left:.5in">But How can I add my passes to LTO Pass. I can't find solution. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">What should I do?<o:p></o:p></p>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">This depends on whether you are trying to add via a pass plugin dynamically via the command line (I believe the support for this is work in progress), or by manually modifying the pass pipeline within LLVM.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Have you implemented as an old pass manager pass (the current default) or the new pass manager or both?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Is it an LTO specific pass, or do you also want to run for non-LTO optimizing compiles (most optimizing passes should run in all cases).<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Assuming the latter, and also assuming you are using the default old pass manager, you would want to look at the following places in PassManagerBuilder.cpp:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">regular (full) LTO: PassManagerBuilder::addLTOOptimizationPasses<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">ThinLTO: PassManagerBuilder::populateModulePassManager, which is used both by the pre-LTO compile and by the LTO linking ThinLTO compiles. If you want to insert your pass for both, just put it in the relevant place
 in this file, if you want to only do during the LTO link portion of the ThinLTO compile, then guard it with a check for "PerformThinLTO".<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">For the new pass manager, it would be added to PassBuilder.cpp (that is structured a bit differently so let me know and I can point you in the right direction). If you are planning to send upstream it should be
 supported by both pass managers.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">HTH,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Teresa<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">_______________________________________________<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal" style="margin-left:.5in">LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><o:p></o:p></p>
</blockquote>
</div>
</div>
<div>
<div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</blockquote>
</div>
<p class="MsoNormal" style="margin-left:.5in"><br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<p class="MsoNormal" style="margin-left:.5in">-- <o:p></o:p></p>
<div>
<div>
<div>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" style="margin-left:.5in">
<tbody>
<tr>
<td nowrap="" style="border:none;border-top:solid #D50F25 1.5pt;padding:0in 0in 0in 0in">
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:#555555">Teresa Johnson |<o:p></o:p></span></p>
</td>
<td nowrap="" style="border:none;border-top:solid #3369E8 1.5pt;padding:0in 0in 0in 0in">
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:#555555"> Software Engineer |<o:p></o:p></span></p>
</td>
<td nowrap="" style="border:none;border-top:solid #009939 1.5pt;padding:0in 0in 0in 0in">
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:#555555"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |<o:p></o:p></span></p>
</td>
<td nowrap="" style="border:none;border-top:solid #EEB211 1.5pt;padding:0in 0in 0in 0in">
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal" style="margin-left:.5in"><br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<p class="MsoNormal" style="margin-left:.5in">-- <o:p></o:p></p>
<div>
<div>
<div>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" style="margin-left:.5in">
<tbody>
<tr>
<td nowrap="" style="border:none;border-top:solid #D50F25 1.5pt;padding:0in 0in 0in 0in">
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:#555555">Teresa Johnson |<o:p></o:p></span></p>
</td>
<td nowrap="" style="border:none;border-top:solid #3369E8 1.5pt;padding:0in 0in 0in 0in">
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:#555555"> Software Engineer |<o:p></o:p></span></p>
</td>
<td nowrap="" style="border:none;border-top:solid #009939 1.5pt;padding:0in 0in 0in 0in">
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:#555555"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |<o:p></o:p></span></p>
</td>
<td nowrap="" style="border:none;border-top:solid #EEB211 1.5pt;padding:0in 0in 0in 0in">
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</body>
</html>