projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[X86][Haswell][SchedModel] Add architecture specific scheduling models.
[oota-llvm.git]
/
lib
/
Object
/
ELFObjectFile.cpp
diff --git
a/lib/Object/ELFObjectFile.cpp
b/lib/Object/ELFObjectFile.cpp
index 15bc6be0b46e7971dc3b7b60ac2f98010cbdf3a3..2e5e3c8836c42780143b42884dc1656ee9ab1151 100644
(file)
--- a/
lib/Object/ELFObjectFile.cpp
+++ b/
lib/Object/ELFObjectFile.cpp
@@
-17,57
+17,74
@@
namespace llvm {
using namespace object;
namespace llvm {
using namespace object;
-// Creates an in-memory object-file by default: createELFObjectFile(Buffer)
-ObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object) {
- std::pair<unsigned char, unsigned char> Ident = getElfArchType(Object);
- error_code ec;
+ELFObjectFileBase::ELFObjectFileBase(unsigned int Type,
+ std::unique_ptr<MemoryBuffer> Source)
+ : ObjectFile(Type, std::move(Source)) {}
+ErrorOr<std::unique_ptr<ObjectFile>>
+ObjectFile::createELFObjectFile(std::unique_ptr<MemoryBuffer> &Obj) {
+ std::pair<unsigned char, unsigned char> Ident =
+ getElfArchType(Obj->getBuffer());
std::size_t MaxAlignment =
std::size_t MaxAlignment =
- 1ULL << countTrailingZeros(uintptr_t(Obj
ect
->getBufferStart()));
+ 1ULL << countTrailingZeros(uintptr_t(Obj->getBufferStart()));
+ std::error_code EC;
+ std::unique_ptr<ObjectFile> R;
if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB)
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
if (MaxAlignment >= 4)
if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB)
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
if (MaxAlignment >= 4)
- return new ELFObjectFile<ELFType<support::little, 4, false> >(Object, ec);
+ R.reset(new ELFObjectFile<ELFType<support::little, 4, false>>(
+ std::move(Obj), EC));
else
#endif
if (MaxAlignment >= 2)
else
#endif
if (MaxAlignment >= 2)
- return new ELFObjectFile<ELFType<support::little, 2, false> >(Object, ec);
+ R.reset(new ELFObjectFile<ELFType<support::little, 2, false>>(
+ std::move(Obj), EC));
else
else
-
llvm_unreachable("Invalid alignment for ELF file!")
;
+
return object_error::parse_failed
;
else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
if (MaxAlignment >= 4)
else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
if (MaxAlignment >= 4)
- return new ELFObjectFile<ELFType<support::big, 4, false> >(Object, ec);
+ R.reset(new ELFObjectFile<ELFType<support::big, 4, false>>(std::move(Obj),
+ EC));
else
#endif
if (MaxAlignment >= 2)
else
#endif
if (MaxAlignment >= 2)
- return new ELFObjectFile<ELFType<support::big, 2, false> >(Object, ec);
+ R.reset(new ELFObjectFile<ELFType<support::big, 2, false>>(std::move(Obj),
+ EC));
else
else
-
llvm_unreachable("Invalid alignment for ELF file!")
;
+
return object_error::parse_failed
;
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
if (MaxAlignment >= 8)
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
if (MaxAlignment >= 8)
- return new ELFObjectFile<ELFType<support::big, 8, true> >(Object, ec);
+ R.reset(new ELFObjectFile<ELFType<support::big, 8, true>>(std::move(Obj),
+ EC));
else
#endif
if (MaxAlignment >= 2)
else
#endif
if (MaxAlignment >= 2)
- return new ELFObjectFile<ELFType<support::big, 2, true> >(Object, ec);
+ R.reset(new ELFObjectFile<ELFType<support::big, 2, true>>(std::move(Obj),
+ EC));
else
else
-
llvm_unreachable("Invalid alignment for ELF file!")
;
+
return object_error::parse_failed
;
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
if (MaxAlignment >= 8)
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
if (MaxAlignment >= 8)
- return new ELFObjectFile<ELFType<support::little, 8, true> >(Object, ec);
+ R.reset(new ELFObjectFile<ELFType<support::little, 8, true>>(
+ std::move(Obj), EC));
else
#endif
if (MaxAlignment >= 2)
else
#endif
if (MaxAlignment >= 2)
- return new ELFObjectFile<ELFType<support::little, 2, true> >(Object, ec);
+ R.reset(new ELFObjectFile<ELFType<support::little, 2, true>>(
+ std::move(Obj), EC));
else
else
-
llvm_unreachable("Invalid alignment for ELF file!")
;
+
return object_error::parse_failed
;
}
}
+ else
+ llvm_unreachable("Buffer is not an ELF object file!");
- report_fatal_error("Buffer is not an ELF object file!");
+ if (EC)
+ return EC;
+ return std::move(R);
}
} // end namespace llvm
}
} // end namespace llvm