<div dir="ltr">Hi Rafael,<div><br></div><div>That would be great if you want to implement it in lld - I was going to take a stab at it tomorrow otherwise.</div><div><br></div><div>Thanks,</div><div>Teresa</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 25, 2017 at 4:56 PM, Rafael Avila de Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In lld we have a precise handling of __start/__stop symbols. If you want<br>
I can try to implement the corresponding patch in lld.<br>
<br>
Cheers,<br>
Rafael<br>
<div class="HOEnZb"><div class="h5"><br>
Teresa Johnson via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> writes:<br>
<br>
> Author: tejohnson<br>
> Date: Tue Jul 25 12:42:32 2017<br>
> New Revision: 309009<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=309009&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=309009&view=rev</a><br>
> Log:<br>
> [LTO] Prevent dead stripping and internalization of symbols with sections<br>
><br>
> Summary:<br>
> ELF linkers generate __start_<secname> and __stop_<secname> symbols<br>
> when there is a value in a section <secname> where the name is a valid<br>
> C identifier.  If dead stripping determines that the values declared<br>
> in section <secname> are dead, and we then internalize (and delete)<br>
> such a symbol, programs that reference the corresponding start and end<br>
> section symbols will get undefined reference linking errors.<br>
><br>
> To fix this, add the section name to the IRSymtab entry when a symbol is<br>
> defined in a specific section. Then use this in the gold-plugin to mark<br>
> the symbol as external and visible from outside the summary when the<br>
> section name is a valid C identifier.<br>
><br>
> Reviewers: pcc<br>
><br>
> Subscribers: mehdi_amini, inglorion, eraman, llvm-commits<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D35639" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D35639</a><br>
><br>
> Added:<br>
>     llvm/trunk/test/tools/gold/<wbr>X86/Inputs/global_with_<wbr>section.ll<br>
>     llvm/trunk/test/tools/gold/<wbr>X86/global_with_section.ll<br>
> Modified:<br>
>     llvm/trunk/include/llvm/LTO/<wbr>LTO.h<br>
>     llvm/trunk/include/llvm/<wbr>Object/IRSymtab.h<br>
>     llvm/trunk/lib/Object/<wbr>IRSymtab.cpp<br>
>     llvm/trunk/test/Object/X86/<wbr>irsymtab.ll<br>
>     llvm/trunk/tools/gold/gold-<wbr>plugin.cpp<br>
>     llvm/trunk/tools/llvm-lto2/<wbr>llvm-lto2.cpp<br>
><br>
> Modified: llvm/trunk/include/llvm/LTO/<wbr>LTO.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTO.h?rev=309009&r1=309008&r2=309009&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/LTO/LTO.h?rev=309009&r1=<wbr>309008&r2=309009&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/include/llvm/LTO/<wbr>LTO.h (original)<br>
> +++ llvm/trunk/include/llvm/LTO/<wbr>LTO.h Tue Jul 25 12:42:32 2017<br>
> @@ -126,6 +126,7 @@ public:<br>
>      using irsymtab::Symbol::<wbr>getCommonSize;<br>
>      using irsymtab::Symbol::<wbr>getCommonAlignment;<br>
>      using irsymtab::Symbol::<wbr>getCOFFWeakExternalFallback;<br>
> +    using irsymtab::Symbol::<wbr>getSectionName;<br>
>      using irsymtab::Symbol::<wbr>isExecutable;<br>
>    };<br>
><br>
><br>
> Modified: llvm/trunk/include/llvm/<wbr>Object/IRSymtab.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/IRSymtab.h?rev=309009&r1=309008&r2=309009&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Object/IRSymtab.h?rev=<wbr>309009&r1=309008&r2=309009&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/include/llvm/<wbr>Object/IRSymtab.h (original)<br>
> +++ llvm/trunk/include/llvm/<wbr>Object/IRSymtab.h Tue Jul 25 12:42:32 2017<br>
> @@ -121,6 +121,9 @@ struct Uncommon {<br>
>    /// COFF-specific: the name of the symbol that a weak external resolves to<br>
>    /// if not defined.<br>
>    Str COFFWeakExternFallbackName;<br>
> +<br>
> +  /// Specified section name, if any.<br>
> +  Str SectionName;<br>
>  };<br>
><br>
>  struct Header {<br>
> @@ -128,7 +131,7 @@ struct Header {<br>
>    /// when the format changes, but it does not need to be incremented if a<br>
>    /// change to LLVM would cause it to create a different symbol table.<br>
>    Word Version;<br>
> -  enum { kCurrentVersion = 0 };<br>
> +  enum { kCurrentVersion = 1 };<br>
><br>
>    /// The producer's version string (LLVM_VERSION_STRING " " LLVM_REVISION).<br>
>    /// Consumers should rebuild the symbol table from IR if the producer's<br>
> @@ -165,6 +168,7 @@ struct Symbol {<br>
>    // Copied from storage::Uncommon.<br>
>    uint32_t CommonSize, CommonAlign;<br>
>    StringRef COFFWeakExternFallbackName;<br>
> +  StringRef SectionName;<br>
><br>
>    /// Returns the mangled symbol name.<br>
>    StringRef getName() const { return Name; }<br>
> @@ -215,6 +219,8 @@ struct Symbol {<br>
>      assert(isWeak() && isIndirect());<br>
>      return COFFWeakExternFallbackName;<br>
>    }<br>
> +<br>
> +  StringRef getSectionName() const { return SectionName; }<br>
>  };<br>
><br>
>  /// This class can be used to read a Symtab and Strtab produced by<br>
> @@ -300,7 +306,10 @@ class Reader::SymbolRef : public Symbol<br>
>        CommonSize = UncI->CommonSize;<br>
>        CommonAlign = UncI->CommonAlign;<br>
>        COFFWeakExternFallbackName = R->str(UncI-><wbr>COFFWeakExternFallbackName);<br>
> -    }<br>
> +      SectionName = R->str(UncI->SectionName);<br>
> +    } else<br>
> +      // Reset this field so it can be queried unconditionally for all symbols.<br>
> +      SectionName = "";<br>
>    }<br>
><br>
>  public:<br>
><br>
> Modified: llvm/trunk/lib/Object/<wbr>IRSymtab.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/IRSymtab.cpp?rev=309009&r1=309008&r2=309009&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Object/<wbr>IRSymtab.cpp?rev=309009&r1=<wbr>309008&r2=309009&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/lib/Object/<wbr>IRSymtab.cpp (original)<br>
> +++ llvm/trunk/lib/Object/<wbr>IRSymtab.cpp Tue Jul 25 12:42:32 2017<br>
> @@ -156,6 +156,7 @@ Error Builder::addSymbol(const ModuleSym<br>
>      Unc = &Uncommons.back();<br>
>      *Unc = {};<br>
>      setStr(Unc-><wbr>COFFWeakExternFallbackName, "");<br>
> +    setStr(Unc->SectionName, "");<br>
>      return *Unc;<br>
>    };<br>
><br>
> @@ -240,6 +241,9 @@ Error Builder::addSymbol(const ModuleSym<br>
>      }<br>
>    }<br>
><br>
> +  if (!Base->getSection().empty())<br>
> +    setStr(Uncommon().SectionName, Saver.save(Base->getSection())<wbr>);<br>
> +<br>
>    return Error::success();<br>
>  }<br>
><br>
><br>
> Modified: llvm/trunk/test/Object/X86/<wbr>irsymtab.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/X86/irsymtab.ll?rev=309009&r1=309008&r2=309009&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Object/X86/irsymtab.ll?rev=<wbr>309009&r1=309008&r2=309009&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/test/Object/X86/<wbr>irsymtab.ll (original)<br>
> +++ llvm/trunk/test/Object/X86/<wbr>irsymtab.ll Tue Jul 25 12:42:32 2017<br>
> @@ -9,13 +9,13 @@<br>
><br>
>  ; BCA:      <SYMTAB_BLOCK<br>
>  ; Version stored at offset 0.<br>
> -; BCA-NEXT:   <BLOB abbrevid=4/> blob data = '\x00\x00\x00\x00\x06\x00\x00\<wbr>x00\x08\x00\x00\x00D\x00\x00\<wbr>x00\x01\x00\x00\x00P\x00\x00\<wbr>x00\x00\x00\x00\x00P\x00\x00\<wbr>x00\x02\x00\x00\x00\x80\x00\<wbr>x00\x00\x00\x00\x00\x00\x0E\<wbr>x00\x00\x00\x18\x00\x00\x00&\<wbr>x00\x00\x00\x0B\x00\x00\x001\<wbr>x00\x00\x00\x00\x00\x00\x00\<wbr>x00\x00\x00\x00\x02\x00\x00\<wbr>x00\x00\x00\x00\x00\x00\x00\<wbr>x00\x00\x03\x00\x00\x00\x00\<wbr>x00\x00\x00\x03\x00\x00\x00\<wbr>xFF\xFF\xFF\xFF\x00$\x00\x00\<wbr>x03\x00\x00\x00\x03\x00\x00\<wbr>x00\x03\x00\x00\x00\x03\x00\<wbr>x00\x00\xFF\xFF\xFF\xFF\x08$\<wbr>x00\x00'<br>
> +; BCA-NEXT:   <BLOB abbrevid=4/> blob data = '\x01\x00\x00\x00\x06\x00\x00\<wbr>x00\x08\x00\x00\x00D\x00\x00\<wbr>x00\x01\x00\x00\x00P\x00\x00\<wbr>x00\x00\x00\x00\x00P\x00\x00\<wbr>x00\x02\x00\x00\x00\x80\x00\<wbr>x00\x00\x00\x00\x00\x00\x0E\<wbr>x00\x00\x00\x18\x00\x00\x00&\<wbr>x00\x00\x00\x0B\x00\x00\x001\<wbr>x00\x00\x00\x00\x00\x00\x00\<wbr>x00\x00\x00\x00\x02\x00\x00\<wbr>x00\x00\x00\x00\x00\x00\x00\<wbr>x00\x00\x03\x00\x00\x00\x00\<wbr>x00\x00\x00\x03\x00\x00\x00\<wbr>xFF\xFF\xFF\xFF\x00$\x00\x00\<wbr>x03\x00\x00\x00\x03\x00\x00\<wbr>x00\x03\x00\x00\x00\x03\x00\<wbr>x00\x00\xFF\xFF\xFF\xFF\x08$\<wbr>x00\x00'<br>
>  ; BCA-NEXT: </SYMTAB_BLOCK><br>
>  ; BCA-NEXT: <STRTAB_BLOCK<br>
>  ; BCA-NEXT:   <BLOB abbrevid=4/> blob data = 'foobarproducerx86_64-unknown-<wbr>linux-gnuirsymtab.ll'<br>
>  ; BCA-NEXT: </STRTAB_BLOCK><br>
><br>
> -; SYMTAB:      version: 0<br>
> +; SYMTAB:      version: 1<br>
>  ; SYMTAB-NEXT: producer: producer<br>
>  ; SYMTAB-NEXT: target triple: x86_64-unknown-linux-gnu<br>
>  ; SYMTAB-NEXT: source filename: irsymtab.ll<br>
><br>
> Added: llvm/trunk/test/tools/gold/<wbr>X86/Inputs/global_with_<wbr>section.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/gold/X86/Inputs/global_with_section.ll?rev=309009&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>gold/X86/Inputs/global_with_<wbr>section.ll?rev=309009&view=<wbr>auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/test/tools/gold/<wbr>X86/Inputs/global_with_<wbr>section.ll (added)<br>
> +++ llvm/trunk/test/tools/gold/<wbr>X86/Inputs/global_with_<wbr>section.ll Tue Jul 25 12:42:32 2017<br>
> @@ -0,0 +1,10 @@<br>
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:<wbr>32:64-S128"<br>
> +target triple = "x86_64-unknown-linux-gnu"<br>
> +<br>
> +define void @deadfunc2_called_from_<wbr>section() {<br>
> +  ret void<br>
> +}<br>
> +<br>
> +define void @deadfunc2_called_from_nonC_<wbr>section() {<br>
> +  ret void<br>
> +}<br>
><br>
> Added: llvm/trunk/test/tools/gold/<wbr>X86/global_with_section.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/gold/X86/global_with_section.ll?rev=309009&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/tools/<wbr>gold/X86/global_with_section.<wbr>ll?rev=309009&view=auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/test/tools/gold/<wbr>X86/global_with_section.ll (added)<br>
> +++ llvm/trunk/test/tools/gold/<wbr>X86/global_with_section.ll Tue Jul 25 12:42:32 2017<br>
> @@ -0,0 +1,79 @@<br>
> +; Test to ensure we don't internalize or treat as dead a global value<br>
> +; with a valid C identifier section name. Otherwise, ELF linker generation of<br>
> +; __start_"sectionname" and __stop_"sectionname" symbols would not occur and<br>
> +; we can end up with undefined references at link time.<br>
> +<br>
> +; First try RegularLTO<br>
> +; RUN: opt %s -o %t.o<br>
> +; RUN: llvm-lto2 dump-symtab %t.o | FileCheck %s --check-prefix=SYMTAB<br>
> +; RUN: opt %p/Inputs/global_with_section.<wbr>ll -o %t2.o<br>
> +; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \<br>
> +; RUN:     --plugin-opt=save-temps \<br>
> +; RUN:     -o %t3.o %t.o %t2.o<br>
> +; Check results of internalization<br>
> +; RUN: llvm-dis %t3.o.0.2.internalize.bc -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK2-<wbr>REGULARLTO<br>
> +<br>
> +; Next try ThinLTO<br>
> +; RUN: opt -module-summary %s -o %t.o<br>
> +; RUN: llvm-lto2 dump-symtab %t.o | FileCheck %s --check-prefix=SYMTAB<br>
> +; RUN: opt -module-summary %p/Inputs/global_with_section.<wbr>ll -o %t2.o<br>
> +; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \<br>
> +; RUN:     --plugin-opt=thinlto \<br>
> +; RUN:     --plugin-opt=save-temps \<br>
> +; RUN:     -o %t3.o %t.o %t2.o<br>
> +; Check results of internalization<br>
> +; RUN: llvm-dis %t.o.2.internalize.bc -o - | FileCheck %s<br>
> +; RUN: llvm-dis %t2.o.2.internalize.bc -o - | FileCheck %s --check-prefix=CHECK2-THINLTO<br>
> +<br>
> +; SYMTAB: deadfunc_with_section<br>
> +; SYMTAB-NEXT: section some_other_section<br>
> +; SYMTAB-NEXT: deadfunc_with_nonC_section<br>
> +; SYMTAB-NEXT: section .nonCsection<br>
> +; SYMTAB-NEXT: deadfunc2_called_from_section<br>
> +; SYMTAB-NEXT: deadfunc2_called_from_nonC_<wbr>section<br>
> +; SYMTAB-NEXT: var_with_section<br>
> +; SYMTAB-NEXT: section some_section<br>
> +; SYMTAB-NEXT: var_with_nonC_section<br>
> +; SYMTAB-NEXT: section .nonCsection<br>
> +<br>
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:<wbr>32:64-S128"<br>
> +target triple = "x86_64-unknown-linux-gnu"<br>
> +<br>
> +; We should not internalize @var_with_section due to section<br>
> +; CHECK-DAG: @var_with_section = global i32 0, section "some_section"<br>
> +@var_with_section = global i32 0, section "some_section"<br>
> +<br>
> +; Confirm via a variable with a non-C identifier section that we are getting<br>
> +; the expected internalization.<br>
> +; CHECK-DAG: @var_with_nonC_section = internal global i32 0, section ".nonCsection"<br>
> +@var_with_nonC_section = global i32 0, section ".nonCsection"<br>
> +<br>
> +; We should not internalize @deadfunc_with_section due to section<br>
> +; CHECK-DAG: define void @deadfunc_with_section() section "some_other_section"<br>
> +define void @deadfunc_with_section() section "some_other_section" {<br>
> +  call void @deadfunc2_called_from_<wbr>section()<br>
> +  ret void<br>
> +}<br>
> +<br>
> +; Confirm via a function with a non-C identifier section that we are getting<br>
> +; the expected internalization.<br>
> +; CHECK-DAG: define internal void @deadfunc_with_nonC_section() section ".nonCsection"<br>
> +define void @deadfunc_with_nonC_section() section ".nonCsection" {<br>
> +  call void @deadfunc2_called_from_nonC_<wbr>section()<br>
> +  ret void<br>
> +}<br>
> +<br>
> +; In RegularLTO mode, where we have combined all the IR,<br>
> +; @deadfunc2_called_from_section can be internalized.<br>
> +; CHECK2-REGULARLTO: define internal void @deadfunc2_called_from_section<br>
> +; In ThinLTO mode, we can't internalize it as it needs to be preserved<br>
> +; (due to the access from @deadfunc_with_section which must be preserved), and<br>
> +; can't be internalized since the reference is from a different module.<br>
> +; CHECK2-THINLTO: define void @deadfunc2_called_from_section<br>
> +declare void @deadfunc2_called_from_<wbr>section()<br>
> +<br>
> +; Confirm when called from a function with a non-C identifier section that we<br>
> +; are getting the expected internalization.<br>
> +; CHECK2-REGULARLTO: define internal void @deadfunc2_called_from_nonC_<wbr>section<br>
> +; CHECK2-THINLTO: define internal void @deadfunc2_called_from_nonC_<wbr>section<br>
> +declare void @deadfunc2_called_from_nonC_<wbr>section()<br>
><br>
> Modified: llvm/trunk/tools/gold/gold-<wbr>plugin.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/gold-plugin.cpp?rev=309009&r1=309008&r2=309009&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/gold/<wbr>gold-plugin.cpp?rev=309009&r1=<wbr>309008&r2=309009&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/tools/gold/gold-<wbr>plugin.cpp (original)<br>
> +++ llvm/trunk/tools/gold/gold-<wbr>plugin.cpp Tue Jul 25 12:42:32 2017<br>
> @@ -605,6 +605,18 @@ static std::string getThinLTOObjectFileN<br>
>    return NewPath.str() + NewSuffix;<br>
>  }<br>
><br>
> +static bool isAlpha(char C) {<br>
> +  return ('a' <= C && C <= 'z') || ('A' <= C && C <= 'Z') || C == '_';<br>
> +}<br>
> +<br>
> +static bool isAlnum(char C) { return isAlpha(C) || ('0' <= C && C <= '9'); }<br>
> +<br>
> +// Returns true if S is valid as a C language identifier.<br>
> +static bool isValidCIdentifier(StringRef S) {<br>
> +  return !S.empty() && isAlpha(S[0]) &&<br>
> +         std::all_of(S.begin() + 1, S.end(), isAlnum);<br>
> +}<br>
> +<br>
>  static void addModule(LTO &Lto, claimed_file &F, const void *View,<br>
>                        StringRef Filename) {<br>
>    MemoryBufferRef BufferRef(StringRef((const char *)View, F.filesize),<br>
> @@ -616,8 +628,12 @@ static void addModule(LTO &Lto, claimed_<br>
>              toString(ObjOrErr.takeError())<wbr>.c_str());<br>
><br>
>    unsigned SymNum = 0;<br>
> +  std::unique_ptr<InputFile> Input = std::move(ObjOrErr.get());<br>
> +  auto InputFileSyms = Input->symbols();<br>
> +  assert(InputFileSyms.size() == F.syms.size());<br>
>    std::vector<SymbolResolution> Resols(F.syms.size());<br>
>    for (ld_plugin_symbol &Sym : F.syms) {<br>
> +    const InputFile::Symbol &InpSym = InputFileSyms[SymNum];<br>
>      SymbolResolution &R = Resols[SymNum++];<br>
><br>
>      ld_plugin_symbol_resolution Resolution =<br>
> @@ -653,6 +669,13 @@ static void addModule(LTO &Lto, claimed_<br>
>        break;<br>
>      }<br>
><br>
> +    // If the symbol has a C identifier section name, we need to mark<br>
> +    // it as visible to a regular object so that LTO will keep it around<br>
> +    // to ensure the linker generates special __start_<secname> and<br>
> +    // __stop_<secname> symbols which may be used elsewhere.<br>
> +    if (isValidCIdentifier(InpSym.<wbr>getSectionName()))<br>
> +      R.VisibleToRegularObj = true;<br>
> +<br>
>      if (Resolution != LDPR_RESOLVED_DYN && Resolution != LDPR_UNDEF &&<br>
>          (IsExecutable || !Res.DefaultVisibility))<br>
>        R.FinalDefinitionInLinkageUnit = true;<br>
> @@ -660,7 +683,7 @@ static void addModule(LTO &Lto, claimed_<br>
>      freeSymName(Sym);<br>
>    }<br>
><br>
> -  check(Lto.add(std::move(*<wbr>ObjOrErr), Resols),<br>
> +  check(Lto.add(std::move(Input)<wbr>, Resols),<br>
>          std::string("Failed to link module ") + F.name);<br>
>  }<br>
><br>
><br>
> Modified: llvm/trunk/tools/llvm-lto2/<wbr>llvm-lto2.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto2/llvm-lto2.cpp?rev=309009&r1=309008&r2=309009&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/tools/llvm-<wbr>lto2/llvm-lto2.cpp?rev=309009&<wbr>r1=309008&r2=309009&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- llvm/trunk/tools/llvm-lto2/<wbr>llvm-lto2.cpp (original)<br>
> +++ llvm/trunk/tools/llvm-lto2/<wbr>llvm-lto2.cpp Tue Jul 25 12:42:32 2017<br>
> @@ -355,6 +355,9 @@ static int dumpSymtab(int argc, char **a<br>
><br>
>        if (TT.isOSBinFormatCOFF() && Sym.isWeak() && Sym.isIndirect())<br>
>          outs() << "         fallback " << Sym.<wbr>getCOFFWeakExternalFallback() << '\n';<br>
> +<br>
> +      if (!Sym.getSectionName().empty()<wbr>)<br>
> +        outs() << "         section " << Sym.getSectionName() << "\n";<br>
>      }<br>
><br>
>      outs() << '\n';<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>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="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>