diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2017-10-10 21:21:16 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2017-10-10 21:21:16 +0000 |
commit | ef421f9c180296eb890a235726a7a2a4195e8400 (patch) | |
tree | 8812588ff06c1701564d9898041344131a22da31 /llvm/lib/Object/ELFObjectFile.cpp | |
parent | a45919f54d4c0c33d7d633498669180accb7beca (diff) | |
download | bcm5719-llvm-ef421f9c180296eb890a235726a7a2a4195e8400.tar.gz bcm5719-llvm-ef421f9c180296eb890a235726a7a2a4195e8400.zip |
Make the ELFObjectFile constructor private.
This forces every user to use the new create method that returns an
Expected. This in turn propagates better error messages.
llvm-svn: 315371
Diffstat (limited to 'llvm/lib/Object/ELFObjectFile.cpp')
-rw-r--r-- | llvm/lib/Object/ELFObjectFile.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/llvm/lib/Object/ELFObjectFile.cpp b/llvm/lib/Object/ELFObjectFile.cpp index 4bca7cb6d8d..0aad1c89a2d 100644 --- a/llvm/lib/Object/ELFObjectFile.cpp +++ b/llvm/lib/Object/ELFObjectFile.cpp @@ -37,6 +37,15 @@ using namespace object; ELFObjectFileBase::ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source) : ObjectFile(Type, Source) {} +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 = @@ -47,29 +56,22 @@ ObjectFile::createELFObjectFile(MemoryBufferRef Obj) { if (MaxAlignment < 2) 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<ELF32LE>(Obj, EC)); + return createPtr<ELF32LE>(Obj); else if (Ident.second == ELF::ELFDATA2MSB) - R.reset(new ELFObjectFile<ELF32BE>(Obj, EC)); + return createPtr<ELF32BE>(Obj); else return createError("Invalid ELF data"); } else if (Ident.first == ELF::ELFCLASS64) { if (Ident.second == ELF::ELFDATA2LSB) - R.reset(new ELFObjectFile<ELF64LE>(Obj, EC)); + return createPtr<ELF64LE>(Obj); else if (Ident.second == ELF::ELFDATA2MSB) - R.reset(new ELFObjectFile<ELF64BE>(Obj, EC)); + return createPtr<ELF64BE>(Obj); else return createError("Invalid ELF data"); - } else { - return createError("Invalid ELF class"); } - - if (EC) - return errorCodeToError(EC); - return std::move(R); + return createError("Invalid ELF class"); } SubtargetFeatures ELFObjectFileBase::getMIPSFeatures() const { |