C++ PATCH for c++/77379 (abi_tag on thunk)

Jason Merrill jason@redhat.com
Mon Aug 29 16:42:00 GMT 2016


Another missing ABI tag, sigh.

Tested x86_64-pc-linux-gnu, applying to trunk.
-------------- next part --------------
commit 1337a943a2d3926537b63d6e1f0d7f46ef10a06d
Author: Jason Merrill <jason@redhat.com>
Date:   Fri Aug 26 15:12:52 2016 -0400

    	PR c++/77379 - ABI tag on thunk
    
    	* mangle.c (maybe_check_abi_tags): Add version parm, handle thunks.
    	(mangle_thunk): Add thunk parameter.
    	* method.c (finish_thunk): Pass it.
    	* cp-tree.h: Declare it.

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 72a128d..5bcb98b 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -6802,7 +6802,7 @@ extern tree mangle_typeinfo_string_for_type	(tree);
 extern tree mangle_vtbl_for_type		(tree);
 extern tree mangle_vtt_for_type			(tree);
 extern tree mangle_ctor_vtbl_for_type		(tree, tree);
-extern tree mangle_thunk			(tree, int, tree, tree);
+extern tree mangle_thunk			(tree, int, tree, tree, tree);
 extern tree mangle_conv_op_name_for_type	(tree);
 extern tree mangle_guard_variable		(tree);
 extern tree mangle_tls_init_fn			(tree);
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index d8b5c45..d34743c 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -231,7 +231,7 @@ static void write_local_name (tree, const tree, const tree);
 static void dump_substitution_candidates (void);
 static tree mangle_decl_string (const tree);
 static int local_class_index (tree);
-static void maybe_check_abi_tags (tree, tree = NULL_TREE);
+static void maybe_check_abi_tags (tree, tree = NULL_TREE, int = 10);
 static bool equal_abi_tags (tree, tree);
 
 /* Control functions.  */
@@ -4024,10 +4024,13 @@ mangle_call_offset (const tree fixed_offset, const tree virtual_offset)
 
 tree
 mangle_thunk (tree fn_decl, const int this_adjusting, tree fixed_offset,
-	      tree virtual_offset)
+	      tree virtual_offset, tree thunk)
 {
   tree result;
 
+  if (abi_version_at_least (11))
+    maybe_check_abi_tags (fn_decl, thunk, 11);
+
   start_mangling (fn_decl);
 
   write_string ("_Z");
@@ -4142,7 +4145,7 @@ mangle_conv_op_name_for_type (const tree type)
    guard variable for T.  */
 
 static void
-maybe_check_abi_tags (tree t, tree for_decl)
+maybe_check_abi_tags (tree t, tree for_decl, int ver)
 {
   if (DECL_ASSEMBLER_NAME_SET_P (t))
     return;
@@ -4153,9 +4156,14 @@ maybe_check_abi_tags (tree t, tree for_decl)
 
   tree newtags = get_abi_tags (t);
   if (newtags && newtags != oldtags
-      && abi_version_crosses (10))
+      && abi_version_crosses (ver))
     {
-      if (for_decl)
+      if (for_decl && DECL_THUNK_P (for_decl))
+	warning_at (DECL_SOURCE_LOCATION (t), OPT_Wabi,
+		    "the mangled name of a thunk for %qD changes between "
+		    "-fabi-version=%d and -fabi-version=%d",
+		    t, flag_abi_version, warn_abi_version);
+      else if (for_decl)
 	warning_at (DECL_SOURCE_LOCATION (for_decl), OPT_Wabi,
 		    "the mangled name of %qD changes between "
 		    "-fabi-version=%d and -fabi-version=%d",
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 75342ae..957ea39 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -169,7 +169,7 @@ finish_thunk (tree thunk)
     virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
   function = THUNK_TARGET (thunk);
   name = mangle_thunk (function, DECL_THIS_THUNK_P (thunk),
-		       fixed_offset, virtual_offset);
+		       fixed_offset, virtual_offset, thunk);
 
   /* We can end up with declarations of (logically) different
      covariant thunks, that do identical adjustments.  The two thunks
diff --git a/gcc/testsuite/g++.dg/abi/abi-tag23.C b/gcc/testsuite/g++.dg/abi/abi-tag23.C
new file mode 100644
index 0000000..5e310a4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/abi-tag23.C
@@ -0,0 +1,35 @@
+// PR c++/77379
+// { dg-options "-fabi-version=0 -Wabi=10" }
+
+struct __attribute ((abi_tag ("bar"))) string { };
+
+struct Mother
+{
+  virtual ~Mother() {};
+  int bar;
+};
+
+struct Father
+{
+  virtual string get_foo()  = 0;
+};
+
+class Derived:
+  public Mother,
+  public Father
+{
+public:
+  string get_foo();		// { dg-warning "mangled name" }
+};
+
+struct Final:
+    public Derived
+{
+};
+
+int main()
+{
+  Final().get_foo();
+}
+
+// { dg-final { scan-assembler "_ZThn16_N7Derived7get_fooB3barEv" } }
diff --git a/gcc/testsuite/g++.dg/abi/abi-tag23a.C b/gcc/testsuite/g++.dg/abi/abi-tag23a.C
new file mode 100644
index 0000000..72aa037
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/abi-tag23a.C
@@ -0,0 +1,35 @@
+// PR c++/77379
+// { dg-options -fabi-version=10 }
+
+struct __attribute ((abi_tag ("bar"))) string { };
+
+struct Mother
+{
+  virtual ~Mother() {};
+  int bar;
+};
+
+struct Father
+{
+  virtual string get_foo()  = 0;
+};
+
+class Derived:
+  public Mother,
+  public Father
+{
+public:
+  string get_foo();
+};
+
+struct Final:
+    public Derived
+{
+};
+
+int main()
+{
+  Final().get_foo();
+}
+
+// { dg-final { scan-assembler "_ZThn16_N7Derived7get_fooEv" } }


More information about the Gcc-patches mailing list