|
|
1.1 root 1: @node internals
2: @chapter Internal Architecture of the Compiler
3:
4: This is meant to describe the C++ frontend for gcc in detail.
5: Questions and comments to [email protected].
6:
7: @index delete, two argument
8: For two argument delete, the second argument is always calculated by
9: ``virtual_size ='' in the source. It currently has a problem, in that
10: object size is not calculated by the virtual destructor and passed back
11: for the second parameter to delete. Destructors need to return a value
12: just like constructors.
13:
14: @index visibility checking
15: Visibility checking in general is unimplemented, there are a few cases
16: where it is implemented. grok_enum_decls should be used in more places
17: to do visibility checking, but this is only the tip of a bigger problem.
18:
19: @index volatile
20: volatile is not implemented in general.
21:
22: @index const
23: const is completely implemented except for function overload selection.
24:
25: @index protected base classes
26: Protected base classes are not fully implemented.
27:
28: @item BLOCK_SUPERCONTEXT
29: In the outermost scope of each function, it points to the FUNCTION_DECL
30: node. It aids in better DWARF support of inline functions.
31:
32: @item DECL_CLASS_CONTEXT
33: Identifys the context that the _DECL was found in.
34:
35: Has values of:
36:
37: RECORD_TYPE, or UNION_TYPE.
38:
39: What things can this be used on:
40:
41: TYPE_DECLs, *_DECLs
42:
43: @item DECL_NESTED_TYPENAME
44: Holds the fully qualified type name. Example, Base::Derived.
45:
46: Has values of:
47:
48: IDENTIFIER_NODE
49:
50: What things can this be used on:
51:
52: TYPE_DECLs
53:
54: @item TYPE_NAME
55: Names the type.
56:
57: Has values of:
58:
59: 0 for things that don't have names.
60: should be IDENTIFIER_NODE for RECORD_TYPEs UNION_TYPEs and ENUM_TYPEs.
61: TYPE_DECL for RECORD_TYPEs, UNION_TYPEs and ENUM_TYPEs, but shouldn't
62: be.
63: TYPE_DECL for typedefs, unsure why.
64:
65: What things can one use this on:
66:
67: TYPE_DECLs
68: RECORD_TYPEs
69: UNION_TYPEs
70: ENUM_TYPEs
71:
72: How is it used:
73:
74: Used by dwarfout.c to fetch the name of structs, unoins and enums
75: to create AT_name fields.
76:
77: History:
78:
79: It currently points to the TYPE_DECL for RECORD_TYPEs,
80: UNION_TYPEs and ENUM_TYPEs, but it should be history soon.
81:
82: @item DECL_NAME
83:
84: Has values of:
85:
86: 0 for things that don't have names.
87: IDENTIFIER_NODE for TYPE_DECLs.
88:
89: @item TYPE_DECL
90: Used to represent typedefs, and used to represent bindings layers.
91:
92: Components:
93:
94: DECL_NAME is the name of the typedef. For example, foo would
95: be found in the DECL_NAME slot when @code{typedef int foo;} is
96: seen.
97:
98: DECL_SOURCE_LINE identifies what source line number in the
99: source file the declaration was found at. A value of 0
100: indicates that this TYPE_DECL is just an internal binding layer
101: marker, and does not correspond to a user suppiled typedef.
102:
103: DECL_SOURCE_FILE @xref{DECL_SOURCE_FILE}.
104:
105: @item DECL_IGNORED_P
106: A bit that can be set to inform the debug information output routines in
107: the backend that a certain _DECL node should be totally ignored.
108:
109: Used in cases where it is known that the debugging information will be
110: output in another file, or where a sub-type is known not to be needed
111: because the enclosing type is not needed.
112:
113: A compiler constructed virtual destructor in derived classes that do not
114: define an exlicit destructor that was defined exlicit in a base class
115: has this bit set as well. Also used on __FUNCTION__ and
116: __PRETTY_FUNCTION__ to mark they are ``compiler generated.'' c-decl and
117: c-lex.c both want DECL_IGNORED_P set for ``internally generated vars,''
118: and ``user-invisible variable.''
119:
120: Functions built by the C++ front-end such as default destructors,
121: virtual desctructors and default constructors want to be marked that
122: they are compiler generated, but unsure why.
123:
124: Currently, it is used in an absolute way in the C++ front-end, as an
125: optimization, to tell the debug information output routines to not
126: generate debugging information that will be output by another separately
127: compiled file.
128:
129: @findex DECL_SOURCE_FILE
130: @item DECL_SOURCE_FILE
131: Identifies what source file a particular declaration was found in.
132:
133: Has values of:
134:
135: "<built-in>" on TYPE_DECLs to mean the typedef is built in.
136:
137: @item DECL_SOURCE_LINE
138: Identifies what source line number in the source file the declaration
139: was found at.
140:
141: Has values of:
142:
143: 0 for an undefined label.
144:
145: 0 for TYPE_DECLs that are internally generated.
146:
147: 0 for FUNCTION_DECLs for functions generated by the compiler.
148: (not yet, but should be.)
149:
150: @item DECL_VIRTUAL_P
151: A flag used on FIELD_DECLs and VAR_DECLs. (Documentation in tree.h is
152: wrong.) Used in VAR_DECLs to indicate that the variable is a vtable.
153: It is also used in FIELD_DECLs for vtable pointers.
154:
155: What things can this be used on:
156:
157: FIELD_DECLs and VAR_DECLs.
158:
159: @item DECL_VINDEX
160: Used for FUNCTION_DECLs in two different ways. Before the structure
161: containing the FUNCTION_DECL is laid out, DECL_VINDEX may point to a
162: FUNCTION_DECL in a base class which is the FUNCTION_DECL which this
163: FUNCTION_DECL will replace as a virtual function. When the class is
164: laid out, this pointer is changed to an INTEGER_CST node which is
165: suitable for use as an index into the virtual function table.
166:
167: DECL_VINDEX may be a TREE_LIST, that would seem to be a list of
168: overridden FUNCTION_DECLs. add_virtual_function has code to deal with
169: this when it uses the variable base_fndecl_list, but it would seem that
170: somehow, it is possible for the TREE_LIST to pursist until method_call,
171: and it should not.
172:
173: @item TREE_USED
174:
175: Has values of:
176:
177: 0 for unused labels.
178:
179: @item TREE_ADDRESSABLE
180: A flag that is set for any type that has a constructor.
181:
182: @item CLASSTYPE_METHOD_VEC
183: The following is true after finish_struct has been called (on the
184: class?) but not before. Before finish_struct is called, things are
185: different to some extent. Contains a TREE_VEC of methods of the class.
186: The TREE_VEC_LENGTH is the number of differently named methods plus one
187: for the 0th entry. The 0th entry is always allocated, and reserved for
188: ctors and dtors. If there are none, TREE_VEC_ELT(N,0) == NULL_TREE.
189: Each entry of the TREE_VEC is a FUNCTION_DECL. For each FUNCTION_DECL,
190: there is a DECL_CHAIN slot. If the FUNCTION_DECL is the last one with a
191: given name, the DECL_CHAIN slot is NULL_TREE. Otherwise it is the next
192: method that has the same name (but a different signature). It would
193: seem that it is not true that because the DECL_CHAIN slot is used in
194: this way, we cannot call pushdecl to put the method in the global scope
195: (cause that would overwrite the TREE_CHAIN slot), because they use
196: different _CHAINs.
197:
198: friends are kept in TREE_LISTs, so that there's no need to use their
199: TREE_CHAIN slot for anything.
200:
201: Has values of:
202:
203: TREE_VEC
204:
205: @item TYPE_METHOD
206: Related to CLASSTYPE_METHOD_VEC. Chained together with TREE_CHAIN.
207: dbxout.c uses this to get at the methods of a class.
208:
209: @item CLASSTYPE_TAGS
210: CLASSTYPE_TAGS is a linked (via TREE_CHAIN) list of member classes of a
211: class. TREE_PURPOSE is the name, TREE_VALUE is the type (pushclass scans
212: these and calls pushtag on them.)
213:
214: finish_struct scans these to produce TYPE_DECLs to add to the
215: TYPE_FIELDS of the type.
216:
217: It is expected that name found in the TREE_PURPOSE slot is unique,
218: resolve_scope_to_name is one such place that depends upon this
219: uniqueness.
220:
221: @item TYPE_FIELDS
222: TYPE_FIELDS is a linked list (via TREE_CHAIN) of member types of a
223: class. The list can contain TYPE_DECLs, but there can also be other
224: things in the list apparently. See also CLASSTYPE_TAGS.
225:
226: @item TREE_PRIVATE
227: Set for FIELD_DECLs by finish_struct. But not uniformly set.
228:
229: The following routines do something with PRIVATE visibility:
230: build_method_call, alter_visibility, finish_struct_methods,
231: finish_struct, convert_to_aggr, CWriteLanguageDecl, CWriteLanguageType,
232: CWriteUseObject, compute_visibility, lookup_field, dfs_pushdecl,
233: GNU_xref_member, dbxout_type_fields, dbxout_type_method_1
234:
235: @item TREE_PROTECTED
236: The following routines do something with PROTECTED visibility:
237: build_method_call, alter_visibility, finish_struct, convert_to_aggr,
238: CWriteLanguageDecl, CWriteLanguageType, CWriteUseObject,
239: compute_visibility, lookup_field, GNU_xref_member, dbxout_type_fields,
240: dbxout_type_method_1
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.