re PR target/65697 (__atomic memory barriers not strong enough for __sync builtins)
[gcc.git] / gcc / jit / notes.txt
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 │ . . . .