On 30 Oct 11:40, Jeff Law wrote:
> On 10/30/13 04:48, Richard Biener wrote:
> >foo (int * p, unsigned int size)
> >{
> > <unnamed type> __bound_tmp.0;
> > long unsigned int D.2239;
> > long unsigned int _2;
> > sizetype _6;
> > int * _7;
> >
> > <bb 3>:
> > __bound_tmp.0_4 = __builtin_ia32_arg_bnd (p_3(D));
> >
> > <bb 2>:
> > _2 = (long unsigned int) size_1(D);
> > __builtin_ia32_bndcl (__bound_tmp.0_4, p_3(D));
> > _6 = _2 + 18446744073709551615;
> > _7 = p_3(D) + _6;
> > __builtin_ia32_bndcu (__bound_tmp.0_4, _7);
> > access_and_store (p_3(D), __bound_tmp.0_4, size_1(D));
> >
> >so it seems there is now a mismatch between DECL_ARGUMENTS
> >and the GIMPLE call stmt arguments. How (if) did you amend
> >the GIMPLE stmt verifier for this?
> Effectively the bounds are passed "on the side".
>
> >
> >How does regular code deal with this which may expect matching
> >to DECL_ARGUMENTS? In fact interleaving the additional
> >arguments sounds very error-prone for existing code - I'd have
> >appended all bound args at the end. Also you unconditionally
> >claim all pointer arguments have a bound - that looks like bad
> >design as well. Why didn't you add a flag to the relevant
> >PARM_DECL (and then, what do you do for indirect calls?).
> You can't actually interleave them -- that results in MPX and normal
> code not being able to interact. Passing the bound at the end
> doesn't really work either -- varargs and the desire to pass some of
> the bounds around in bound registers.
>
>
> >
> >/* Return the number of arguments used by call statement GS
> > ignoring bound ones. */
> >
> >static inline unsigned
> >gimple_call_num_nobnd_args (const_gimple gs)
> >{
> > unsigned num_args = gimple_call_num_args (gs);
> > unsigned res = num_args;
> > for (unsigned n = 0; n < num_args; n++)
> > if (POINTER_BOUNDS_P (gimple_call_arg (gs, n)))
> > res--;
> > return res;
> >}
> >
> >the choice means that gimple_call_num_nobnd_args is not O(1).
> Yes, but I don't see that's terribly problematical.
>
>
> >
> >/* Return INDEX's call argument ignoring bound ones. */
> >static inline tree
> >gimple_call_nobnd_arg (const_gimple gs, unsigned index)
> >{
> > /* No bound args may exist if pointers checker is off. */
> > if (!flag_check_pointer_bounds)
> > return gimple_call_arg (gs, index);
> > return gimple_call_arg (gs, gimple_call_get_nobnd_arg_index (gs, index));
> >}
> >
> >GIMPLE layout depending on flag_check_pointer_bounds sounds
> >like a recipie for desaster if you consider TUs compiled with and
> >TUs compiled without and LTO. Or if you consider using
> >optimized attribute with that flag.
> Sorry, I don't follow. Can you elaborate please.
I suppose the possile problem here is when we run LTO compiler without
-fcheck-pointer-bounds and give instrumented code as input.
gimple_call_nobnd_arg would work wrong for instrumented code. Actually there
are other places in subsequent patches wich assume that
flag_check_pointer_bounds is 1 if we have instrumented code.
Ilya
>
> >I hope the reviewers that approved the patch will work with you to
> >address the above issues. I can't be everywhere.
> Obviously I will.
>
> jeff
>