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 <[email protected]>
+ * 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 <[email protected]>
* 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