On Sun, Aug 28, 2011 at 1:30 AM, Matt Davis <mattdav...@gmail.com> wrote:
> 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.

Well, from looking at the function it should work if you pass NULL as
the old stmt.
If it does not, figure out why.

Richard.

> -Matt
>

Reply via email to