Hi,
    I want to add a warning to inlining function when violate strict
    aliasing.
    See bug:
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60546
    For details. 

* tree-inline.c (global): Add new include to c-family/c-common.h. To
access strict aliasing check.
(setup_one_parameter): Add strict aliasing check.
* testsuite/gcc.dg/Wstrict-aliasing-inline-parameter.C:New test.
---
 gcc/ChangeLog                                      |  5 +++
 .../gcc.dg/Wstrict-aliasing-inline-parameter.C     | 42 ++++++++++++++++++++++
 gcc/tree-inline.c                                  |  6 ++++
 3 files changed, 53 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/Wstrict-aliasing-inline-parameter.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8ccdde2..f584567 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-08-19  Lin Zuojian <manjian2...@gmail.com>
+       * tree-inline.c (global): Add new include to c-family/c-common.h. To
+       access strict aliasing check.
+       (setup_one_parameter): Add strict aliasing check.
+       * testsuite/gcc.dg/Wstrict-aliasing-inline.C: New test.
 2014-08-19  David Malcolm  <dmalc...@redhat.com>
 
        * basic-block.h (BB_HEAD): Convert to a function.  Strengthen the
diff --git a/gcc/testsuite/gcc.dg/Wstrict-aliasing-inline-parameter.C 
b/gcc/testsuite/gcc.dg/Wstrict-aliasing-inline-parameter.C
new file mode 100644
index 0000000..9a667be
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wstrict-aliasing-inline-parameter.C
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wstrict-aliasing=10 -fstrict-aliasing" } */
+
+struct A
+{
+    int a;
+    int b;
+    int c;
+};
+
+static inline int hash2(const unsigned short* change2, int len)
+{
+    int result = 0;
+    for(int i = 0; i < len; ++i) {
+
+        result += change2[i];
+        result ^= result << 11;
+        result += result >> 17;
+
+        // Force "avalanching" of final 31 bits.
+        result ^= result << 3;
+        result += result >> 5;
+        result ^= result << 2;
+        result += result >> 15;
+        result ^= result << 10;
+    }
+    return result;
+}
+
+static inline int hash(const void* change1, int len)
+{
+    return hash2(static_cast<const unsigned short*>(change1), len / 2);
+}
+
+
+int foo(int a, int b, int c)
+{
+    struct A a_struct = {a, b, c};
+    return hash(&a_struct, sizeof(struct A));
+}
+
+/* { dg-message "dereferencing type-punned pointer will break strict-aliasing 
rules" } */
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index b6ecaa4..33d7017 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -22,6 +22,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
+/* For warn_strict_aliasing. */
+#include "c-family/c-common.h"
 #include "diagnostic-core.h"
 #include "tree.h"
 #include "stor-layout.h"
@@ -2913,6 +2915,10 @@ setup_one_parameter (copy_body_data *id, tree p, tree 
value, tree fn,
        }
     }
 
+  if (warn_strict_aliasing > 2)
+    if (strict_aliasing_warning (TREE_TYPE (rhs), TREE_TYPE(p), rhs))
+      warning (OPT_Wstrict_aliasing, "during inlining function %s into 
function %s", fndecl_name(fn), function_name(cfun));
+
   /* Make an equivalent VAR_DECL.  Note that we must NOT remap the type
      here since the type of this decl must be visible to the calling
      function.  */
-- 
1.9.1

Lin Zuojian

Reply via email to