Linker.TraceCall tracing.
Linker doesn't operate in terms of functions or subroutines, but rather in terms of executable chunks of code. It is convenient, though, to track called functions, i.e., there are names and arguments (data-flow). Since a code in Primus is an uniterpreted computation it is the responsibility of the code provider to make corresponding observations, when a subroutine is entered or left.
By default, the code is provided by the BIR Interpreter and Primus Interpreter. Both care to provide corresponding observations. However, the Primus Lisp Interpreter provides call observations only when an externally visible function is called, e.g., malloc, free.
val call : (string * value list) observationoccurs when a subroutine is called. Argument values are specified in the same order in which corresponding input arguments of a corresponding subroutine term are specified.
Example,
(call (malloc 4))
val return : (string * value list) observationoccurs just before a subroutine returns.
Context-wise, an observation is made when the interpreter is still in the subroutine. The argument list are in the same order as arguments of a corresponding subroutine. Values of all arguments are provided, including output and input arguments.
Example,
(call-return (malloc 4 0xDEADBEEF))
val lisp_call : (string * value list) observationoccurs when an externally linked primus stub is called. Arguments values are specified in the same order as in the call observation
val lisp_call_return : (string * value list) observationoccurs just before a lisp call from an external procedure returns. Arguments values are specified in the same order as in the return observation
Use Machine.Observation.make function, where Machine is a module implementing Machine.S interface, to provide observations.
the statement that makes lisp-call observations