public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: simonb@google.com (Simon Baldwin)
To: gcc-patches@gcc.gnu.org
Subject: [LTO] PATCH: Fix for ICE vector VEC(cgraph_node_ptr,base) index domain error
Date: Thu, 23 Oct 2008 13:26:00 -0000	[thread overview]
Message-ID: <20081023093840.412C43FF2B9@localhost> (raw)

Callgraph nodes are not necessarily written out in such an order that an
inlined function can always locate the function that inlines it.  Sometimes,
the function that inlines it has not yet been read.

This patch addresses that by deferring node lookup by reference until all of
the callgraph nodes have been read, and fixes the following:

  extern inline void __attribute__((__always_inline__)) func(void) { }
  void f(void) { func(); }

  $ gcc -c -fwhopr -o f.o f.c
  $ gcc -shared -fwhopr -o f.so f.o
  lto1: internal compiler error: vector VEC(cgraph_node_ptr,base) index
  domain error, in input_node at lto/lto-lang.c:1216


gcc/lto/ChangeLog
2008-10-22  Simon Baldwin  <simonb@google.com>

	* lto-lang.c: (input_node): Save the node reference, rather than the
	node pointer, in node->inlined_to.
	(fixup_cgraph_nodes): New function, convert node references into
	node pointers.
	(input_cgraph_1): Call fixup_cgraph_nodes.


Index: gcc/lto/lto-lang.c
===================================================================
--- gcc/lto/lto-lang.c	(revision 141263)
+++ gcc/lto/lto-lang.c	(working copy)
@@ -1212,10 +1212,10 @@ input_node (struct lto_file_decl_data* f
 	  node->global.estimated_stack_size = estimated_stack_size;
 	  node->global.stack_frame_offset = stack_frame_offset;
 	  node->global.insns = insns;
-	  if (ref != LCC_NOT_FOUND)
-	    node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref);
-	  else
-	    node->global.inlined_to = NULL;
+
+          /* Store a reference for now, and fix up later to be a pointer.  */
+          node->global.inlined_to = (graph_node_ptr) ref;
+
 	  node->global.estimated_growth = estimated_growth;
 	  node->global.inlined = inlined;
 	}
@@ -1270,6 +1270,26 @@ input_edge (struct lto_input_block *ib, 
   edge->indirect_call = lto_get_flag (&flags);
 }
 
+/* Callgraph node inlined_to fields are currently references; here is where
+   we convert them into node pointers.  */
+
+static void
+fixup_cgraph_nodes (VEC(cgraph_node_ptr, heap) *nodes)
+{
+  int i;
+
+  for (i = 0; VEC_iterate (cgraph_node_ptr, nodes, i, node); i++)
+    {
+      const int ref = (int) node->global.inlined_to;
+
+      if (ref != LCC_NOT_FOUND)
+        node->global.inlined_to = VEC_index (cgraph_node_ptr, nodes, ref);
+      else
+        node->global.inlined_to = NULL;
+    }
+
+}
+
 /* Input a cgraph from IB using the info in FILE_DATA.  */
 
 static void
@@ -1286,7 +1306,7 @@ input_cgraph_1 (struct lto_file_decl_dat
       LTO_DEBUG_INDENT (tag);
 
       if (tag == LTO_cgraph_edge)
-	  input_edge (ib, nodes);
+        input_edge (ib, nodes);
       else 
 	{
 	  node = input_node (file_data, ib, tag, nodes);
@@ -1297,6 +1317,7 @@ input_cgraph_1 (struct lto_file_decl_dat
       tag = lto_input_uleb128 (ib);
     }
 
+  fixup_cgraph_nodes (nodes);
   VEC_free (cgraph_node_ptr, heap, nodes);
 }
 

             reply	other threads:[~2008-10-23  9:39 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-23 13:26 Simon Baldwin [this message]
2008-10-23 13:29 ` Diego Novillo
2008-10-23 15:56   ` Simon Baldwin
2008-10-23 16:35     ` Diego Novillo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20081023093840.412C43FF2B9@localhost \
    --to=simonb@google.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).