2015-07-14 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / jit / notes.txt
blobe92c6651f00001a4157f36ed6e6232764badb28d
1 Client Code   . Generated .            libgccjit.so
2               . code      .
3               .           . JIT API  . JIT "Frontend". (libbackend.a)
4 ....................................................................................
5    │          .           .          .               .
6     ──────────────────────────>      .               .
7               .           .    │     .               .
8               .           .    V     .               .
9               .           .    ──> libgccjit.c       .
10               .           .        │ (error-checking).
11               .           .        │                 .
12               .           .        ──> jit-recording.c
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.c
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 ("fake.so")
82               .           .      │   .               .
83               .           .      │   . Load DSO (dlopen "fake.so")
84               .           .      │   .               .
85               .           .      │   . Bundle it up in a jit::result
86               .           .    <──   .               .
87               .           .    │     .               .
88               .           .    │ RELEASE MUTEX       .
89               .           .    │     .               .
90               .           .    │ end of playback::context::compile ()
91               .           .    │     .               .
92               .           .    │ playback::context dtor
93               .           .     ──>  .               .
94               .           .       │ Normally we cleanup the tempdir here:
95               .           .       │   ("fake.so" is unlinked from the
96               .           .       │    filesystem at this point)
97               .           .       │ If the client code requested debuginfo, the
98               .           .       │ cleanup happens later (in gcc_jit_result_release)
99               .           .       │ to make it easier on the debugger (see PR jit/64206)
100               .           .    <──   .               .
101               .           .    │     .               .
102               .           .    │ end of recording::context::compile ()
103    <───────────────────────────      .               .
104    │          .           .          .               .
105    V          .           .  gcc_jit_result_get_code .
106     ──────────────────────────>      .               .
107               .           .    │ dlsym () within loaded DSO
108    <───────────────────────────      .               .
109    Get (void*).           .          .               .
110    │          .           .          .               .
111    │ Call it  .           .          .               .
112    ───────────────>       .          .               .
113               .    │      .          .               .
114               .    │      .          .               .
115    <───────────────       .          .               .
116    │          .           .          .               .
117 etc│          .           .          .               .
118    │          .           .          .               .
119    V          .           .  gcc_jit_result_release  .
120     ──────────────────────────>      .               .
121               .           .    │ dlclose () the loaded DSO
122               .           .    │    (code becomes uncallable)
123               .           .    │     .               .
124               .           .    │ If the client code requested debuginfo, then
125               .           .    │ cleanup of the tempdir was delayed.
126               .           .    │ If that was the case, clean it up now.
127    <───────────────────────────      .               .
128    │          .           .          .               .