1de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===---- ObjectBuffer.h - Utility class to wrap object image memory -----===// 2de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 4de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 5de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// This file is distributed under the University of Illinois Open Source 6de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// License. See LICENSE.TXT for details. 7de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 8de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===----------------------------------------------------------------------===// 9de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 10de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// This file declares a wrapper class to hold the memory into which an 11de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// object will be generated. 12de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// 13de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===----------------------------------------------------------------------===// 14de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 15de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#ifndef LLVM_EXECUTIONENGINE_OBJECTBUFFER_H 16de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#define LLVM_EXECUTIONENGINE_OBJECTBUFFER_H 17de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 18255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/SmallVector.h" 19de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "llvm/Support/MemoryBuffer.h" 20255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/raw_ostream.h" 21de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 22de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszaknamespace llvm { 23de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 24de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// ObjectBuffer - This class acts as a container for the memory buffer used during 25de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// generation and loading of executable objects using MCJIT and RuntimeDyld. The 26de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// underlying memory for the object will be owned by the ObjectBuffer instance 27de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// throughout its lifetime. The getMemBuffer() method provides a way to create a 28de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// MemoryBuffer wrapper object instance to be owned by other classes (such as 29de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// ObjectFile) as needed, but the MemoryBuffer instance returned does not own the 30de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// actual memory it points to. 31de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakclass ObjectBuffer { 32354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka virtual void anchor(); 33de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakpublic: 34de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak ObjectBuffer() {} 35de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak ObjectBuffer(MemoryBuffer* Buf) : Buffer(Buf) {} 36b21ab43cfc3fa0dacf5c95f04e58b6d804b59a16Alexey Samsonov virtual ~ObjectBuffer() {} 37de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 38de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak /// getMemBuffer - Like MemoryBuffer::getMemBuffer() this function 39de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak /// returns a pointer to an object that is owned by the caller. However, 40de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak /// the caller does not take ownership of the underlying memory. 41de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak MemoryBuffer *getMemBuffer() const { 42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return MemoryBuffer::getMemBuffer(Buffer->getBuffer(), 43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Buffer->getBufferIdentifier(), false); 44de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 45de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 46de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak const char *getBufferStart() const { return Buffer->getBufferStart(); } 47de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak size_t getBufferSize() const { return Buffer->getBufferSize(); } 48f12745f7a7e68c05c89ebd515b9b4faedce37dd0Rafael Espindola StringRef getBuffer() const { return Buffer->getBuffer(); } 49de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 50de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakprotected: 51de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // The memory contained in an ObjectBuffer 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MemoryBuffer> Buffer; 53de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak}; 54de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 55de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// ObjectBufferStream - This class encapsulates the SmallVector and 56de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// raw_svector_ostream needed to generate an object using MC code emission 57de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// while providing a common ObjectBuffer interface for access to the 58de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// memory once the object has been generated. 59de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakclass ObjectBufferStream : public ObjectBuffer { 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void anchor() override; 61de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakpublic: 62de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak ObjectBufferStream() : OS(SV) {} 63b21ab43cfc3fa0dacf5c95f04e58b6d804b59a16Alexey Samsonov virtual ~ObjectBufferStream() {} 64de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 65de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak raw_ostream &getOStream() { return OS; } 66de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak void flush() 67de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak { 68de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak OS.flush(); 69de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 70de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak // Make the data accessible via the ObjectBuffer::Buffer 71de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak Buffer.reset(MemoryBuffer::getMemBuffer(StringRef(SV.data(), SV.size()), 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "", 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines false)); 74de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak } 75de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 76de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakprotected: 77de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak SmallVector<char, 4096> SV; // Working buffer into which we JIT. 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_svector_ostream OS; // streaming wrapper 79de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak}; 80de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 81de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak} // namespace llvm 82de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak 83de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#endif 84