summaryrefslogtreecommitdiffstats
path: root/gcc/cp
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2001-02-26 11:01:44 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2001-02-26 11:01:44 +0000
commit568e13cde460043bb793ad80f5645b0375740aca (patch)
tree142477486cd3b6b7f5f8fe3ce3c4e8951c25c741 /gcc/cp
parent369e3169e41e16b1cca7bb2b495cfa6603604284 (diff)
downloadppe42-gcc-568e13cde460043bb793ad80f5645b0375740aca.tar.gz
ppe42-gcc-568e13cde460043bb793ad80f5645b0375740aca.zip
* except.c (call_eh_info): Cleanup generation of cp_eh_info struct.
* decl.c (mark_inlined_fns): Prototype. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40065 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c1
-rw-r--r--gcc/cp/except.c99
3 files changed, 68 insertions, 38 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0bb8645667a..ede5dc12f50 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2001-02-26 Nathan Sidwell <nathan@codesourcery.com>
+
+ * except.c (call_eh_info): Cleanup generation of cp_eh_info struct.
+
+ * decl.c (mark_inlined_fns): Prototype.
+
2001-02-22 Mark Mitchell <mark@codesourcery.com>
* spew.c (yylex): Correct handling of friends.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 39008956f4a..941f95a81b1 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -130,6 +130,7 @@ static void mark_binding_level PARAMS ((void *));
static void mark_named_label_lists PARAMS ((void *, void *));
static void mark_cp_function_context PARAMS ((struct function *));
static void mark_saved_scope PARAMS ((void *));
+static void mark_inlined_fns PARAMS ((struct lang_decl_inlined_fns *));
static void mark_lang_function PARAMS ((struct cp_language_function *));
static void save_function_data PARAMS ((tree));
static void check_function_type PARAMS ((tree, tree));
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index e53582100e3..9d3a6a5f7bd 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -169,62 +169,85 @@ call_eh_info ()
fn = IDENTIFIER_GLOBAL_VALUE (fn);
else
{
- tree t1, t, fields[7];
-
- /* Declare cp_eh_info * __start_cp_handler (void),
- as defined in exception.cc. */
-
- /* struct cp_eh_info. This must match exception.cc. Note that this
- type is not pushed anywhere. */
- t1= make_aggr_type (RECORD_TYPE);
- fields[0] = build_decl (FIELD_DECL,
- get_identifier ("handler_label"), ptr_type_node);
- fields[1] = build_decl (FIELD_DECL,
- get_identifier ("dynamic_handler_chain"), ptr_type_node);
- fields[2] = build_decl (FIELD_DECL,
- get_identifier ("info"), ptr_type_node);
- fields[3] = build_decl (FIELD_DECL,
- get_identifier ("table_index"), ptr_type_node);
- /* N.B.: The fourth field LEN is expected to be
- the number of fields - 1, not the total number of fields. */
- finish_builtin_type (t1, "eh_context", fields, 3, ptr_type_node);
- t1 = build_pointer_type (t1);
-
- t1= make_aggr_type (RECORD_TYPE);
+ tree eh_info_type;
+ tree cleanup_fn_type;
+ tree matcher_fn_type;
+ tree cp_eh_info_type;
+ tree exception_desc_type;
+ tree fields[8];
+
+ eh_info_type = make_aggr_type (RECORD_TYPE);
+ exception_desc_type = make_aggr_type (RECORD_TYPE);
+
+ /* void * (*) (__eh_info *, void *, exception_descriptor *); */
+ matcher_fn_type = tree_cons
+ (NULL_TREE, build_pointer_type (eh_info_type), tree_cons
+ (NULL_TREE, ptr_type_node, tree_cons
+ (NULL_TREE, build_pointer_type (exception_desc_type),
+ void_list_node)));
+ matcher_fn_type = build_function_type (ptr_type_node, matcher_fn_type);
+ matcher_fn_type = build_pointer_type (matcher_fn_type);
+
+ /* void (*) (void *); */
+ cleanup_fn_type = tree_cons
+ (NULL_TREE, ptr_type_node, void_list_node);
+ cleanup_fn_type = build_function_type (void_type_node, cleanup_fn_type);
+ cleanup_fn_type = build_pointer_type (cleanup_fn_type);
+
+ /* eh-common.h
+ struct __eh_info
+ {
+ __eh_matcher match_function;
+ short language;
+ short version;
+ }; */
fields[0] = build_decl (FIELD_DECL,
- get_identifier ("match_function"), ptr_type_node);
+ get_identifier ("match_function"), matcher_fn_type);
fields[1] = build_decl (FIELD_DECL,
get_identifier ("language"), short_integer_type_node);
fields[2] = build_decl (FIELD_DECL,
get_identifier ("version"), short_integer_type_node);
/* N.B.: The fourth field LEN is expected to be
the number of fields - 1, not the total number of fields. */
- finish_builtin_type (t1, "__eh_info", fields, 2, ptr_type_node);
- t = make_aggr_type (RECORD_TYPE);
- fields[0] = build_decl (FIELD_DECL,
- get_identifier ("eh_info"), t1);
+ finish_builtin_type (eh_info_type, "__eh_info", fields, 2, ptr_type_node);
+
+ /* exception_support.h
+ struct cp_eh_info
+ {
+ __eh_info eh_info;
+ void *value;
+ void *type;
+ cleanup_fn cleanup;
+ bool caught;
+ cp_eh_info *next;
+ long handlers;
+ void *original_value;
+ }; */
+ cp_eh_info_type = make_aggr_type (RECORD_TYPE);
+ fields[0] = build_decl (FIELD_DECL, get_identifier ("eh_info"),
+ eh_info_type);
fields[1] = build_decl (FIELD_DECL, get_identifier ("value"),
ptr_type_node);
fields[2] = build_decl (FIELD_DECL, get_identifier ("type"),
ptr_type_node);
- fields[3] = build_decl
- (FIELD_DECL, get_identifier ("cleanup"),
- build_pointer_type (build_function_type
- (ptr_type_node, tree_cons
- (NULL_TREE, ptr_type_node, void_list_node))));
+ fields[3] = build_decl (FIELD_DECL, get_identifier ("cleanup"),
+ cleanup_fn_type);
fields[4] = build_decl (FIELD_DECL, get_identifier ("caught"),
boolean_type_node);
fields[5] = build_decl (FIELD_DECL, get_identifier ("next"),
- build_pointer_type (t));
- fields[6] = build_decl
- (FIELD_DECL, get_identifier ("handlers"), long_integer_type_node);
+ build_pointer_type (cp_eh_info_type));
+ fields[6] = build_decl (FIELD_DECL, get_identifier ("handlers"),
+ long_integer_type_node);
+ fields[7] = build_decl (FIELD_DECL, get_identifier ("original_value"),
+ ptr_type_node);
/* N.B.: The fourth field LEN is expected to be
the number of fields - 1, not the total number of fields. */
- finish_builtin_type (t, "cp_eh_info", fields, 6, ptr_type_node);
- t = build_pointer_type (t);
+ finish_builtin_type (cp_eh_info_type, "cp_eh_info", fields, 7, ptr_type_node);
/* And now the function. */
- fn = push_library_fn (fn, build_function_type (t, void_list_node));
+ fn = push_library_fn (fn,
+ build_function_type (build_pointer_type (cp_eh_info_type),
+ void_list_node));
}
return build_function_call (fn, NULL_TREE);
}
OpenPOWER on IntegriCloud