mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2026-07-16 04:17:25 +00:00
ff0f815593
Acked-by: Martin Jansa <Martin.Jansa@gmail.com> Acked-by: Eric Bénard <eric@eukrea.com> Acked-by: Khem Raj <raj.khem@gmail.com> Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
160 lines
3.4 KiB
Diff
160 lines
3.4 KiB
Diff
2007-11-06 Jakub Jelinek <jakub@redhat.com>
|
|
|
|
PR tree-optimization/33763
|
|
* gcc.dg/pr33763.c: New test.
|
|
* g++.dg/opt/inline13.C: New test.
|
|
|
|
2007-11-06 Jan Hubicka <jh@suse.cz>
|
|
|
|
PR tree-optimization/33763
|
|
* tree-inline.c (expand_call_inline): Silently ignore always_inline
|
|
attribute for redefined extern inline functions.
|
|
|
|
Index: gcc/tree-inline.c
|
|
===================================================================
|
|
--- gcc/tree-inline.c.orig 2010-03-18 13:07:13.000000000 -0700
|
|
+++ gcc/tree-inline.c 2010-06-25 10:18:51.230139825 -0700
|
|
@@ -3545,6 +3545,12 @@
|
|
goto egress;
|
|
|
|
if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn))
|
|
+ /* For extern inline functions that get redefined we always
|
|
+ silently ignored alway_inline flag. Better behaviour would
|
|
+ be to be able to keep both bodies and use extern inline body
|
|
+ for inlining, but we can't do that because frontends overwrite
|
|
+ the body. */
|
|
+ && !cg_edge->callee->local.redefined_extern_inline
|
|
/* Avoid warnings during early inline pass. */
|
|
&& cgraph_global_info_ready)
|
|
{
|
|
Index: gcc/testsuite/gcc.dg/pr33763.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gcc/testsuite/gcc.dg/pr33763.c 2010-06-25 10:18:51.234141302 -0700
|
|
@@ -0,0 +1,60 @@
|
|
+/* PR tree-optimization/33763 */
|
|
+/* { dg-do compile } */
|
|
+/* { dg-options "-O2" } */
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ void *a;
|
|
+ void *b;
|
|
+} T;
|
|
+extern void *foo (const char *, const char *);
|
|
+extern void *bar (void *, const char *, T);
|
|
+extern int baz (const char *, int);
|
|
+
|
|
+extern inline __attribute__ ((always_inline, gnu_inline)) int
|
|
+baz (const char *x, int y)
|
|
+{
|
|
+ return 2;
|
|
+}
|
|
+
|
|
+int
|
|
+baz (const char *x, int y)
|
|
+{
|
|
+ return 1;
|
|
+}
|
|
+
|
|
+int xa, xb;
|
|
+
|
|
+static void *
|
|
+inl (const char *x, const char *y)
|
|
+{
|
|
+ T t = { &xa, &xb };
|
|
+ int *f = (int *) __builtin_malloc (sizeof (int));
|
|
+ const char *z;
|
|
+ int o = 0;
|
|
+ void *r = 0;
|
|
+
|
|
+ for (z = y; *z; z++)
|
|
+ {
|
|
+ if (*z == 'r')
|
|
+ o |= 1;
|
|
+ if (*z == 'w')
|
|
+ o |= 2;
|
|
+ }
|
|
+ if (o == 1)
|
|
+ *f = baz (x, 0);
|
|
+ if (o == 2)
|
|
+ *f = baz (x, 1);
|
|
+ if (o == 3)
|
|
+ *f = baz (x, 2);
|
|
+
|
|
+ if (o && *f > 0)
|
|
+ r = bar (f, "w", t);
|
|
+ return r;
|
|
+}
|
|
+
|
|
+void *
|
|
+foo (const char *x, const char *y)
|
|
+{
|
|
+ return inl (x, y);
|
|
+}
|
|
Index: gcc/testsuite/g++.dg/opt/inline13.C
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gcc/testsuite/g++.dg/opt/inline13.C 2010-06-25 10:18:51.261052137 -0700
|
|
@@ -0,0 +1,60 @@
|
|
+// PR tree-optimization/33763
|
|
+// { dg-do compile }
|
|
+// { dg-options "-O2" }
|
|
+
|
|
+typedef struct
|
|
+{
|
|
+ void *a;
|
|
+ void *b;
|
|
+} T;
|
|
+extern void *foo (const char *, const char *);
|
|
+extern void *bar (void *, const char *, T);
|
|
+extern int baz (const char *, int);
|
|
+
|
|
+extern inline __attribute__ ((always_inline, gnu_inline)) int
|
|
+baz (const char *x, int y)
|
|
+{
|
|
+ return 2;
|
|
+}
|
|
+
|
|
+int
|
|
+baz (const char *x, int y)
|
|
+{
|
|
+ return 1;
|
|
+}
|
|
+
|
|
+int xa, xb;
|
|
+
|
|
+static void *
|
|
+inl (const char *x, const char *y)
|
|
+{
|
|
+ T t = { &xa, &xb };
|
|
+ int *f = (int *) __builtin_malloc (sizeof (int));
|
|
+ const char *z;
|
|
+ int o = 0;
|
|
+ void *r = 0;
|
|
+
|
|
+ for (z = y; *z; z++)
|
|
+ {
|
|
+ if (*z == 'r')
|
|
+ o |= 1;
|
|
+ if (*z == 'w')
|
|
+ o |= 2;
|
|
+ }
|
|
+ if (o == 1)
|
|
+ *f = baz (x, 0);
|
|
+ if (o == 2)
|
|
+ *f = baz (x, 1);
|
|
+ if (o == 3)
|
|
+ *f = baz (x, 2);
|
|
+
|
|
+ if (o && *f > 0)
|
|
+ r = bar (f, "w", t);
|
|
+ return r;
|
|
+}
|
|
+
|
|
+void *
|
|
+foo (const char *x, const char *y)
|
|
+{
|
|
+ return inl (x, y);
|
|
+}
|