diff options
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 fa136d782b5a..0aad1c89a2d8 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";  | 
