From 5e2f4cd242aaa15c3b594434764660e1e96d4065 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 20 Dec 2004 02:23:49 +0000 Subject: [PATCH] cp-tree.h (note_decl_for_pch): New function. * cp-tree.h (note_decl_for_pch): New function. * class.c (build_clone): Call note_decl_for_pch. * semantics.c (finish_member_declaration): Likewise. (note_decl_for_pch): New function. From-SVN: r92402 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/class.c | 2 ++ gcc/cp/cp-tree.h | 1 + gcc/cp/semantics.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2007959dee3..57affb008c2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2004-12-19 Mark Mitchell + + * cp-tree.h (note_decl_for_pch): New function. + * class.c (build_clone): Call note_decl_for_pch. + * semantics.c (finish_member_declaration): Likewise. + (note_decl_for_pch): New function. + 2004-12-17 Steven Bosscher * init.c (build_zero_init): max_index is the number of diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 688744cd66b..c7b0c687db6 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -3786,6 +3786,8 @@ build_clone (tree fn, tree name) DECL_TEMPLATE_INFO (result) = copy_node (DECL_TEMPLATE_INFO (result)); DECL_TI_TEMPLATE (result) = clone; } + else if (pch_file) + note_decl_for_pch (clone); return clone; } diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 54fade9b7d4..fdc828d74f5 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4188,6 +4188,7 @@ extern void check_accessibility_of_qualified_id (tree, tree, tree); extern tree finish_qualified_id_expr (tree, tree, bool, bool); extern void simplify_aggr_init_expr (tree *); extern void finalize_nrv (tree *, tree, tree); +extern void note_decl_for_pch (tree); /* in tree.c */ extern void lang_check_failed (const char *, int, diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 956bf04c163..19c6d5d8910 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2226,6 +2226,40 @@ finish_member_declaration (tree decl) maybe_add_class_template_decl_list (current_class_type, decl, /*friend_p=*/0); } + + if (pch_file) + note_decl_for_pch (decl); +} + +/* DECL has been declared while we are building a PCH file. Perform + actions that we might normally undertake lazily, but which can be + performed now so that they do not have to be performed in + translation units which include the PCH file. */ + +void +note_decl_for_pch (tree decl) +{ + gcc_assert (pch_file); + + /* A non-template inline function with external linkage will always + be COMDAT. As we must eventually determine the linkage of all + functions, and as that causes writes to the data mapped in from + the PCH file, it's advantageous to mark the functions at this + point. */ + if (TREE_CODE (decl) == FUNCTION_DECL + && TREE_PUBLIC (decl) + && DECL_DECLARED_INLINE_P (decl) + && !DECL_IMPLICIT_INSTANTIATION (decl)) + { + comdat_linkage (decl); + DECL_INTERFACE_KNOWN (decl) = 1; + } + + /* There's a good chance that we'll have to mangle names at some + point, even if only for emission in debugging information. */ + if (TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == FUNCTION_DECL) + mangle_decl (decl); } /* Finish processing a complete template declaration. The PARMS are