]>
Commit | Line | Data |
---|---|---|
19551f29 AO |
1 | /* Language-dependent hooks for C++. |
2 | Copyright 2001 Free Software Foundation, Inc. | |
3 | Contributed by Alexandre Oliva <aoliva@redhat.com> | |
4 | ||
5 | This file is part of GNU CC. | |
6 | ||
7 | GNU CC is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 2, or (at your option) | |
10 | any later version. | |
11 | ||
12 | GNU CC is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with GNU CC; see the file COPYING. If not, write to | |
19 | the Free Software Foundation, 59 Temple Place - Suite 330, | |
20 | Boston, MA 02111-1307, USA. */ | |
21 | ||
22 | #include "config.h" | |
23 | #include "system.h" | |
24 | #include "tree.h" | |
25 | #include "cp-tree.h" | |
ac79cd5a | 26 | #include "c-common.h" |
19551f29 AO |
27 | #include "toplev.h" |
28 | #include "langhooks.h" | |
d23c55c2 | 29 | #include "langhooks-def.h" |
19551f29 | 30 | |
8ac61af7 | 31 | static HOST_WIDE_INT cxx_get_alias_set PARAMS ((tree)); |
61eece67 | 32 | static bool ok_to_generate_alias_set_for_type PARAMS ((tree)); |
8ac61af7 | 33 | |
3ac88239 NB |
34 | #undef LANG_HOOKS_NAME |
35 | #define LANG_HOOKS_NAME "GNU C++" | |
19551f29 AO |
36 | #undef LANG_HOOKS_INIT |
37 | #define LANG_HOOKS_INIT cxx_init | |
38 | #undef LANG_HOOKS_FINISH | |
39 | #define LANG_HOOKS_FINISH cxx_finish | |
37207ee7 ZW |
40 | #undef LANG_HOOKS_CLEAR_BINDING_STACK |
41 | #define LANG_HOOKS_CLEAR_BINDING_STACK pop_everything | |
19551f29 AO |
42 | #undef LANG_HOOKS_INIT_OPTIONS |
43 | #define LANG_HOOKS_INIT_OPTIONS cxx_init_options | |
44 | #undef LANG_HOOKS_DECODE_OPTION | |
45 | #define LANG_HOOKS_DECODE_OPTION cxx_decode_option | |
46 | #undef LANG_HOOKS_POST_OPTIONS | |
47 | #define LANG_HOOKS_POST_OPTIONS cxx_post_options | |
8ac61af7 RK |
48 | #undef LANG_HOOKS_GET_ALIAS_SET |
49 | #define LANG_HOOKS_GET_ALIAS_SET cxx_get_alias_set | |
ac79cd5a RK |
50 | #undef LANG_HOOKS_EXPAND_CONSTANT |
51 | #define LANG_HOOKS_EXPAND_CONSTANT cplus_expand_constant | |
c9d892a8 NB |
52 | #undef LANG_HOOKS_EXPAND_EXPR |
53 | #define LANG_HOOKS_EXPAND_EXPR cxx_expand_expr | |
ac79cd5a RK |
54 | #undef LANG_HOOKS_SAFE_FROM_P |
55 | #define LANG_HOOKS_SAFE_FROM_P c_safe_from_p | |
52dabb6c NB |
56 | #undef LANG_HOOKS_PARSE_FILE |
57 | #define LANG_HOOKS_PARSE_FILE c_common_parse_file | |
63e1b1c4 NB |
58 | #undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL |
59 | #define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL cxx_dup_lang_specific_decl | |
24965e7a NB |
60 | #undef LANG_HOOKS_UNSAVE_EXPR_NOW |
61 | #define LANG_HOOKS_UNSAVE_EXPR_NOW cxx_unsave_expr_now | |
7b3e5198 NB |
62 | #undef LANG_HOOKS_MAYBE_BUILD_CLEANUP |
63 | #define LANG_HOOKS_MAYBE_BUILD_CLEANUP cxx_maybe_build_cleanup | |
4f0ade92 NB |
64 | #undef LANG_HOOKS_MARK_TREE |
65 | #define LANG_HOOKS_MARK_TREE cxx_mark_tree | |
5d69f816 NB |
66 | #undef LANG_HOOKS_PRINT_STATISTICS |
67 | #define LANG_HOOKS_PRINT_STATISTICS cxx_print_statistics | |
68 | #undef LANG_HOOKS_PRINT_XNODE | |
69 | #define LANG_HOOKS_PRINT_XNODE cxx_print_xnode | |
70 | #undef LANG_HOOKS_PRINT_DECL | |
71 | #define LANG_HOOKS_PRINT_DECL cxx_print_decl | |
72 | #undef LANG_HOOKS_PRINT_TYPE | |
73 | #define LANG_HOOKS_PRINT_TYPE cxx_print_type | |
74 | #undef LANG_HOOKS_PRINT_IDENTIFIER | |
75 | #define LANG_HOOKS_PRINT_IDENTIFIER cxx_print_identifier | |
7afff7cf NB |
76 | #undef LANG_HOOKS_DECL_PRINTABLE_NAME |
77 | #define LANG_HOOKS_DECL_PRINTABLE_NAME cxx_printable_name | |
5d69f816 NB |
78 | #undef LANG_HOOKS_SET_YYDEBUG |
79 | #define LANG_HOOKS_SET_YYDEBUG cxx_set_yydebug | |
19551f29 AO |
80 | |
81 | #undef LANG_HOOKS_TREE_INLINING_WALK_SUBTREES | |
82 | #define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES \ | |
83 | cp_walk_subtrees | |
84 | #undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN | |
85 | #define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \ | |
86 | cp_cannot_inline_tree_fn | |
87 | #undef LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS | |
88 | #define LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS \ | |
89 | cp_add_pending_fn_decls | |
90 | #undef LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P | |
91 | #define LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P \ | |
92 | cp_is_overload_p | |
93 | #undef LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P | |
94 | #define LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P \ | |
95 | cp_auto_var_in_fn_p | |
96 | #undef LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING | |
97 | #define LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING \ | |
98 | cp_copy_res_decl_for_inlining | |
99 | #undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P | |
100 | #define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P anon_aggr_type_p | |
742a37d5 JM |
101 | #undef LANG_HOOKS_TREE_INLINING_START_INLINING |
102 | #define LANG_HOOKS_TREE_INLINING_START_INLINING cp_start_inlining | |
103 | #undef LANG_HOOKS_TREE_INLINING_END_INLINING | |
104 | #define LANG_HOOKS_TREE_INLINING_END_INLINING cp_end_inlining | |
89d684bb BM |
105 | #undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN |
106 | #define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN cp_dump_tree | |
107 | #undef LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN | |
108 | #define LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN cp_type_quals | |
19551f29 AO |
109 | |
110 | /* Each front end provides its own hooks, for toplev.c. */ | |
3ac88239 | 111 | const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; |
8ac61af7 | 112 | |
61eece67 DN |
113 | /* Check if a C++ type is safe for aliasing. |
114 | Return TRUE if T safe for aliasing FALSE otherwise. */ | |
115 | ||
116 | static bool | |
117 | ok_to_generate_alias_set_for_type (t) | |
118 | tree t; | |
119 | { | |
120 | if (TYPE_PTRMEMFUNC_P (t)) | |
121 | return true; | |
122 | if (AGGREGATE_TYPE_P (t)) | |
123 | { | |
124 | if ((TREE_CODE (t) == RECORD_TYPE) || (TREE_CODE (t) == UNION_TYPE)) | |
125 | { | |
126 | tree fields; | |
127 | /* PODs are safe. */ | |
128 | if (! CLASSTYPE_NON_POD_P(t)) | |
129 | return true; | |
130 | /* Classes with virtual baseclasses are not. */ | |
131 | if (TYPE_USES_VIRTUAL_BASECLASSES (t)) | |
132 | return false; | |
133 | /* Recursively check the base classes. */ | |
134 | if (TYPE_BINFO (t) != NULL && TYPE_BINFO_BASETYPES (t) != NULL) | |
135 | { | |
136 | int i; | |
137 | for (i = 0; i < TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (t)); i++) | |
138 | { | |
139 | tree binfo = TREE_VEC_ELT (TYPE_BINFO_BASETYPES (t), i); | |
140 | if (!ok_to_generate_alias_set_for_type (BINFO_TYPE (binfo))) | |
141 | return false; | |
142 | } | |
143 | } | |
144 | /* Check all the fields. */ | |
145 | for (fields = TYPE_FIELDS (t); fields; fields = TREE_CHAIN (fields)) | |
146 | { | |
147 | if (TREE_CODE (fields) != FIELD_DECL) | |
148 | continue; | |
149 | if (! ok_to_generate_alias_set_for_type (TREE_TYPE (fields))) | |
150 | return false; | |
151 | } | |
152 | return true; | |
153 | } | |
154 | else if (TREE_CODE (t) == ARRAY_TYPE) | |
155 | return ok_to_generate_alias_set_for_type (TREE_TYPE (t)); | |
156 | else | |
157 | /* This should never happen, we dealt with all the aggregate | |
158 | types that can appear in C++ above. */ | |
159 | abort (); | |
160 | } | |
161 | else | |
162 | return true; | |
163 | } | |
164 | ||
2f9834e8 KG |
165 | /* Tree code classes. */ |
166 | ||
167 | #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, | |
168 | ||
169 | const char tree_code_type[] = { | |
170 | #include "tree.def" | |
171 | 'x', | |
172 | #include "c-common.def" | |
173 | 'x', | |
174 | #include "cp-tree.def" | |
175 | }; | |
176 | #undef DEFTREECODE | |
177 | ||
178 | /* Table indexed by tree code giving number of expression | |
179 | operands beyond the fixed part of the node structure. | |
180 | Not used for types or decls. */ | |
181 | ||
182 | #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, | |
183 | ||
184 | const unsigned char tree_code_length[] = { | |
185 | #include "tree.def" | |
186 | 0, | |
187 | #include "c-common.def" | |
188 | 0, | |
189 | #include "cp-tree.def" | |
190 | }; | |
191 | #undef DEFTREECODE | |
192 | ||
193 | /* Names of tree components. | |
194 | Used for printing out the tree and error messages. */ | |
195 | #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, | |
196 | ||
197 | const char *const tree_code_name[] = { | |
198 | #include "tree.def" | |
199 | "@@dummy", | |
200 | #include "c-common.def" | |
201 | "@@dummy", | |
202 | #include "cp-tree.def" | |
203 | }; | |
204 | #undef DEFTREECODE | |
205 | ||
8ac61af7 RK |
206 | /* Special routine to get the alias set for C++. */ |
207 | ||
208 | static HOST_WIDE_INT | |
209 | cxx_get_alias_set (t) | |
210 | tree t; | |
211 | { | |
61eece67 DN |
212 | /* It's not yet safe to use alias sets for classes in C++. */ |
213 | if (!ok_to_generate_alias_set_for_type(t)) | |
8ac61af7 RK |
214 | return 0; |
215 | ||
216 | return c_common_get_alias_set (t); | |
217 | } |