summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/ELFObjectFile.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2017-10-10 21:21:16 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2017-10-10 21:21:16 +0000
commitef421f9c180296eb890a235726a7a2a4195e8400 (patch)
tree8812588ff06c1701564d9898041344131a22da31 /llvm/lib/Object/ELFObjectFile.cpp
parenta45919f54d4c0c33d7d633498669180accb7beca (diff)
downloadbcm5719-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.cpp26
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 {
OpenPOWER on IntegriCloud