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.

>>> for (node=cgraph_nodes; node; node=node->next)
>>> {
>>>     if (!(func = DECL_STRUCT_FUNCTION(node->decl)))
>>>       continue;
>>>
>>>     push_cfun(func);
>>>     old_fn_decl = current_function_decl;
>>>     current_function_decl = node->decl;
>>>
>>>     insert_func_call(func);
>>>
>>>     rebuild_cgraph_edges();
>>>     current_function_decl = old_fn_decl;
>>>     pop_cfun();
>>> }
>
> -Matt
>

Reply via email to