Scratch that, I found the issue, trivial fix in:<div>   <a href="http://llvm.org/viewvc/llvm-project?view=rev&revision=167866">http://llvm.org/viewvc/llvm-project?view=rev&revision=167866</a></div><div><br></div><div>
 - Daniel</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Nov 13, 2012 at 11:35 AM, Shankar Easwaran <span dir="ltr"><<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Daniel,<br>
<br>
I will fix it ASAP.<br>
<br>
Thanks<br>
<br>
Shankar Easwaran<div class="HOEnZb"><div class="h5"><br>
<br>
On 11/13/2012 1:33 PM, Daniel Dunbar wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I attached a copy of the output on my machine. It looks to me like<br>
non-determinism in the output, because on my machine I get:<br>
--<br>
          w ??_Elogic_error@std@@UAEPAXI@Z<br>
00000000 T ??_Ginvalid_argument@std@@<u></u>UAEPAXI@Z<br>
          U ??_Ginvalid_argument@std@@<u></u>UAEPAXI@Z<br>
00000000 T ??_Glogic_error@std@@UAEPAXI@Z<br>
--<br>
where the test seems to think the expected output is:<br>
--<br>
CHECKIDX:          w ??_Elogic_error@std@@UAEPAXI@Z<br>
CHECKIDX:          U ??_Ginvalid_argument@std@@<u></u>UAEPAXI@Z<br>
CHECKIDX: 00000000 T ??_Ginvalid_argument@std@@<u></u>UAEPAXI@Z<br>
CHECKIDX: 00000000 T ??_Glogic_error@std@@UAEPAXI@Z<br>
--<br>
<br>
  - Daniel<br>
<br>
<br>
On Tue, Nov 13, 2012 at 11:05 AM, Chad Rosier <<a href="mailto:mcrosier@apple.com" target="_blank">mcrosier@apple.com</a>> wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Shankar,<br>
This is causing a test failure on one of our internal buildbots.<br>
<br>
******************** TEST 'LLVM :: Object/coff-archive.test' FAILED ********************Script:<br>
--<br>
Release+Asserts/bin/llvm-nm -s llvm/test/Object/Inputs/coff_<u></u>archive.lib | Release+Asserts/bin/FileCheck -check-prefix=CHECKIDX llvm/test/Object/coff-archive.<u></u>test<br>
--<br>
Exit Code: 1<br>
Command Output (stderr):<br>
--<br>
llvm/test/Object/coff-archive.<u></u>test:159:11: error: expected string not found in input<br>
CHECKIDX: U ??_Glogic_error@std@@UAEPAXI@Z<br>
           ^<br>
<stdin>:156:1: note: scanning from here<br>
00000000 D ??_R0?AVexception@std@@@8<br>
^<br>
<stdin>:173:10: note: possible intended match here<br>
00000000 R ??_R4logic_error@std@@6B@<br>
          ^<br>
--<br>
<br>
********************<br>
<br>
Regards,<br>
   Chad<br>
<br>
On Nov 13, 2012, at 10:39 AM, Shankar Easwaran <<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>><br>
wrote:<br>
<br>
Author: shankare<br>
Date: Tue Nov 13 12:39:10 2012<br>
New Revision: 167854<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=167854&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=167854&view=rev</a><br>
Log:<br>
Adding support to resolve symbols with archive libraries in lld<br>
<br>
Added:<br>
    lld/trunk/include/lld/<u></u>ReaderWriter/ReaderArchive.h<br>
    lld/trunk/lib/ReaderWriter/<u></u>ReaderArchive.cpp<br>
    lld/trunk/test/elf/Inputs/<u></u>libfnarchive.x86_64   (with props)<br>
    lld/trunk/test/elf/Inputs/<u></u>mainobj.x86_64   (with props)<br>
    lld/trunk/test/elf/archive-<u></u>elf-forceload.objtxt<br>
    lld/trunk/test/elf/archive-<u></u>elf.objtxt<br>
Modified:<br>
    lld/trunk/include/lld/<u></u>ReaderWriter/ReaderELF.h<br>
    lld/trunk/lib/ReaderWriter/<u></u>CMakeLists.txt<br>
    lld/trunk/lib/ReaderWriter/<u></u>ELF/ReaderELF.cpp<br>
    lld/trunk/tools/lld-core/lld-<u></u>core.cpp<br>
<br>
Added: lld/trunk/include/lld/<u></u>ReaderWriter/ReaderArchive.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ReaderArchive.h?rev=167854&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>ReaderWriter/ReaderArchive.h?<u></u>rev=167854&view=auto</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/<u></u>ReaderWriter/ReaderArchive.h (added)<br>
+++ lld/trunk/include/lld/<u></u>ReaderWriter/ReaderArchive.h Tue Nov 13 12:39:10<br>
2012<br>
@@ -0,0 +1,80 @@<br>
+//===- ReaderWriter/ReaderArchive.h - Archive Library Reader<br>
------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
<br>
+//===------------------------<u></u>------------------------------<u></u>--------------===//<br>
+<br>
+#ifndef LLD_READER_ARCHIVE_H<br>
+#define LLD_READER_ARCHIVE_H<br>
+<br>
+#include "lld/Core/ArchiveLibraryFile.<u></u>h"<br>
+#include "llvm/Object/ObjectFile.h"<br>
+#include "llvm/ADT/OwningPtr.h"<br>
+#include "llvm/ADT/StringRef.h"<br>
+#include "llvm/Support/MemoryBuffer.h"<br>
+#include "llvm/Support/system_error.h"<br>
+#include "llvm/Object/Archive.h"<br>
+#include "lld/Core/File.h"<br>
+#include "lld/Core/LLVM.h"<br>
+#include "lld/ReaderWriter/Reader.h"<br>
+#include "lld/ReaderWriter/<u></u>ReaderArchive.h"<br>
+#include <memory><br>
+#include <bits/unique_ptr.h><br>
+#include <vector><br>
+<br>
+namespace lld<br>
+{<br>
+///<br>
+/// The ReaderOptionsArchive encapsulates the options used by the<br>
ReaderArchive.<br>
+/// The option objects are the only way to control the behaviour of<br>
Readers.<br>
+///<br>
+class ReaderOptionsArchive<br>
+{<br>
+public:<br>
+  ReaderOptionsArchive(bool is_force_load=false):<br>
_isForceLoad(is_force_load),<br>
+                                                  _reader(nullptr)<br>
+  { }<br>
+<br>
+  bool isForceLoad() const {<br>
+    return _isForceLoad;<br>
+  }<br>
+<br>
+  Reader *reader() const {<br>
+    return _reader;<br>
+  }<br>
+<br>
+  void setReader(Reader *r) {<br>
+    _reader = r;<br>
+  }<br>
+<br>
+private:<br>
+  bool _isForceLoad;<br>
+  Reader *_reader;<br>
+};<br>
+<br>
+// ReaderArchive is a class for reading archive libraries<br>
+class ReaderArchive final<br>
+{<br>
+public:<br>
+  ReaderArchive(<u></u>ReaderOptionsArchive &options) : _options(options),<br>
+                                                 _archive()<br>
+  { }<br>
+<br>
+  // Returns a vector of Files that are contained in the archive file<br>
+  // pointed to by the Memorybuffer<br>
+  virtual error_code parseFile(std::unique_ptr<<u></u>llvm::MemoryBuffer> mb,<br>
+                               std::vector<std::unique_ptr<<u></u>File>><br>
&result);<br>
+<br>
+  virtual ~ReaderArchive() { }<br>
+<br>
+private:<br>
+  ReaderOptionsArchive &_options;<br>
+  std::unique_ptr<llvm::object::<u></u>Archive> _archive;<br>
+};<br>
+<br>
+} // namespace lld<br>
+<br>
+#endif // LLD_READER_ARCHIVE_H<br>
<br>
Modified: lld/trunk/include/lld/<u></u>ReaderWriter/ReaderELF.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ReaderELF.h?rev=167854&r1=167853&r2=167854&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>ReaderWriter/ReaderELF.h?rev=<u></u>167854&r1=167853&r2=167854&<u></u>view=diff</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/<u></u>ReaderWriter/ReaderELF.h (original)<br>
+++ lld/trunk/include/lld/<u></u>ReaderWriter/ReaderELF.h Tue Nov 13 12:39:10 2012<br>
@@ -11,6 +11,7 @@<br>
#define LLD_READERWRITER_READER_ELF_H_<br>
<br>
#include "lld/ReaderWriter/Reader.h"<br>
+#include "lld/ReaderWriter/<u></u>ReaderArchive.h"<br>
#include "lld/Core/LLVM.h"<br>
<br>
<br>
@@ -56,7 +57,8 @@<br>
/// ReaderOptionsELF object supplied, so the objects object must not be<br>
/// destroyed before the Reader object.<br>
///<br>
-Reader* createReaderELF(const ReaderOptionsELF &options);<br>
+Reader* createReaderELF(const ReaderOptionsELF &options,<br>
+                        ReaderOptionsArchive &optionsArchive);<br>
<br>
<br>
<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>CMakeLists.txt<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/CMakeLists.txt?rev=167854&r1=167853&r2=167854&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/CMakeLists.txt?<u></u>rev=167854&r1=167853&r2=<u></u>167854&view=diff</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>CMakeLists.txt (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>CMakeLists.txt Tue Nov 13 12:39:10 2012<br>
@@ -6,4 +6,5 @@<br>
add_lld_library(<u></u>lldReaderWriter<br>
   Reader.cpp<br>
   Writer.cpp<br>
+  ReaderArchive.cpp<br>
   )<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/ReaderELF.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ReaderELF.cpp?rev=167854&r1=167853&r2=167854&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/ReaderELF.<u></u>cpp?rev=167854&r1=167853&r2=<u></u>167854&view=diff</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/ReaderELF.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/ReaderELF.cpp Tue Nov 13 12:39:10 2012<br>
@@ -12,9 +12,9 @@<br>
//<br>
<br>
//===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
#include "lld/ReaderWriter/ReaderELF.h"<br>
+#include "lld/ReaderWriter/<u></u>ReaderArchive.h"<br>
#include "lld/Core/File.h"<br>
#include "lld/Core/Reference.h"<br>
-<br>
#include "llvm/ADT/ArrayRef.h"<br>
#include "llvm/ADT/SmallString.h"<br>
#include "llvm/ADT/StringRef.h"<br>
@@ -30,6 +30,7 @@<br>
#include "llvm/Support/MemoryBuffer.h"<br>
#include "llvm/Support/raw_ostream.h"<br>
#include "llvm/Support/system_error.h"<br>
+#include "llvm/Support/Path.h"<br>
<br>
<br>
#include <map><br>
@@ -751,43 +752,72 @@<br>
<br>
class ReaderELF: public Reader {<br>
public:<br>
-  ReaderELF(const ReaderOptionsELF &) {}<br>
+  ReaderELF(const ReaderOptionsELF &readerELFOptions,<br>
+            ReaderOptionsArchive &readerOptionsArchive)<br>
+         : _readerELFOptions(<u></u>readerELFOptions),<br>
+           _readerOptionsArchive(<u></u>readerOptionsArchive),<br>
+           _readerArchive(_<u></u>readerOptionsArchive) {<br>
+    _readerOptionsArchive.<u></u>setReader(this);<br>
+  }<br>
+<br>
   error_code parseFile(std::unique_ptr<<u></u>MemoryBuffer> mb, std::vector<<br>
-      std::unique_ptr<File> > &result) {<br>
+                       std::unique_ptr<File> > &result) {<br>
+    llvm::error_code ec;<br>
+    std::unique_ptr<File> f;<br>
+    std::pair<unsigned char, unsigned char> Ident;<br>
<br>
-    std::pair<unsigned char, unsigned char> Ident =<br>
-        llvm::object::getElfArchType(&<u></u>*mb);<br>
-    llvm::error_code ec;<br>
-    //    Instantiate the correct FileELF template instance<br>
-    //    based on the Ident pair. Once the File is created<br>
-    //     we push the file to the vector of files already<br>
-    //     created during parser's life.<br>
+    llvm::sys::LLVMFileType fileType =<br>
+          llvm::sys::IdentifyFileType(<u></u>mb->getBufferStart(),<br>
+<br>
                                static_cast<unsigned>(mb-><u></u>getBufferSize()));<br>
+    switch (fileType) {<br>
+<br>
+      case llvm::sys::ELF_Relocatable_<u></u>FileType:<br>
+<br>
+        Ident = llvm::object::getElfArchType(&<u></u>*mb);<br>
+        //    Instantiate the correct FileELF template instance<br>
+        //    based on the Ident pair. Once the File is created<br>
+        //     we push the file to the vector of files already<br>
+        //     created during parser's life.<br>
+<br>
+        if (Ident.first == llvm::ELF::ELFCLASS32 && Ident.second<br>
+            == llvm::ELF::ELFDATA2LSB) {<br>
+          f.reset(new FileELF<llvm::support::little,<br>
false>(std::move(mb), ec));<br>
+<br>
+        } else if (Ident.first == llvm::ELF::ELFCLASS32 && Ident.second<br>
+            == llvm::ELF::ELFDATA2MSB) {<br>
+          f.reset(new FileELF<llvm::support::big, false> (std::move(mb),<br>
ec));<br>
+<br>
+        } else if (Ident.first == llvm::ELF::ELFCLASS64 && Ident.second<br>
+            == llvm::ELF::ELFDATA2MSB) {<br>
+          f.reset(new FileELF<llvm::support::big, true> (std::move(mb),<br>
ec));<br>
+<br>
+        } else if (Ident.first == llvm::ELF::ELFCLASS64 && Ident.second<br>
+            == llvm::ELF::ELFDATA2LSB) {<br>
+          f.reset(new FileELF<llvm::support::little, true><br>
(std::move(mb), ec));<br>
+        }<br>
+        if (!ec)<br>
+          result.push_back(std::move(f))<u></u>;<br>
+        break;<br>
<br>
-    std::unique_ptr<File> f;<br>
+      case llvm::sys::Archive_FileType:<br>
+        ec = _readerArchive.parseFile(std::<u></u>move(mb), result);<br>
+        break;<br>
<br>
-    if (Ident.first == llvm::ELF::ELFCLASS32 && Ident.second<br>
-        == llvm::ELF::ELFDATA2LSB) {<br>
-      f.reset(new FileELF<llvm::support::little, false>(std::move(mb),<br>
ec));<br>
-<br>
-    } else if (Ident.first == llvm::ELF::ELFCLASS32 && Ident.second<br>
-        == llvm::ELF::ELFDATA2MSB) {<br>
-      f.reset(new FileELF<llvm::support::big, false> (std::move(mb), ec));<br>
-<br>
-    } else if (Ident.first == llvm::ELF::ELFCLASS64 && Ident.second<br>
-        == llvm::ELF::ELFDATA2MSB) {<br>
-      f.reset(new FileELF<llvm::support::big, true> (std::move(mb), ec));<br>
-<br>
-    } else if (Ident.first == llvm::ELF::ELFCLASS64 && Ident.second<br>
-        == llvm::ELF::ELFDATA2LSB) {<br>
-      f.reset(new FileELF<llvm::support::little, true> (std::move(mb),<br>
ec));<br>
+      default:<br>
+        llvm_unreachable("not supported format");<br>
+        break;<br>
     }<br>
<br>
     if (ec)<br>
       return ec;<br>
<br>
-    result.push_back(std::move(f))<u></u>;<br>
     return error_code::success();<br>
   }<br>
+<br>
+private:<br>
+  const ReaderOptionsELF &_readerELFOptions;<br>
+  ReaderOptionsArchive &_readerOptionsArchive;<br>
+  ReaderArchive _readerArchive;<br>
};<br>
<br>
} // namespace anonymous<br>
@@ -800,8 +830,9 @@<br>
ReaderOptionsELF::~<u></u>ReaderOptionsELF() {<br>
}<br>
<br>
-Reader *createReaderELF(const ReaderOptionsELF &options) {<br>
-  return new ReaderELF(options);<br>
+Reader *createReaderELF(const ReaderOptionsELF &options,<br>
+                        ReaderOptionsArchive &optionsArchive) {<br>
+  return new ReaderELF(options, optionsArchive);<br>
}<br>
<br>
} // namespace LLD<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>ReaderArchive.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ReaderArchive.cpp?rev=167854&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ReaderArchive.<u></u>cpp?rev=167854&view=auto</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ReaderArchive.cpp (added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ReaderArchive.cpp Tue Nov 13 12:39:10 2012<br>
@@ -0,0 +1,160 @@<br>
+//===- lib/ReaderWriter/<u></u>ReaderArchive.cpp - Archive Library<br>
Reader--------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
<br>
+//===------------------------<u></u>------------------------------<u></u>---------------===//<br>
+#include "lld/ReaderWriter/<u></u>ReaderArchive.h"<br>
+<br>
+namespace lld<br>
+{<br>
+// The FileArchive class represents an Archive Library file<br>
+class FileArchive : public ArchiveLibraryFile {<br>
+public:<br>
+<br>
+  virtual ~FileArchive() { }<br>
+<br>
+  /// Check if any member of the archive contains an Atom with the<br>
+  /// specified name and return the File object for that member, or<br>
nullptr.<br>
+  virtual const File *find(StringRef name, bool dataSymbolOnly) const {<br>
+    error_code ec;<br>
+    llvm::object::Archive::child_<u></u>iterator ci;<br>
+<br>
+    ci = _archive.get()->findSym(name);<br>
+    if (ci == _archive->end_children())<br>
+      return nullptr;<br>
+<br>
+    if (dataSymbolOnly && (ec = isDataSymbol(ci->getBuffer(), name)))<br>
+      return nullptr;<br>
+<br>
+    std::vector<std::unique_ptr<<u></u>File>> result;<br>
+<br>
+    if ((ec = _options.reader()->parseFile(<u></u>std::unique_ptr<MemoryBuffer><br>
+                                           (ci->getBuffer()), result)))<br>
+      return nullptr;<br>
+<br>
+    assert(result.size() == 1);<br>
+<br>
+    // give up the pointer so that this object no longer manages it<br>
+    for (std::unique_ptr<File> &f : result) {<br>
+      return f.release();<br>
+    }<br>
+<br>
+    return nullptr;<br>
+  }<br>
+<br>
+  virtual void addAtom(const Atom&) {<br>
+    llvm_unreachable("cannot add atoms to archive files");<br>
+  }<br>
+<br>
+  virtual const atom_collection<DefinedAtom> &defined() const {<br>
+    return _definedAtoms;<br>
+  }<br>
+<br>
+  virtual const atom_collection<UndefinedAtom> &undefined() const {<br>
+    return _undefinedAtoms;<br>
+  }<br>
+<br>
+  virtual const atom_collection<<u></u>SharedLibraryAtom> &sharedLibrary() const<br>
{<br>
+    return _sharedLibraryAtoms;<br>
+  }<br>
+<br>
+  virtual const atom_collection<AbsoluteAtom> &absolute() const {<br>
+    return _absoluteAtoms;<br>
+  }<br>
+<br>
+protected:<br>
+  error_code isDataSymbol(MemoryBuffer *mb, StringRef symbol) const<br>
+  {<br>
+    llvm::object::ObjectFile *obj =<br>
+                  llvm::object::ObjectFile::<u></u>createObjectFile(mb);<br>
+    error_code ec;<br>
+    llvm::object::SymbolRef::Type symtype;<br>
+    uint32_t symflags;<br>
+    llvm::object::symbol_iterator ibegin = obj->begin_symbols();<br>
+    llvm::object::symbol_iterator iend = obj->end_symbols();<br>
+    StringRef symbolname;<br>
+<br>
+    for (llvm::object::symbol_iterator i = ibegin; i != iend;<br>
i.increment(ec)) {<br>
+      if (ec) return ec;<br>
+<br>
+      // Get symbol name<br>
+      if ((ec = (i->getName(symbolname)))) return ec;<br>
+<br>
+      if (symbolname != symbol)<br>
+          continue;<br>
+<br>
+      // Get symbol flags<br>
+      if ((ec = (i->getFlags(symflags)))) return ec;<br>
+<br>
+      if (symflags <= llvm::object::SymbolRef::SF_<u></u>Undefined)<br>
+          continue;<br>
+<br>
+      // Get Symbol Type<br>
+      if ((ec = (i->getType(symtype)))) return ec;<br>
+<br>
+      if (symtype == llvm::object::SymbolRef::ST_<u></u>Data) {<br>
+        return error_code::success();<br>
+      }<br>
+    }<br>
+    return llvm::object::object_error::<u></u>parse_failed;<br>
+  }<br>
+<br>
+private:<br>
+  llvm::MemoryBuffer *_mb;<br>
+  std::unique_ptr<llvm::object::<u></u>Archive> _archive;<br>
+  const ReaderOptionsArchive _options;<br>
+  atom_collection_vector<<u></u>DefinedAtom>       _definedAtoms;<br>
+  atom_collection_vector<<u></u>UndefinedAtom>     _undefinedAtoms;<br>
+  atom_collection_vector<<u></u>SharedLibraryAtom> _sharedLibraryAtoms;<br>
+  atom_collection_vector<<u></u>AbsoluteAtom>      _absoluteAtoms;<br>
+<br>
+public:<br>
+  /// only subclasses of ArchiveLibraryFile can be instantiated<br>
+  explicit FileArchive(llvm::MemoryBuffer *mb,<br>
+                       const ReaderOptionsArchive &options,<br>
+                       error_code &ec)<br>
+                      :ArchiveLibraryFile(mb-><u></u>getBufferIdentifier()),<br>
+                       _mb(mb),<br>
+                       _archive(nullptr),<br>
+                       _options(options) {<br>
+    auto *archive_obj = new llvm::object::Archive(mb, ec);<br>
+    if (ec)<br>
+      return;<br>
+    _archive.reset(archive_obj);<br>
+  }<br>
+}; // class FileArchive<br>
+<br>
+// Returns a vector of Files that are contained in the archive file<br>
+// pointed to by the MemoryBuffer<br>
+error_code ReaderArchive::parseFile(std::<u></u>unique_ptr<llvm::MemoryBuffer><br>
mb,<br>
+ std::vector<std::unique_ptr<<u></u>File>> &result) {<br>
+  error_code ec;<br>
+<br>
+  if (_options.isForceLoad())<br>
+  {<br>
+    _archive.reset(new llvm::object::Archive(mb.<u></u>release(), ec));<br>
+    if (ec)<br>
+      return ec;<br>
+<br>
+    for (auto mf = _archive->begin_children(),<br>
+              me = _archive->end_children(); mf != me; ++mf)<br>
+    {<br>
+     if ((ec = _options.reader()->parseFile(<u></u>std::unique_ptr<MemoryBuffer><br>
+                                             (mf->getBuffer()), result)))<br>
+        return ec;<br>
+    }<br>
+  } else {<br>
+    std::unique_ptr<File> f;<br>
+    f.reset(new FileArchive(mb.release(), _options, ec));<br>
+    if (ec)<br>
+      return ec;<br>
+<br>
+    result.push_back(std::move(f))<u></u>;<br>
+  }<br>
+  return llvm::error_code::success();<br>
+}<br>
+<br>
+} // namespace lld<br>
<br>
Added: lld/trunk/test/elf/Inputs/<u></u>libfnarchive.x86_64<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Inputs/libfnarchive.x86_64?rev=167854&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/elf/<u></u>Inputs/libfnarchive.x86_64?<u></u>rev=167854&view=auto</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: lld/trunk/test/elf/Inputs/<u></u>libfnarchive.x86_64<br>
<br>
------------------------------<u></u>------------------------------<u></u>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: lld/trunk/test/elf/Inputs/<u></u>mainobj.x86_64<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Inputs/mainobj.x86_64?rev=167854&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/elf/<u></u>Inputs/mainobj.x86_64?rev=<u></u>167854&view=auto</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
Binary file - no diff available.<br>
<br>
Propchange: lld/trunk/test/elf/Inputs/<u></u>mainobj.x86_64<br>
<br>
------------------------------<u></u>------------------------------<u></u>------------------<br>
    svn:mime-type = application/octet-stream<br>
<br>
Added: lld/trunk/test/elf/archive-<u></u>elf-forceload.objtxt<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/archive-elf-forceload.objtxt?rev=167854&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/elf/<u></u>archive-elf-forceload.objtxt?<u></u>rev=167854&view=auto</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/elf/archive-<u></u>elf-forceload.objtxt (added)<br>
+++ lld/trunk/test/elf/archive-<u></u>elf-forceload.objtxt Tue Nov 13 12:39:10<br>
2012<br>
@@ -0,0 +1,48 @@<br>
+# Tests the functionality of archive libraries reading<br>
+# and resolution<br>
+# Note: The binary files would not be required once we have support to<br>
generate<br>
+# binary archives from textual(yaml) input<br>
+#<br>
+# Tests generated using the source files below<br>
+# main file<br>
+# int main()<br>
+# {<br>
+#   fn();<br>
+#   return 0;<br>
+# }<br>
+#<br>
+# archive file<br>
+# int fn()<br>
+# {<br>
+#   return 0;<br>
+# }<br>
+#<br>
+# int fn1()<br>
+# {<br>
+#   return 0;<br>
+# }<br>
+# gcc -c main.c fn.c fn1.c<br>
+<br>
+RUN: lld-core -reader ELF %p/Inputs/mainobj.x86_64<br>
%p/Inputs/libfnarchive.x86_64 -force-load | FileCheck -check-prefix<br>
FORCELOAD %s<br>
+<br>
+FORCELOAD:    - name:              fn1<br>
+FORCELOAD:      scope:             global<br>
+FORCELOAD:      type:              code<br>
+FORCELOAD:      section-choice:    custom-required<br>
+FORCELOAD:      section-name:      .text<br>
+FORCELOAD:      content:           [ 55, 48, 89, E5, B8, 00, 00, 00, 00,<br>
5D, C3 ]<br>
+FORCELOAD:    - name:              fn<br>
+FORCELOAD:      scope:             global<br>
+FORCELOAD:      type:              code<br>
+FORCELOAD:      section-choice:    custom-required<br>
+FORCELOAD:      section-name:      .text<br>
+FORCELOAD:      content:           [ 55, 48, 89, E5, B8, 00, 00, 00, 00,<br>
5D, C3 ]<br>
+FORCELOAD:    - name:              main.c<br>
+FORCELOAD:      definition:        absolute<br>
+FORCELOAD:      value:             0x0<br>
+FORCELOAD:    - name:              fn1.c<br>
+FORCELOAD:      definition:        absolute<br>
+FORCELOAD:      value:             0x0<br>
+FORCELOAD:    - name:              fn.c<br>
+FORCELOAD:      definition:        absolute<br>
+FORCELOAD:      value:             0x0<br>
<br>
Added: lld/trunk/test/elf/archive-<u></u>elf.objtxt<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/archive-elf.objtxt?rev=167854&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/elf/<u></u>archive-elf.objtxt?rev=167854&<u></u>view=auto</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/elf/archive-<u></u>elf.objtxt (added)<br>
+++ lld/trunk/test/elf/archive-<u></u>elf.objtxt Tue Nov 13 12:39:10 2012<br>
@@ -0,0 +1,39 @@<br>
+# Tests the functionality of archive libraries reading<br>
+# and resolution<br>
+# Note: The binary files would not be required once we have support to<br>
generate<br>
+# binary archives from textual(yaml) input<br>
+#<br>
+# Tests generated using the source files below<br>
+# main file<br>
+# int main()<br>
+# {<br>
+#   fn();<br>
+#   return 0;<br>
+# }<br>
+#<br>
+# archive file<br>
+# int fn()<br>
+# {<br>
+#   return 0;<br>
+# }<br>
+#<br>
+# int fn1()<br>
+# {<br>
+#   return 0;<br>
+# }<br>
+# gcc -c main.c fn.c fn1.c<br>
+<br>
+RUN: lld-core -reader ELF %p/Inputs/mainobj.x86_64<br>
%p/Inputs/libfnarchive.x86_64 | FileCheck -check-prefix NOFORCELOAD %s<br>
+<br>
+NOFORCELOAD:    - name:              fn<br>
+NOFORCELOAD:      scope:             global<br>
+NOFORCELOAD:      type:              code<br>
+NOFORCELOAD:      section-choice:    custom-required<br>
+NOFORCELOAD:      section-name:      .text<br>
+NOFORCELOAD:      content:           [ 55, 48, 89, E5, B8, 00, 00, 00,<br>
00, 5D, C3 ]<br>
+NOFORCELOAD:    - name:              main.c<br>
+NOFORCELOAD:      definition:        absolute<br>
+NOFORCELOAD:      value:             0x0<br>
+NOFORCELOAD:    - name:              fn.c<br>
+NOFORCELOAD:      definition:        absolute<br>
+NOFORCELOAD:      value:             0x0<br>
<br>
Modified: lld/trunk/tools/lld-core/lld-<u></u>core.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/tools/lld-core/lld-core.cpp?rev=167854&r1=167853&r2=167854&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/tools/lld-<u></u>core/lld-core.cpp?rev=167854&<u></u>r1=167853&r2=167854&view=diff</a><br>

<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/tools/lld-core/lld-<u></u>core.cpp (original)<br>
+++ lld/trunk/tools/lld-core/lld-<u></u>core.cpp Tue Nov 13 12:39:10 2012<br>
@@ -12,6 +12,7 @@<br>
#include "lld/Core/Pass.h"<br>
#include "lld/Core/Resolver.h"<br>
#include "lld/ReaderWriter/Reader.h"<br>
+#include "lld/ReaderWriter/<u></u>ReaderArchive.h"<br>
#include "lld/ReaderWriter/<u></u>ReaderNative.h"<br>
#include "lld/ReaderWriter/ReaderYAML.<u></u>h"<br>
#include "lld/ReaderWriter/ReaderELF.h"<br>
@@ -76,6 +77,10 @@<br>
           llvm::cl::desc("Any undefined symbols at end is an error"));<br>
<br>
llvm::cl::opt<bool><br>
+cmdLineForceLoad("force-load"<u></u>,<br>
+          llvm::cl::desc("force load all members of the archive"));<br>
+<br>
+llvm::cl::opt<bool><br>
cmdLineCommonsSearchArchives("<u></u>commons-search-archives",<br>
           llvm::cl::desc("Tentative definitions trigger archive search"));<br>
<br>
@@ -214,6 +219,8 @@<br>
   // create object to mange input files<br>
   InputFiles inputFiles;<br>
<br>
+  ReaderOptionsArchive readerOptionsArchive(<u></u>cmdLineForceLoad);<br>
+<br>
   // read input files into in-memory File objects<br>
<br>
   TestingReaderOptionsYAML  readerOptionsYAML;<br>
@@ -231,7 +238,9 @@<br>
       reader = createReaderPECOFF(lld::<u></u>ReaderOptionsPECOFF());<br>
       break;<br>
     case readerELF:<br>
-      reader = createReaderELF(lld::<u></u>ReaderOptionsELF());<br>
+      reader = createReaderELF(lld::<u></u>ReaderOptionsELF(),<br>
+                               readerOptionsArchive);<br>
+<br>
       break;<br>
     default:<br>
       reader = createReaderYAML(<u></u>readerOptionsYAML);<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
<br>
<br>
</blockquote></blockquote>
<br>
<br></div></div><span class="HOEnZb"><font color="#888888">
-- <br>
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation<br>
<br>
</font></span></blockquote></div><br></div>