1 //===- ObjectMemoryBuffer.h - SmallVector-backed MemoryBuffrer -*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file declares a wrapper class to hold the memory into which an 11 // object will be generated. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_EXECUTIONENGINE_OBJECTMEMORYBUFFER_H 16 #define LLVM_EXECUTIONENGINE_OBJECTMEMORYBUFFER_H 17 18 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/Support/MemoryBuffer.h" 20 #include "llvm/Support/raw_ostream.h" 21 22 namespace llvm { 23 24 /// \brief SmallVector-backed MemoryBuffer instance. 25 /// 26 /// This class enables efficient construction of MemoryBuffers from SmallVector 27 /// instances. This is useful for MCJIT and Orc, where object files are streamed 28 /// into SmallVectors, then inspected using ObjectFile (which takes a 29 /// MemoryBuffer). 30 class ObjectMemoryBuffer : public MemoryBuffer { 31 public: 32 33 /// \brief Construct an ObjectMemoryBuffer from the given SmallVector r-value. 34 /// 35 /// FIXME: It'd be nice for this to be a non-templated constructor taking a 36 /// SmallVectorImpl here instead of a templated one taking a SmallVector<N>, 37 /// but SmallVector's move-construction/assignment currently only take 38 /// SmallVectors. If/when that is fixed we can simplify this constructor and 39 /// the following one. ObjectMemoryBuffer(SmallVectorImpl<char> && SV)40 ObjectMemoryBuffer(SmallVectorImpl<char> &&SV) 41 : SV(std::move(SV)), BufferName("<in-memory object>") { 42 init(this->SV.begin(), this->SV.end(), false); 43 } 44 45 /// \brief Construct a named ObjectMemoryBuffer from the given SmallVector 46 /// r-value and StringRef. ObjectMemoryBuffer(SmallVectorImpl<char> && SV,StringRef Name)47 ObjectMemoryBuffer(SmallVectorImpl<char> &&SV, StringRef Name) 48 : SV(std::move(SV)), BufferName(Name) { 49 init(this->SV.begin(), this->SV.end(), false); 50 } 51 getBufferIdentifier()52 const char* getBufferIdentifier() const override { return BufferName.c_str(); } 53 getBufferKind()54 BufferKind getBufferKind() const override { return MemoryBuffer_Malloc; } 55 56 private: 57 SmallVector<char, 0> SV; 58 std::string BufferName; 59 }; 60 61 } // namespace llvm 62 63 #endif 64