re PR lto/41281 (toplevel asms do not work)
authorRichard Guenther <rguenther@suse.de>
Mon, 5 Oct 2009 14:30:10 +0000 (14:30 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 5 Oct 2009 14:30:10 +0000 (14:30 +0000)
2009-10-05  Richard Guenther  <rguenther@suse.de>

PR lto/41281
* lto-cgraph.c (output_cgraph): Output toplevel asms.
(input_cgraph_1): Input toplevel asms.

* gcc.dg/lto/20090914-2_0.c: New testcase.

From-SVN: r152453

gcc/ChangeLog
gcc/lto-cgraph.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/20090914-2_0.c [new file with mode: 0644]

index 6060ebf..f3efe24 100644 (file)
@@ -1,5 +1,11 @@
 2009-10-05  Richard Guenther  <rguenther@suse.de>
 
+       PR lto/41281
+       * lto-cgraph.c (output_cgraph): Output toplevel asms.
+       (input_cgraph_1): Input toplevel asms.
+
+2009-10-05  Richard Guenther  <rguenther@suse.de>
+
        PR lto/40902
        * lto-symtab.c (lto_compatible_attributes_p): Remove.
        (external_aggregate_decl_p): Likewise.
index 47ccccd..1491647 100644 (file)
@@ -318,6 +318,7 @@ output_cgraph (cgraph_node_set set)
   int i, n_nodes;
   bitmap written_decls;
   lto_cgraph_encoder_t encoder;
+  struct cgraph_asm_node *can;
 
   ob = lto_create_simple_output_block (LTO_section_cgraph);
 
@@ -375,6 +376,18 @@ output_cgraph (cgraph_node_set set)
 
   lto_output_uleb128_stream (ob->main_stream, 0);
 
+  /* Emit toplevel asms.  */
+  for (can = cgraph_asm_nodes; can; can = can->next)
+    {
+      int len = TREE_STRING_LENGTH (can->asm_str);
+      lto_output_uleb128_stream (ob->main_stream, len);
+      for (i = 0; i < len; ++i)
+       lto_output_1_stream (ob->main_stream,
+                            TREE_STRING_POINTER (can->asm_str)[i]);
+    }
+
+  lto_output_uleb128_stream (ob->main_stream, 0);
+
   lto_destroy_simple_output_block (ob);
 }
 
@@ -573,6 +586,7 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
   VEC(cgraph_node_ptr, heap) *nodes = NULL;
   struct cgraph_node *node;
   unsigned i;
+  unsigned HOST_WIDE_INT len;
 
   tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
   while (tag)
@@ -591,6 +605,19 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
       tag = (enum LTO_cgraph_tags) lto_input_uleb128 (ib);
     }
 
+  /* Input toplevel asms.  */
+  len = lto_input_uleb128 (ib);
+  while (len)
+    {
+      char *str = (char *)xmalloc (len + 1);
+      for (i = 0; i < len; ++i)
+       str[i] = lto_input_1_unsigned (ib);
+      cgraph_add_asm_node (build_string (len, str));
+      free (str);
+
+      len = lto_input_uleb128 (ib);
+    }
+
   for (i = 0; VEC_iterate (cgraph_node_ptr, nodes, i, node); i++)
     {
       const int ref = (int) (intptr_t) node->global.inlined_to;
index c48f680..aa6181d 100644 (file)
@@ -1,5 +1,10 @@
 2009-10-05  Richard Guenther  <rguenther@suse.de>
 
+       PR lto/41281
+       * gcc.dg/lto/20090914-2_0.c: New testcase.
+
+2009-10-05  Richard Guenther  <rguenther@suse.de>
+
        PR lto/40902
        * gcc.dg/lto/20091005-1_0.c: New testcase.
        * gcc.dg/lto/20091005-1_1.c: Likewise.
diff --git a/gcc/testsuite/gcc.dg/lto/20090914-2_0.c b/gcc/testsuite/gcc.dg/lto/20090914-2_0.c
new file mode 100644 (file)
index 0000000..f78ecf8
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-lto-do run { target x86_64-*-* i?86-*-* } } */
+
+/* Doesn't work without this dummy function with -fwhopr.  */
+int foo(void) { }
+
+asm(".text\n"
+    ".globl main\n"
+    "\t.type main,@function\n"
+    "main:\n"
+    "\txorl %eax, %eax\n"
+    "\tret\n");