+//===---- ObjectBuffer.h - Utility class to wrap object image memory -----===//\r
+//\r
+// The LLVM Compiler Infrastructure\r
+//\r
+// This file is distributed under the University of Illinois Open Source\r
+// License. See LICENSE.TXT for details.\r
+//\r
+//===----------------------------------------------------------------------===//\r
+//\r
+// This file declares a wrapper class to hold the memory into which an\r
+// object will be generated.\r
+//\r
+//===----------------------------------------------------------------------===//\r
+\r
+#ifndef LLVM_EXECUTIONENGINE_OBJECTBUFFER_H\r
+#define LLVM_EXECUTIONENGINE_OBJECTBUFFER_H\r
+\r
+#include "llvm/ADT/SmallVector.h"\r
+#include "llvm/ADT/OwningPtr.h"\r
+#include "llvm/Support/raw_ostream.h"\r
+#include "llvm/Support/MemoryBuffer.h"\r
+\r
+namespace llvm {\r
+\r
+/// ObjectBuffer - This class acts as a container for the memory buffer used during\r
+/// generation and loading of executable objects using MCJIT and RuntimeDyld. The\r
+/// underlying memory for the object will be owned by the ObjectBuffer instance\r
+/// throughout its lifetime. The getMemBuffer() method provides a way to create a\r
+/// MemoryBuffer wrapper object instance to be owned by other classes (such as\r
+/// ObjectFile) as needed, but the MemoryBuffer instance returned does not own the\r
+/// actual memory it points to.\r
+class ObjectBuffer {\r
+public:\r
+ ObjectBuffer() {}\r
+ ObjectBuffer(MemoryBuffer* Buf) : Buffer(Buf) {}\r
+ virtual ~ObjectBuffer() {}\r
+\r
+ /// getMemBuffer - Like MemoryBuffer::getMemBuffer() this function\r
+ /// returns a pointer to an object that is owned by the caller. However,\r
+ /// the caller does not take ownership of the underlying memory.\r
+ MemoryBuffer *getMemBuffer() const {\r
+ return MemoryBuffer::getMemBuffer(Buffer->getBuffer(), "", false);\r
+ }\r
+\r
+ const char *getBufferStart() const { return Buffer->getBufferStart(); }\r
+ size_t getBufferSize() const { return Buffer->getBufferSize(); }\r
+\r
+protected:\r
+ // The memory contained in an ObjectBuffer\r
+ OwningPtr<MemoryBuffer> Buffer;\r
+};\r
+\r
+/// ObjectBufferStream - This class encapsulates the SmallVector and\r
+/// raw_svector_ostream needed to generate an object using MC code emission\r
+/// while providing a common ObjectBuffer interface for access to the\r
+/// memory once the object has been generated.\r
+class ObjectBufferStream : public ObjectBuffer {\r
+public:\r
+ ObjectBufferStream() : OS(SV) {}\r
+ virtual ~ObjectBufferStream() {}\r
+\r
+ raw_ostream &getOStream() { return OS; }\r
+ void flush()\r
+ {\r
+ OS.flush();\r
+\r
+ // Make the data accessible via the ObjectBuffer::Buffer\r
+ Buffer.reset(MemoryBuffer::getMemBuffer(StringRef(SV.data(), SV.size()),\r
+ "",\r
+ false));\r
+ }\r
+\r
+protected:\r
+ SmallVector<char, 4096> SV; // Working buffer into which we JIT.\r
+ raw_svector_ostream OS; // streaming wrapper\r
+};\r
+\r
+} // namespace llvm\r
+\r
+#endif\r