summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp21
-rw-r--r--lld/test/pecoff/Inputs/static.libbin0 -> 1120 bytes
2 files changed, 18 insertions, 3 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
index 2fae0a4094f..aa2b782fed1 100644
--- a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
@@ -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
diff --git a/lld/test/pecoff/Inputs/static.lib b/lld/test/pecoff/Inputs/static.lib
new file mode 100644
index 00000000000..5a631010e1d
--- /dev/null
+++ b/lld/test/pecoff/Inputs/static.lib
Binary files differ
OpenPOWER on IntegriCloud