]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/38988 (Cannot build crtstuff.c with -mcmodel=large -fPIC -O2)
authorUros Bizjak <ubizjak@gmail.com>
Thu, 29 Jan 2009 10:05:17 +0000 (11:05 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Thu, 29 Jan 2009 10:05:17 +0000 (11:05 +0100)
Backport from mainline:
2009-01-28  Uros Bizjak  <ubizjak@gmail.com>

PR target/38988
* gcc.target/i386/pr38988.c: New test.

2009-01-27  Uros Bizjak  <ubizjak@gmail.com>

PR middle-end/38969
* gcc.c-torture/execute/pr38969.c: New test.

testsuite/ChangeLog:

Backport from mainline:
2009-01-28  Uros Bizjak  <ubizjak@gmail.com>

PR target/38988
* config/i386/i386.md (set_rip_rex64): Wrap operand 1 in label_ref.
(set_got_offset_rex64): Ditto.

2009-01-27  Uros Bizjak  <ubizjak@gmail.com>

PR middle-end/38969
* calls.c (initialize_argument_information): Do not wrap complex
arguments in SAVE_EXPR.

From-SVN: r143752

gcc/ChangeLog
gcc/calls.c
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr38969.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr38988.c [new file with mode: 0644]

index 0a4c5b731b0143e73cb3a70fe38d528d706c108c..fa6334a7e0811a00c186af3a3b7b5f19c629f1a0 100644 (file)
@@ -1,3 +1,18 @@
+2009-01-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline:
+       2009-01-28  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/38988
+       * config/i386/i386.md (set_rip_rex64): Wrap operand 1 in label_ref.
+       (set_got_offset_rex64): Ditto.
+
+       2009-01-27  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR middle-end/38969
+       * calls.c (initialize_argument_information): Do not wrap complex
+       arguments in SAVE_EXPR.
+
 2009-01-27  Steve Ellcey  <sje@cup.hp.com>
 
        PR middle-end/38615
index d95c88282b1acf0e3f8f8086aa2cc9b6d1e31348..4651d3adc93c2ca89dd5c4b937faee796d809356 100644 (file)
@@ -978,7 +978,6 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
            && targetm.calls.split_complex_arg (argtype))
          {
            tree subtype = TREE_TYPE (argtype);
-           arg = save_expr (arg);
            args[j].tree_value = build1 (REALPART_EXPR, subtype, arg);
            j += inc;
            args[j].tree_value = build1 (IMAGPART_EXPR, subtype, arg);
index d8d12a8420abea625b96a3873672e2ecaa48f9e1..e304541eaf9774f48a8e4010c60f3cdad686adce 100644 (file)
 
 (define_insn "set_rip_rex64"
   [(set (match_operand:DI 0 "register_operand" "=r")
-       (unspec:DI [(match_operand:DI 1 "" "")] UNSPEC_SET_RIP))]
+       (unspec:DI [(label_ref (match_operand 1 "" ""))] UNSPEC_SET_RIP))]
   "TARGET_64BIT"
   "lea{q}\t{%l1(%%rip), %0|%0, %l1[rip]}"
   [(set_attr "type" "lea")
 
 (define_insn "set_got_offset_rex64"
   [(set (match_operand:DI 0 "register_operand" "=r")
-       (unspec:DI [(match_operand:DI 1 "" "")] UNSPEC_SET_GOT_OFFSET))]
+       (unspec:DI
+         [(label_ref (match_operand 1 "" ""))]
+         UNSPEC_SET_GOT_OFFSET))]
   "TARGET_64BIT"
   "movabs{q}\t{$_GLOBAL_OFFSET_TABLE_-%l1, %0|%0, OFFSET FLAT:_GLOBAL_OFFSET_TABLE_-%l1}"
   [(set_attr "type" "imov")
index d445527abec2e0c641cec218e380f979426dbdaf..0bfa47eddbd9aa44d5cbd430fa1bddbb598b289c 100644 (file)
@@ -1,3 +1,16 @@
+2009-01-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline:
+       2009-01-28  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/38988
+       * gcc.target/i386/pr38988.c: New test.
+
+       2009-01-27  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR middle-end/38969
+       * gcc.c-torture/execute/pr38969.c: New test.
+
 2009-01-27  Steve Ellcey  <sje@cup.hp.com>
 
        PR middle-end/38615
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr38969.c b/gcc/testsuite/gcc.c-torture/execute/pr38969.c
new file mode 100644 (file)
index 0000000..328bdf4
--- /dev/null
@@ -0,0 +1,25 @@
+__complex__ float
+__attribute__ ((noinline)) foo (__complex__ float x)
+{
+  return x;
+}
+
+__complex__ float
+__attribute__ ((noinline)) bar (__complex__ float x)
+{
+  return foo (x);
+}
+
+int main()
+{
+  __complex__ float a, b;
+  __real__ a = 9;
+  __imag__ a = 42;
+
+  b = bar (a);
+
+  if (a != b)
+    abort ();
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr38988.c b/gcc/testsuite/gcc.target/i386/pr38988.c
new file mode 100644 (file)
index 0000000..8e2c8ea
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-require-effective-target fpic } */
+/* { dg-options "-O2 -fpic -mcmodel=large" } */
+
+typedef long unsigned int size_t;
+typedef void (*func_ptr) (void);
+
+static func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) };
+
+void
+__do_global_dtors_aux (void)
+{
+  extern func_ptr __DTOR_END__[];
+  size_t dtor_idx = 0;
+  const size_t max_idx = __DTOR_END__ - __DTOR_LIST__ - 1;
+  func_ptr f;
+
+  while (dtor_idx < max_idx)
+    {
+      f = __DTOR_LIST__[++dtor_idx];
+      f ();
+    }
+}