diff options
Diffstat (limited to 'contrib/llvm/lib/Object/ELFObjectFile.cpp')
-rw-r--r-- | contrib/llvm/lib/Object/ELFObjectFile.cpp | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/contrib/llvm/lib/Object/ELFObjectFile.cpp b/contrib/llvm/lib/Object/ELFObjectFile.cpp index fa136d782b5a..0aad1c89a2d8 100644 --- a/contrib/llvm/lib/Object/ELFObjectFile.cpp +++ b/contrib/llvm/lib/Object/ELFObjectFile.cpp @@ -37,7 +37,16 @@ using namespace object; ELFObjectFileBase::ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source) : ObjectFile(Type, Source) {} -ErrorOr<std::unique_ptr<ObjectFile>> +template <class ELFT> +static Expected<std::unique_ptr<ELFObjectFile<ELFT>>> +createPtr(MemoryBufferRef Object) { + auto Ret = ELFObjectFile<ELFT>::create(Object); + if (Error E = Ret.takeError()) + return std::move(E); + return make_unique<ELFObjectFile<ELFT>>(std::move(*Ret)); +} + +Expected<std::unique_ptr<ObjectFile>> ObjectFile::createELFObjectFile(MemoryBufferRef Obj) { std::pair<unsigned char, unsigned char> 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<ObjectFile> R; if (Ident.first == ELF::ELFCLASS32) { if (Ident.second == ELF::ELFDATA2LSB) - R.reset(new ELFObjectFile<ELFType<support::little, false>>(Obj, EC)); + return createPtr<ELF32LE>(Obj); else if (Ident.second == ELF::ELFDATA2MSB) - R.reset(new ELFObjectFile<ELFType<support::big, false>>(Obj, EC)); + return createPtr<ELF32BE>(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<ELFType<support::little, true>>(Obj, EC)); + return createPtr<ELF64LE>(Obj); else if (Ident.second == ELF::ELFDATA2MSB) - R.reset(new ELFObjectFile<ELFType<support::big, true>>(Obj, EC)); + return createPtr<ELF64BE>(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"; |