From 044eb2f6afba375a914ac9d8024f8f5142bb912e Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Mon, 18 Dec 2017 20:10:56 +0000 Subject: Vendor import of llvm trunk r321017: https://llvm.org/svn/llvm-project/llvm/trunk@321017 --- lib/Object/ELFObjectFile.cpp | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) (limited to 'lib/Object/ELFObjectFile.cpp') diff --git a/lib/Object/ELFObjectFile.cpp b/lib/Object/ELFObjectFile.cpp index fa136d782b5aa..0aad1c89a2d8b 100644 --- a/lib/Object/ELFObjectFile.cpp +++ b/lib/Object/ELFObjectFile.cpp @@ -37,7 +37,16 @@ using namespace object; ELFObjectFileBase::ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source) : ObjectFile(Type, Source) {} -ErrorOr> +template +static Expected>> +createPtr(MemoryBufferRef Object) { + auto Ret = ELFObjectFile::create(Object); + if (Error E = Ret.takeError()) + return std::move(E); + return make_unique>(std::move(*Ret)); +} + +Expected> ObjectFile::createELFObjectFile(MemoryBufferRef Obj) { std::pair Ident = getElfArchType(Obj.getBuffer()); @@ -45,31 +54,24 @@ ObjectFile::createELFObjectFile(MemoryBufferRef Obj) { 1ULL << countTrailingZeros(uintptr_t(Obj.getBufferStart())); if (MaxAlignment < 2) - return object_error::parse_failed; + return createError("Insufficient alignment"); - std::error_code EC; - std::unique_ptr R; if (Ident.first == ELF::ELFCLASS32) { if (Ident.second == ELF::ELFDATA2LSB) - R.reset(new ELFObjectFile>(Obj, EC)); + return createPtr(Obj); else if (Ident.second == ELF::ELFDATA2MSB) - R.reset(new ELFObjectFile>(Obj, EC)); + return createPtr(Obj); else - return object_error::parse_failed; + return createError("Invalid ELF data"); } else if (Ident.first == ELF::ELFCLASS64) { if (Ident.second == ELF::ELFDATA2LSB) - R.reset(new ELFObjectFile>(Obj, EC)); + return createPtr(Obj); else if (Ident.second == ELF::ELFDATA2MSB) - R.reset(new ELFObjectFile>(Obj, EC)); + return createPtr(Obj); else - return object_error::parse_failed; - } else { - return object_error::parse_failed; + return createError("Invalid ELF data"); } - - if (EC) - return EC; - return std::move(R); + return createError("Invalid ELF class"); } SubtargetFeatures ELFObjectFileBase::getMIPSFeatures() const { @@ -260,8 +262,7 @@ void ELFObjectFileBase::setARMSubArch(Triple &TheTriple) const { std::string Triple; // Default to ARM, but use the triple if it's been set. - if (TheTriple.getArch() == Triple::thumb || - TheTriple.getArch() == Triple::thumbeb) + if (TheTriple.isThumb()) Triple = "thumb"; else Triple = "arm"; -- cgit v1.2.3