annotate gcc/doc/gty.texi @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1 @c Copyright (C) 2002-2020 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 @c This is part of the GCC manual.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 @c For copying conditions, see the file gcc.texi.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 @node Type Information
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 @chapter Memory Management and Type Information
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 @cindex GGC
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 @findex GTY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 GCC uses some fairly sophisticated memory management techniques, which
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 involve determining information about GCC's data structures from GCC's
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 source code and using this information to perform garbage collection and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 implement precompiled headers.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
111
kono
parents: 67
diff changeset
15 A full C++ parser would be too complicated for this task, so a limited
kono
parents: 67
diff changeset
16 subset of C++ is interpreted and special markers are used to determine
kono
parents: 67
diff changeset
17 what parts of the source to look at. All @code{struct}, @code{union}
kono
parents: 67
diff changeset
18 and @code{template} structure declarations that define data structures
kono
parents: 67
diff changeset
19 that are allocated under control of the garbage collector must be
kono
parents: 67
diff changeset
20 marked. All global variables that hold pointers to garbage-collected
kono
parents: 67
diff changeset
21 memory must also be marked. Finally, all global variables that need
kono
parents: 67
diff changeset
22 to be saved and restored by a precompiled header must be marked. (The
kono
parents: 67
diff changeset
23 precompiled header mechanism can only save static variables if they're
kono
parents: 67
diff changeset
24 scalar. Complex data structures must be allocated in garbage-collected
kono
parents: 67
diff changeset
25 memory to be saved in a precompiled header.)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 The full format of a marker is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 @smallexample
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 GTY (([@var{option}] [(@var{param})], [@var{option}] [(@var{param})] @dots{}))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 @end smallexample
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 @noindent
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 but in most cases no options are needed. The outer double parentheses
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 are still necessary, though: @code{GTY(())}. Markers can appear:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 @itemize @bullet
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 In a structure definition, before the open brace;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 In a global variable declaration, after the keyword @code{static} or
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 @code{extern}; and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 In a structure field definition, before the name of the field.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 @end itemize
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 Here are some examples of marking simple data structures and globals.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 @smallexample
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
48 struct GTY(()) @var{tag}
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 @{
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 @var{fields}@dots{}
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 @};
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53 typedef struct GTY(()) @var{tag}
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 @{
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 @var{fields}@dots{}
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 @} *@var{typename};
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 static GTY(()) struct @var{tag} *@var{list}; /* @r{points to GC memory} */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 static GTY(()) int @var{counter}; /* @r{save counter in a PCH} */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 @end smallexample
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 The parser understands simple typedefs such as
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 @code{typedef struct @var{tag} *@var{name};} and
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 @code{typedef int @var{name};}.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 These don't need to be marked.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
111
kono
parents: 67
diff changeset
67 Since @code{gengtype}'s understanding of C++ is limited, there are
kono
parents: 67
diff changeset
68 several constructs and declarations that are not supported inside
kono
parents: 67
diff changeset
69 classes/structures marked for automatic GC code generation. The
kono
parents: 67
diff changeset
70 following C++ constructs produce a @code{gengtype} error on
kono
parents: 67
diff changeset
71 structures/classes marked for automatic GC code generation:
kono
parents: 67
diff changeset
72
kono
parents: 67
diff changeset
73 @itemize @bullet
kono
parents: 67
diff changeset
74 @item
kono
parents: 67
diff changeset
75 Type definitions inside classes/structures are not supported.
kono
parents: 67
diff changeset
76 @item
kono
parents: 67
diff changeset
77 Enumerations inside classes/structures are not supported.
kono
parents: 67
diff changeset
78 @end itemize
kono
parents: 67
diff changeset
79
kono
parents: 67
diff changeset
80 If you have a class or structure using any of the above constructs,
kono
parents: 67
diff changeset
81 you need to mark that class as @code{GTY ((user))} and provide your
kono
parents: 67
diff changeset
82 own marking routines (see section @ref{User GC} for details).
kono
parents: 67
diff changeset
83
kono
parents: 67
diff changeset
84 It is always valid to include function definitions inside classes.
kono
parents: 67
diff changeset
85 Those are always ignored by @code{gengtype}, as it only cares about
kono
parents: 67
diff changeset
86 data members.
kono
parents: 67
diff changeset
87
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 @menu
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 * GTY Options:: What goes inside a @code{GTY(())}.
111
kono
parents: 67
diff changeset
90 * Inheritance and GTY:: Adding GTY to a class hierarchy.
kono
parents: 67
diff changeset
91 * User GC:: Adding user-provided GC marking routines.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 * GGC Roots:: Making global variables GGC roots.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 * Files:: How the generated files work.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 * Invoking the garbage collector:: How to invoke the garbage collector.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
95 * Troubleshooting:: When something does not work as expected.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 @end menu
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 @node GTY Options
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 @section The Inside of a @code{GTY(())}
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 Sometimes the C code is not enough to fully describe the type
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 structure. Extra information can be provided with @code{GTY} options
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 and additional markers. Some options take a parameter, which may be
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 either a string or a type name, depending on the parameter. If an
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 option takes no parameter, it is acceptable either to omit the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 parameter entirely, or to provide an empty string as a parameter. For
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 example, @code{@w{GTY ((skip))}} and @code{@w{GTY ((skip ("")))}} are
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 equivalent.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 When the parameter is a string, often it is a fragment of C code. Four
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 special escapes may be used in these strings, to refer to pieces of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 the data structure being marked:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 @cindex % in GTY option
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 @table @code
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 @item %h
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 The current structure.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 @item %1
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 The structure that immediately contains the current structure.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 @item %0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 The outermost structure that contains the current structure.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 @item %a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 A partial expression of the form @code{[i1][i2]@dots{}} that indexes
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 the array item currently being marked.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 @end table
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 For instance, suppose that you have a structure of the form
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 @smallexample
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 struct A @{
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 @dots{}
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 @};
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 struct B @{
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 struct A foo[12];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 @};
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 @end smallexample
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 @noindent
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 and @code{b} is a variable of type @code{struct B}. When marking
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 @samp{b.foo[11]}, @code{%h} would expand to @samp{b.foo[11]},
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 @code{%0} and @code{%1} would both expand to @samp{b}, and @code{%a}
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 would expand to @samp{[11]}.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 As in ordinary C, adjacent strings will be concatenated; this is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 helpful when you have a complicated expression.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 @smallexample
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 @group
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 GTY ((chain_next ("TREE_CODE (&%h.generic) == INTEGER_TYPE"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 " ? TYPE_NEXT_VARIANT (&%h.generic)"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 " : TREE_CHAIN (&%h.generic)")))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 @end group
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 @end smallexample
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 The available options are:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 @table @code
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 @findex length
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 @item length ("@var{expression}")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 There are two places the type machinery will need to be explicitly told
111
kono
parents: 67
diff changeset
159 the length of an array of non-atomic objects. The first case is when a
kono
parents: 67
diff changeset
160 structure ends in a variable-length array, like this:
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 @smallexample
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
162 struct GTY(()) rtvec_def @{
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 int num_elem; /* @r{number of elements} */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 rtx GTY ((length ("%h.num_elem"))) elem[1];
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 @};
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 @end smallexample
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 In this case, the @code{length} option is used to override the specified
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 array length (which should usually be @code{1}). The parameter of the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 option is a fragment of C code that calculates the length.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 The second case is when a structure or a global variable contains a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 pointer to an array, like this:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 @smallexample
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
175 struct gimple_omp_for_iter * GTY((length ("%h.collapse"))) iter;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 @end smallexample
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
177 In this case, @code{iter} has been allocated by writing something like
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 @smallexample
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
179 x->iter = ggc_alloc_cleared_vec_gimple_omp_for_iter (collapse);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 @end smallexample
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
181 and the @code{collapse} provides the length of the field.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 This second use of @code{length} also works on global variables, like:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 @verbatim
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
185 static GTY((length("reg_known_value_size"))) rtx *reg_known_value;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 @end verbatim
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187
111
kono
parents: 67
diff changeset
188 Note that the @code{length} option is only meant for use with arrays of
kono
parents: 67
diff changeset
189 non-atomic objects, that is, objects that contain pointers pointing to
kono
parents: 67
diff changeset
190 other GTY-managed objects. For other GC-allocated arrays and strings
kono
parents: 67
diff changeset
191 you should use @code{atomic}.
kono
parents: 67
diff changeset
192
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 @findex skip
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 @item skip
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 If @code{skip} is applied to a field, the type machinery will ignore it.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 This is somewhat dangerous; the only safe use is in a union when one
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 field really isn't ever used.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
111
kono
parents: 67
diff changeset
200 @findex for_user
kono
parents: 67
diff changeset
201 @item for_user
kono
parents: 67
diff changeset
202
kono
parents: 67
diff changeset
203 Use this to mark types that need to be marked by user gc routines, but are not
kono
parents: 67
diff changeset
204 refered to in a template argument. So if you have some user gc type T1 and a
kono
parents: 67
diff changeset
205 non user gc type T2 you can give T2 the for_user option so that the marking
kono
parents: 67
diff changeset
206 functions for T1 can call non mangled functions to mark T2.
kono
parents: 67
diff changeset
207
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 @findex desc
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 @findex tag
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 @findex default
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 @item desc ("@var{expression}")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 @itemx tag ("@var{constant}")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 @itemx default
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 The type machinery needs to be told which field of a @code{union} is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 currently active. This is done by giving each field a constant
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 @code{tag} value, and then specifying a discriminator using @code{desc}.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 The value of the expression given by @code{desc} is compared against
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 each @code{tag} value, each of which should be different. If no
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 @code{tag} is matched, the field marked with @code{default} is used if
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 there is one, otherwise no field in the union will be marked.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 In the @code{desc} option, the ``current structure'' is the union that
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 it discriminates. Use @code{%1} to mean the structure containing it.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 There are no escapes available to the @code{tag} option, since it is a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 constant.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 For example,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 @smallexample
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
230 struct GTY(()) tree_binding
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 @{
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 struct tree_common common;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 union tree_binding_u @{
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 tree GTY ((tag ("0"))) scope;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 struct cp_binding_level * GTY ((tag ("1"))) level;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 @} GTY ((desc ("BINDING_HAS_LEVEL_P ((tree)&%0)"))) xscope;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 tree value;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 @};
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 @end smallexample
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 In this example, the value of BINDING_HAS_LEVEL_P when applied to a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 @code{struct tree_binding *} is presumed to be 0 or 1. If 1, the type
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 mechanism will treat the field @code{level} as being present and if 0,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 will treat the field @code{scope} as being present.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245
111
kono
parents: 67
diff changeset
246 The @code{desc} and @code{tag} options can also be used for inheritance
kono
parents: 67
diff changeset
247 to denote which subclass an instance is. See @ref{Inheritance and GTY}
kono
parents: 67
diff changeset
248 for more information.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249
111
kono
parents: 67
diff changeset
250 @findex cache
kono
parents: 67
diff changeset
251 @item cache
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252
111
kono
parents: 67
diff changeset
253 When the @code{cache} option is applied to a global variable gt_clear_cache is
kono
parents: 67
diff changeset
254 called on that variable between the mark and sweep phases of garbage
kono
parents: 67
diff changeset
255 collection. The gt_clear_cache function is free to mark blocks as used, or to
kono
parents: 67
diff changeset
256 clear pointers in the variable.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 @findex deletable
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 @item deletable
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 @code{deletable}, when applied to a global variable, indicates that when
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 garbage collection runs, there's no need to mark anything pointed to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 by this variable, it can just be set to @code{NULL} instead. This is used
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 to keep a list of free structures around for re-use.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
265
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 @findex maybe_undef
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 @item maybe_undef
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 When applied to a field, @code{maybe_undef} indicates that it's OK if
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 the structure that this fields points to is never defined, so long as
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 this field is always @code{NULL}. This is used to avoid requiring
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 backends to define certain optional structures. It doesn't work with
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 language frontends.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 @findex nested_ptr
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 @item nested_ptr (@var{type}, "@var{to expression}", "@var{from expression}")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 The type machinery expects all pointers to point to the start of an
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 object. Sometimes for abstraction purposes it's convenient to have
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 a pointer which points inside an object. So long as it's possible to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 convert the original object to and from the pointer, such pointers
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 can still be used. @var{type} is the type of the original object,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 the @var{to expression} returns the pointer given the original object,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 and the @var{from expression} returns the original object given
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 the pointer. The pointer will be available using the @code{%h}
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 escape.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
287
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 @findex chain_next
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 @findex chain_prev
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 @findex chain_circular
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 @item chain_next ("@var{expression}")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 @itemx chain_prev ("@var{expression}")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 @itemx chain_circular ("@var{expression}")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
294
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 It's helpful for the type machinery to know if objects are often
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 chained together in long lists; this lets it generate code that uses
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 less stack space by iterating along the list instead of recursing down
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 it. @code{chain_next} is an expression for the next item in the list,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 @code{chain_prev} is an expression for the previous item. For singly
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 linked lists, use only @code{chain_next}; for doubly linked lists, use
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 both. The machinery requires that taking the next item of the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 previous item gives the original item. @code{chain_circular} is similar
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 to @code{chain_next}, but can be used for circular single linked lists.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 @findex reorder
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 @item reorder ("@var{function name}")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
307
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 Some data structures depend on the relative ordering of pointers. If
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 the precompiled header machinery needs to change that ordering, it
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 will call the function referenced by the @code{reorder} option, before
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 changing the pointers in the object that's pointed to by the field the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 option applies to. The function must take four arguments, with the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 signature @samp{@w{void *, void *, gt_pointer_operator, void *}}.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 The first parameter is a pointer to the structure that contains the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 object being updated, or the object itself if there is no containing
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 structure. The second parameter is a cookie that should be ignored.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 The third parameter is a routine that, given a pointer, will update it
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 to its correct new value. The fourth parameter is a cookie that must
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 be passed to the second parameter.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 PCH cannot handle data structures that depend on the absolute values
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 of pointers. @code{reorder} functions can be expensive. When
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323 possible, it is better to depend on properties of the data, like an ID
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 number or the hash of a string instead.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325
111
kono
parents: 67
diff changeset
326 @findex atomic
kono
parents: 67
diff changeset
327 @item atomic
kono
parents: 67
diff changeset
328
kono
parents: 67
diff changeset
329 The @code{atomic} option can only be used with pointers. It informs
kono
parents: 67
diff changeset
330 the GC machinery that the memory that the pointer points to does not
kono
parents: 67
diff changeset
331 contain any pointers, and hence it should be treated by the GC and PCH
kono
parents: 67
diff changeset
332 machinery as an ``atomic'' block of memory that does not need to be
kono
parents: 67
diff changeset
333 examined when scanning memory for pointers. In particular, the
kono
parents: 67
diff changeset
334 machinery will not scan that memory for pointers to mark them as
kono
parents: 67
diff changeset
335 reachable (when marking pointers for GC) or to relocate them (when
kono
parents: 67
diff changeset
336 writing a PCH file).
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
337
111
kono
parents: 67
diff changeset
338 The @code{atomic} option differs from the @code{skip} option.
kono
parents: 67
diff changeset
339 @code{atomic} keeps the memory under Garbage Collection, but makes the
kono
parents: 67
diff changeset
340 GC ignore the contents of the memory. @code{skip} is more drastic in
kono
parents: 67
diff changeset
341 that it causes the pointer and the memory to be completely ignored by
kono
parents: 67
diff changeset
342 the Garbage Collector. So, memory marked as @code{atomic} is
kono
parents: 67
diff changeset
343 automatically freed when no longer reachable, while memory marked as
kono
parents: 67
diff changeset
344 @code{skip} is not.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
345
111
kono
parents: 67
diff changeset
346 The @code{atomic} option must be used with great care, because all
kono
parents: 67
diff changeset
347 sorts of problem can occur if used incorrectly, that is, if the memory
kono
parents: 67
diff changeset
348 the pointer points to does actually contain a pointer.
kono
parents: 67
diff changeset
349
kono
parents: 67
diff changeset
350 Here is an example of how to use it:
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
351 @smallexample
111
kono
parents: 67
diff changeset
352 struct GTY(()) my_struct @{
kono
parents: 67
diff changeset
353 int number_of_elements;
kono
parents: 67
diff changeset
354 unsigned int * GTY ((atomic)) elements;
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
355 @};
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
356 @end smallexample
111
kono
parents: 67
diff changeset
357 In this case, @code{elements} is a pointer under GC, and the memory it
kono
parents: 67
diff changeset
358 points to needs to be allocated using the Garbage Collector, and will
kono
parents: 67
diff changeset
359 be freed automatically by the Garbage Collector when it is no longer
kono
parents: 67
diff changeset
360 referenced. But the memory that the pointer points to is an array of
kono
parents: 67
diff changeset
361 @code{unsigned int} elements, and the GC must not try to scan it to
kono
parents: 67
diff changeset
362 find pointers to mark or relocate, which is why it is marked with the
kono
parents: 67
diff changeset
363 @code{atomic} option.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
364
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
365 Note that, currently, global variables cannot be marked with
111
kono
parents: 67
diff changeset
366 @code{atomic}; only fields of a struct can. This is a known
kono
parents: 67
diff changeset
367 limitation. It would be useful to be able to mark global pointers
kono
parents: 67
diff changeset
368 with @code{atomic} to make the PCH machinery aware of them so that
kono
parents: 67
diff changeset
369 they are saved and restored correctly to PCH files.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
370
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 @findex special
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 @item special ("@var{name}")
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 The @code{special} option is used to mark types that have to be dealt
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
375 with by special case machinery. The parameter is the name of the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
376 special case. See @file{gengtype.c} for further details. Avoid
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 adding new special cases unless there is no other alternative.
111
kono
parents: 67
diff changeset
378
kono
parents: 67
diff changeset
379 @findex user
kono
parents: 67
diff changeset
380 @item user
kono
parents: 67
diff changeset
381
kono
parents: 67
diff changeset
382 The @code{user} option indicates that the code to mark structure
kono
parents: 67
diff changeset
383 fields is completely handled by user-provided routines. See section
kono
parents: 67
diff changeset
384 @ref{User GC} for details on what functions need to be provided.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 @end table
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
386
111
kono
parents: 67
diff changeset
387 @node Inheritance and GTY
kono
parents: 67
diff changeset
388 @section Support for inheritance
kono
parents: 67
diff changeset
389 gengtype has some support for simple class hierarchies. You can use
kono
parents: 67
diff changeset
390 this to have gengtype autogenerate marking routines, provided:
kono
parents: 67
diff changeset
391
kono
parents: 67
diff changeset
392 @itemize @bullet
kono
parents: 67
diff changeset
393 @item
kono
parents: 67
diff changeset
394 There must be a concrete base class, with a discriminator expression
kono
parents: 67
diff changeset
395 that can be used to identify which subclass an instance is.
kono
parents: 67
diff changeset
396 @item
kono
parents: 67
diff changeset
397 Only single inheritance is used.
kono
parents: 67
diff changeset
398 @item
kono
parents: 67
diff changeset
399 None of the classes within the hierarchy are templates.
kono
parents: 67
diff changeset
400 @end itemize
kono
parents: 67
diff changeset
401
kono
parents: 67
diff changeset
402 If your class hierarchy does not fit in this pattern, you must use
kono
parents: 67
diff changeset
403 @ref{User GC} instead.
kono
parents: 67
diff changeset
404
kono
parents: 67
diff changeset
405 The base class and its discriminator must be identified using the ``desc''
kono
parents: 67
diff changeset
406 option. Each concrete subclass must use the ``tag'' option to identify
kono
parents: 67
diff changeset
407 which value of the discriminator it corresponds to.
kono
parents: 67
diff changeset
408
kono
parents: 67
diff changeset
409 Every class in the hierarchy must have a @code{GTY(())} marker, as
kono
parents: 67
diff changeset
410 gengtype will only attempt to parse classes that have such a marker
kono
parents: 67
diff changeset
411 @footnote{Classes lacking such a marker will not be identified as being
kono
parents: 67
diff changeset
412 part of the hierarchy, and so the marking routines will not handle them,
kono
parents: 67
diff changeset
413 leading to a assertion failure within the marking routines due to an
kono
parents: 67
diff changeset
414 unknown tag value (assuming that assertions are enabled).}.
kono
parents: 67
diff changeset
415
kono
parents: 67
diff changeset
416 @smallexample
kono
parents: 67
diff changeset
417 class GTY((desc("%h.kind"), tag("0"))) example_base
kono
parents: 67
diff changeset
418 @{
kono
parents: 67
diff changeset
419 public:
kono
parents: 67
diff changeset
420 int kind;
kono
parents: 67
diff changeset
421 tree a;
kono
parents: 67
diff changeset
422 @};
kono
parents: 67
diff changeset
423
kono
parents: 67
diff changeset
424 class GTY((tag("1"))) some_subclass : public example_base
kono
parents: 67
diff changeset
425 @{
kono
parents: 67
diff changeset
426 public:
kono
parents: 67
diff changeset
427 tree b;
kono
parents: 67
diff changeset
428 @};
kono
parents: 67
diff changeset
429
kono
parents: 67
diff changeset
430 class GTY((tag("2"))) some_other_subclass : public example_base
kono
parents: 67
diff changeset
431 @{
kono
parents: 67
diff changeset
432 public:
kono
parents: 67
diff changeset
433 tree c;
kono
parents: 67
diff changeset
434 @};
kono
parents: 67
diff changeset
435 @end smallexample
kono
parents: 67
diff changeset
436
kono
parents: 67
diff changeset
437 The generated marking routines for the above will contain a ``switch''
kono
parents: 67
diff changeset
438 on ``kind'', visiting all appropriate fields. For example, if kind is
kono
parents: 67
diff changeset
439 2, it will cast to ``some_other_subclass'' and visit fields a, b, and c.
kono
parents: 67
diff changeset
440
kono
parents: 67
diff changeset
441 @node User GC
kono
parents: 67
diff changeset
442 @section Support for user-provided GC marking routines
kono
parents: 67
diff changeset
443 @cindex user gc
kono
parents: 67
diff changeset
444 The garbage collector supports types for which no automatic marking
kono
parents: 67
diff changeset
445 code is generated. For these types, the user is required to provide
kono
parents: 67
diff changeset
446 three functions: one to act as a marker for garbage collection, and
kono
parents: 67
diff changeset
447 two functions to act as marker and pointer walker for pre-compiled
kono
parents: 67
diff changeset
448 headers.
kono
parents: 67
diff changeset
449
kono
parents: 67
diff changeset
450 Given a structure @code{struct GTY((user)) my_struct}, the following functions
kono
parents: 67
diff changeset
451 should be defined to mark @code{my_struct}:
kono
parents: 67
diff changeset
452
kono
parents: 67
diff changeset
453 @smallexample
kono
parents: 67
diff changeset
454 void gt_ggc_mx (my_struct *p)
kono
parents: 67
diff changeset
455 @{
kono
parents: 67
diff changeset
456 /* This marks field 'fld'. */
kono
parents: 67
diff changeset
457 gt_ggc_mx (p->fld);
kono
parents: 67
diff changeset
458 @}
kono
parents: 67
diff changeset
459
kono
parents: 67
diff changeset
460 void gt_pch_nx (my_struct *p)
kono
parents: 67
diff changeset
461 @{
kono
parents: 67
diff changeset
462 /* This marks field 'fld'. */
kono
parents: 67
diff changeset
463 gt_pch_nx (tp->fld);
kono
parents: 67
diff changeset
464 @}
kono
parents: 67
diff changeset
465
kono
parents: 67
diff changeset
466 void gt_pch_nx (my_struct *p, gt_pointer_operator op, void *cookie)
kono
parents: 67
diff changeset
467 @{
kono
parents: 67
diff changeset
468 /* For every field 'fld', call the given pointer operator. */
kono
parents: 67
diff changeset
469 op (&(tp->fld), cookie);
kono
parents: 67
diff changeset
470 @}
kono
parents: 67
diff changeset
471 @end smallexample
kono
parents: 67
diff changeset
472
kono
parents: 67
diff changeset
473 In general, each marker @code{M} should call @code{M} for every
kono
parents: 67
diff changeset
474 pointer field in the structure. Fields that are not allocated in GC
kono
parents: 67
diff changeset
475 or are not pointers must be ignored.
kono
parents: 67
diff changeset
476
kono
parents: 67
diff changeset
477 For embedded lists (e.g., structures with a @code{next} or @code{prev}
kono
parents: 67
diff changeset
478 pointer), the marker must follow the chain and mark every element in
kono
parents: 67
diff changeset
479 it.
kono
parents: 67
diff changeset
480
kono
parents: 67
diff changeset
481 Note that the rules for the pointer walker @code{gt_pch_nx (my_struct
kono
parents: 67
diff changeset
482 *, gt_pointer_operator, void *)} are slightly different. In this
kono
parents: 67
diff changeset
483 case, the operation @code{op} must be applied to the @emph{address} of
kono
parents: 67
diff changeset
484 every pointer field.
kono
parents: 67
diff changeset
485
kono
parents: 67
diff changeset
486 @subsection User-provided marking routines for template types
kono
parents: 67
diff changeset
487 When a template type @code{TP} is marked with @code{GTY}, all
kono
parents: 67
diff changeset
488 instances of that type are considered user-provided types. This means
kono
parents: 67
diff changeset
489 that the individual instances of @code{TP} do not need to be marked
kono
parents: 67
diff changeset
490 with @code{GTY}. The user needs to provide template functions to mark
kono
parents: 67
diff changeset
491 all the fields of the type.
kono
parents: 67
diff changeset
492
kono
parents: 67
diff changeset
493 The following code snippets represent all the functions that need to
kono
parents: 67
diff changeset
494 be provided. Note that type @code{TP} may reference to more than one
kono
parents: 67
diff changeset
495 type. In these snippets, there is only one type @code{T}, but there
kono
parents: 67
diff changeset
496 could be more.
kono
parents: 67
diff changeset
497
kono
parents: 67
diff changeset
498 @smallexample
kono
parents: 67
diff changeset
499 template<typename T>
kono
parents: 67
diff changeset
500 void gt_ggc_mx (TP<T> *tp)
kono
parents: 67
diff changeset
501 @{
kono
parents: 67
diff changeset
502 extern void gt_ggc_mx (T&);
kono
parents: 67
diff changeset
503
kono
parents: 67
diff changeset
504 /* This marks field 'fld' of type 'T'. */
kono
parents: 67
diff changeset
505 gt_ggc_mx (tp->fld);
kono
parents: 67
diff changeset
506 @}
kono
parents: 67
diff changeset
507
kono
parents: 67
diff changeset
508 template<typename T>
kono
parents: 67
diff changeset
509 void gt_pch_nx (TP<T> *tp)
kono
parents: 67
diff changeset
510 @{
kono
parents: 67
diff changeset
511 extern void gt_pch_nx (T&);
kono
parents: 67
diff changeset
512
kono
parents: 67
diff changeset
513 /* This marks field 'fld' of type 'T'. */
kono
parents: 67
diff changeset
514 gt_pch_nx (tp->fld);
kono
parents: 67
diff changeset
515 @}
kono
parents: 67
diff changeset
516
kono
parents: 67
diff changeset
517 template<typename T>
kono
parents: 67
diff changeset
518 void gt_pch_nx (TP<T *> *tp, gt_pointer_operator op, void *cookie)
kono
parents: 67
diff changeset
519 @{
kono
parents: 67
diff changeset
520 /* For every field 'fld' of 'tp' with type 'T *', call the given
kono
parents: 67
diff changeset
521 pointer operator. */
kono
parents: 67
diff changeset
522 op (&(tp->fld), cookie);
kono
parents: 67
diff changeset
523 @}
kono
parents: 67
diff changeset
524
kono
parents: 67
diff changeset
525 template<typename T>
kono
parents: 67
diff changeset
526 void gt_pch_nx (TP<T> *tp, gt_pointer_operator, void *cookie)
kono
parents: 67
diff changeset
527 @{
kono
parents: 67
diff changeset
528 extern void gt_pch_nx (T *, gt_pointer_operator, void *);
kono
parents: 67
diff changeset
529
kono
parents: 67
diff changeset
530 /* For every field 'fld' of 'tp' with type 'T', call the pointer
kono
parents: 67
diff changeset
531 walker for all the fields of T. */
kono
parents: 67
diff changeset
532 gt_pch_nx (&(tp->fld), op, cookie);
kono
parents: 67
diff changeset
533 @}
kono
parents: 67
diff changeset
534 @end smallexample
kono
parents: 67
diff changeset
535
kono
parents: 67
diff changeset
536 Support for user-defined types is currently limited. The following
kono
parents: 67
diff changeset
537 restrictions apply:
kono
parents: 67
diff changeset
538
kono
parents: 67
diff changeset
539 @enumerate
kono
parents: 67
diff changeset
540 @item Type @code{TP} and all the argument types @code{T} must be
kono
parents: 67
diff changeset
541 marked with @code{GTY}.
kono
parents: 67
diff changeset
542
kono
parents: 67
diff changeset
543 @item Type @code{TP} can only have type names in its argument list.
kono
parents: 67
diff changeset
544
kono
parents: 67
diff changeset
545 @item The pointer walker functions are different for @code{TP<T>} and
kono
parents: 67
diff changeset
546 @code{TP<T *>}. In the case of @code{TP<T>}, references to
kono
parents: 67
diff changeset
547 @code{T} must be handled by calling @code{gt_pch_nx} (which
kono
parents: 67
diff changeset
548 will, in turn, walk all the pointers inside fields of @code{T}).
kono
parents: 67
diff changeset
549 In the case of @code{TP<T *>}, references to @code{T *} must be
kono
parents: 67
diff changeset
550 handled by calling the @code{op} function on the address of the
kono
parents: 67
diff changeset
551 pointer (see the code snippets above).
kono
parents: 67
diff changeset
552 @end enumerate
kono
parents: 67
diff changeset
553
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
554 @node GGC Roots
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
555 @section Marking Roots for the Garbage Collector
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
556 @cindex roots, marking
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
557 @cindex marking roots
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
558
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
559 In addition to keeping track of types, the type machinery also locates
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
560 the global variables (@dfn{roots}) that the garbage collector starts
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
561 at. Roots must be declared using one of the following syntaxes:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
562
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
563 @itemize @bullet
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
564 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
565 @code{extern GTY(([@var{options}])) @var{type} @var{name};}
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
566 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 @code{static GTY(([@var{options}])) @var{type} @var{name};}
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
568 @end itemize
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 @noindent
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 The syntax
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
571 @itemize @bullet
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
572 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
573 @code{GTY(([@var{options}])) @var{type} @var{name};}
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
574 @end itemize
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
575 @noindent
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
576 is @emph{not} accepted. There should be an @code{extern} declaration
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
577 of such a variable in a header somewhere---mark that, not the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
578 definition. Or, if the variable is only used in one file, make it
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
579 @code{static}.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
581 @node Files
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
582 @section Source Files Containing Type Information
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 @cindex generated files
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 @cindex files, generated
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
585
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
586 Whenever you add @code{GTY} markers to a source file that previously
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
587 had none, or create a new source file containing @code{GTY} markers,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
588 there are three things you need to do:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
589
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 @enumerate
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
591 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
592 You need to add the file to the list of source files the type
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
593 machinery scans. There are four cases:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
594
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
595 @enumerate a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
596 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
597 For a back-end file, this is usually done
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
598 automatically; if not, you should add it to @code{target_gtfiles} in
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
599 the appropriate port's entries in @file{config.gcc}.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
600
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
601 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
602 For files shared by all front ends, add the filename to the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
603 @code{GTFILES} variable in @file{Makefile.in}.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
604
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
605 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
606 For files that are part of one front end, add the filename to the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
607 @code{gtfiles} variable defined in the appropriate
111
kono
parents: 67
diff changeset
608 @file{config-lang.in}.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
609 Headers should appear before non-headers in this list.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
610
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
611 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
612 For files that are part of some but not all front ends, add the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
613 filename to the @code{gtfiles} variable of @emph{all} the front ends
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
614 that use it.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
615 @end enumerate
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
616
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
617 @item
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
618 If the file was a header file, you'll need to check that it's included
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
619 in the right place to be visible to the generated files. For a back-end
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
620 header file, this should be done automatically. For a front-end header
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
621 file, it needs to be included by the same file that includes
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
622 @file{gtype-@var{lang}.h}. For other header files, it needs to be
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
623 included in @file{gtype-desc.c}, which is a generated file, so add it to
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
624 @code{ifiles} in @code{open_base_file} in @file{gengtype.c}.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
625
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
626 For source files that aren't header files, the machinery will generate a
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
627 header file that should be included in the source file you just changed.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
628 The file will be called @file{gt-@var{path}.h} where @var{path} is the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
629 pathname relative to the @file{gcc} directory with slashes replaced by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
630 @verb{|-|}, so for example the header file to be included in
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
631 @file{cp/parser.c} is called @file{gt-cp-parser.c}. The
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
632 generated header file should be included after everything else in the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
633 source file. Don't forget to mention this file as a dependency in the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
634 @file{Makefile}!
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
635
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
636 @end enumerate
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
637
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
638 For language frontends, there is another file that needs to be included
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
639 somewhere. It will be called @file{gtype-@var{lang}.h}, where
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
640 @var{lang} is the name of the subdirectory the language is contained in.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
641
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
642 Plugins can add additional root tables. Run the @code{gengtype}
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
643 utility in plugin mode as @code{gengtype -P pluginout.h @var{source-dir}
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
644 @var{file-list} @var{plugin*.c}} with your plugin files
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
645 @var{plugin*.c} using @code{GTY} to generate the @var{pluginout.h} file.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
646 The GCC build tree is needed to be present in that mode.
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
647
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
648
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
649 @node Invoking the garbage collector
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
650 @section How to invoke the garbage collector
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
651 @cindex garbage collector, invocation
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
652 @findex ggc_collect
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
653
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
654 The GCC garbage collector GGC is only invoked explicitly. In contrast
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
655 with many other garbage collectors, it is not implicitly invoked by
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
656 allocation routines when a lot of memory has been consumed. So the
111
kono
parents: 67
diff changeset
657 only way to have GGC reclaim storage is to call the @code{ggc_collect}
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
658 function explicitly. This call is an expensive operation, as it may
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
659 have to scan the entire heap. Beware that local variables (on the GCC
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
660 call stack) are not followed by such an invocation (as many other
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
661 garbage collectors do): you should reference all your data from static
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
662 or external @code{GTY}-ed variables, and it is advised to call
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
663 @code{ggc_collect} with a shallow call stack. The GGC is an exact mark
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
664 and sweep garbage collector (so it does not scan the call stack for
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
665 pointers). In practice GCC passes don't often call @code{ggc_collect}
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
666 themselves, because it is called by the pass manager between passes.
67
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
667
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
668 At the time of the @code{ggc_collect} call all pointers in the GC-marked
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
669 structures must be valid or @code{NULL}. In practice this means that
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
670 there should not be uninitialized pointer fields in the structures even
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
671 if your code never reads or writes those fields at a particular
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
672 instance. One way to ensure this is to use cleared versions of
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
673 allocators unless all the fields are initialized manually immediately
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
674 after allocation.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
675
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
676 @node Troubleshooting
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
677 @section Troubleshooting the garbage collector
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
678 @cindex garbage collector, troubleshooting
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
679
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
680 With the current garbage collector implementation, most issues should
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
681 show up as GCC compilation errors. Some of the most commonly
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
682 encountered issues are described below.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
683
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
684 @itemize @bullet
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
685 @item Gengtype does not produce allocators for a @code{GTY}-marked type.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
686 Gengtype checks if there is at least one possible path from GC roots to
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
687 at least one instance of each type before outputting allocators. If
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
688 there is no such path, the @code{GTY} markers will be ignored and no
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
689 allocators will be output. Solve this by making sure that there exists
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
690 at least one such path. If creating it is unfeasible or raises a ``code
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
691 smell'', consider if you really must use GC for allocating such type.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
692
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
693 @item Link-time errors about undefined @code{gt_ggc_r_foo_bar} and
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
694 similarly-named symbols. Check if your @file{foo_bar} source file has
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
695 @code{#include "gt-foo_bar.h"} as its very last line.
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
696
f6334be47118 update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
697 @end itemize