On 12/13/11 14:42, Richard Henderson wrote:
On 12/13/2011 12:41 PM, Aldy Hernandez wrote:
The TM clone is marked weak as the original decl was weak, but it is no longer
external or public. I suggested to just clear the DECL_WEAK bit on the clone,
but Jason mentioned that unsetting DECL_EXTERNAL is more optimal-- so that the
clone can still be public and comdat.
No regressions. PR fixed.
OK?
curr
PR middle-end/51411
* trans-mem.c (ipa_tm_create_version): Do not zap DECL_EXTERNAL.
The actual patch is more or less the exact opposite of what Jason recommended.
r~
Bah, you guys are speaking Bostoneese or something, cause reading back
on the IRC log I still think I implemented what Jason said.
Be that as it may, I gather this is what you want?
OK pending another round of tests?
PR middle-end/51411
* trans-mem.c (ipa_tm_create_version): Do not zap DECL_EXTERNAL.
Index: testsuite/g++.dg/tm/pr51411.C
===================================================================
--- testsuite/g++.dg/tm/pr51411.C (revision 0)
+++ testsuite/g++.dg/tm/pr51411.C (revision 0)
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-fgnu-tm -O" }
+
+struct A
+{
+ __attribute__ ((transaction_safe)) virtual void virtfoo () { }
+};
Index: trans-mem.c
===================================================================
--- trans-mem.c (revision 182290)
+++ trans-mem.c (working copy)
@@ -4256,10 +4256,7 @@ ipa_tm_create_version (struct cgraph_nod
/* Remap extern inline to static inline. */
/* ??? Is it worth trying to use make_decl_one_only? */
if (DECL_DECLARED_INLINE_P (new_decl) && DECL_EXTERNAL (new_decl))
- {
- DECL_EXTERNAL (new_decl) = 0;
- TREE_PUBLIC (new_decl) = 0;
- }
+ DECL_EXTERNAL (new_decl) = 0;
tree_function_versioning (old_decl, new_decl, NULL, false, NULL,
NULL, NULL);