[lld] r184036 - [PECOFF] Support .lib archive file.

Rui Ueyama ruiu at google.com
Fri Jun 14 22:15:41 PDT 2013


Author: ruiu
Date: Sat Jun 15 00:15:41 2013
New Revision: 184036

URL: http://llvm.org/viewvc/llvm-project?rev=184036&view=rev
Log:
[PECOFF] Support .lib archive file.

Archive file in Windows has file extension of ".lib" but the file format is
in fact the same as Unix. It's an ar archive holding multiple .obj files.
The existing archive reader can read .lib files.

Added:
    lld/trunk/test/pecoff/Inputs/static.lib
Modified:
    lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp

Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp?rev=184036&r1=184035&r2=184036&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp Sat Jun 15 00:15:41 2013
@@ -9,8 +9,9 @@
 
 #define DEBUG_TYPE "ReaderCOFF"
 
-#include "lld/ReaderWriter/Reader.h"
 #include "lld/Core/File.h"
+#include "lld/ReaderWriter/Reader.h"
+#include "lld/ReaderWriter/ReaderArchive.h"
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/Object/COFF.h"
@@ -546,11 +547,23 @@ private:
 
 class ReaderCOFF : public Reader {
 public:
-  ReaderCOFF(const TargetInfo &ti) : Reader(ti) {}
+  ReaderCOFF(const TargetInfo &ti) : Reader(ti), _readerArchive(ti, *this) {}
 
   error_code parseFile(std::unique_ptr<MemoryBuffer> &mb,
                        std::vector<std::unique_ptr<File> > &result) const {
-    llvm::error_code ec;
+    StringRef magic(mb->getBufferStart(), mb->getBufferSize());
+    llvm::sys::fs::file_magic fileType = llvm::sys::fs::identify_magic(magic);
+    if (fileType == llvm::sys::fs::file_magic::coff_object)
+      return parseCOFFFile(mb, result);
+    if (fileType == llvm::sys::fs::file_magic::archive)
+      return _readerArchive.parseFile(mb, result);
+    return make_error_code(llvm::object::object_error::invalid_file_type);
+  }
+
+private:
+  error_code parseCOFFFile(std::unique_ptr<MemoryBuffer> &mb,
+                           std::vector<std::unique_ptr<File> > &result) const {
+    error_code ec;
     std::unique_ptr<File> file(new FileCOFF(_targetInfo, std::move(mb), ec));
     if (ec)
       return ec;
@@ -568,6 +581,8 @@ public:
     result.push_back(std::move(file));
     return error_code::success();
   }
+
+  ReaderArchive _readerArchive;
 };
 
 } // end namespace anonymous

Added: lld/trunk/test/pecoff/Inputs/static.lib
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/static.lib?rev=184036&view=auto
==============================================================================
Binary files lld/trunk/test/pecoff/Inputs/static.lib (added) and lld/trunk/test/pecoff/Inputs/static.lib Sat Jun 15 00:15:41 2013 differ





More information about the llvm-commits mailing list