135 lines
9.3 KiB
Plaintext
135 lines
9.3 KiB
Plaintext
Client Code . Generated . libgccjit.so
|
|
. code .
|
|
. . JIT API . JIT "Frontend". (libbackend.a)
|
|
....................................................................................
|
|
│ . . . .
|
|
──────────────────────────> . .
|
|
. . │ . .
|
|
. . V . .
|
|
. . ──> libgccjit.c .
|
|
. . │ (error-checking).
|
|
. . │ .
|
|
. . ──> jit-recording.c
|
|
. . (record API calls)
|
|
. . <─────── .
|
|
. . │ . .
|
|
<─────────────────────────── . .
|
|
│ . . . .
|
|
│ . . . .
|
|
V . . gcc_jit_context_compile .
|
|
──────────────────────────> . .
|
|
. . │ start of recording::context::compile ()
|
|
. . │ . .
|
|
. . │ start of playback::context::compile ()
|
|
. . │ (create tempdir) .
|
|
. . │ . .
|
|
. . │ ACQUIRE MUTEX .
|
|
. . │ . .
|
|
. . V───────────────────────> toplev::main (for now)
|
|
. . . . │
|
|
. . . . (various code)
|
|
. . . . │
|
|
. . . . V
|
|
. . . <───────────────── langhook:parse_file
|
|
. . . │ .
|
|
. . . │ (jit_langhook_parse_file)
|
|
. . . │ .
|
|
..........................................│..................VVVVVVVVVVVVV...
|
|
. . . │ . No GC in here
|
|
. . . │ jit-playback.c
|
|
. . . │ (playback of API calls)
|
|
. . . ───────────────> creation of functions,
|
|
. . . . types, expression trees
|
|
. . . <──────────────── etc
|
|
. . . │(handle_locations: add locations to
|
|
. . . │ linemap and associate them with trees)
|
|
. . . │ .
|
|
. . . │ . No GC in here
|
|
..........................................│..................AAAAAAAAAAAAA...
|
|
. . . │ for each function
|
|
. . . ──> postprocess
|
|
. . . │ .
|
|
. . . ────────────> cgraph_finalize_function
|
|
. . . <────────────
|
|
. . . <── .
|
|
. . . │ .
|
|
. . . ──────────────────> (end of
|
|
. . . . │ langhook_parse_file)
|
|
. . . . │
|
|
. . . . (various code)
|
|
. . . . │
|
|
. . . . ↓
|
|
. . . <───────────────── langhook:write_globals
|
|
. . . │ .
|
|
. . . │ (jit_langhook_write_globals)
|
|
. . . │ .
|
|
. . . │ .
|
|
. . . ──────────────────> finalize_compilation_unit
|
|
. . . . │
|
|
. . . . (the middle─end and backend)
|
|
. . . . ↓
|
|
. . <───────────────────────────── end of toplev::main
|
|
. . │ . .
|
|
. . V───────────────────────> toplev::finalize
|
|
. . . . │ (purge internal state)
|
|
. . <──────────────────────── end of toplev::finalize
|
|
. . │ . .
|
|
. . V─> playback::context::postprocess:
|
|
. . │ . .
|
|
. . │ (assuming an in-memory compile):
|
|
. . │ . .
|
|
. . --> Convert assembler to DSO, via embedded
|
|
. . copy of driver:
|
|
. . driver::main ()
|
|
. . invocation of "as"
|
|
. . invocation of "ld"
|
|
. . driver::finalize ()
|
|
. . <----
|
|
. . │ . .
|
|
. . │ . Load DSO (dlopen "fake.so")
|
|
. . │ . .
|
|
. . │ . Bundle it up in a jit::result
|
|
. . <── . .
|
|
. . │ . .
|
|
. . │ RELEASE MUTEX .
|
|
. . │ . .
|
|
. . │ end of playback::context::compile ()
|
|
. . │ . .
|
|
. . │ playback::context dtor
|
|
. . ──> . .
|
|
. . │ Normally we cleanup the tempdir here:
|
|
. . │ ("fake.so" is unlinked from the
|
|
. . │ filesystem at this point)
|
|
. . │ If the client code requested debuginfo, the
|
|
. . │ cleanup happens later (in gcc_jit_result_release)
|
|
. . │ to make it easier on the debugger (see PR jit/64206)
|
|
. . <── . .
|
|
. . │ . .
|
|
. . │ end of recording::context::compile ()
|
|
<─────────────────────────── . .
|
|
│ . . . .
|
|
V . . gcc_jit_result_get_code .
|
|
──────────────────────────> . .
|
|
. . │ dlsym () within loaded DSO
|
|
<─────────────────────────── . .
|
|
Get (void*). . . .
|
|
│ . . . .
|
|
│ Call it . . . .
|
|
───────────────> . . .
|
|
. │ . . .
|
|
. │ . . .
|
|
<─────────────── . . .
|
|
│ . . . .
|
|
etc│ . . . .
|
|
│ . . . .
|
|
V . . gcc_jit_result_release .
|
|
──────────────────────────> . .
|
|
. . │ dlclose () the loaded DSO
|
|
. . │ (code becomes uncallable)
|
|
. . │ . .
|
|
. . │ If the client code requested debuginfo, then
|
|
. . │ cleanup of the tempdir was delayed.
|
|
. . │ If that was the case, clean it up now.
|
|
<─────────────────────────── . .
|
|
│ . . . .
|