The following code implements inline tracing for the kinst DTrace provider.
Briefly explained, what the code does is, for each probe of the form:
libdtrace checks to see if `<inline_func>` is indeed an inline function, where
in this case it finds all inline copies of it and creates new probes for each
one of them. Otherwise, it converts the probe to an FBT one so that we don't
duplicate FBT's functionality in kinst.
Some things to note:
Should the `dtsp_inline`, `dtsp_entry` and `dtsp_return` flags be merged
into a `dtsp_flags` field?
Are the `warn*()`/`err*()` calls appropriate here? DTrace's `xywarn()` and
`dt_handle_liberr()` are not really want I want.
`dt_sugar_kinst_find_caller_func()` has x86-only code, we'll have to visit it
again when kinst is ported to new platforms. Perhaps an `#ifdef` would be
better than splitting the code into multiple files.
I'm ignoring functions (with a warning) that do not start with `push %rbp`,
since kinst(4) currently also ignores such functions. I'm planning to change
kinst's logic to search for `pop %rbp` anywhere in the function, instead of
checking if the first instruction is `push %rbp`.