aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm/lib/Object/ELFObjectFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/lib/Object/ELFObjectFile.cpp')
-rw-r--r--contrib/llvm/lib/Object/ELFObjectFile.cpp37
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";