mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-01 12:24:24 +00:00
string_ostream is a safe and efficient string builder that combines opaque stack storage with a built-in ostream interface. small_string_ostream<bytes> additionally permits an explicit stack storage size other than the default 128 bytes to be provided. Beyond that, storage is transferred to the heap. This convenient class can be used in most places an std::string+raw_string_ostream pair or SmallString<>+raw_svector_ostream pair would previously have been used, in order to guarantee consistent access without byte truncation. The patch also converts much of LLVM to use the new facility. These changes include several probable bug fixes for truncated output, a programming error that's no longer possible with the new interface. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211749 91177308-0d34-0410-b5e6-96231b3b80d8
78 lines
2.7 KiB
C++
78 lines
2.7 KiB
C++
//===---- ObjectBuffer.h - Utility class to wrap object image memory -----===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares a wrapper class to hold the memory into which an
|
|
// object will be generated.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_EXECUTIONENGINE_OBJECTBUFFER_H
|
|
#define LLVM_EXECUTIONENGINE_OBJECTBUFFER_H
|
|
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// ObjectBuffer - This class acts as a container for the memory buffer used during
|
|
/// generation and loading of executable objects using MCJIT and RuntimeDyld. The
|
|
/// underlying memory for the object will be owned by the ObjectBuffer instance
|
|
/// throughout its lifetime. The getMemBuffer() method provides a way to create a
|
|
/// MemoryBuffer wrapper object instance to be owned by other classes (such as
|
|
/// ObjectFile) as needed, but the MemoryBuffer instance returned does not own the
|
|
/// actual memory it points to.
|
|
class ObjectBuffer {
|
|
virtual void anchor();
|
|
public:
|
|
ObjectBuffer() {}
|
|
ObjectBuffer(MemoryBuffer* Buf) : Buffer(Buf) {}
|
|
virtual ~ObjectBuffer() {}
|
|
|
|
/// getMemBuffer - Like MemoryBuffer::getMemBuffer() this function
|
|
/// returns a pointer to an object that is owned by the caller. However,
|
|
/// the caller does not take ownership of the underlying memory.
|
|
MemoryBuffer *getMemBuffer() const {
|
|
return MemoryBuffer::getMemBuffer(Buffer->getBuffer(), "", false);
|
|
}
|
|
|
|
const char *getBufferStart() const { return Buffer->getBufferStart(); }
|
|
size_t getBufferSize() const { return Buffer->getBufferSize(); }
|
|
StringRef getBuffer() const { return Buffer->getBuffer(); }
|
|
|
|
protected:
|
|
// The memory contained in an ObjectBuffer
|
|
std::unique_ptr<MemoryBuffer> Buffer;
|
|
};
|
|
|
|
/// ObjectBufferStream - This class encapsulates the SmallVector and
|
|
/// raw_svector_ostream needed to generate an object using MC code emission
|
|
/// while providing a common ObjectBuffer interface for access to the
|
|
/// memory once the object has been generated.
|
|
class ObjectBufferStream : public ObjectBuffer {
|
|
void anchor() override;
|
|
public:
|
|
ObjectBufferStream() {}
|
|
virtual ~ObjectBufferStream() {}
|
|
|
|
raw_ostream &getOStream() { return OS; }
|
|
void flush()
|
|
{
|
|
// Make the data accessible via the ObjectBuffer::Buffer
|
|
Buffer.reset(MemoryBuffer::getMemBuffer(OS.str(), "", false));
|
|
}
|
|
|
|
protected:
|
|
small_string_ostream<4096> OS; // Working buffer into which we JIT.
|
|
};
|
|
|
|
} // namespace llvm
|
|
|
|
#endif
|