<div dir="ltr">I posted a minimal test case to reproduce the issue to <a href="https://bugs.llvm.org/show_bug.cgi?id=41978">https://bugs.llvm.org/show_bug.cgi?id=41978</a>.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 24, 2019 at 5:16 PM Mani, Suresh <<a href="mailto:Suresh.Mani@amd.com">Suresh.Mani@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div lang="EN-US">
<div class="gmail-m_5177172578697203070WordSection1">
<p class="MsoNormal">Sure Rui, Thanks for the update and investigation.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Regards<u></u><u></u></p>
<p class="MsoNormal">M Suresh<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0in 0in">
<p class="MsoNormal"><b>From:</b> Rui Ueyama <<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>> <br>
<b>Sent:</b> Monday, June 24, 2019 1:38 PM<br>
<b>To:</b> Mani, Suresh <<a href="mailto:Suresh.Mani@amd.com" target="_blank">Suresh.Mani@amd.com</a>><br>
<b>Cc:</b> Teresa Johnson <<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>>; llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
<b>Subject:</b> Re: [llvm-dev] Expected behavior of lld during LTO for global symbols (Attr Internal/Common)<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">[CAUTION: External Email] <u></u><u></u></p>
<div>
<div>
<div>
<p class="MsoNormal">The direct cause of this issue is that, previously lld converted common symbols to defined symbols before passing input files to LTO, and after r360841 they are passed as common symbols to LTO. Making lld to work as before is easy, as we
can convert common symbols to defined symbols as before. Here is a patch to do that, and I confirmed that that restores the original behavior for the reported issue.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">The question is why LTO cannot internalize common symbols under some conditions. Looks like if there's no file other than bitcode files, LTO can internalize them, but if there's other DSO file, LTO can't, even if the DSOs don't contain
any symbols. But I don't fully understand what is going on. I'll try to investigate tomorrow.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<p class="MsoNormal"><span style="font-family:"Courier New"">diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp<br>
index 008a6cd7954..d9deddbf357 100644<br>
--- a/lld/ELF/Driver.cpp<br>
+++ b/lld/ELF/Driver.cpp<br>
@@ -1789,6 +1789,11 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {<br>
if (!Config->Relocatable)<br>
Symtab->scanVersionScript();<br>
<br>
+ // Replace common symbols with regular symbols, so that common<br>
+ // symbols in input object files appear as regular symbols in .bss<br>
+ // in the output.<br>
+ replaceCommonSymbols();<br>
+<br>
// Do link-time optimization if given files are LLVM bitcode files.<br>
// This compiles bitcode files into real object files.<br>
//<br>
@@ -1798,6 +1803,11 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {<br>
if (errorCount())<br>
return;<br>
<br>
+ // LTO may have introduced new common symbols, so convert them<br>
+ // to regular defined symbols.<br>
+ if (!BitcodeFiles.empty())<br>
+ replaceCommonSymbols();<br>
// If -thinlto-index-only is given, we should create only "index<br>
// files" and not object files. Index file creation is already done<br>
// in addCombinedLTOObject, so we are done if that's the case.<br>
@@ -1879,7 +1889,6 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {<br>
if (!Config->Relocatable)<br>
InputSections.push_back(createCommentSection());<br>
<br>
- // Replace common symbols with regular symbols.<br>
- replaceCommonSymbols();<br>
<br>
// Do size optimizations: garbage collection, merging of SHF_MERGE sections</span><u></u><u></u></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Fri, Jun 21, 2019 at 8:39 PM Rui Ueyama <<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">Let me investigate.<u></u><u></u></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Fri, Jun 21, 2019 at 5:08 PM Mani, Suresh <<a href="mailto:Suresh.Mani@amd.com" target="_blank">Suresh.Mani@amd.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal">Thanks for the info Teresa,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Regards<u></u><u></u></p>
<p class="MsoNormal">M Suresh<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0in 0in">
<p class="MsoNormal"><b>From:</b> Teresa Johnson <<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>>
<br>
<b>Sent:</b> Thursday, June 20, 2019 7:15 PM<br>
<b>To:</b> Mani, Suresh <<a href="mailto:Suresh.Mani@amd.com" target="_blank">Suresh.Mani@amd.com</a>><br>
<b>Cc:</b> Rui Ueyama <<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>>; llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
<b>Subject:</b> Re: [llvm-dev] Expected behavior of lld during LTO for global symbols (Attr Internal/Common)<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">[CAUTION: External Email]
<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">I haven't had a chance to look, but as mentioned, the linker resolution for the symbol is exported, which explains the LTO side behavior. Someone from the linker will probably need
to see what changed in the symbol info they are giving LTO is changing after that patch. If you want you can debug lld's BitcodeCompiler::add to see what info is different in the Resols array for that symbol that gets passed to LTO. Or what else is different
in the Sym used to generate the resolution. Both of those are examined in LTO::addModuleToGlobalRes when we note that the symbol is external.
<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Teresa<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">On Thu, Jun 20, 2019 at 2:36 AM Mani, Suresh <<a href="mailto:Suresh.Mani@amd.com" target="_blank">Suresh.Mani@amd.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin:5pt 0in 5pt 4.8pt">
<div>
<div>
<p class="MsoNormal">Hi Teresa,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Can you please let me know if there is any update on this issue.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Thanks<u></u><u></u></p>
<p class="MsoNormal">M Suresh<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0in 0in">
<p class="MsoNormal"><b>From:</b> Teresa Johnson <<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>>
<br>
<b>Sent:</b> Tuesday, June 11, 2019 7:23 PM<br>
<b>To:</b> Rui Ueyama <<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>><br>
<b>Cc:</b> Mani, Suresh <<a href="mailto:Suresh.Mani@amd.com" target="_blank">Suresh.Mani@amd.com</a>>; llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
<b>Subject:</b> Re: [llvm-dev] Expected behavior of lld during LTO for global symbols (Attr Internal/Common)<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">[CAUTION: External Email]
<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">LTO can, but it is linker driven. I confirmed that when it is a common symbol the resolution indicates that the symbol is exported, and when I add an initializer so that it is a
def we no longer think it is exported and are able to internalize. So this seems to be due to a change in what the linker is telling LTO. I would have to dig in the debugger to confirm, but perhaps lld is now indicating that it might be used by a regular obj?
I.e. in BitcodeCompiler::add. <u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Teresa<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">On Tue, Jun 11, 2019 at 5:48 AM Rui Ueyama <<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin:5pt 0in 5pt 4.8pt">
<div>
<div>
<p class="MsoNormal">Looks like this is indeed related to r360841.
<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">In C, there are distinctions between declarations, definitions and tentative definitions. Global variables declared with "extern" are declarations. Global variables that don't have
"extern" and have initializers are definitions. If global variables have neither "extern" nor initializers, they are called tentative definitions.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Common symbols represent tentative definitions.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Tentative definition get special treatment in the linker. Usually if you define the same symbol in two object files, a linker report an error. However, common symbols are allowed
to duplicate. Two or more common symbols are merged and then placed to the .bss section, so that they will be zero-initialized at runtime.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">So, a global variable defined as `struct Node* head` is actually a common symbol.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I'm not sure why LTO cannot internalize common symbols though. Teresa, is this expected?<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">On Mon, Jun 10, 2019 at 11:06 PM Teresa Johnson <<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin:5pt 0in 5pt 4.8pt">
<div>
<div>
<div>
<p class="MsoNormal">My guess is that it is due to lld change r360841 on that date (Introduce CommonSymbol). +Rui for comments.<u></u><u></u></p>
</div>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">On Mon, Jun 10, 2019 at 4:45 AM Mani, Suresh via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin:5pt 0in 5pt 4.8pt">
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Hi ,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">I have an issue during LTO phase of llvm compiler which is as follows,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">File t3.c<u></u><u></u></p>
<p class="MsoNormal">---------<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">#include <stdio.h>
<u></u><u></u></p>
<p class="MsoNormal">#include <stdlib.h>
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">// A linked list node
<u></u><u></u></p>
<p class="MsoNormal">struct Node {
<u></u><u></u></p>
<p class="MsoNormal"> int data;
<u></u><u></u></p>
<p class="MsoNormal"> struct Node* next;
<u></u><u></u></p>
<p class="MsoNormal"> struct Node* prev;
<u></u><u></u></p>
<p class="MsoNormal">};
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><b><span style="font-size:14pt">struct Node* head;</span></b><u></u><u></u></p>
<p class="MsoNormal">
<u></u><u></u></p>
<p class="MsoNormal">/* Given a reference (pointer to pointer) to the head of a list
<u></u><u></u></p>
<p class="MsoNormal">and an int, inserts a new node on the front of the list. */<u></u><u></u></p>
<p class="MsoNormal">void push(struct Node** head_ref, int new_data)
<u></u><u></u></p>
<p class="MsoNormal">{
<u></u><u></u></p>
<p class="MsoNormal"> struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> new_node->data = new_data;
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> new_node->next = (*head_ref);
<u></u><u></u></p>
<p class="MsoNormal"> new_node->prev = NULL;
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> if ((*head_ref) != NULL)
<u></u><u></u></p>
<p class="MsoNormal"> (*head_ref)->prev = new_node;
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> (*head_ref) = new_node;
<u></u><u></u></p>
<p class="MsoNormal">}
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">// This function prints contents of linked list starting from the given node
<u></u><u></u></p>
<p class="MsoNormal">void printList(struct Node* node)
<u></u><u></u></p>
<p class="MsoNormal">{
<u></u><u></u></p>
<p class="MsoNormal"> struct Node* last;
<u></u><u></u></p>
<p class="MsoNormal"> printf("\nTraversal in forward direction \n");
<u></u><u></u></p>
<p class="MsoNormal"> while (node != NULL) {
<u></u><u></u></p>
<p class="MsoNormal"> printf(" %d ", node->data);
<u></u><u></u></p>
<p class="MsoNormal"> last = node;
<u></u><u></u></p>
<p class="MsoNormal"> node = node->next;
<u></u><u></u></p>
<p class="MsoNormal"> }
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> printf("\nTraversal in reverse direction \n");
<u></u><u></u></p>
<p class="MsoNormal"> while (last != NULL) {
<u></u><u></u></p>
<p class="MsoNormal"> printf(" %d ", last->data);
<u></u><u></u></p>
<p class="MsoNormal"> last = last->prev;
<u></u><u></u></p>
<p class="MsoNormal"> }
<u></u><u></u></p>
<p class="MsoNormal">}
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">
<u></u><u></u></p>
<p class="MsoNormal">/* Driver program to test above functions*/<u></u><u></u></p>
<p class="MsoNormal">int main()
<u></u><u></u></p>
<p class="MsoNormal">{
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> head = NULL;<u></u><u></u></p>
<p class="MsoNormal"> push(&head, 7);
<u></u><u></u></p>
<p class="MsoNormal"> push(&head, 1);
<u></u><u></u></p>
<p class="MsoNormal"> push(&head, 4);
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> printList(head);
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> return 0;
<u></u><u></u></p>
<p class="MsoNormal">}
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Compiler invocation:
<u></u><u></u></p>
<p class="MsoNormal">--------------------<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">clang -flto -fuse-ld=lld -O3 t3.c -o a.out<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Expected behavior during LTO:<u></u><u></u></p>
<p class="MsoNormal">------------------------------<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">The compiler optimization during LTO needs to figure out that variable "head" is not referred by any precompiled object or library.<u></u><u></u></p>
<p class="MsoNormal">Until May-16-2019 variable "head" had internal attribute as follows,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">@head = internal global %struct.Node* null, align 8<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">And the compiler was rightly able to recognize that "head" is not referred by any external precompiled object or library.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">But after May-16-2019 the attribute of head was changed as follows,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">@head = common dso_local global %struct.Node* null, align 8<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Not sure if this is correct behavior?<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">If this is a correct behavior then can you please let me know how could the compiler figure out that variable "head" is not referred by any external precompiled object or library?<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Thanks<u></u><u></u></p>
<p class="MsoNormal">M Suresh<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal">_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"><br clear="all">
<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<p class="MsoNormal">--
<u></u><u></u></p>
<div>
<div>
<div>
<table class="gmail-m_5177172578697203070MsoNormalTable" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(213,15,37);padding:0in">
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(85,85,85)">Teresa Johnson |</span><span style="color:windowtext"><u></u><u></u></span></p>
</td>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(51,105,232);padding:0in">
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(85,85,85)"> Software Engineer |</span><span style="color:windowtext"><u></u><u></u></span></p>
</td>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(0,153,57);padding:0in">
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(85,85,85)"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</span><span style="color:windowtext"><u></u><u></u></span></p>
</td>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(238,178,17);padding:0in">
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><br clear="all">
<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<p class="MsoNormal">--
<u></u><u></u></p>
<div>
<div>
<div>
<table class="gmail-m_5177172578697203070MsoNormalTable" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(213,15,37);padding:0in">
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(85,85,85)">Teresa Johnson |</span><span style="color:windowtext"><u></u><u></u></span></p>
</td>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(51,105,232);padding:0in">
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(85,85,85)"> Software Engineer |</span><span style="color:windowtext"><u></u><u></u></span></p>
</td>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(0,153,57);padding:0in">
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(85,85,85)"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</span><span style="color:windowtext"><u></u><u></u></span></p>
</td>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(238,178,17);padding:0in">
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><br clear="all">
<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<p class="MsoNormal">--
<u></u><u></u></p>
<div>
<div>
<div>
<table class="gmail-m_5177172578697203070MsoNormalTable" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(213,15,37);padding:0in">
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(85,85,85)">Teresa Johnson |</span><span style="color:windowtext"><u></u><u></u></span></p>
</td>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(51,105,232);padding:0in">
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(85,85,85)"> Software Engineer |</span><span style="color:windowtext"><u></u><u></u></span></p>
</td>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(0,153,57);padding:0in">
<p class="MsoNormal"><span style="font-size:12pt;font-family:Arial,sans-serif;color:rgb(85,85,85)"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</span><span style="color:windowtext"><u></u><u></u></span></p>
</td>
<td nowrap style="border-right:none;border-bottom:none;border-left:none;border-top:1.5pt solid rgb(238,178,17);padding:0in">
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</blockquote></div>