Commit db48b831 by Jason Merrill Committed by Jason Merrill

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.

From-SVN: r29715
parent 2450ddbb
1999-09-29 Jason Merrill <jason@yorick.cygnus.com> 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. * class.c (class_cache_obstack, class_obstack): Remove.
(init_class_processing): Don't initialize class_obstack. (init_class_processing): Don't initialize class_obstack.
(push_cache_obstack): Remove. (push_cache_obstack): Remove.
......
...@@ -6330,7 +6330,6 @@ init_decl_processing () ...@@ -6330,7 +6330,6 @@ init_decl_processing ()
init_class_processing (); init_class_processing ();
init_init_processing (); init_init_processing ();
init_search_processing (); init_search_processing ();
if (flag_rtti)
init_rtti_processing (); init_rtti_processing ();
if (flag_exceptions) if (flag_exceptions)
......
...@@ -2685,6 +2685,10 @@ import_export_decl (decl) ...@@ -2685,6 +2685,10 @@ import_export_decl (decl)
if (IS_AGGR_TYPE (ctype) && CLASSTYPE_INTERFACE_KNOWN (ctype) if (IS_AGGR_TYPE (ctype) && CLASSTYPE_INTERFACE_KNOWN (ctype)
&& TYPE_VIRTUAL_P (ctype) && TYPE_VIRTUAL_P (ctype)
/* If -fno-rtti, we're not necessarily emitting this stuff with
the class, so go ahead and emit it now. This can happen
when a class is used in exception handling. */
&& flag_rtti
/* If the type is a cv-qualified variant of a type, then we /* If the type is a cv-qualified variant of a type, then we
must emit the tinfo function in this translation unit must emit the tinfo function in this translation unit
since it will not be emitted when the vtable for the type since it will not be emitted when the vtable for the type
......
...@@ -38,7 +38,6 @@ Boston, MA 02111-1307, USA. */ ...@@ -38,7 +38,6 @@ Boston, MA 02111-1307, USA. */
static void push_eh_cleanup PROTO((void)); static void push_eh_cleanup PROTO((void));
static tree build_eh_type_type PROTO((tree)); static tree build_eh_type_type PROTO((tree));
static tree build_eh_type PROTO((tree));
static tree call_eh_info PROTO((void)); static tree call_eh_info PROTO((void));
static void push_eh_info PROTO((void)); static void push_eh_info PROTO((void));
static tree get_eh_info PROTO((void)); static tree get_eh_info PROTO((void));
...@@ -333,9 +332,6 @@ static tree ...@@ -333,9 +332,6 @@ static tree
build_eh_type_type (type) build_eh_type_type (type)
tree type; tree type;
{ {
const char *typestring;
tree exp;
if (type == error_mark_node) if (type == error_mark_node)
return error_mark_node; return error_mark_node;
...@@ -346,22 +342,16 @@ build_eh_type_type (type) ...@@ -346,22 +342,16 @@ build_eh_type_type (type)
/* Peel off cv qualifiers. */ /* Peel off cv qualifiers. */
type = TYPE_MAIN_VARIANT (type); type = TYPE_MAIN_VARIANT (type);
if (flag_rtti)
return build1 (ADDR_EXPR, ptr_type_node, get_typeid_1 (type)); 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);
} }
/* Build the address of a runtime type for use in the runtime matching /* Build the address of a typeinfo function for use in the runtime
field of the new exception model */ matching field of the new exception model */
static tree static tree
build_eh_type_type_ref (type) build_eh_type_type_ref (type)
tree type; tree type;
{ {
const char *typestring;
tree exp; tree exp;
if (type == error_mark_node) if (type == error_mark_node)
...@@ -374,39 +364,10 @@ build_eh_type_type_ref (type) ...@@ -374,39 +364,10 @@ build_eh_type_type_ref (type)
/* Peel off cv qualifiers. */ /* Peel off cv qualifiers. */
type = TYPE_MAIN_VARIANT (type); type = TYPE_MAIN_VARIANT (type);
push_permanent_obstack ();
if (flag_rtti)
{
exp = get_tinfo_fn (type); exp = get_tinfo_fn (type);
TREE_USED (exp) = 1;
mark_inline_for_output (exp);
exp = build1 (ADDR_EXPR, ptr_type_node, 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);
}
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 /* This routine is called to mark all the symbols representing runtime
...@@ -859,7 +820,7 @@ expand_throw (exp) ...@@ -859,7 +820,7 @@ expand_throw (exp)
(NULL_TREE, integer_type_node, void_list_node)))); (NULL_TREE, integer_type_node, void_list_node))));
if (TYPE_PTR_P (TREE_TYPE (exp))) if (TYPE_PTR_P (TREE_TYPE (exp)))
throw_type = build_eh_type (exp); throw_type = build_eh_type_type (TREE_TYPE (exp));
else else
{ {
tree object, ptr; tree object, ptr;
...@@ -907,7 +868,7 @@ expand_throw (exp) ...@@ -907,7 +868,7 @@ expand_throw (exp)
finish_cleanup_try_block (try_block); finish_cleanup_try_block (try_block);
finish_cleanup (build_terminate_handler (), 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))) if (TYPE_HAS_DESTRUCTOR (TREE_TYPE (object)))
{ {
......
...@@ -424,9 +424,6 @@ get_typeid (type) ...@@ -424,9 +424,6 @@ get_typeid (type)
return error_mark_node; return error_mark_node;
} }
if (! flag_rtti)
error ("requesting typeid with -fno-rtti");
if (processing_template_decl) if (processing_template_decl)
return build_min_nt (TYPEID_EXPR, type); return build_min_nt (TYPEID_EXPR, type);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment