summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp')
-rw-r--r--lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp37
1 files changed, 18 insertions, 19 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp b/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
index 577f5a86107..671df194a24 100644
--- a/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
+++ b/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
@@ -91,28 +91,27 @@ bool ELFTargetInfo::isDynamic() const {
return false;
}
-
-error_code ELFTargetInfo::parseFile(std::unique_ptr<MemoryBuffer> &mb,
- std::vector<std::unique_ptr<File>> &result) const {
+error_code
+ELFTargetInfo::parseFile(std::unique_ptr<MemoryBuffer> mb,
+ std::vector<std::unique_ptr<File>> &result) const {
if (!_elfReader)
_elfReader = createReaderELF(*this);
- error_code ec = _elfReader->parseFile(mb, result);
- if (ec) {
- // Not an ELF file, check file extension to see if it might be yaml
- StringRef path = mb->getBufferIdentifier();
- if ( path.endswith(".objtxt") ) {
- if (!_yamlReader)
- _yamlReader = createReaderYAML(*this);
- ec = _yamlReader->parseFile(mb, result);
- }
- if (ec) {
- // Not a yaml file, assume it is a linkerscript
- if (!_linkerScriptReader)
- _linkerScriptReader.reset(new ReaderLinkerScript(*this));
- ec = _linkerScriptReader->parseFile(mb, result);
- }
+ std::string path = mb->getBufferIdentifier();
+ auto magic = llvm::sys::fs::identify_magic(mb->getBuffer());
+ if (magic == llvm::sys::fs::file_magic::elf_relocatable ||
+ magic == llvm::sys::fs::file_magic::elf_shared_object ||
+ magic == llvm::sys::fs::file_magic::archive)
+ return _elfReader->parseFile(std::move(mb), result);
+ // Not an ELF file, check file extension to see if it might be yaml
+ if (StringRef(path).endswith(".objtxt")) {
+ if (!_yamlReader)
+ _yamlReader = createReaderYAML(*this);
+ return _yamlReader->parseFile(std::move(mb), result);
}
- return ec;
+ // Not a yaml file, assume it is a linkerscript
+ if (!_linkerScriptReader)
+ _linkerScriptReader.reset(new ReaderLinkerScript(*this));
+ return _linkerScriptReader->parseFile(std::move(mb), result);
}
Writer &ELFTargetInfo::writer() const {
OpenPOWER on IntegriCloud