rjmccall added a comment.

In D79279#2016496 <https://reviews.llvm.org/D79279#2016496>, @jfb wrote:

> In D79279#2015983 <https://reviews.llvm.org/D79279#2015983>, @rjmccall wrote:
>
> > Most of the complexity of this patch is introduced by the decision to 
> > type-check these calls with a volatile-typed parameter, which seems like it 
> > does nothing but cause problems.  If your goal is to make these functions 
> > do the right thing when given arbitrary pointer types, I think you need to 
> > give these calls special type-checking semantics.  Done right, that will 
> > also let you e.g. accept pointers into arbitrary address spaces.  But I'm 
> > not sure how good of an idea this actually is at base, since these builtins 
> > are typically used for direct calls to their associated library functions.
>
>
> You mean: in `Builtins,def` allow a `?` modifier on `volatile` (so, `D?`) to 
> denote overloading on `volatile`, and consume that overload directly while 
> type checking? That seems fine to me. Just want to make sure that's what you 
> have in mind.


I don't know how that `?` would actually work, but more importantly, no, that's 
not really what I meant.  The current semantics of these builtins are that they 
are not polymorphic.  I think the right way to understand what you're trying to 
do is that you're trying to make them polymorphic over qualifiers.  That means 
that we can do a `__builtin_memset` of a `volatile void *`, yes, but it also 
means that we can do a `__builtin_memset` of a `volatile restrict __local void 
*`.  (Now, some qualifiers don't make sense to honor because they'd be a 
radical change in behavior — we wouldn't want to honor `__strong` by doing a 
bunch of ARC assignments, for example.  But most qualifiers do still make sense 
for these operations.)  And in fact there's a certain amount of precedent for 
this because we already honor the presumed alignment of the pointer before it's 
converted to `void*`.

Unfortunately, the only way to do this kind of polymorphism in Clang today is 
to give the entire builtin custom type-checking with `t`.  And you'll need to 
do a bunch of work to make sure that the behavior of this builtin is consistent 
with an ordinary call to `memcpy` when e.g. the argument is a class type with 
overloaded conversion operators to pointer types.  But I think that's what 
you're signing up for.

I do think this is a somewhat debatable change in the behavior of these 
builtins, though.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D79279/new/

https://reviews.llvm.org/D79279



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to