1Client Code   . Generated .            libgccjit.so
2              . code      .
3              .           . JIT API  . JIT "Frontend". (libbackend.a)
4....................................................................................
5   ���          .           .          .               .
6    ������������������������������������������������������������������������������>      .               .
7              .           .    ���     .               .
8              .           .    V     .               .
9              .           .    ������> libgccjit.cc       .
10              .           .        ��� (error-checking).
11              .           .        ���                 .
12              .           .        ������> jit-recording.cc
13              .           .              (record API calls)
14              .           .    <���������������������              .
15              .           .    ���     .               .
16   <���������������������������������������������������������������������������������      .               .
17   ���          .           .          .               .
18   ���          .           .          .               .
19   V          .           .  gcc_jit_context_compile .
20    ������������������������������������������������������������������������������>      .               .
21              .           .    ��� start of recording::context::compile ()
22              .           .    ���     .               .
23              .           .    ��� start of playback::context::compile ()
24              .           .    ���   (create tempdir)  .
25              .           .    ���     .               .
26              .           .    ��� ACQUIRE MUTEX       .
27              .           .    ���     .               .
28              .           .    V���������������������������������������������������������������������> toplev::main (for now)
29              .           .          .               .       ���
30              .           .          .               .   (various code)
31              .           .          .               .       ���
32              .           .          .               .       V
33              .           .          .    <��������������������������������������������������� langhook:parse_file
34              .           .          .    ���          .
35              .           .          .    ��� (jit_langhook_parse_file)
36              .           .          .    ���          .
37..........................................���..................VVVVVVVVVVVVV...
38              .           .          .    ���          .       No GC in here
39              .           .          .    ��� jit-playback.cc
40              .           .          .    ���   (playback of API calls)
41              .           .          .    ���������������������������������������������> creation of functions,
42              .           .          .               .     types, expression trees
43              .           .          .    <������������������������������������������������ etc
44              .           .          .    ���(handle_locations: add locations to
45              .           .          .    ��� linemap and associate them with trees)
46              .           .          .    ���          .
47              .           .          .    ���          .       No GC in here
48..........................................���..................AAAAAAAAAAAAA...
49              .           .          .    ��� for each function
50              .           .          .    ������> postprocess
51              .           .          .        ���      .
52              .           .          .        ������������������������������������> cgraph_finalize_function
53              .           .          .        <������������������������������������
54              .           .          .     <������       .
55              .           .          .    ���          .
56              .           .          .    ������������������������������������������������������> (end of
57              .           .          .               .       ��� langhook_parse_file)
58              .           .          .               .       ���
59              .           .          .               .   (various code)
60              .           .          .               .       ���
61              .           .          .               .       ���
62              .           .          .    <��������������������������������������������������� langhook:write_globals
63              .           .          .    ���          .
64              .           .          .    ��� (jit_langhook_write_globals)
65              .           .          .    ���          .
66              .           .          .    ���          .
67              .           .          .    ������������������������������������������������������> finalize_compilation_unit
68              .           .          .               .       ���
69              .           .          .               .   (the middle���end and backend)
70              .           .          .               .       ���
71              .           .    <��������������������������������������������������������������������������������������� end of toplev::main
72              .           .    ���     .               .
73              .           .    V���������������������������������������������������������������������> toplev::finalize
74              .           .          .               . ���   (purge internal state)
75              .           .    <������������������������������������������������������������������������ end of toplev::finalize
76              .           .    ���     .               .
77              .           .    V���> playback::context::postprocess:
78              .           .      ���   .               .
79              .           .      ���   (assuming an in-memory compile):
80              .           .      ���   .               .
81              .           .      --> Convert assembler to DSO, via embedded
82              .           .          copy of driver:
83              .           .           driver::main ()
84              .           .             invocation of "as"
85              .           .             invocation of "ld"
86              .           .           driver::finalize ()
87              .           .      <----
88              .           .      ���   .               .
89              .           .      ���   . Load DSO (dlopen "fake.so")
90              .           .      ���   .               .
91              .           .      ���   . Bundle it up in a jit::result
92              .           .    <������   .               .
93              .           .    ���     .               .
94              .           .    ��� RELEASE MUTEX       .
95              .           .    ���     .               .
96              .           .    ��� end of playback::context::compile ()
97              .           .    ���     .               .
98              .           .    ��� playback::context dtor
99              .           .     ������>  .               .
100              .           .       ��� Normally we cleanup the tempdir here:
101              .           .       ���   ("fake.so" is unlinked from the
102              .           .       ���    filesystem at this point)
103              .           .       ��� If the client code requested debuginfo, the
104              .           .       ��� cleanup happens later (in gcc_jit_result_release)
105              .           .       ��� to make it easier on the debugger (see PR jit/64206)
106              .           .    <������   .               .
107              .           .    ���     .               .
108              .           .    ��� end of recording::context::compile ()
109   <���������������������������������������������������������������������������������      .               .
110   ���          .           .          .               .
111   V          .           .  gcc_jit_result_get_code .
112    ������������������������������������������������������������������������������>      .               .
113              .           .    ��� dlsym () within loaded DSO
114   <���������������������������������������������������������������������������������      .               .
115   Get (void*).           .          .               .
116   ���          .           .          .               .
117   ��� Call it  .           .          .               .
118   ���������������������������������������������>       .          .               .
119              .    ���      .          .               .
120              .    ���      .          .               .
121   <���������������������������������������������       .          .               .
122   ���          .           .          .               .
123etc���          .           .          .               .
124   ���          .           .          .               .
125   V          .           .  gcc_jit_result_release  .
126    ������������������������������������������������������������������������������>      .               .
127              .           .    ��� dlclose () the loaded DSO
128              .           .    ���    (code becomes uncallable)
129              .           .    ���     .               .
130              .           .    ��� If the client code requested debuginfo, then
131              .           .    ��� cleanup of the tempdir was delayed.
132              .           .    ��� If that was the case, clean it up now.
133   <���������������������������������������������������������������������������������      .               .
134   ���          .           .          .               .
135