| 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 ("fake.so") |
| . . │ . . |
| . . │ . 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. |
| <─────────────────────────── . . |
| │ . . . . |