00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "system.h"
00024 #include "tree.h"
00025 #include "cp-tree.h"
00026 #include "c-common.h"
00027 #include "toplev.h"
00028 #include "langhooks.h"
00029 #include "langhooks-def.h"
00030
00031 static HOST_WIDE_INT cxx_get_alias_set PARAMS ((tree));
00032 static bool ok_to_generate_alias_set_for_type PARAMS ((tree));
00033 static bool cxx_warn_unused_global_decl PARAMS ((tree));
00034 static tree cp_expr_size PARAMS ((tree));
00035 static bool cp_var_mod_type_p PARAMS ((tree));
00036
00037 #undef LANG_HOOKS_NAME
00038 #define LANG_HOOKS_NAME "GNU C++"
00039 #undef LANG_HOOKS_INIT
00040 #define LANG_HOOKS_INIT cxx_init
00041 #undef LANG_HOOKS_FINISH
00042 #define LANG_HOOKS_FINISH cxx_finish
00043 #undef LANG_HOOKS_CLEAR_BINDING_STACK
00044 #define LANG_HOOKS_CLEAR_BINDING_STACK pop_everything
00045 #undef LANG_HOOKS_INIT_OPTIONS
00046 #define LANG_HOOKS_INIT_OPTIONS cxx_init_options
00047 #undef LANG_HOOKS_DECODE_OPTION
00048 #define LANG_HOOKS_DECODE_OPTION c_common_decode_option
00049 #undef LANG_HOOKS_POST_OPTIONS
00050 #define LANG_HOOKS_POST_OPTIONS c_common_post_options
00051 #undef LANG_HOOKS_GET_ALIAS_SET
00052 #define LANG_HOOKS_GET_ALIAS_SET cxx_get_alias_set
00053 #undef LANG_HOOKS_EXPAND_CONSTANT
00054 #define LANG_HOOKS_EXPAND_CONSTANT cplus_expand_constant
00055 #undef LANG_HOOKS_EXPAND_EXPR
00056 #define LANG_HOOKS_EXPAND_EXPR cxx_expand_expr
00057 #undef LANG_HOOKS_SAFE_FROM_P
00058 #define LANG_HOOKS_SAFE_FROM_P c_safe_from_p
00059 #undef LANG_HOOKS_PARSE_FILE
00060 #define LANG_HOOKS_PARSE_FILE c_common_parse_file
00061 #undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL
00062 #define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL cxx_dup_lang_specific_decl
00063 #undef LANG_HOOKS_UNSAVE_EXPR_NOW
00064 #define LANG_HOOKS_UNSAVE_EXPR_NOW cxx_unsave_expr_now
00065 #undef LANG_HOOKS_MAYBE_BUILD_CLEANUP
00066 #define LANG_HOOKS_MAYBE_BUILD_CLEANUP cxx_maybe_build_cleanup
00067 #undef LANG_HOOKS_TRUTHVALUE_CONVERSION
00068 #define LANG_HOOKS_TRUTHVALUE_CONVERSION c_common_truthvalue_conversion
00069 #undef LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES
00070 #define LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES cxx_insert_default_attributes
00071 #undef LANG_HOOKS_UNSAFE_FOR_REEVAL
00072 #define LANG_HOOKS_UNSAFE_FOR_REEVAL c_common_unsafe_for_reeval
00073 #undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME
00074 #define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME mangle_decl
00075 #undef LANG_HOOKS_MARK_ADDRESSABLE
00076 #define LANG_HOOKS_MARK_ADDRESSABLE cxx_mark_addressable
00077 #undef LANG_HOOKS_PRINT_STATISTICS
00078 #define LANG_HOOKS_PRINT_STATISTICS cxx_print_statistics
00079 #undef LANG_HOOKS_PRINT_XNODE
00080 #define LANG_HOOKS_PRINT_XNODE cxx_print_xnode
00081 #undef LANG_HOOKS_PRINT_DECL
00082 #define LANG_HOOKS_PRINT_DECL cxx_print_decl
00083 #undef LANG_HOOKS_PRINT_TYPE
00084 #define LANG_HOOKS_PRINT_TYPE cxx_print_type
00085 #undef LANG_HOOKS_PRINT_IDENTIFIER
00086 #define LANG_HOOKS_PRINT_IDENTIFIER cxx_print_identifier
00087 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
00088 #define LANG_HOOKS_DECL_PRINTABLE_NAME cxx_printable_name
00089 #undef LANG_HOOKS_PRINT_ERROR_FUNCTION
00090 #define LANG_HOOKS_PRINT_ERROR_FUNCTION cxx_print_error_function
00091 #undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
00092 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl
00093 #undef LANG_HOOKS_WRITE_GLOBALS
00094 #define LANG_HOOKS_WRITE_GLOBALS lhd_do_nothing
00095
00096
00097 #undef LANG_HOOKS_FUNCTION_INIT
00098 #define LANG_HOOKS_FUNCTION_INIT cxx_push_function_context
00099 #undef LANG_HOOKS_FUNCTION_FINAL
00100 #define LANG_HOOKS_FUNCTION_FINAL cxx_pop_function_context
00101
00102
00103 #undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
00104 #define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE c_common_attribute_table
00105 #undef LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE
00106 #define LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE c_common_format_attribute_table
00107 #undef LANG_HOOKS_ATTRIBUTE_TABLE
00108 #define LANG_HOOKS_ATTRIBUTE_TABLE cxx_attribute_table
00109
00110 #undef LANG_HOOKS_TREE_INLINING_WALK_SUBTREES
00111 #define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES \
00112 cp_walk_subtrees
00113 #undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN
00114 #define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \
00115 cp_cannot_inline_tree_fn
00116 #undef LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS
00117 #define LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS \
00118 cp_add_pending_fn_decls
00119 #undef LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P
00120 #define LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P \
00121 cp_is_overload_p
00122 #undef LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P
00123 #define LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P \
00124 cp_auto_var_in_fn_p
00125 #undef LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING
00126 #define LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING \
00127 cp_copy_res_decl_for_inlining
00128 #undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P
00129 #define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P anon_aggr_type_p
00130 #undef LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P
00131 #define LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P cp_var_mod_type_p
00132 #undef LANG_HOOKS_TREE_INLINING_START_INLINING
00133 #define LANG_HOOKS_TREE_INLINING_START_INLINING cp_start_inlining
00134 #undef LANG_HOOKS_TREE_INLINING_END_INLINING
00135 #define LANG_HOOKS_TREE_INLINING_END_INLINING cp_end_inlining
00136 #undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN
00137 #define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN cp_dump_tree
00138 #undef LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN
00139 #define LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN cp_type_quals
00140 #undef LANG_HOOKS_EXPR_SIZE
00141 #define LANG_HOOKS_EXPR_SIZE cp_expr_size
00142
00143 #undef LANG_HOOKS_MAKE_TYPE
00144 #define LANG_HOOKS_MAKE_TYPE cxx_make_type
00145 #undef LANG_HOOKS_TYPE_FOR_MODE
00146 #define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode
00147 #undef LANG_HOOKS_TYPE_FOR_SIZE
00148 #define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size
00149 #undef LANG_HOOKS_SIGNED_TYPE
00150 #define LANG_HOOKS_SIGNED_TYPE c_common_signed_type
00151 #undef LANG_HOOKS_UNSIGNED_TYPE
00152 #define LANG_HOOKS_UNSIGNED_TYPE c_common_unsigned_type
00153 #undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE
00154 #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE c_common_signed_or_unsigned_type
00155 #undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR
00156 #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR cxx_incomplete_type_error
00157 #undef LANG_HOOKS_TYPE_PROMOTES_TO
00158 #define LANG_HOOKS_TYPE_PROMOTES_TO cxx_type_promotes_to
00159
00160
00161 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
00162
00163
00164
00165 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
00166
00167 const char tree_code_type[] = {
00168 #include "tree.def"
00169 'x',
00170 #include "c-common.def"
00171 'x',
00172 #include "cp-tree.def"
00173 };
00174 #undef DEFTREECODE
00175
00176
00177
00178
00179
00180 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
00181
00182 const unsigned char tree_code_length[] = {
00183 #include "tree.def"
00184 0,
00185 #include "c-common.def"
00186 0,
00187 #include "cp-tree.def"
00188 };
00189 #undef DEFTREECODE
00190
00191
00192
00193 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
00194
00195 const char *const tree_code_name[] = {
00196 #include "tree.def"
00197 "@@dummy",
00198 #include "c-common.def"
00199 "@@dummy",
00200 #include "cp-tree.def"
00201 };
00202 #undef DEFTREECODE
00203
00204
00205
00206
00207 static bool
00208 ok_to_generate_alias_set_for_type (t)
00209 tree t;
00210 {
00211 if (TYPE_PTRMEMFUNC_P (t))
00212 return true;
00213 if (AGGREGATE_TYPE_P (t))
00214 {
00215 if ((TREE_CODE (t) == RECORD_TYPE) || (TREE_CODE (t) == UNION_TYPE))
00216 {
00217 tree fields;
00218
00219 if (! CLASS_TYPE_P (t))
00220 return true;
00221
00222 if (! CLASSTYPE_NON_POD_P(t))
00223 return true;
00224
00225 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
00226 return false;
00227
00228 if (TYPE_BINFO (t) != NULL && TYPE_BINFO_BASETYPES (t) != NULL)
00229 {
00230 int i;
00231 for (i = 0; i < TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (t)); i++)
00232 {
00233 tree binfo = TREE_VEC_ELT (TYPE_BINFO_BASETYPES (t), i);
00234 if (!ok_to_generate_alias_set_for_type (BINFO_TYPE (binfo)))
00235 return false;
00236 }
00237 }
00238
00239 for (fields = TYPE_FIELDS (t); fields; fields = TREE_CHAIN (fields))
00240 {
00241 if (TREE_CODE (fields) != FIELD_DECL)
00242 continue;
00243 if (! ok_to_generate_alias_set_for_type (TREE_TYPE (fields)))
00244 return false;
00245 }
00246 return true;
00247 }
00248 else if (TREE_CODE (t) == ARRAY_TYPE)
00249 return ok_to_generate_alias_set_for_type (TREE_TYPE (t));
00250 else
00251
00252
00253 abort ();
00254 }
00255 else
00256 return true;
00257 }
00258
00259
00260
00261 static HOST_WIDE_INT
00262 cxx_get_alias_set (t)
00263 tree t;
00264 {
00265 if (
00266 !ok_to_generate_alias_set_for_type (t)
00267
00268
00269
00270
00271 || TYPE_PTRMEMFUNC_P (t))
00272 return 0;
00273
00274 return c_common_get_alias_set (t);
00275 }
00276
00277
00278
00279 static bool
00280 cxx_warn_unused_global_decl (decl)
00281 tree decl;
00282 {
00283 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
00284 return false;
00285 if (DECL_IN_SYSTEM_HEADER (decl))
00286 return false;
00287
00288
00289 if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl))
00290 return false;
00291
00292 return true;
00293 }
00294
00295
00296
00297
00298
00299 static tree
00300 cp_expr_size (exp)
00301 tree exp;
00302 {
00303 if (CLASS_TYPE_P (TREE_TYPE (exp)))
00304 {
00305
00306
00307
00308 if (TYPE_HAS_COMPLEX_INIT_REF (TREE_TYPE (exp))
00309 && TYPE_HAS_COMPLEX_ASSIGN_REF (TREE_TYPE (exp))
00310
00311 && TREE_CODE (exp) != CONSTRUCTOR)
00312 abort ();
00313
00314
00315 return CLASSTYPE_SIZE_UNIT (TREE_TYPE (exp));
00316 }
00317 else
00318
00319 return lhd_expr_size (exp);
00320 }
00321
00322
00323
00324
00325
00326 static bool
00327 cp_var_mod_type_p (tree type)
00328 {
00329
00330
00331 if (TYPE_PTRMEM_P (type) || TYPE_PTRMEMFUNC_P (type))
00332 return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type))
00333 || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type)));
00334
00335
00336 return false;
00337 }
00338