1999-09-29 Jason Merrill <jason@yorick.cygnus.com>
+ Support normal type_info-based EH mechanisms with -fno-rtti.
+ * except.c (build_eh_type_type): Remove special -fno-rtti handling.
+ (build_eh_type_type_ref): Likewise.
+ (build_eh_type): Remove.
+ (expand_throw): Call build_eh_type_type, not build_eh_type.
+ * decl2.c (import_export_decl): Don't associate the tinfo fn with
+ the vtable if -fno-rtti.
+ * decl.c (init_decl_processing): Always init_rtti_processing.
+
+ * rtti.c (get_typeid): Don't complain about -fno-rtti.
+
* class.c (class_cache_obstack, class_obstack): Remove.
(init_class_processing): Don't initialize class_obstack.
(push_cache_obstack): Remove.
static void push_eh_cleanup PROTO((void));
static tree build_eh_type_type PROTO((tree));
-static tree build_eh_type PROTO((tree));
static tree call_eh_info PROTO((void));
static void push_eh_info PROTO((void));
static tree get_eh_info PROTO((void));
build_eh_type_type (type)
tree type;
{
- const char *typestring;
- tree exp;
-
if (type == error_mark_node)
return error_mark_node;
/* Peel off cv qualifiers. */
type = TYPE_MAIN_VARIANT (type);
- if (flag_rtti)
- return build1 (ADDR_EXPR, ptr_type_node, get_typeid_1 (type));
-
- typestring = build_overload_name (type, 1, 1);
- exp = combine_strings (build_string (strlen (typestring)+1, typestring));
- return build1 (ADDR_EXPR, ptr_type_node, exp);
+ return build1 (ADDR_EXPR, ptr_type_node, get_typeid_1 (type));
}
-/* Build the address of a runtime type for use in the runtime matching
- field of the new exception model */
+/* Build the address of a typeinfo function for use in the runtime
+ matching field of the new exception model */
static tree
build_eh_type_type_ref (type)
tree type;
{
- const char *typestring;
tree exp;
if (type == error_mark_node)
/* Peel off cv qualifiers. */
type = TYPE_MAIN_VARIANT (type);
- push_permanent_obstack ();
+ exp = get_tinfo_fn (type);
+ exp = build1 (ADDR_EXPR, ptr_type_node, exp);
- if (flag_rtti)
- {
- exp = get_tinfo_fn (type);
- TREE_USED (exp) = 1;
- mark_inline_for_output (exp);
- exp = build1 (ADDR_EXPR, ptr_type_node, exp);
- }
- else
- {
- typestring = build_overload_name (type, 1, 1);
- exp = combine_strings (build_string (strlen (typestring)+1, typestring));
- exp = build1 (ADDR_EXPR, ptr_type_node, exp);
- }
- pop_obstacks ();
return (exp);
}
-
-/* Build a type value for use at runtime for a exp that is thrown or
- matched against by the exception handling system. */
-
-static tree
-build_eh_type (exp)
- tree exp;
-{
- if (flag_rtti)
- {
- exp = build_typeid (exp);
- return build1 (ADDR_EXPR, ptr_type_node, exp);
- }
- return build_eh_type_type (TREE_TYPE (exp));
-}
-
/* This routine is called to mark all the symbols representing runtime
type functions in the exception table as haveing been referenced.
This will make sure code is emitted for them. Called from finish_file. */
(NULL_TREE, integer_type_node, void_list_node))));
if (TYPE_PTR_P (TREE_TYPE (exp)))
- throw_type = build_eh_type (exp);
+ throw_type = build_eh_type_type (TREE_TYPE (exp));
else
{
tree object, ptr;
finish_cleanup_try_block (try_block);
finish_cleanup (build_terminate_handler (), try_block);
- throw_type = build_eh_type (object);
+ throw_type = build_eh_type_type (TREE_TYPE (object));
if (TYPE_HAS_DESTRUCTOR (TREE_TYPE (object)))
{