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>
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.
......
......@@ -6330,7 +6330,6 @@ init_decl_processing ()
init_class_processing ();
init_init_processing ();
init_search_processing ();
if (flag_rtti)
init_rtti_processing ();
if (flag_exceptions)
......
......@@ -2685,6 +2685,10 @@ import_export_decl (decl)
if (IS_AGGR_TYPE (ctype) && CLASSTYPE_INTERFACE_KNOWN (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
must emit the tinfo function in this translation unit
since it will not be emitted when the vtable for the type
......
......@@ -38,7 +38,6 @@ Boston, MA 02111-1307, USA. */
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));
......@@ -333,9 +332,6 @@ static tree
build_eh_type_type (type)
tree type;
{
const char *typestring;
tree exp;
if (type == error_mark_node)
return error_mark_node;
......@@ -346,22 +342,16 @@ build_eh_type_type (type)
/* 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);
}
/* 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)
......@@ -374,39 +364,10 @@ build_eh_type_type_ref (type)
/* Peel off cv qualifiers. */
type = TYPE_MAIN_VARIANT (type);
push_permanent_obstack ();
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));
return (exp);
}
/* This routine is called to mark all the symbols representing runtime
......@@ -859,7 +820,7 @@ expand_throw (exp)
(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;
......@@ -907,7 +868,7 @@ expand_throw (exp)
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)))
{
......
......@@ -424,9 +424,6 @@ get_typeid (type)
return error_mark_node;
}
if (! flag_rtti)
error ("requesting typeid with -fno-rtti");
if (processing_template_decl)
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