rjmccall added a comment. In D102015#2748441 <https://reviews.llvm.org/D102015#2748441>, @efriedma wrote:
> In D102015#2743634 <https://reviews.llvm.org/D102015#2743634>, @rjmccall > wrote: > >> Objective-C object types also have aggregate evaluation kind. Those can >> only be used as value types in an old, fragile ObjC ABI, but I believe we >> haven't yet formally decided to remove support for that. Fortunately, >> however, there's a much better simplification available: this >> `hasAggregateEvaluationKind(Ty)` call is literally doing nothing that >> couldn't just be a `getAs<RecordType>()` call, and then we don't need to >> worry about it. > > If you're confident that only RecordTypes need to be destroyed, sure. Well, they're the only thing for which `isParamDestroyedInCallee()` is defined. If we generalize that in the future, I think the code in your patch will be obvious enough how to modify. In D102015#2748595 <https://reviews.llvm.org/D102015#2748595>, @efriedma wrote: > In D102015#2748441 <https://reviews.llvm.org/D102015#2748441>, @efriedma > wrote: > >>> ...I'm confused about why this code is doing what it's doing with cleanups, >>> though. Why does it only apply when the parameter is indirect? I believe >>> `isParamDestroyedInCallee()` can apply to types that are passed in other >>> ways, so where we pushing the destructor for those, and why isn't it good >>> enough to handle this case as well? >> >> Objects with a non-trivial destructor end up indirect anyway under the >> normal ABI rules. Not sure how it interacts with trivial_abi; I'll look >> into it. > > Figured it out. "isIndirect()" here doesn't mean the same thing that it > means in ABIArgInfo. If `hasScalarEvaluationKind(Ty)` is false, the caller > ensures the value is "isIndirect()", i.e. on the stack. It doesn't matter if > the value was actually passed in registers. Ugh. Well, that's not great, but yeah, I agree we don't need to mess with that right now. Thanks for checking it out. In D102015#2749212 <https://reviews.llvm.org/D102015#2749212>, @efriedma wrote: >> Using _Atomic for C structs with non-trivially destructible fields currently >> doesn't work, so maybe that should just be disallowed. > > I'd prefer to disallow _Atomic on all types that aren't trivially > destructible, yes. Not impossible to support, of course, but I don't really > see the value. I agree that disallowing this is the right way to go. There are non-trivial C structs that can support atomic operations easily enough, but the ones with ARC strong references specifically aren't among them. I guess your test case is testing both the parameter and argument code. The delegate-arg code should be testable with an override thunk with a big atomic parameter, right? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D102015/new/ https://reviews.llvm.org/D102015 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits