diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:10:56 +0000 |
| commit | 044eb2f6afba375a914ac9d8024f8f5142bb912e (patch) | |
| tree | 1475247dc9f9fe5be155ebd4c9069c75aadf8c20 /lib/Object/ELFObjectFile.cpp | |
| parent | eb70dddbd77e120e5d490bd8fbe7ff3f8fa81c6b (diff) | |
Notes
Diffstat (limited to 'lib/Object/ELFObjectFile.cpp')
| -rw-r--r-- | lib/Object/ELFObjectFile.cpp | 37 |
1 files changed, 19 insertions, 18 deletions
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<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"; |
