2012-11-14 20:18:34 +00:00
|
|
|
//===---- ObjectBuffer.h - Utility class to wrap object image memory -----===//
|
|
|
|
//
|
2014-03-16 23:58:43 +00:00
|
|
|
// The LLVM Compiler Infrastructure
|
2012-11-14 20:18:34 +00:00
|
|
|
//
|
|
|
|
// 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
|
|
|
|
|
2012-12-03 17:02:12 +00:00
|
|
|
#include "llvm/ADT/SmallVector.h"
|
2012-11-14 20:18:34 +00:00
|
|
|
#include "llvm/Support/MemoryBuffer.h"
|
2012-12-03 17:02:12 +00:00
|
|
|
#include "llvm/Support/raw_ostream.h"
|
2012-11-14 20:18:34 +00:00
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
|
2014-08-17 20:57:50 +00:00
|
|
|
/// This class acts as a container for the memory buffer used during generation
|
|
|
|
/// and loading of executable objects using MCJIT and RuntimeDyld. The
|
2012-11-14 20:18:34 +00:00
|
|
|
/// underlying memory for the object will be owned by the ObjectBuffer instance
|
2014-08-19 18:44:46 +00:00
|
|
|
/// throughout its lifetime.
|
2012-11-14 20:18:34 +00:00
|
|
|
class ObjectBuffer {
|
2013-11-19 00:57:56 +00:00
|
|
|
virtual void anchor();
|
2012-11-14 20:18:34 +00:00
|
|
|
public:
|
|
|
|
ObjectBuffer() {}
|
2014-09-03 19:48:09 +00:00
|
|
|
ObjectBuffer(std::unique_ptr<MemoryBuffer> Buf) : Buffer(std::move(Buf)) {}
|
2013-11-18 09:31:53 +00:00
|
|
|
virtual ~ObjectBuffer() {}
|
2012-11-14 20:18:34 +00:00
|
|
|
|
2014-08-19 18:44:46 +00:00
|
|
|
MemoryBufferRef getMemBuffer() const { return Buffer->getMemBufferRef(); }
|
2012-11-14 20:18:34 +00:00
|
|
|
|
|
|
|
const char *getBufferStart() const { return Buffer->getBufferStart(); }
|
|
|
|
size_t getBufferSize() const { return Buffer->getBufferSize(); }
|
2013-06-10 15:27:39 +00:00
|
|
|
StringRef getBuffer() const { return Buffer->getBuffer(); }
|
[MCJIT] Refactor and add stub inspection to the RuntimeDyldChecker framework.
This patch introduces a 'stub_addr' builtin that can be used to find the address
of the stub for a given (<file>, <section>, <symbol>) tuple. This address can be
used both to verify the contents of stubs (by loading from the returned address)
and to verify references to stubs (by comparing against the returned address).
Example (1) - Verifying stub contents:
Load 8 bytes (assuming a 64-bit target) from the stub for 'x' in the __text
section of f.o, and compare that value against the addres of 'x'.
# rtdyld-check: *{8}(stub_addr(f.o, __text, x) = x
Example (2) - Verifying references to stubs:
Decode the immediate of the instruction at label 'l', and verify that it's
equal to the offset from the next instruction's PC to the stub for 'y' in the
__text section of f.o (i.e. it's the correct PC-rel difference).
# rtdyld-check: decode_operand(l, 4) = stub_addr(f.o, __text, y) - next_pc(l)
l:
movq y@GOTPCREL(%rip), %rax
Since stub inspection requires cooperation with RuntimeDyldImpl this patch
pimpl-ifies RuntimeDyldChecker. Its implementation is moved in to a new class,
RuntimeDyldCheckerImpl, that has access to the definition of RuntimeDyldImpl.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213698 91177308-0d34-0410-b5e6-96231b3b80d8
2014-07-22 22:47:39 +00:00
|
|
|
StringRef getBufferIdentifier() const {
|
|
|
|
return Buffer->getBufferIdentifier();
|
|
|
|
}
|
2012-11-14 20:18:34 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
// The memory contained in an ObjectBuffer
|
2014-03-06 05:51:42 +00:00
|
|
|
std::unique_ptr<MemoryBuffer> Buffer;
|
2012-11-14 20:18:34 +00:00
|
|
|
};
|
|
|
|
|
2014-08-17 20:57:50 +00:00
|
|
|
/// 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.
|
2012-11-14 20:18:34 +00:00
|
|
|
class ObjectBufferStream : public ObjectBuffer {
|
2014-03-08 07:51:20 +00:00
|
|
|
void anchor() override;
|
2012-11-14 20:18:34 +00:00
|
|
|
public:
|
2014-06-26 22:52:05 +00:00
|
|
|
ObjectBufferStream() : OS(SV) {}
|
2013-11-18 09:31:53 +00:00
|
|
|
virtual ~ObjectBufferStream() {}
|
2012-11-14 20:18:34 +00:00
|
|
|
|
|
|
|
raw_ostream &getOStream() { return OS; }
|
|
|
|
void flush()
|
|
|
|
{
|
2014-06-26 22:52:05 +00:00
|
|
|
OS.flush();
|
|
|
|
|
2012-11-14 20:18:34 +00:00
|
|
|
// Make the data accessible via the ObjectBuffer::Buffer
|
2014-08-27 20:03:13 +00:00
|
|
|
Buffer =
|
|
|
|
MemoryBuffer::getMemBuffer(StringRef(SV.data(), SV.size()), "", false);
|
2012-11-14 20:18:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
2014-06-26 22:52:05 +00:00
|
|
|
SmallVector<char, 4096> SV; // Working buffer into which we JIT.
|
|
|
|
raw_svector_ostream OS; // streaming wrapper
|
2012-11-14 20:18:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace llvm
|
|
|
|
|
|
|
|
#endif
|