[PATCH][LTO] Handle toplevel asms

Richard Guenther rguenther@suse.de
Mon Oct 5 13:02:00 GMT 2009


This simple patch adds handling of toplevel asms to LTO.  Really
they IMHO should be regular cgraph nodes which would make things
so much easier ... well, just emitting toplevel asms alongside the
cgraph is easy.  I would have expected it not to work with WHOPR
(well, it doesn't - see PR41584 ;)), but appearantly it does in
the simple case at least.

I have bootstrapped and tested this earlier but will repeat soon.

Ok?

Thanks,
Richard.

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.

Index: trunk/gcc/lto-cgraph.c
===================================================================
*** trunk.orig/gcc/lto-cgraph.c	2009-10-05 11:09:03.000000000 +0200
--- trunk/gcc/lto-cgraph.c	2009-10-05 14:42:03.000000000 +0200
*************** output_cgraph (cgraph_node_set set)
*** 318,323 ****
--- 318,324 ----
    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);
  
*************** output_cgraph (cgraph_node_set set)
*** 375,380 ****
--- 376,393 ----
  
    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);
  }
  
*************** input_cgraph_1 (struct lto_file_decl_dat
*** 573,578 ****
--- 586,592 ----
    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)
*************** input_cgraph_1 (struct lto_file_decl_dat
*** 591,596 ****
--- 605,623 ----
        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: trunk/gcc/testsuite/gcc.dg/lto/20090914-2_0.c
===================================================================
*** /dev/null	1970-01-01 00:00:00.000000000 +0000
--- trunk/gcc/testsuite/gcc.dg/lto/20090914-2_0.c	2009-10-05 14:56:28.000000000 +0200
***************
*** 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");



More information about the Gcc-patches mailing list