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