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_SUPPORT_SMALLVECTORMEMORYBUFFER_H
15 #define LLVM_SUPPORT_SMALLVECTORMEMORYBUFFER_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 a SmallVectorMemoryBuffer from the given SmallVector r-value.
32   SmallVectorMemoryBuffer(SmallVectorImpl<char> &&SV,
33                           bool RequiresNullTerminator = true)
34       : SmallVectorMemoryBuffer(std::move(SV), "<in-memory object>",
35                                 RequiresNullTerminator) {}
36 
37   /// Construct a named SmallVectorMemoryBuffer from the given SmallVector
38   /// r-value and StringRef.
39   SmallVectorMemoryBuffer(SmallVectorImpl<char> &&SV, StringRef Name,
40                           bool RequiresNullTerminator = true)
41       : SV(std::move(SV)), BufferName(std::string(Name)) {
42     if (RequiresNullTerminator) {
43       this->SV.push_back('\0');
44       this->SV.pop_back();
45     }
46     init(this->SV.begin(), this->SV.end(), false);
47   }
48 
49   // Key function.
50   ~SmallVectorMemoryBuffer() override;
51 
52   StringRef getBufferIdentifier() const override { return BufferName; }
53 
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