<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 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:665127965;
        mso-list-type:hybrid;
        mso-list-template-ids:-713408766 161898632 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-start-at:2015;
        mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";
        color:#1F497D;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></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><div><div><div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><![if !supportLists]><span style='font-family:Wingdings;color:#1F497D'><span style='mso-list:Ignore'>Ø<span style='font:7.0pt "Times New Roman"'>  </span></span></span><![endif]>valgrind??? I thought, every LLVM developer must know about <a href="http://clang.llvm.org/docs/AddressSanitizer.html">ASAN</a> ;)<o:p></o:p></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>ASAN is not that great to quicktest such a small patches, and valgrind does its job in plug-and play manner.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='color:#1F497D'>Or, which is recommended way to use ASAN as a pre-commit test, apart from obvious “always build clang with ASAN” ? Any docs, tips/tricks?<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoListParagraph style='margin-left:0cm'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><![if !supportLists]><span style='font-family:Wingdings;color:#1F497D'><span style='mso-list:Ignore'>Ø<span style='font:7.0pt "Times New Roman"'>  </span></span></span><![endif]>The patch changes the return value of the getLLVMArchSuffixForARM function. Is it intended?<o:p></o:p></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Not sure what do you mean. It seems I haven’t changed the semantics during this fix. If you’re asking about <a href="http://reviews.llvm.org/rL248370">http://reviews.llvm.org/rL248370</a> , would you please post comment there?<o:p></o:p></span></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoListParagraph style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><![if !supportLists]><span style='font-family:Wingdings;color:#1F497D'><span style='mso-list:Ignore'>Ø<span style='font:7.0pt "Times New Roman"'>  </span></span></span><![endif]>Also, I'd prefer "std::string" instead of "auto".<o:p></o:p></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Ok, next version is attached<o:p></o:p></span></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>-- Alex<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks, Vladimir</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Alexander Kornienko [mailto:<a href="mailto:alexfh@google.com" target="_blank">alexfh@google.com</a>] <br><b>Sent:</b> 23 September 2015 15:41<br><b>To:</b> Vladimir Sukharev<br><b>Cc:</b> cfe-commits<br><b>Subject:</b> Re: r248370 - [ARM] Fix crash "-target arm -mcpu=generic", without "-march="</span><o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Wed, Sep 23, 2015 at 11:29 AM, Vladimir Sukharev via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Author: vsukharev<br>Date: Wed Sep 23 04:29:32 2015<br>New Revision: 248370<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=248370&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=248370&view=rev</a><br>Log:<br>[ARM] Fix crash "-target arm -mcpu=generic", without "-march="<br><br>An assertion hit has been fixed for cmdlines like<br><br>$ clang --target=arm-linux-gnueabi -mcpu=generic hello.c<br><br>Related to: <a href="http://reviews.llvm.org/rL245445" target="_blank">http://reviews.llvm.org/rL245445</a><br><br>Reviewers: rengolin<br><br>Subscribers: cfe-commits<br><br>Differential Revision: <a href="http://reviews.llvm.org/D13013" target="_blank">http://reviews.llvm.org/D13013</a><br><br><br>Modified:<br>    cfe/trunk/lib/Driver/ToolChain.cpp<br>    cfe/trunk/lib/Driver/Tools.cpp<br>    cfe/trunk/lib/Driver/Tools.h<br>    cfe/trunk/test/Driver/aarch64-cpus.c<br>    cfe/trunk/test/Driver/arm-cortex-cpus.c<br><br>Modified: cfe/trunk/lib/Driver/ToolChain.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=248370&r1=248369&r2=248370&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=248370&r1=248369&r2=248370&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Driver/ToolChain.cpp (original)<br>+++ cfe/trunk/lib/Driver/ToolChain.cpp Wed Sep 23 04:29:32 2015<br>@@ -317,8 +317,7 @@ std::string ToolChain::ComputeLLVMTriple<br>             ? tools::arm::getARMCPUForMArch(MArch, Triple).str()<br>             : tools::arm::getARMTargetCPU(MCPU, MArch, Triple);<br>     StringRef Suffix =<br>-      tools::arm::getLLVMArchSuffixForARM(CPU,<br>-                                          tools::arm::getARMArch(MArch, Triple));<br>+      tools::arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);<br>     bool ThumbDefault = Suffix.startswith("v6m") || Suffix.startswith("v7m") ||<br>       Suffix.startswith("v7em") ||<br>       (Suffix.startswith("v7") && getTriple().isOSBinFormatMachO());<br><br>Modified: cfe/trunk/lib/Driver/Tools.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=248370&r1=248369&r2=248370&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=248370&r1=248369&r2=248370&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>+++ cfe/trunk/lib/Driver/Tools.cpp Wed Sep 23 04:29:32 2015<br>@@ -560,8 +560,7 @@ static void checkARMCPUName(const Driver<br>                             llvm::StringRef CPUName, llvm::StringRef ArchName,<br>                             const llvm::Triple &Triple) {<br>   std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);<br>-  std::string Arch = arm::getARMArch(ArchName, Triple);<br>-  if (arm::getLLVMArchSuffixForARM(CPU, Arch).empty())<br>+  if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty())<br>     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);<br> }<br><br>@@ -6087,7 +6086,7 @@ const std::string arm::getARMArch(String<br>     std::string CPU = llvm::sys::getHostCPUName();<br>     if (CPU != "generic") {<br>       // Translate the native cpu into the architecture suffix for that CPU.<br>-      StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);<br>+      StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);<br>       // If there is no valid architecture suffix for this CPU we don't know how<br>       // to handle it, so return no architecture.<br>       if (Suffix.empty())<br>@@ -6133,12 +6132,19 @@ std::string arm::getARMTargetCPU(StringR<br> /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular<br> /// CPU  (or Arch, if CPU is generic).<br> // FIXME: This is redundant with -mcpu, why does LLVM use this.<br>-StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {<br>-  if (CPU == "generic")<br>-    return llvm::ARM::getSubArch(<br>-        llvm::ARM::parseArch(Arch));<br>-<br>-  unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);<br>+StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,<br>+                                       const llvm::Triple &Triple) {<br>+  unsigned ArchKind;<br>+  Arch = tools::arm::getARMArch(Arch, Triple);<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>arm::getARMArch returns std::string, so here you're ending up with a dangling StringRef. Please fix or revert.<o:p></o:p></p></div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt'><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>+  if (CPU == "generic") {<br>+    ArchKind = llvm::ARM::parseArch(Arch);<br>+    if (ArchKind == llvm::ARM::AK_INVALID)<br>+      // In case of generic Arch, i.e. "arm",<br>+      // extract arch from default cpu of the Triple<br>+      ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(Arch));<br>+  } else {<br>+    ArchKind = llvm::ARM::parseCPUArch(CPU);<br>+  }<br>   if (ArchKind == llvm::ARM::AK_INVALID)<br>     return "";<br>   return llvm::ARM::getSubArch(ArchKind);<br><br>Modified: cfe/trunk/lib/Driver/Tools.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.h?rev=248370&r1=248369&r2=248370&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.h?rev=248370&r1=248369&r2=248370&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Driver/Tools.h (original)<br>+++ cfe/trunk/lib/Driver/Tools.h Wed Sep 23 04:29:32 2015<br>@@ -246,7 +246,8 @@ std::string getARMTargetCPU(StringRef CP<br> const std::string getARMArch(StringRef Arch,<br>                              const llvm::Triple &Triple);<br> StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);<br>-StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch);<br>+StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,<br>+                                  const llvm::Triple &Triple);<br><br> void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,<br>                        const llvm::Triple &Triple);<br><br>Modified: cfe/trunk/test/Driver/aarch64-cpus.c<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/aarch64-cpus.c?rev=248370&r1=248369&r2=248370&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/aarch64-cpus.c?rev=248370&r1=248369&r2=248370&view=diff</a><br>==============================================================================<br>--- cfe/trunk/test/Driver/aarch64-cpus.c (original)<br>+++ cfe/trunk/test/Driver/aarch64-cpus.c Wed Sep 23 04:29:32 2015<br>@@ -1,12 +1,17 @@<br> // Check target CPUs are correctly passed.<br><br> // RUN: %clang -target aarch64 -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s<br>+// RUN: %clang -target aarch64 -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s<br> // RUN: %clang -target aarch64 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s<br>+// RUN: %clang -target aarch64 -mlittle-endian -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s<br> // RUN: %clang -target aarch64_be -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s<br>+// RUN: %clang -target aarch64_be -mlittle-endian -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=GENERIC %s<br> // GENERIC: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" "generic"<br><br> // RUN: %clang -target arm64 -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s<br>+// RUN: %clang -target arm64 -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s<br> // RUN: %clang -target arm64 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s<br>+// RUN: %clang -target arm64 -mlittle-endian -mcpu-generic -### -c %s 2>&1 | FileCheck -check-prefix=ARM64-GENERIC %s<br><br> // ARM64-GENERIC: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "generic"<br><br><br>Modified: cfe/trunk/test/Driver/arm-cortex-cpus.c<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/arm-cortex-cpus.c?rev=248370&r1=248369&r2=248370&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/arm-cortex-cpus.c?rev=248370&r1=248369&r2=248370&view=diff</a><br>==============================================================================<br>--- cfe/trunk/test/Driver/arm-cortex-cpus.c (original)<br>+++ cfe/trunk/test/Driver/arm-cortex-cpus.c Wed Sep 23 04:29:32 2015<br>@@ -1,4 +1,16 @@<br> // ================== Check default CPU on each major architecture<br>+// RUN: %clang -target arm -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-GENERIC %s<br>+// CHECK-GENERIC: "-cc1"{{.*}} "-triple" "armv4t-{{.*}} "-target-cpu" "generic"<br>+<br>+// RUN: %clang -target armeb -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-GENERIC %s<br>+// CHECK-BE-GENERIC: "-cc1"{{.*}} "-triple" "armebv4t-{{.*}} "-target-cpu" "generic"<br>+<br>+// RUN: %clang -target arm -mthumb -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-GENERIC-THUMB %s<br>+// CHECK-GENERIC-THUMB: "-cc1"{{.*}} "-triple" "thumbv4t-{{.*}} "-target-cpu" "generic"<br>+<br>+// RUN: %clang -target armeb -mthumb -mcpu=generic -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-GENERIC-THUMB %s<br>+// CHECK-BE-GENERIC-THUMB: "-cc1"{{.*}} "-triple" "thumbebv4t-{{.*}} "-target-cpu" "generic"<br>+<br> // RUN: %clang -target armv4t -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V4T %s<br> // RUN: %clang -target arm -march=armv4t -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V4T %s<br> // CHECK-V4T: "-cc1"{{.*}} "-triple" "armv4t-{{.*}} "-target-cpu" "arm7tdmi"<br><br><br>_______________________________________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><o:p></o:p></p></blockquote></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><br><br clear=all><o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>-- <o:p></o:p></p><div><div><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='color:#666666;border:solid #D50F25 1.5pt;padding:2.0pt'>Alexander Kornienko |</span><span style='color:#666666;border:solid #3369E8 1.5pt;padding:2.0pt'> Software Engineer |</span><span style='color:#666666;border:solid #009939 1.5pt;padding:2.0pt'> </span><span style='border:solid #009939 1.5pt;padding:2.0pt'><a href="mailto:alexfh@google.com" target="_blank"><span style='color:#1155CC'>alexfh@google.com</span></a> |</span><span style='border:solid #EEB211 1.5pt;padding:2.0pt'> Google Germany, Munich</span><o:p></o:p></p></div></div></div></div></div></div></div></div></div><p class=MsoNormal><br><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:black'>-- IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.<br><br>ARM Limited, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ, Registered in England & Wales, Company No: 2557590<br>ARM Holdings plc, Registered office 110 Fulbourn Road, Cambridge CB1 9NJ, Registered in England & Wales, Company No: 2548782</span><o:p></o:p></p></div></blockquote></div><p class=MsoNormal><br><br clear=all><o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div></div></div></div></body></html>