<div dir="ltr">Fixed in r250062.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Oct 11, 2015 at 6:48 PM, Rafael Espíndola <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">There is something missing on the test. Everything still passes if I convert<br>
<span class=""><br>
if (Body && Body->isUndefined() && !Body->isWeak())<br>
<br>
</span>to just<br>
<br>
if (Body)<br>
<br>
Cheers,<br>
Rafael<br>
<br>
<br>
<br>
On 11 October 2015 at 16:59, Rui Ueyama via llvm-commits<br>
<div class="HOEnZb"><div class="h5"><<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: ruiu<br>
> Date: Sun Oct 11 15:59:12 2015<br>
> New Revision: 249998<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=249998&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=249998&view=rev</a><br>
> Log:<br>
> ELF2: Implement --as-needed.<br>
><br>
> This patch adds AsNeeded and IsUsed bool fields to SharedFile. AsNeeded bit<br>
> is set if the DSO is enclosed with --as-needed and --no-as-needed. IsUsed<br>
> bit is off by default. When we adds a symbol to the symbol table for dynamic<br>
> linking, we set its SharedFile's IsUsed bit.<br>
><br>
> If AsNeeded is set but IsUsed is not set, we don't want to write that<br>
> file's SO name to DT_NEEDED field.<br>
><br>
> <a href="http://reviews.llvm.org/D13579" rel="noreferrer" target="_blank">http://reviews.llvm.org/D13579</a><br>
><br>
> Added:<br>
>     lld/trunk/test/elf2/Inputs/shared2.s<br>
>     lld/trunk/test/elf2/Inputs/shared3.s<br>
>     lld/trunk/test/elf2/as-needed.s<br>
> Modified:<br>
>     lld/trunk/ELF/Config.h<br>
>     lld/trunk/ELF/Driver.cpp<br>
>     lld/trunk/ELF/InputFiles.cpp<br>
>     lld/trunk/ELF/InputFiles.h<br>
>     lld/trunk/ELF/InputSection.cpp<br>
>     lld/trunk/ELF/LinkerScript.cpp<br>
>     lld/trunk/ELF/Options.td<br>
>     lld/trunk/ELF/OutputSections.cpp<br>
>     lld/trunk/ELF/Symbols.h<br>
>     lld/trunk/ELF/Writer.cpp<br>
><br>
> Modified: lld/trunk/ELF/Config.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/Config.h (original)<br>
> +++ lld/trunk/ELF/Config.h Sun Oct 11 15:59:12 2015<br>
> @@ -43,6 +43,7 @@ struct Configuration {<br>
>    std::string RPath;<br>
>    std::vector<llvm::StringRef> SearchPaths;<br>
>    bool AllowMultipleDefinition;<br>
> +  bool AsNeeded = false;<br>
>    bool DiscardAll;<br>
>    bool DiscardLocals;<br>
>    bool DiscardNone;<br>
><br>
> Modified: lld/trunk/ELF/Driver.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/Driver.cpp (original)<br>
> +++ lld/trunk/ELF/Driver.cpp Sun Oct 11 15:59:12 2015<br>
> @@ -100,9 +100,12 @@ void LinkerDriver::addFile(StringRef Pat<br>
>      }<br>
>      Files.push_back(make_unique<ArchiveFile>(MBRef));<br>
>      return;<br>
> -  case file_magic::elf_shared_object:<br>
> -    Files.push_back(createELFFile<SharedFile>(MBRef));<br>
> +  case file_magic::elf_shared_object: {<br>
> +    std::unique_ptr<ELFFileBase> File = createELFFile<SharedFile>(MBRef);<br>
> +    cast<SharedFileBase>(File.get())->AsNeeded = Config->AsNeeded;<br>
> +    Files.push_back(std::move(File));<br>
>      return;<br>
> +  }<br>
>    default:<br>
>      Files.push_back(createELFFile<ObjectFile>(MBRef));<br>
>    }<br>
> @@ -187,6 +190,12 @@ void LinkerDriver::createFiles(opt::Inpu<br>
>      case OPT_script:<br>
>        addFile(Arg->getValue());<br>
>        break;<br>
> +    case OPT_as_needed:<br>
> +      Config->AsNeeded = true;<br>
> +      break;<br>
> +    case OPT_no_as_needed:<br>
> +      Config->AsNeeded = false;<br>
> +      break;<br>
>      case OPT_Bstatic:<br>
>        Config->Static = true;<br>
>        break;<br>
><br>
> Modified: lld/trunk/ELF/InputFiles.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/InputFiles.cpp (original)<br>
> +++ lld/trunk/ELF/InputFiles.cpp Sun Oct 11 15:59:12 2015<br>
> @@ -329,7 +329,7 @@ template <class ELFT> void SharedFile<EL<br>
>      error(NameOrErr.getError());<br>
>      StringRef Name = *NameOrErr;<br>
><br>
> -    SymbolBodies.emplace_back(Name, Sym);<br>
> +    SymbolBodies.emplace_back(this, Name, Sym);<br>
>    }<br>
>  }<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=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/InputFiles.h (original)<br>
> +++ lld/trunk/ELF/InputFiles.h Sun Oct 11 15:59:12 2015<br>
> @@ -146,7 +146,7 @@ public:<br>
>      uint32_t FirstNonLocal = this->Symtab->sh_info;<br>
>      if (SymbolIndex < FirstNonLocal)<br>
>        return nullptr;<br>
> -    return SymbolBodies[SymbolIndex - FirstNonLocal]->repl();<br>
> +    return SymbolBodies[SymbolIndex - FirstNonLocal];<br>
>    }<br>
><br>
>    Elf_Sym_Range getLocalSymbols();<br>
> @@ -198,6 +198,11 @@ public:<br>
>    StringRef getSoName() const { return SoName; }<br>
>    virtual void parseSoName() = 0;<br>
>    virtual void parse() = 0;<br>
> +<br>
> +  // Used for --as-needed<br>
> +  bool AsNeeded = false;<br>
> +  bool IsUsed = false;<br>
> +  bool isNeeded() const { return !AsNeeded || IsUsed; }<br>
>  };<br>
><br>
>  template <class ELFT><br>
><br>
> Modified: lld/trunk/ELF/InputSection.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/InputSection.cpp (original)<br>
> +++ lld/trunk/ELF/InputSection.cpp Sun Oct 11 15:59:12 2015<br>
> @@ -46,7 +46,7 @@ void InputSection<ELFT>::relocate(<br>
>          continue;<br>
>        SymVA = getLocalSymVA(Sym, File);<br>
>      } else {<br>
> -      SymbolBody &Body = *File.getSymbolBody(SymIndex);<br>
> +      SymbolBody &Body = *File.getSymbolBody(SymIndex)->repl();<br>
>        SymVA = getSymVA<ELFT>(Body);<br>
>        if (Target->relocNeedsPlt(Type, Body)) {<br>
>          SymVA = Out<ELFT>::Plt->getEntryAddr(Body);<br>
><br>
> Modified: lld/trunk/ELF/LinkerScript.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/LinkerScript.cpp (original)<br>
> +++ lld/trunk/ELF/LinkerScript.cpp Sun Oct 11 15:59:12 2015<br>
> @@ -155,12 +155,15 @@ void LinkerScript::addFile(StringRef S)<br>
><br>
>  void LinkerScript::readAsNeeded() {<br>
>    expect("(");<br>
> +  bool Orig = Config->AsNeeded;<br>
> +  Config->AsNeeded = true;<br>
>    for (;;) {<br>
>      StringRef Tok = next();<br>
>      if (Tok == ")")<br>
> -      return;<br>
> +      break;<br>
>      addFile(Tok);<br>
>    }<br>
> +  Config->AsNeeded = Orig;<br>
>  }<br>
><br>
>  void LinkerScript::readEntry() {<br>
><br>
> Modified: lld/trunk/ELF/Options.td<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/Options.td (original)<br>
> +++ lld/trunk/ELF/Options.td Sun Oct 11 15:59:12 2015<br>
> @@ -14,6 +14,8 @@ def allow_multiple_definition: Flag<["--<br>
><br>
>  def allow_shlib_undefined : Flag<["--", "-"], "allow-shlib-undefined">;<br>
><br>
> +def as_needed : Flag<["--"], "as-needed">;<br>
> +<br>
>  def disable_new_dtags : Flag<["--"], "disable-new-dtags">,<br>
>    HelpText<"Disable new dynamic tags">;<br>
><br>
> @@ -52,6 +54,8 @@ def m : Separate<["-"], "m">,<br>
><br>
>  def no_allow_shlib_undefined : Flag<["--"], "no-allow-shlib-undefined">;<br>
><br>
> +def no_as_needed : Flag<["--"], "no-as-needed">;<br>
> +<br>
>  def no_whole_archive : Flag<["--"], "no-whole-archive">,<br>
>    HelpText<"Restores the default behavior of loading archive members">;<br>
><br>
> @@ -111,14 +115,12 @@ def alias_undefined_u : Separate<["-"],<br>
><br>
>  // Options listed below are silently ignored now.<br>
>  def O3 : Flag<["-"], "O3">;<br>
> -def as_needed : Flag<["--"], "as-needed">;<br>
>  def build_id : Flag<["--"], "build-id">;<br>
>  def eh_frame_hdr : Flag<["--"], "eh-frame-hdr">;<br>
>  def end_group : Flag<["--"], "end-group">;<br>
>  def gc_sections : Flag<["--"], "gc-sections">;<br>
>  def hash_style : Joined<["--"], "hash-style=">;<br>
>  def no_add_needed : Flag<["--"], "no-add-needed">;<br>
> -def no_as_needed : Flag<["--"], "no-as-needed">;<br>
>  def no_fatal_warnings : Flag<["--"], "no-fatal-warnings">;<br>
>  def start_group : Flag<["--"], "start-group">;<br>
>  def strip_all : Flag<["--"], "strip-all">;<br>
><br>
> Modified: lld/trunk/ELF/OutputSections.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/OutputSections.cpp (original)<br>
> +++ lld/trunk/ELF/OutputSections.cpp Sun Oct 11 15:59:12 2015<br>
> @@ -116,8 +116,10 @@ template <class ELFT> void RelocationSec<br>
>      OutputSection<ELFT> *OutSec = C.getOutputSection();<br>
>      uint32_t SymIndex = RI.getSymbol(IsMips64EL);<br>
>      const ObjectFile<ELFT> &File = *C.getFile();<br>
> -    const SymbolBody *Body = File.getSymbolBody(SymIndex);<br>
> +    SymbolBody *Body = File.getSymbolBody(SymIndex);<br>
>      const ELFFile<ELFT> &Obj = File.getObj();<br>
> +    if (Body)<br>
> +      Body = Body->repl();<br>
><br>
>      uint32_t Type = RI.getType(IsMips64EL);<br>
><br>
> @@ -279,6 +281,8 @@ template <class ELFT> void DynamicSectio<br>
>      NumEntries += 2;<br>
><br>
>    for (const std::unique_ptr<SharedFile<ELFT>> &F : SymTab.getSharedFiles()) {<br>
> +    if (!F->isNeeded())<br>
> +      continue;<br>
>      Out<ELFT>::DynStrTab->add(F->getSoName());<br>
>      ++NumEntries;<br>
>    }<br>
> @@ -356,7 +360,8 @@ template <class ELFT> void DynamicSectio<br>
>    WriteArray(DT_FINI_ARRAY, DT_FINI_ARRAYSZ, FiniArraySec);<br>
><br>
>    for (const std::unique_ptr<SharedFile<ELFT>> &F : SymTab.getSharedFiles())<br>
> -    WriteVal(DT_NEEDED, Out<ELFT>::DynStrTab->getFileOff(F->getSoName()));<br>
> +    if (F->isNeeded())<br>
> +      WriteVal(DT_NEEDED, Out<ELFT>::DynStrTab->getFileOff(F->getSoName()));<br>
><br>
>    if (InitSym)<br>
>      WritePtr(DT_INIT, getSymVA<ELFT>(*InitSym));<br>
><br>
> Modified: lld/trunk/ELF/Symbols.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/Symbols.h (original)<br>
> +++ lld/trunk/ELF/Symbols.h Sun Oct 11 15:59:12 2015<br>
> @@ -24,6 +24,7 @@ class InputFile;<br>
>  class SymbolBody;<br>
>  template <class ELFT> class ObjectFile;<br>
>  template <class ELFT> class OutputSection;<br>
> +template <class ELFT> class SharedFile;<br>
><br>
>  // Initializes global objects defined in this file.<br>
>  // Called at the beginning of main().<br>
> @@ -263,8 +264,10 @@ public:<br>
>      return S->kind() == Base::SharedKind;<br>
>    }<br>
><br>
> -  SharedSymbol(StringRef Name, const Elf_Sym &Sym)<br>
> -      : Defined<ELFT>(Base::SharedKind, Name, Sym) {}<br>
> +  SharedSymbol(SharedFile<ELFT> *F, StringRef Name, const Elf_Sym &Sym)<br>
> +      : Defined<ELFT>(Base::SharedKind, Name, Sym), File(F) {}<br>
> +<br>
> +  SharedFile<ELFT> *File;<br>
>  };<br>
><br>
>  // This class represents a symbol defined in an archive file. It is<br>
><br>
> Modified: lld/trunk/ELF/Writer.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=249998&r1=249997&r2=249998&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=249998&r1=249997&r2=249998&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/Writer.cpp (original)<br>
> +++ lld/trunk/ELF/Writer.cpp Sun Oct 11 15:59:12 2015<br>
> @@ -174,6 +174,14 @@ void Writer<ELFT>::scanRelocs(<br>
>      uint32_t SymIndex = RI.getSymbol(IsMips64EL);<br>
>      SymbolBody *Body = File.getSymbolBody(SymIndex);<br>
>      uint32_t Type = RI.getType(IsMips64EL);<br>
> +<br>
> +    // Set "used" bit for --as-needed.<br>
> +    if (Body && Body->isUndefined() && !Body->isWeak())<br>
> +      if (auto *S = dyn_cast<SharedSymbol<ELFT>>(Body->repl()))<br>
> +        S->File->IsUsed = true;<br>
> +<br>
> +    if (Body)<br>
> +      Body = Body->repl();<br>
>      if (Body) {<br>
>        if (Target->relocNeedsPlt(Type, *Body)) {<br>
>          if (Body->isInPlt())<br>
> @@ -186,12 +194,13 @@ void Writer<ELFT>::scanRelocs(<br>
>          Out<ELFT>::Got->addEntry(Body);<br>
>        }<br>
>      }<br>
> -    if (canBePreempted(Body)) {<br>
> +<br>
> +    bool CBP = canBePreempted(Body);<br>
> +    if (!CBP && (!Config->Shared || Target->isRelRelative(Type)))<br>
> +      continue;<br>
> +    if (CBP)<br>
>        Body->setUsedInDynamicReloc();<br>
> -      Out<ELFT>::RelaDyn->addReloc({C, RI});<br>
> -    } else if (Config->Shared && !Target->isRelRelative(Type)) {<br>
> -      Out<ELFT>::RelaDyn->addReloc({C, RI});<br>
> -    }<br>
> +    Out<ELFT>::RelaDyn->addReloc({C, RI});<br>
>    }<br>
>  }<br>
><br>
><br>
> Added: lld/trunk/test/elf2/Inputs/shared2.s<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/Inputs/shared2.s?rev=249998&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/Inputs/shared2.s?rev=249998&view=auto</a><br>
> ==============================================================================<br>
> --- lld/trunk/test/elf2/Inputs/shared2.s (added)<br>
> +++ lld/trunk/test/elf2/Inputs/shared2.s Sun Oct 11 15:59:12 2015<br>
> @@ -0,0 +1,6 @@<br>
> +.global bar2<br>
> +.type bar2, @function<br>
> +bar2:<br>
> +<br>
> +.global zed2<br>
> +zed2:<br>
><br>
> Added: lld/trunk/test/elf2/Inputs/shared3.s<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/Inputs/shared3.s?rev=249998&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/Inputs/shared3.s?rev=249998&view=auto</a><br>
> ==============================================================================<br>
> --- lld/trunk/test/elf2/Inputs/shared3.s (added)<br>
> +++ lld/trunk/test/elf2/Inputs/shared3.s Sun Oct 11 15:59:12 2015<br>
> @@ -0,0 +1,3 @@<br>
> +.global baz<br>
> +.type barz, @function<br>
> +baz:<br>
><br>
> Added: lld/trunk/test/elf2/as-needed.s<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/as-needed.s?rev=249998&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/as-needed.s?rev=249998&view=auto</a><br>
> ==============================================================================<br>
> --- lld/trunk/test/elf2/as-needed.s (added)<br>
> +++ lld/trunk/test/elf2/as-needed.s Sun Oct 11 15:59:12 2015<br>
> @@ -0,0 +1,43 @@<br>
> +// REQUIRES: x86<br>
> +// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o<br>
> +// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared.s -o %t2.o<br>
> +// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared2.s -o %t3.o<br>
> +// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared3.s -o %t4.o<br>
> +// RUN: ld.lld2 -shared %t2.o -soname shared1 -o %t2.so<br>
> +// RUN: ld.lld2 -shared %t3.o -soname shared2 -o %t3.so<br>
> +// RUN: ld.lld2 -shared %t4.o -soname shared3 -o %t4.so<br>
> +<br>
> +/// Check if --as-needed actually works.<br>
> +<br>
> +// RUN: ld.lld2 %t.o %t2.so %t3.so %t4.so -o %t2<br>
> +// RUN: llvm-readobj -dynamic-table %t2 | FileCheck %s<br>
> +<br>
> +// RUN: ld.lld2 --as-needed %t.o %t2.so %t3.so %t4.so -o %t2<br>
> +// RUN: llvm-readobj -dynamic-table %t2 | FileCheck -check-prefix=CHECK2 %s<br>
> +<br>
> +// RUN: ld.lld2 --as-needed %t.o %t2.so --no-as-needed %t3.so %t4.so -o %t2<br>
> +// RUN: llvm-readobj -dynamic-table %t2 | FileCheck %s<br>
> +<br>
> +/// GROUP directive is the same as --as-needed.<br>
> +<br>
> +// RUN: echo "GROUP(" %t2.so %t3.so %t4.so ")" > %t.script<br>
> +// RUN: ld.lld2 %t.o %t.script -o %t2<br>
> +// RUN: llvm-readobj -dynamic-table %t2 | FileCheck %s<br>
> +<br>
> +// RUN: echo "GROUP(AS_NEEDED(" %t2.so %t3.so %t4.so "))" > %t.script<br>
> +// RUN: ld.lld2 %t.o %t.script -o %t2<br>
> +// RUN: llvm-readobj -dynamic-table %t2 | FileCheck -check-prefix=CHECK2 %s<br>
> +<br>
> +// CHECK: NEEDED SharedLibrary (shared1)<br>
> +// CHECK: NEEDED SharedLibrary (shared2)<br>
> +// CHECK: NEEDED SharedLibrary (shared3)<br>
> +<br>
> +// CHECK2:     NEEDED SharedLibrary (shared1)<br>
> +// CHECK2-NOT: NEEDED SharedLibrary (shared2)<br>
> +// CHECK2-NOT: NEEDED SharedLibrary (shared3)<br>
> +<br>
> +.global _start<br>
> +_start:<br>
> +.long bar<br>
> +.long zed<br>
> +.weak baz<br>
><br>
><br>
> _______________________________________________<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/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>