annotate gcc/jit/jit-common.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Core of implementation of libgccjit.so
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2013-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
8 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
10 any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but
kono
parents:
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
kono
parents:
diff changeset
15 General Public License for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 #ifndef JIT_COMMON_H
kono
parents:
diff changeset
22 #define JIT_COMMON_H
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 #include "libgccjit.h"
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 #include "vec.h"
kono
parents:
diff changeset
27 #include "tree.h"
kono
parents:
diff changeset
28 #include "inchash.h"
kono
parents:
diff changeset
29 #include "tree-iterator.h"
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 #ifdef GCC_VERSION
kono
parents:
diff changeset
32 #if GCC_VERSION >= 4001
kono
parents:
diff changeset
33 #define GNU_PRINTF(M, N) __attribute__ ((format (gnu_printf, (M), (N))))
kono
parents:
diff changeset
34 #else
kono
parents:
diff changeset
35 #define GNU_PRINTF(M, N)
kono
parents:
diff changeset
36 #endif
kono
parents:
diff changeset
37 #endif
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 const int NUM_GCC_JIT_TYPES = GCC_JIT_TYPE_COMPLEX_LONG_DOUBLE + 1;
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 /* This comment is included by the docs.
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 In order to allow jit objects to be usable outside of a compile
kono
parents:
diff changeset
44 whilst working with the existing structure of GCC's code the
kono
parents:
diff changeset
45 C API is implemented in terms of a gcc::jit::recording::context,
kono
parents:
diff changeset
46 which records the calls made to it.
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 When a gcc_jit_context is compiled, the recording context creates a
kono
parents:
diff changeset
49 playback context. The playback context invokes the bulk of the GCC
kono
parents:
diff changeset
50 code, and within the "frontend" parsing hook, plays back the recorded
kono
parents:
diff changeset
51 API calls, creating GCC tree objects.
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 So there are two parallel families of classes: those relating to
kono
parents:
diff changeset
54 recording, and those relating to playback:
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 * Visibility: recording objects are exposed back to client code,
kono
parents:
diff changeset
57 whereas playback objects are internal to the library.
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 * Lifetime: recording objects have a lifetime equal to that of the
kono
parents:
diff changeset
60 recording context that created them, whereas playback objects only
kono
parents:
diff changeset
61 exist within the frontend hook.
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 * Memory allocation: recording objects are allocated by the recording
kono
parents:
diff changeset
64 context, and automatically freed by it when the context is released,
kono
parents:
diff changeset
65 whereas playback objects are allocated within the GC heap, and
kono
parents:
diff changeset
66 garbage-collected; they can own GC-references.
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 * Integration with rest of GCC: recording objects are unrelated to the
kono
parents:
diff changeset
69 rest of GCC, whereas playback objects are wrappers around "tree"
kono
parents:
diff changeset
70 instances. Hence you can't ask a recording rvalue or lvalue what its
kono
parents:
diff changeset
71 type is, whereas you can for a playback rvalue of lvalue (since it
kono
parents:
diff changeset
72 can work with the underlying GCC tree nodes).
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 * Instancing: There can be multiple recording contexts "alive" at once
kono
parents:
diff changeset
75 (albeit it only one compiling at once), whereas there can only be one
kono
parents:
diff changeset
76 playback context alive at one time (since it interacts with the GC).
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 Ultimately if GCC could support multiple GC heaps and contexts, and
kono
parents:
diff changeset
79 finer-grained initialization, then this recording vs playback
kono
parents:
diff changeset
80 distinction could be eliminated.
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 During a playback, we associate objects from the recording with
kono
parents:
diff changeset
83 their counterparts during this playback. For simplicity, we store this
kono
parents:
diff changeset
84 within the recording objects, as ``void *m_playback_obj``, casting it to
kono
parents:
diff changeset
85 the appropriate playback object subclass. For these casts to make
kono
parents:
diff changeset
86 sense, the two class hierarchies need to have the same structure.
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 Note that the playback objects that ``m_playback_obj`` points to are
kono
parents:
diff changeset
89 GC-allocated, but the recording objects don't own references:
kono
parents:
diff changeset
90 these associations only exist within a part of the code where
kono
parents:
diff changeset
91 the GC doesn't collect, and are set back to NULL before the GC can
kono
parents:
diff changeset
92 run.
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 End of comment for inclusion in the docs. */
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 namespace gcc {
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 namespace jit {
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 class result;
kono
parents:
diff changeset
101 class dump;
kono
parents:
diff changeset
102 class logger;
kono
parents:
diff changeset
103 class builtins_manager; // declared within jit-builtins.h
kono
parents:
diff changeset
104 class tempdir;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 namespace recording {
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 /* Recording types. */
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 /* Indentation indicates inheritance: */
kono
parents:
diff changeset
111 class context;
kono
parents:
diff changeset
112 class memento;
kono
parents:
diff changeset
113 class string;
kono
parents:
diff changeset
114 class location;
kono
parents:
diff changeset
115 class type;
kono
parents:
diff changeset
116 class function_type;
kono
parents:
diff changeset
117 class compound_type;
kono
parents:
diff changeset
118 class struct_;
kono
parents:
diff changeset
119 class union_;
kono
parents:
diff changeset
120 class vector_type;
kono
parents:
diff changeset
121 class field;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
122 class bitfield;
111
kono
parents:
diff changeset
123 class fields;
kono
parents:
diff changeset
124 class function;
kono
parents:
diff changeset
125 class block;
kono
parents:
diff changeset
126 class rvalue;
kono
parents:
diff changeset
127 class lvalue;
kono
parents:
diff changeset
128 class local;
kono
parents:
diff changeset
129 class global;
kono
parents:
diff changeset
130 class param;
kono
parents:
diff changeset
131 class base_call;
kono
parents:
diff changeset
132 class function_pointer;
kono
parents:
diff changeset
133 class statement;
kono
parents:
diff changeset
134 class case_;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 /* End of recording types. */
kono
parents:
diff changeset
137 }
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 namespace playback {
kono
parents:
diff changeset
140 /* Playback types. */
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 /* Indentation indicates inheritance: */
kono
parents:
diff changeset
143 class context;
kono
parents:
diff changeset
144 class wrapper;
kono
parents:
diff changeset
145 class type;
kono
parents:
diff changeset
146 class compound_type;
kono
parents:
diff changeset
147 class field;
kono
parents:
diff changeset
148 class function;
kono
parents:
diff changeset
149 class block;
kono
parents:
diff changeset
150 class rvalue;
kono
parents:
diff changeset
151 class lvalue;
kono
parents:
diff changeset
152 class param;
kono
parents:
diff changeset
153 class source_file;
kono
parents:
diff changeset
154 class source_line;
kono
parents:
diff changeset
155 class location;
kono
parents:
diff changeset
156 class case_;
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 /* End of playback types. */
kono
parents:
diff changeset
159 }
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 typedef playback::context replayer;
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 class dump
kono
parents:
diff changeset
164 {
kono
parents:
diff changeset
165 public:
kono
parents:
diff changeset
166 dump (recording::context &ctxt,
kono
parents:
diff changeset
167 const char *filename,
kono
parents:
diff changeset
168 bool update_locations);
kono
parents:
diff changeset
169 ~dump ();
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 recording::context &get_context () { return m_ctxt; }
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 void write (const char *fmt, ...)
kono
parents:
diff changeset
174 GNU_PRINTF(2, 3);
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 bool update_locations () const { return m_update_locations; }
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 recording::location *
kono
parents:
diff changeset
179 make_location () const;
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 FILE *get_file () const { return m_file; }
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 private:
kono
parents:
diff changeset
184 recording::context &m_ctxt;
kono
parents:
diff changeset
185 const char *m_filename;
kono
parents:
diff changeset
186 bool m_update_locations;
kono
parents:
diff changeset
187 int m_line;
kono
parents:
diff changeset
188 int m_column;
kono
parents:
diff changeset
189 FILE *m_file;
kono
parents:
diff changeset
190 };
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 /* A hidden enum of boolean options that are only exposed via API
kono
parents:
diff changeset
193 entrypoints, rather than via gcc_jit_context_set_bool_option. */
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 enum inner_bool_option
kono
parents:
diff changeset
196 {
kono
parents:
diff changeset
197 INNER_BOOL_OPTION_ALLOW_UNREACHABLE_BLOCKS,
kono
parents:
diff changeset
198 INNER_BOOL_OPTION_USE_EXTERNAL_DRIVER,
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 NUM_INNER_BOOL_OPTIONS
kono
parents:
diff changeset
201 };
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 } // namespace gcc::jit
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 } // namespace gcc
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 #endif /* JIT_COMMON_H */