Patchwork C++ PATCH to limit DECL_THUNKS to virtual functions

login
register
mail settings
Submitter Jason Merrill
Date Oct. 11, 2012, 3:29 p.m.
Message ID <5076E5DB.4070601@redhat.com>
Download mbox | patch
Permalink /patch/190930/
State New
Headers show

Comments

Jason Merrill - Oct. 11, 2012, 3:29 p.m.
The two current users of this field are DECL_FRIEND_CONTEXT for friend 
functions and DECL_THUNKS for virtual member functions; I would like to 
use it for another purpose for constructors, so I'm changing DECL_THUNKS 
to return null for non-virtual functions.

Tested x86_64-pc-linux-gnu, applying to trunk.

Patch

commit 256548b555a1bbfc2ad184ebf9ac9b10cb6798f6
Author: Jason Merrill <jason@redhat.com>
Date:   Tue Oct 9 22:30:49 2012 -0400

    	* cp-tree.h (DECL_THUNKS): NULL_TREE for non-virtual functions.
    	(SET_DECL_THUNKS): New.
    	* decl.c (duplicate_decls): Adjust.
    	* method.c (make_thunk): Adjust.

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 35819ed..fdf122f 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -2378,7 +2378,11 @@  struct GTY((variable_size)) lang_decl {
 
 /* The thunks associated with NODE, a FUNCTION_DECL.  */
 #define DECL_THUNKS(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->context)
+  (DECL_VIRTUAL_P (NODE) ? LANG_DECL_FN_CHECK (NODE)->context : NULL_TREE)
+
+/* Set DECL_THUNKS.  */
+#define SET_DECL_THUNKS(NODE,THUNKS) \
+  (LANG_DECL_FN_CHECK (NODE)->context = (THUNKS))
 
 /* Nonzero if NODE is a thunk, rather than an ordinary function.  */
 #define DECL_THUNK_P(NODE)			\
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index e78c664..f97f7b1 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -2052,7 +2052,7 @@  duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
 	  /* DECL_THUNKS is only valid for virtual functions,
 	     otherwise it is a DECL_FRIEND_CONTEXT.  */
 	  if (DECL_VIRTUAL_P (newdecl))
-	    DECL_THUNKS (newdecl) = DECL_THUNKS (olddecl);
+	    SET_DECL_THUNKS (newdecl, DECL_THUNKS (olddecl));
 	}
       /* Only variables have this field.  */
       else if (TREE_CODE (newdecl) == VAR_DECL
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index a42ed60..4d44c7d 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -126,7 +126,8 @@  make_thunk (tree function, bool this_adjusting,
 		      FUNCTION_DECL, NULL_TREE, TREE_TYPE (function));
   DECL_LANG_SPECIFIC (thunk) = DECL_LANG_SPECIFIC (function);
   cxx_dup_lang_specific_decl (thunk);
-  DECL_THUNKS (thunk) = NULL_TREE;
+  DECL_VIRTUAL_P (thunk) = true;
+  SET_DECL_THUNKS (thunk, NULL_TREE);
 
   DECL_CONTEXT (thunk) = DECL_CONTEXT (function);
   TREE_READONLY (thunk) = TREE_READONLY (function);
@@ -157,7 +158,7 @@  make_thunk (tree function, bool this_adjusting,
 
   /* Add it to the list of thunks associated with FUNCTION.  */
   DECL_CHAIN (thunk) = DECL_THUNKS (function);
-  DECL_THUNKS (function) = thunk;
+  SET_DECL_THUNKS (function, thunk);
 
   return thunk;
 }