Inline Expansion Problem

Matt Davis mattdavis9@gmail.com
Sat Aug 27 08:07:00 GMT 2011


On Sat, Aug 27, 2011 at 09:27:49AM +0200, Richard Guenther wrote:
> On Sat, Aug 27, 2011 at 4:47 AM, Matt Davis <mattdavis9@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.

>> 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



More information about the Gcc mailing list