summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/ELF
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter/ELF')
-rw-r--r--lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp36
-rw-r--r--lld/lib/ReaderWriter/ELF/Reader.cpp11
2 files changed, 23 insertions, 24 deletions
diff --git a/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp b/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
index 671df194a24..db3a032feeb 100644
--- a/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
+++ b/lld/lib/ReaderWriter/ELF/ELFTargetInfo.cpp
@@ -91,27 +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);
- 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);
+ 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);
+ }
}
- // Not a yaml file, assume it is a linkerscript
- if (!_linkerScriptReader)
- _linkerScriptReader.reset(new ReaderLinkerScript(*this));
- return _linkerScriptReader->parseFile(std::move(mb), result);
+ return ec;
}
Writer &ELFTargetInfo::writer() const {
diff --git a/lld/lib/ReaderWriter/ELF/Reader.cpp b/lld/lib/ReaderWriter/ELF/Reader.cpp
index 28517611bb4..cb6e9cde00f 100644
--- a/lld/lib/ReaderWriter/ELF/Reader.cpp
+++ b/lld/lib/ReaderWriter/ELF/Reader.cpp
@@ -82,8 +82,8 @@ public:
: lld::Reader(ti), _elfTargetInfo(ti), _readerArchive(ti, *this) {
}
- error_code parseFile(std::unique_ptr<MemoryBuffer> mb,
- std::vector<std::unique_ptr<File>> &result) const {
+ error_code parseFile(std::unique_ptr<MemoryBuffer> &mb,
+ std::vector<std::unique_ptr<File> > &result) const {
using llvm::object::ELFType;
llvm::sys::LLVMFileType fileType =
llvm::sys::IdentifyFileType(mb->getBufferStart(),
@@ -96,7 +96,7 @@ public:
switch (fileType) {
case llvm::sys::ELF_Relocatable_FileType: {
std::unique_ptr<File> f(createELF<ELFFileCreateELFTraits>(
- getElfArchType(mb.get()), MaxAlignment, _elfTargetInfo, std::move(mb),
+ getElfArchType(&*mb), MaxAlignment, _elfTargetInfo, std::move(mb),
ec));
if (ec)
return ec;
@@ -105,15 +105,14 @@ public:
}
case llvm::sys::ELF_SharedObject_FileType: {
auto f = createELF<DynamicFileCreateELFTraits>(
- getElfArchType(mb.get()), MaxAlignment, _elfTargetInfo,
- std::move(mb));
+ getElfArchType(&*mb), MaxAlignment, _elfTargetInfo, std::move(mb));
if (!f)
return f;
result.push_back(std::move(*f));
break;
}
case llvm::sys::Archive_FileType:
- ec = _readerArchive.parseFile(std::move(mb), result);
+ ec = _readerArchive.parseFile(mb, result);
break;
default:
return llvm::make_error_code(llvm::errc::executable_format_error);
OpenPOWER on IntegriCloud