On Sat, Aug 27, 2011 at 11:25:45AM +0200, Richard Guenther wrote: > On Sat, Aug 27, 2011 at 10:06 AM, Matt Davis <mattdav...@gmail.com> wrote: > > On Sat, Aug 27, 2011 at 09:27:49AM +0200, Richard Guenther wrote: > >> On Sat, Aug 27, 2011 at 4:47 AM, Matt Davis <mattdav...@gmail.com> wrote: > >> > Hello, > >> > I am having the compiler insert a call to a function which is defined > >> > inside > >> > another object file. However, during inline expansion via > >> > expand_call_inline(), > >> > the following assertion fails in tree-inline.c: > >> >>> 3775: edge = cgraph_edge (id->dst_node, stmt); > >> >>> 3776: gcc_checking_assert (cg_edge); > >> > > >> > cg_node comes back as being NULL since there is only one callee and no > >> > indirect > >> > calls, the function that has the inserted call is main(). Is there > >> > something I > >> > forgot to do after inserting the gimple call statement? This works fine > >> > without > >> > optimization. > >> > >> Dependent on where you do it you have to add/rebuild cgraph edges. > > > > Thanks Richard, > > I tired "rebuild_cgraph_edges()" before I sent the initial email. > > Unfortunately, when I call that function after I add the statement, in an > > IPA > > pass, the resulting binary does not link, as it does not seem able to > > resolve > > the symbol to the callee. Maybe providing more context would help make more > > sense. insert_func_call inserts the call by adding a new gimple call > > statement. > > I've done this tons of times before, but it seems with -O the callgraph > > isn't > > happy. > > If you are doing this from an IPA pass you have to add the edge manually using > update_edges_for_call_stmt.
Thanks Richard, I was unable to properly use update_edges_for_call_stmt. It seems that routine is for updating an existing call. In my case I am inserting a new gimple call via gsi_insert_before() with GSI_NEW_STMT. As a gimple pass, this works fine. I appreciate all of your correspondence. -Matt