<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 17, 2015 at 7:43 PM, Peter Collingbourne <span dir="ltr"><<a href="mailto:peter@pcc.me.uk" target="_blank">peter@pcc.me.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb adM"><div class="">> My primary concern is that I would very much like the CFI implementation to<br>
> be truly generic for indirect function calls rather than specific to type<br>
> hierarchies.<br>
><br>
> Is the issue that for virtual calls there is a dramatically cheaper way to<br>
> structure the CFI implementation than there is for fully general indirect<br>
> calls?<br>
<br>
</div></div>The main problem with a design that is fully generic to indirect calls<br>
is a lack of precision. If we design our checks independent of the type<br>
hierarchy we could permit virtual calls to a function of the wrong type if<br>
the parameter/return types would otherwise match. See also [1] which contains<br>
some discussion of precision.<br></blockquote><div><br></div><div>This is helpful information, and clarifies a miscommunication. =]</div><div><br></div><div>My hope would be that we could implement the checks generically, but provide constraints from the frontend to further constrain the correct target set. Does that make sense at all?</div><div><br></div><div>Maybe to put it another way, if I have some other language than C++ which provides a different language-based constraint on the set of possible targets for an indirect call, it would be nice for both Clang and that other language frontend to encode generic target constraints and then a common check implementation to kick in to implement them. And then the check mechanism could be *completely* generic in the case of fully general indirect calls.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
There are also ancillary performance benefits of this design. For example,<br>
if we lay out the type information near the virtual tables we can in some<br>
cases avoid an additional cache miss.</blockquote></div><br>That does seem quite nice to preserve if possible. Is it possible to use a hint to get this?</div></div>