Skip to content

Conversation

@lhames
Copy link
Contributor

@lhames lhames commented Nov 26, 2025

ControllerAccess provides an abstract interface for bidirectional RPC between the executor (running JIT'd code) and the controller (containing the llvm::orc::ExecutionSession). ControllerAccess implementations are expected to implement IPC / RPC using a concrete communication method (shared memory, pipes, sockets, native system IPC, etc).

Calls from executor to controller are made via callController, with "handler tags" (addresses in the executor) specifying the target handler in the controller. A handler must be associated in the controller with the given tag for the call to succeed. This ensures that only registered entry points in the controller can be used, and avoids leaking controller addresses into the executor.

Calls in both directions are to "wrapper functions" that take a buffer of bytes as input and return a buffer of bytes as output. In the ORC runtime these must be orc_rt_WrapperFunctions (see Session::handleWrapperCall). The interpretation of the byte buffers is up to the wrapper functions: the ORC runtime imposes no restrictions on how the bytes are to be interpreted.

ControllerAccess objects may be detached from the Session prior to Session shutdown, in which case no further calls may be made in either direction, and any pending results (from calls made that haven't returned yet) should return errors. If the ControllerAccess class is still attached at Session shutdown time it will be detached as part of the shutdown process. The ControllerAccess::disconnect method must support concurrent entry on multiple threads, and all callers must block until they can guarantee that no further calls will be received or accepted.

ControllerAccess provides an abstract interface for bidirectional RPC between
the executor (running JIT'd code) and the controller (containing the
llvm::orc::ExecutionSession). ControllerAccess implementations are expected to
implement IPC / RPC using a concrete communication method (shared memory, pipes,
sockets, native system IPC, etc).

Calls from executor to controller are made via callController, with "handler
tags" (addresses in the executor) specifying the target handler in the
controller. A handler must be associated in the controller with the given tag
for the call to succeed. This ensures that only registered entry points in the
controller can be used, and avoids leaking controller addresses into the
executor.

Calls in both directions are to "wrapper functions" that take a buffer of bytes
as input and return a buffer of bytes as output. In the ORC runtime these must
be `orc_rt_WrapperFunction`s (see Session::handleWrapperCall). The
interpretation of the byte buffers is up to the wrapper functions: the ORC
runtime imposes no restrictions on how the bytes are to be interpreted.

ControllerAccess objects may be detached from the Session prior to Session
shutdown, in which case no further calls may be made in either direction, and
any pending results (from calls made that haven't returned yet) should return
errors. If the ControllerAccess class is still attached at Session shutdown time
it will be detached as part of the shutdown process. The
ControllerAccess::disconnect method must support concurrent entry on multiple
threads, and all callers must block until they can guarantee that no further
calls will be received or accepted.
@lhames lhames merged commit bfc732e into llvm:main Nov 26, 2025
9 of 10 checks passed
@lhames lhames deleted the orc-rt-controlleraccess branch November 26, 2025 03:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant