> 
> Yep, there is such code in place. It is done by
> insert_bndret_call_after. You are right, I should use the same
> interface for both these cases.

That would be nice indeed.  We should separate out and unify the code for 
porducing
a wrapper call next stage1 (as Jeff mentions too).
> 
> >> > +         if (instrumentation_clone
> >> > +             && !DECL_BY_REFERENCE (resdecl)
> >> > +             && restmp
> >> > +             && BOUNDED_P (restmp))
> >> > +           {
> >> > +             tree fn = targetm.builtin_chkp_function 
> >> > (BUILT_IN_CHKP_BNDRET);
> >> > +             gcall *retbnd = gimple_build_call (fn, 1, restmp);
> >> > +
> >> > +             resbnd = create_tmp_reg (pointer_bounds_type_node, 
> >> > "retbnd");
> >> > +             gimple_call_set_lhs (retbnd, resbnd);
> >> > +
> >> > +             gsi_insert_after (&bsi, retbnd, GSI_NEW_STMT);
> >> > +             create_edge (get_create (fn), retbnd, callees->count, 
> >> > callees->frequency);
> >> > +           }
> >
> > I am not sure why we need to check here:  Originaly we have two bounded 
> > functions, A and B.
> > We turn function B to a wrapper of function A. If callers of bounded 
> > functions need
> > to call a builtin, I would expect all callers of B to do it already, so I 
> > would expect
> > that wrapper is safe here?
> 
> The problem with instrumented call is that instrumented function
> returns two values and call lhs gets only the first one. Thus we
> generate bndret call to get the second one to build own return with
> two values.

I see, patch is OK then (preferably merging as much as possible with ipa-split)

Honza
> 
> >
> > Or do we mix instrumented and non-instrumented versions somehow?
> >
> > Addding code handling return value is going to turn the call to 
> > non-tailcall, so you probably
> > want to drop the tailcall flag, too.
> 
> No, function still return what the last call return, thus may keep tailcall.
> 
> Thanks,
> Ilya
> 
> >
> > Honza

Reply via email to