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