summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lib/Object/ELFObjectFile.cpp
diff options
context:
space:
mode:
authorpascal <pascal@openbsd.org>2016-09-03 22:46:54 +0000
committerpascal <pascal@openbsd.org>2016-09-03 22:46:54 +0000
commitb5500b9ca0102f1ccaf32f0e77e96d0739aded9b (patch)
treee1b7ebb5a0231f9e6d8d3f6f719582cebd64dc98 /gnu/llvm/lib/Object/ELFObjectFile.cpp
parentclarify purpose of src/gnu/ directory. (diff)
downloadwireguard-openbsd-b5500b9ca0102f1ccaf32f0e77e96d0739aded9b.tar.xz
wireguard-openbsd-b5500b9ca0102f1ccaf32f0e77e96d0739aded9b.zip
Use the space freed up by sparc and zaurus to import LLVM.
ok hackroom@
Diffstat (limited to 'gnu/llvm/lib/Object/ELFObjectFile.cpp')
-rw-r--r--gnu/llvm/lib/Object/ELFObjectFile.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/gnu/llvm/lib/Object/ELFObjectFile.cpp b/gnu/llvm/lib/Object/ELFObjectFile.cpp
new file mode 100644
index 00000000000..c7df30a5903
--- /dev/null
+++ b/gnu/llvm/lib/Object/ELFObjectFile.cpp
@@ -0,0 +1,58 @@
+//===- ELFObjectFile.cpp - ELF object file implementation -------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Part of the ELFObjectFile class implementation.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Object/ELFObjectFile.h"
+#include "llvm/Support/MathExtras.h"
+
+namespace llvm {
+using namespace object;
+
+ELFObjectFileBase::ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source)
+ : ObjectFile(Type, Source) {}
+
+ErrorOr<std::unique_ptr<ObjectFile>>
+ObjectFile::createELFObjectFile(MemoryBufferRef Obj) {
+ std::pair<unsigned char, unsigned char> Ident =
+ getElfArchType(Obj.getBuffer());
+ std::size_t MaxAlignment =
+ 1ULL << countTrailingZeros(uintptr_t(Obj.getBufferStart()));
+
+ if (MaxAlignment < 2)
+ return object_error::parse_failed;
+
+ 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));
+ else if (Ident.second == ELF::ELFDATA2MSB)
+ R.reset(new ELFObjectFile<ELFType<support::big, false>>(Obj, EC));
+ else
+ return object_error::parse_failed;
+ } else if (Ident.first == ELF::ELFCLASS64) {
+ if (Ident.second == ELF::ELFDATA2LSB)
+ R.reset(new ELFObjectFile<ELFType<support::little, true>>(Obj, EC));
+ else if (Ident.second == ELF::ELFDATA2MSB)
+ R.reset(new ELFObjectFile<ELFType<support::big, true>>(Obj, EC));
+ else
+ return object_error::parse_failed;
+ } else {
+ return object_error::parse_failed;
+ }
+
+ if (EC)
+ return EC;
+ return std::move(R);
+}
+
+} // end namespace llvm