MC/Mach-O: Start stubbing out a Mach-O object file wrapper.
authorDaniel Dunbar <daniel@zuster.org>
Sat, 27 Nov 2010 05:38:50 +0000 (05:38 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 27 Nov 2010 05:38:50 +0000 (05:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120190 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/MachOObject.h [new file with mode: 0644]
lib/Object/CMakeLists.txt
lib/Object/MachOObject.cpp [new file with mode: 0644]

diff --git a/include/llvm/Object/MachOObject.h b/include/llvm/Object/MachOObject.h
new file mode 100644 (file)
index 0000000..74339cb
--- /dev/null
@@ -0,0 +1,69 @@
+//===- MachOObject.h - Mach-O Object File Wrapper ---------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_OBJECT_MACHOOBJECT_H
+#define LLVM_OBJECT_MACHOOBJECT_H
+
+#include <string>
+#include "llvm/ADT/OwningPtr.h"
+
+namespace llvm {
+
+class MemoryBuffer;
+
+namespace object {
+
+/// \brief Wrapper object for manipulating Mach-O object files.
+///
+/// This class is designed to implement a full-featured, efficient, portable,
+/// and robust Mach-O interface to Mach-O object files. It does not attempt to
+/// smooth over rough edges in the Mach-O format or generalize access to object
+/// independent features.
+///
+/// The class is designed around accessing the Mach-O object which is expected
+/// to be fully loaded into memory.
+///
+/// This class is *not* suitable for concurrent use. For efficient operation,
+/// the class uses APIs which rely on the ability to cache the results of
+/// certain calls in internal objects which are not safe for concurrent
+/// access. This allows the API to be zero-copy on the common paths.
+//
+// FIXME: It would be cool if we supported a "paged" MemoryBuffer
+// implementation. This would allow us to implement a more sensible version of
+// MemoryObject which can work like a MemoryBuffer, but be more efficient for
+// objects which are in the current address space.
+class MachOObject {
+public:
+
+private:
+  OwningPtr<MemoryBuffer> Buffer;
+  
+public:
+  MachOObject(MemoryBuffer *Buffer);
+
+  /// \brief Load a Mach-O object from a MemoryBuffer object.
+  ///
+  /// \param Buffer - The buffer to load the object from. This routine takes
+  /// exclusive ownership of the buffer (which is passed to the returned object
+  /// on success).
+  /// \param ErrorStr [out] - If given, will be set to a user readable error
+  /// message on failure.
+  /// \returns The loaded object, or null on error.
+  static MachOObject *LoadFromBuffer(MemoryBuffer *Buffer,
+                                     std::string *ErrorStr = 0);
+
+  /// @name Object Header Information
+  /// @{
+  /// @}
+};
+
+} // end namespace object
+} // end namespace llvm
+
+#endif
index 18ee4beac18356d86f79bcd48eba95288df71eda..49c50ccd76601f5570d28e2a926c15f76d01bb7b 100644 (file)
@@ -1,3 +1,4 @@
 add_llvm_library(LLVMObject
+  MachOObject.cpp
   ObjectFile.cpp
   )
diff --git a/lib/Object/MachOObject.cpp b/lib/Object/MachOObject.cpp
new file mode 100644 (file)
index 0000000..5946863
--- /dev/null
@@ -0,0 +1,23 @@
+//===- MachOObject.cpp - Mach-O Object File Wrapper -----------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Object/MachOObject.h"
+#include "llvm/Support/MemoryBuffer.h"
+
+using namespace llvm;
+using namespace object;
+
+MachOObject::MachOObject(MemoryBuffer *Buffer_) : Buffer(Buffer_) {
+}
+
+MachOObject *MachOObject::LoadFromBuffer(MemoryBuffer *Buffer,
+                                         std::string *ErrorStr) {
+  if (ErrorStr) *ErrorStr = "";
+  return new MachOObject(Buffer);
+}