This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [C++ patch] Move FINAL flag to middle-end trees.
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: Jason Merrill <jason at redhat dot com>
- Cc: Jan Hubicka <hubicka at ucw dot cz>, gcc-patches at gcc dot gnu dot org
- Date: Sun, 25 Aug 2013 17:38:09 +0200
- Subject: Re: [C++ patch] Move FINAL flag to middle-end trees.
- References: <52162B9B dot 5060905 at redhat dot com> <20130822152254 dot GC19256 at kam dot mff dot cuni dot cz> <521769A8 dot 3010204 at redhat dot com> <20130823135755 dot GB22972 at kam dot mff dot cuni dot cz> <521770DA dot 300 at redhat dot com> <20130823143616 dot GA27462 at kam dot mff dot cuni dot cz> <20130823145112 dot GC27462 at kam dot mff dot cuni dot cz> <52184F67 dot 3020908 at redhat dot com> <20130824091811 dot GA30293 at kam dot mff dot cuni dot cz> <52192428 dot 7020500 at redhat dot com>
> On 08/24/2013 05:18 AM, Jan Hubicka wrote:
> >In the next step I would like to introduce the DECL_CPP_CONSTRUCTOR/DESTRUCTOR macro.
> >The catch I run into is that these flags are tested on TEMPLATE_DECL so the middle-end
> >macro bombs on type checking. I wonder what is best approach here.
>
> I think fix the front end to use STRIP_TEMPLATE to make sure we're
> checking/setting the flag on a FUNCTION_DECL.
Thank you!
I did not know the FUNCTION_DECLs are already there. The following patch seems
to work. Of course if it seems cleaner, I can update the users of the CPP
macros into the expanded variants. I want to have CPP in name in middle-end to
signify that we actually understand language specific properties of these
functions (so constructors/destructors in other languages probably don't
want to do that).
Bootstrapped/regtested ppc64-linux, OK?
* tree.h (tree_decl_with_vis): Add cpp_constructor and cpp_destructor.
(DECL_CPP_CONSTRUCTOR_P, DECL_CPP_DESTRUCTOR_P): New macros.
* cp-tree.h (DECL_CONSTRUCTOR_P, DECL_DESTRUCTOR_P): Change to
strip templates and set the middle-end flag.
Index: tree.h
===================================================================
--- tree.h (revision 201977)
+++ tree.h (working copy)
@@ -3232,8 +3232,12 @@ struct GTY(()) tree_decl_with_vis {
/* Used by C++ only. Might become a generic decl flag. */
unsigned shadowed_for_var_p : 1;
/* Belong to FUNCTION_DECL exclusively. */
+ unsigned cpp_constructor : 1;
+ /* Belong to FUNCTION_DECL exclusively. */
+ unsigned cpp_destructor : 1;
+ /* Belong to FUNCTION_DECL exclusively. */
unsigned final : 1;
- /* 13 unused bits. */
+ /* 11 unused bits. */
};
extern tree decl_debug_expr_lookup (tree);
@@ -3483,6 +3487,18 @@ extern vec<tree, va_gc> **decl_debug_arg
#define DECL_FUNCTION_VERSIONED(NODE)\
(FUNCTION_DECL_CHECK (NODE)->function_decl.versioned_function)
+/* In FUNCTION_DECL, this is set if this function is a C++ constructor.
+ Devirtualization machinery uses this knowledge for determing type of the
+ object constructed. Also we assume that constructor address is not
+ important. */
+#define DECL_CPP_CONSTRUCTOR_P(NODE)\
+ (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.cpp_constructor)
+
+/* In FUNCTION_DECL, this is set if this function is a C++ destructor.
+ Devirtualization machinery uses this to track types in destruction. */
+#define DECL_CPP_DESTRUCTOR_P(NODE)\
+ (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.cpp_destructor)
+
/* In FUNCTION_DECL that represent an virtual method this is set when
the method is final. */
#define DECL_FINAL_P(NODE)\
Index: cp/cp-tree.h
===================================================================
--- cp/cp-tree.h (revision 201977)
+++ cp/cp-tree.h (working copy)
@@ -2121,9 +2121,10 @@ struct GTY((variable_size)) lang_decl {
#define SET_DECL_LANGUAGE(NODE, LANGUAGE) \
(DECL_LANG_SPECIFIC (NODE)->u.base.language = (LANGUAGE))
-/* For FUNCTION_DECLs: nonzero means that this function is a constructor. */
+/* For FUNCTION_DECLs and TEMPLATE_DECLs: nonzero means that this function
+ is a constructor. */
#define DECL_CONSTRUCTOR_P(NODE) \
- (LANG_DECL_FN_CHECK (NODE)->constructor_attr)
+ DECL_CPP_CONSTRUCTOR_P (STRIP_TEMPLATE (NODE))
/* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete
object. */
@@ -2152,9 +2153,10 @@ struct GTY((variable_size)) lang_decl {
#define DECL_MOVE_CONSTRUCTOR_P(NODE) \
(DECL_CONSTRUCTOR_P (NODE) && move_fn_p (NODE))
-/* Nonzero if NODE is a destructor. */
+/* Nonzero if NODE (a FUNCTION_DECL or TEMPLATE_DECL)
+ is a destructor. */
#define DECL_DESTRUCTOR_P(NODE) \
- (LANG_DECL_FN_CHECK (NODE)->destructor_attr)
+ DECL_CPP_DESTRUCTOR_P (STRIP_TEMPLATE (NODE))
/* Nonzero if NODE (a FUNCTION_DECL) is a destructor, but not the
specialized in-charge constructor, in-charge deleting constructor,