<div dir="ltr">Hello Peter,<br><br>This commit broke tests on one of our builders:<br><a href="http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/18560">http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/18560</a><br><br>. . .<br>Failing Tests (1):<br>    lld :: ELF/icf-safe.s<br><br>Please have a look?<br>The builder was already red and did not sent any notifications on this.<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 18, 2018 at 3:49 PM, Peter Collingbourne via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: pcc<br>
Date: Wed Jul 18 15:49:31 2018<br>
New Revision: 337429<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=337429&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=337429&view=rev</a><br>
Log:<br>
ELF: Implement --icf=safe using address-significance tables.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D48146" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D48146</a><br>
<br>
Added:<br>
    lld/trunk/test/ELF/Inputs/icf-<wbr>safe.s<br>
    lld/trunk/test/ELF/icf-safe.s<br>
Modified:<br>
    lld/trunk/ELF/Config.h<br>
    lld/trunk/ELF/Driver.cpp<br>
    lld/trunk/ELF/ICF.cpp<br>
    lld/trunk/ELF/InputFiles.cpp<br>
    lld/trunk/ELF/InputFiles.h<br>
    lld/trunk/ELF/Options.td<br>
    lld/trunk/docs/ld.lld.1<br>
<br>
Modified: lld/trunk/ELF/Config.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=337429&r1=337428&r2=337429&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Config.<wbr>h?rev=337429&r1=337428&r2=<wbr>337429&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Config.h (original)<br>
+++ lld/trunk/ELF/Config.h Wed Jul 18 15:49:31 2018<br>
@@ -40,6 +40,9 @@ enum class BuildIdKind { None, Fast, Md5<br>
 // For --discard-{all,locals,none}.<br>
 enum class DiscardPolicy { Default, All, Locals, None };<br>
<br>
+// For --icf={none,safe,all}.<br>
+enum class ICFLevel { None, Safe, All };<br>
+<br>
 // For --strip-{all,debug}.<br>
 enum class StripPolicy { None, All, Debug };<br>
<br>
@@ -138,7 +141,6 @@ struct Configuration {<br>
   bool GnuUnique;<br>
   bool HasDynamicList = false;<br>
   bool HasDynSymTab;<br>
-  bool ICF;<br>
   bool IgnoreDataAddressEquality;<br>
   bool IgnoreFunctionAddressEquality;<br>
   bool LTODebugPassManager;<br>
@@ -187,6 +189,7 @@ struct Configuration {<br>
   bool ZRetpolineplt;<br>
   bool ZWxneeded;<br>
   DiscardPolicy Discard;<br>
+  ICFLevel ICF;<br>
   OrphanHandlingPolicy OrphanHandling;<br>
   SortSectionPolicy SortSection;<br>
   StripPolicy Strip;<br>
<br>
Modified: lld/trunk/ELF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=337429&r1=337428&r2=337429&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Driver.<wbr>cpp?rev=337429&r1=337428&r2=<wbr>337429&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Driver.cpp (original)<br>
+++ lld/trunk/ELF/Driver.cpp Wed Jul 18 15:49:31 2018<br>
@@ -51,6 +51,7 @@<br>
 #include "llvm/ADT/StringSwitch.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/Compression.h"<br>
+#include "llvm/Support/LEB128.h"<br>
 #include "llvm/Support/Path.h"<br>
 #include "llvm/Support/TarWriter.h"<br>
 #include "llvm/Support/TargetSelect.h"<br>
@@ -296,7 +297,7 @@ static void checkOptions(opt::InputArgLi<br>
       error("-r and --gc-sections may not be used together");<br>
     if (Config->GdbIndex)<br>
       error("-r and --gdb-index may not be used together");<br>
-    if (Config->ICF)<br>
+    if (Config->ICF != ICFLevel::None)<br>
       error("-r and --icf may not be used together");<br>
     if (Config->Pie)<br>
       error("-r and -pie may not be used together");<br>
@@ -519,6 +520,15 @@ static StringRef getDynamicLinker(opt::I<br>
   return Arg->getValue();<br>
 }<br>
<br>
+static ICFLevel getICF(opt::InputArgList &Args) {<br>
+  auto *Arg = Args.getLastArg(OPT_icf_none, OPT_icf_safe, OPT_icf_all);<br>
+  if (!Arg || Arg->getOption().getID() == OPT_icf_none)<br>
+    return ICFLevel::None;<br>
+  if (Arg->getOption().getID() == OPT_icf_safe)<br>
+    return ICFLevel::Safe;<br>
+  return ICFLevel::All;<br>
+}<br>
+<br>
 static StripPolicy getStrip(opt::InputArgList &Args) {<br>
   if (Args.hasArg(OPT_relocatable))<br>
     return StripPolicy::None;<br>
@@ -745,7 +755,7 @@ void LinkerDriver::readConfigs(opt:<wbr>:Inpu<br>
   Config->GcSections = Args.hasFlag(OPT_gc_sections, OPT_no_gc_sections, false);<br>
   Config->GnuUnique = Args.hasFlag(OPT_gnu_unique, OPT_no_gnu_unique, true);<br>
   Config->GdbIndex = Args.hasFlag(OPT_gdb_index, OPT_no_gdb_index, false);<br>
-  Config->ICF = Args.hasFlag(OPT_icf_all, OPT_icf_none, false);<br>
+  Config->ICF = getICF(Args);<br>
   Config-><wbr>IgnoreDataAddressEquality =<br>
       Args.hasArg(OPT_ignore_data_<wbr>address_equality);<br>
   Config-><wbr>IgnoreFunctionAddressEquality =<br>
@@ -1225,16 +1235,60 @@ template <class ELFT> static void demote<br>
   }<br>
 }<br>
<br>
+static bool keepUnique(Symbol *S) {<br>
+  if (auto *D = dyn_cast_or_null<Defined>(S)) {<br>
+    if (D->Section) {<br>
+      D->Section->KeepUnique = true;<br>
+      return true;<br>
+    }<br>
+  }<br>
+  return false;<br>
+}<br>
+<br>
 // Record sections that define symbols mentioned in --keep-unique <symbol><br>
-// these sections are inelligible for ICF.<br>
+// and symbols referred to by address-significance tables. These sections are<br>
+// ineligible for ICF.<br>
+template <class ELFT><br>
 static void findKeepUniqueSections(opt::<wbr>InputArgList &Args) {<br>
   for (auto *Arg : Args.filtered(OPT_keep_unique)<wbr>) {<br>
     StringRef Name = Arg->getValue();<br>
-    if (auto *Sym = dyn_cast_or_null<Defined>(<wbr>Symtab->find(Name)))<br>
-      Sym->Section->KeepUnique = true;<br>
-    else<br>
+    if (!keepUnique(Symtab->find(<wbr>Name)))<br>
       warn("could not find symbol " + Name + " to keep unique");<br>
   }<br>
+<br>
+  if (Config->ICF == ICFLevel::Safe) {<br>
+    // Symbols in the dynsym could be address-significant in other executables<br>
+    // or DSOs, so we conservatively mark them as address-significant.<br>
+    for (Symbol *S : Symtab->getSymbols())<br>
+      if (S->includeInDynsym())<br>
+        keepUnique(S);<br>
+<br>
+    // Visit the address-significance table in each object file and mark each<br>
+    // referenced symbol as address-significant.<br>
+    for (InputFile *F : ObjectFiles) {<br>
+      auto *Obj = cast<ObjFile<ELFT>>(F);<br>
+      ArrayRef<Symbol *> Syms = Obj->getSymbols();<br>
+      if (Obj->AddrsigSec) {<br>
+        ArrayRef<uint8_t> Contents =<br>
+            check(Obj->getObj().<wbr>getSectionContents(Obj-><wbr>AddrsigSec));<br>
+        const uint8_t *Cur = Contents.begin();<br>
+        while (Cur != Contents.end()) {<br>
+          unsigned Size;<br>
+          const char *Err;<br>
+          uint64_t SymIndex = decodeULEB128(Cur, &Size, Contents.end(), &Err);<br>
+          if (Err)<br>
+            fatal(toString(F) + ": could not decode addrsig section: " + Err);<br>
+          keepUnique(Syms[SymIndex]);<br>
+          Cur += Size;<br>
+        }<br>
+      } else {<br>
+        // If an object file does not have an address-significance table,<br>
+        // conservatively mark all of its symbols as address-significant.<br>
+        for (Symbol *S : Syms)<br>
+          keepUnique(S);<br>
+      }<br>
+    }<br>
+  }<br>
 }<br>
<br>
 // Do actual linking. Note that when this function is called,<br>
@@ -1409,8 +1463,8 @@ template <class ELFT> void LinkerDriver:<br>
   markLive<ELFT>();<br>
   demoteSymbols<ELFT>();<br>
   mergeSections();<br>
-  if (Config->ICF) {<br>
-    findKeepUniqueSections(Args);<br>
+  if (Config->ICF != ICFLevel::None) {<br>
+    findKeepUniqueSections<ELFT>(<wbr>Args);<br>
     doIcf<ELFT>();<br>
   }<br>
<br>
<br>
Modified: lld/trunk/ELF/ICF.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ICF.cpp?rev=337429&r1=337428&r2=337429&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/ICF.cpp?<wbr>rev=337429&r1=337428&r2=<wbr>337429&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/ICF.cpp (original)<br>
+++ lld/trunk/ELF/ICF.cpp Wed Jul 18 15:49:31 2018<br>
@@ -173,8 +173,9 @@ static bool isEligible(InputSection *S)<br>
     return false;<br>
<br>
   // Don't merge read only data sections unless<br>
-  // --ignore-data-address-equality was passed.<br>
-  if (!(S->Flags & SHF_EXECINSTR) && !Config-><wbr>IgnoreDataAddressEquality)<br>
+  // --ignore-data-address-equality or --icf=safe was passed.<br>
+  if (!(S->Flags & SHF_EXECINSTR) &&<br>
+      !(Config-><wbr>IgnoreDataAddressEquality || Config->ICF == ICFLevel::Safe))<br>
     return false;<br>
<br>
   // Don't merge synthetic sections as their Data member is not valid and empty.<br>
<br>
Modified: lld/trunk/ELF/InputFiles.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=337429&r1=337428&r2=337429&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>InputFiles.cpp?rev=337429&r1=<wbr>337428&r2=337429&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/InputFiles.cpp (original)<br>
+++ lld/trunk/ELF/InputFiles.cpp Wed Jul 18 15:49:31 2018<br>
@@ -420,6 +420,17 @@ void ObjFile<ELFT>::<wbr>initializeSections(<br>
     // if -r is given, we'll let the final link discard such sections.<br>
     // This is compatible with GNU.<br>
     if ((Sec.sh_flags & SHF_EXCLUDE) && !Config->Relocatable) {<br>
+      if (Sec.sh_type == SHT_LLVM_ADDRSIG) {<br>
+        // We ignore the address-significance table if we know that the object<br>
+        // file was created by objcopy or ld -r. This is because these tools<br>
+        // will reorder the symbols in the symbol table, invalidating the data<br>
+        // in the address-significance table, which refers to symbols by index.<br>
+        if (Sec.sh_link != 0)<br>
+          this->AddrsigSec = &Sec;<br>
+        else if (Config->ICF == ICFLevel::Safe)<br>
+          warn(toString(this) + ": --icf=safe is incompatible with object "<br>
+                                "files created using objcopy or ld -r");<br>
+      }<br>
       this->Sections[I] = &InputSection::Discarded;<br>
       continue;<br>
     }<br>
<br>
Modified: lld/trunk/ELF/InputFiles.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=337429&r1=337428&r2=337429&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>InputFiles.h?rev=337429&r1=<wbr>337428&r2=337429&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/InputFiles.h (original)<br>
+++ lld/trunk/ELF/InputFiles.h Wed Jul 18 15:49:31 2018<br>
@@ -215,6 +215,9 @@ public:<br>
   // but had one or more functions with the no_split_stack attribute.<br>
   bool SomeNoSplitStack = false;<br>
<br>
+  // Pointer to this input file's .llvm_addrsig section, if it has one.<br>
+  const Elf_Shdr *AddrsigSec = nullptr;<br>
+<br>
 private:<br>
   void<br>
   initializeSections(llvm::<wbr>DenseSet<llvm::<wbr>CachedHashStringRef> &ComdatGroups);<br>
<br>
Modified: lld/trunk/ELF/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=337429&r1=337428&r2=337429&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Options.<wbr>td?rev=337429&r1=337428&r2=<wbr>337429&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Options.td (original)<br>
+++ lld/trunk/ELF/Options.td Wed Jul 18 15:49:31 2018<br>
@@ -170,6 +170,8 @@ def help: F<"help">, HelpText<"Print opt<br>
<br>
 def icf_all: F<"icf=all">, HelpText<"Enable identical code folding">;<br>
<br>
+def icf_safe: F<"icf=safe">, HelpText<"Enable safe identical code folding">;<br>
+<br>
 def icf_none: F<"icf=none">, HelpText<"Disable identical code folding (default)">;<br>
<br>
 def ignore_function_address_<wbr>equality: F<"ignore-function-address-<wbr>equality">,<br>
<br>
Modified: lld/trunk/docs/ld.lld.1<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/docs/ld.lld.1?rev=337429&r1=337428&r2=337429&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/docs/ld.lld.<wbr>1?rev=337429&r1=337428&r2=<wbr>337429&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/docs/ld.lld.1 (original)<br>
+++ lld/trunk/docs/ld.lld.1 Wed Jul 18 15:49:31 2018<br>
@@ -187,6 +187,8 @@ is the default.<br>
 Print a help message.<br>
 .It Fl -icf Ns = Ns Cm all<br>
 Enable identical code folding.<br>
+.It Fl -icf Ns = Ns Cm safe<br>
+Enable safe identical code folding.<br>
 .It Fl -icf Ns = Ns Cm none<br>
 Disable identical code folding.<br>
 .It Fl -image-base Ns = Ns Ar value<br>
<br>
Added: lld/trunk/test/ELF/Inputs/icf-<wbr>safe.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/Inputs/icf-safe.s?rev=337429&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>Inputs/icf-safe.s?rev=337429&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/Inputs/icf-<wbr>safe.s (added)<br>
+++ lld/trunk/test/ELF/Inputs/icf-<wbr>safe.s Wed Jul 18 15:49:31 2018<br>
@@ -0,0 +1,9 @@<br>
+.section .text.non_addrsig1,"ax",@<wbr>progbits<br>
+.globl non_addrsig1<br>
+non_addrsig1:<br>
+ret<br>
+<br>
+.section .text.non_addrsig2,"ax",@<wbr>progbits<br>
+.globl non_addrsig2<br>
+non_addrsig2:<br>
+ret<br>
<br>
Added: lld/trunk/test/ELF/icf-safe.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/icf-safe.s?rev=337429&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>icf-safe.s?rev=337429&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/icf-safe.s (added)<br>
+++ lld/trunk/test/ELF/icf-safe.s Wed Jul 18 15:49:31 2018<br>
@@ -0,0 +1,137 @@<br>
+# REQUIRES: x86<br>
+<br>
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o<br>
+# RUN: llvm-objcopy %t1.o %t1copy.o<br>
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %S/Inputs/icf-safe.s -o %t2.o<br>
+# RUN: ld.lld %t1.o %t2.o -o %t2 --icf=safe --print-icf-sections | FileCheck %s<br>
+# RUN: ld.lld %t1.o %t2.o -o %t3 --icf=safe --print-icf-sections -shared | FileCheck --check-prefix=EXPORT %s<br>
+# RUN: ld.lld %t1.o %t2.o -o %t3 --icf=safe --print-icf-sections --export-dynamic | FileCheck --check-prefix=EXPORT %s<br>
+# RUN: ld.lld %t1copy.o -o %t4 --icf=safe 2>&1 | FileCheck --check-prefix=OBJCOPY %s<br>
+<br>
+# CHECK-NOT: selected section {{.*}}:(.rodata.l1)<br>
+# CHECK: selected section {{.*}}:(.rodata.l3)<br>
+# CHECK:   removing identical section {{.*}}:(.rodata.l4)<br>
+<br>
+# CHECK-NOT: selected section {{.*}}:(.text.f1)<br>
+# CHECK: selected section {{.*}}:(.text.f3)<br>
+# CHECK:   removing identical section {{.*}}:(.text.f4)<br>
+<br>
+# CHECK-NOT: selected section {{.*}}:(.rodata.h1)<br>
+# CHECK: selected section {{.*}}:(.rodata.h3)<br>
+# CHECK:   removing identical section {{.*}}:(.rodata.h4)<br>
+<br>
+# CHECK-NOT: selected section {{.*}}:(.rodata.g1)<br>
+# CHECK: selected section {{.*}}:(.rodata.g3)<br>
+# CHECK:   removing identical section {{.*}}:(.rodata.g4)<br>
+<br>
+# CHECK-NOT: selected section {{.*}}:(.text.non_addrsig{{.}}<wbr>)<br>
+<br>
+# llvm-mc normally emits an empty .text section into every object file. Since<br>
+# nothing actually refers to it via a relocation, it doesn't have any associated<br>
+# symbols (thus nor can anything refer to it via a relocation, making it safe to<br>
+# merge with the empty section in the other input file). Here we check that the<br>
+# only two sections merged are the two empty sections and the sections with only<br>
+# STB_LOCAL or STV_HIDDEN symbols. The dynsym entries should have prevented<br>
+# anything else from being merged.<br>
+# EXPORT-NOT: selected section<br>
+# EXPORT: selected section {{.*}}:(.rodata.l3)<br>
+# EXPORT:   removing identical section {{.*}}:(.rodata.l4)<br>
+# EXPORT-NOT: selected section<br>
+# EXPORT: selected section {{.*}}:(.rodata.h3)<br>
+# EXPORT:   removing identical section {{.*}}:(.rodata.h4)<br>
+# EXPORT-NOT: selected section<br>
+# EXPORT: selected section {{.*}}:(.text)<br>
+# EXPORT:   removing identical section {{.*}}:(.text)<br>
+# EXPORT-NOT: selected section<br>
+<br>
+# OBJCOPY: --icf=safe is incompatible with object files created using objcopy or ld -r<br>
+<br>
+.section .text.f1,"ax",@progbits<br>
+.globl f1<br>
+f1:<br>
+ret<br>
+<br>
+.section .text.f2,"ax",@progbits<br>
+.globl f2<br>
+f2:<br>
+ret<br>
+<br>
+.section .text.f3,"ax",@progbits<br>
+.globl f3<br>
+f3:<br>
+ud2<br>
+<br>
+.section .text.f4,"ax",@progbits<br>
+.globl f4<br>
+f4:<br>
+ud2<br>
+<br>
+.section .rodata.g1,"a",@progbits<br>
+.globl g1<br>
+g1:<br>
+.byte 1<br>
+<br>
+.section .rodata.g2,"a",@progbits<br>
+.globl g2<br>
+g2:<br>
+.byte 1<br>
+<br>
+.section .rodata.g3,"a",@progbits<br>
+.globl g3<br>
+g3:<br>
+.byte 2<br>
+<br>
+.section .rodata.g4,"a",@progbits<br>
+.globl g4<br>
+g4:<br>
+.byte 2<br>
+<br>
+.section .rodata.l1,"a",@progbits<br>
+l1:<br>
+.byte 3<br>
+<br>
+.section .rodata.l2,"a",@progbits<br>
+l2:<br>
+.byte 3<br>
+<br>
+.section .rodata.l3,"a",@progbits<br>
+l3:<br>
+.byte 4<br>
+<br>
+.section .rodata.l4,"a",@progbits<br>
+l4:<br>
+.byte 4<br>
+<br>
+.section .rodata.h1,"a",@progbits<br>
+.globl h1<br>
+.hidden h1<br>
+h1:<br>
+.byte 5<br>
+<br>
+.section .rodata.h2,"a",@progbits<br>
+.globl h2<br>
+.hidden h2<br>
+h2:<br>
+.byte 5<br>
+<br>
+.section .rodata.h3,"a",@progbits<br>
+.globl h3<br>
+.hidden h3<br>
+h3:<br>
+.byte 6<br>
+<br>
+.section .rodata.h4,"a",@progbits<br>
+.globl h4<br>
+.hidden h4<br>
+h4:<br>
+.byte 6<br>
+<br>
+.addrsig<br>
+.addrsig_sym f1<br>
+.addrsig_sym f2<br>
+.addrsig_sym g1<br>
+.addrsig_sym g2<br>
+.addrsig_sym l1<br>
+.addrsig_sym l2<br>
+.addrsig_sym h1<br>
+.addrsig_sym h2<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>