Skip to content

Commit

Permalink
[Orc] Add a method for ObjectLinkingLayer to return ownership of obje…
Browse files Browse the repository at this point in the history
…ct buffers.

RTDyldObjectLinkingLayer allowed clients to register a NotifyEmitted function to
reclaim ownership of object buffers once they had been linked. This patch adds
similar functionality to ObjectLinkingLayer: Clients can now optionally call the
ObjectLinkingLayer::setReturnObjectBuffer method to register a function that
will be called when discarding object buffers. If set, this function will be
called to return ownership of the object regardless of whether the link
succeeded or failed.

Use cases for this function include debug dumping (it provides a way to dump
all objects linked into JIT'd code) and object re-use (e.g. storing an
object in a cache).

llvm-svn: 374951
  • Loading branch information
lhames committed Oct 15, 2019
1 parent 75b991e commit a98546e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
11 changes: 11 additions & 0 deletions llvm/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h
Expand Up @@ -73,6 +73,9 @@ class ObjectLinkingLayer : public ObjectLayer {
virtual Error notifyRemovingAllModules() { return Error::success(); }
};

using ReturnObjectBufferFunction =
std::function<void(std::unique_ptr<MemoryBuffer>)>;

/// Construct an ObjectLinkingLayer with the given NotifyLoaded,
/// and NotifyEmitted functors.
ObjectLinkingLayer(ExecutionSession &ES,
Expand All @@ -81,6 +84,13 @@ class ObjectLinkingLayer : public ObjectLayer {
/// Destruct an ObjectLinkingLayer.
~ObjectLinkingLayer();

/// Set an object buffer return function. By default object buffers are
/// deleted once the JIT has linked them. If a return function is set then
/// it will be called to transfer ownership of the buffer instead.
void setReturnObjectBuffer(ReturnObjectBufferFunction ReturnObjectBuffer) {
this->ReturnObjectBuffer = std::move(ReturnObjectBuffer);
}

/// Add a pass-config modifier.
ObjectLinkingLayer &addPlugin(std::unique_ptr<Plugin> P) {
std::lock_guard<std::mutex> Lock(LayerMutex);
Expand Down Expand Up @@ -138,6 +148,7 @@ class ObjectLinkingLayer : public ObjectLayer {
jitlink::JITLinkMemoryManager &MemMgr;
bool OverrideObjectFlags = false;
bool AutoClaimObjectSymbols = false;
ReturnObjectBufferFunction ReturnObjectBuffer;
DenseMap<VModuleKey, AllocPtr> TrackedAllocs;
std::vector<AllocPtr> UntrackedAllocs;
std::vector<std::unique_ptr<Plugin>> Plugins;
Expand Down
7 changes: 7 additions & 0 deletions llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
Expand Up @@ -29,6 +29,13 @@ class ObjectLinkingLayerJITLinkContext final : public JITLinkContext {
std::unique_ptr<MemoryBuffer> ObjBuffer)
: Layer(Layer), MR(std::move(MR)), ObjBuffer(std::move(ObjBuffer)) {}

~ObjectLinkingLayerJITLinkContext() {
// If there is an object buffer return function then use it to
// return ownership of the buffer.
if (Layer.ReturnObjectBuffer)
Layer.ReturnObjectBuffer(std::move(ObjBuffer));
}

JITLinkMemoryManager &getMemoryManager() override { return Layer.MemMgr; }

MemoryBufferRef getObjectBuffer() const override {
Expand Down

0 comments on commit a98546e

Please sign in to comment.