[PATCH] D33398: Remove __unaligned preventively when mangling types in Itanium ABI
Roger Ferrer Ibanez via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue May 23 00:13:26 PDT 2017
rogfer01 added inline comments.
================
Comment at: lib/AST/ItaniumMangle.cpp:2329-2333
+ // __unaligned is not currently mangled in any way. This implies that it is
+ // not a relevant qualifier for substitutions (while CVR and maybe others
+ // are). This triggers an assertion when this is the only qualifier and the
+ // unqualified type is a class. So let's remove it preventively here.
+ quals.removeUnaligned();
----------------
rsmith wrote:
> I don't think this is the right place/way to handle this: given
>
> ```
> void f(struct X __unaligned *p, struct X *q) {}
> ```
>
> it looks like we'll mangle as `_Z1fP1XP1X` with this patch, which seems wrong: this should presumably instead be `_Z1fP1XS0_`.
>
> But regardless, I think the right thing to do is to invent a mangling for `__unaligned`, since we support overloading on it; the most appropriate mangling would be `U11__unaligned`, per http://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling-type. (You'll need to extend `mangleQualifiers` to emit this and `hasMangledSubstitutionQualifiers` to ignore it.)
Oh. I see. Thanks for the review.
I'll update this patch and then I'll post another one for the mangling of unaligned.
https://reviews.llvm.org/D33398
More information about the cfe-commits
mailing list