2013/11/8 Richard Biener <richard.guent...@gmail.com>: > On Thu, Nov 7, 2013 at 7:55 PM, Jeff Law <l...@redhat.com> wrote: >> On 11/07/13 04:50, Ilya Enkovich wrote: >>> >>> Hi, >>> >>> Here is an updated patch version. >> >> I think this needs to hold until we have a consensus on what the parameter >> passing looks like for bounded pointers. > > I still think the best thing to do on GIMPLE is > > arg_2 = __builtin_ia32_bnd_arg (arg_1(D)); > foo (arg_2); > > that is, make the parameter an implicit pair of {value, bound} where > the bound is determined by the value going through a bound association > builtin. No extra explicit argument to the calls so arguments match > the fndecl and fntype. All the complexity is defered to the expander > which can trivially lookup bound arguments via the SSA def (I suppose > it does that anyway now for getting at the explicit bound argument now). > > As far as I can see (well, think), all currently passed bound arguments > are the return value of such builtin already.
All bounds are result of different builtin calls. Small example: int *global_p; void foo (int *p) { int buf[10]; bar (p, buf, global_p); } It is translated into: __bound_tmp.1_7 = __builtin_ia32_bndmk (&buf, 40); __bound_tmp.1_6 = __builtin_ia32_arg_bnd (p_3(D)(ab)); global_p.0_2 = global_p; __bound_tmp.1_8 = __builtin_ia32_bndldx (&global_p, global_p.0_2); bar (p_3(D)(ab), __bound_tmp.1_6, &buf, __bound_tmp.1_7, global_p.0_2, __bound_tmp.1_8); Bounds binding via calls as you suggest may be done as following: __bound_tmp.1_7 = __builtin_ia32_bndmk (&buf, 40); __bound_tmp.1_6 = __builtin_ia32_arg_bnd (p_3(D)(ab)); global_p.0_2 = global_p; __bound_tmp.1_8 = __builtin_ia32_bndldx (&global_p, global_p.0_2); _9 = __builtin_bind_bounds (p_3(D)(ab), __bound_tmp.1_6); _10 = __builtin_bind_bounds (&buf, __bound_tmp.1_7); _11 = __builtin_bind_bounds (global_p.0_2, __bound_tmp.1_8); bar (_9, _10, _11); Is it close to what you propose? Ilya > > Richard. > > > >> Jeff