Patch to mangle __uuidof expressions under -fms-extensions
jahanian
fjahanian at apple.com
Tue Sep 23 13:28:29 PDT 2014
On Sep 22, 2014, at 5:15 PM, John McCall <rjmccall at apple.com> wrote:
> On Sep 22, 2014, at 4:20 PM, jahanian <fjahanian at apple.com> wrote:
>> This patch allows mangling of microsoft’s __uuidof expression for the Itanium ABI when under -fms-extensions
>> // rdar://17784718
>
> + case Expr::CXXUuidofExprClass: {
> + if (!getASTContext().getLangOpts().MicrosoftExt) {
> + DiagnosticsEngine &Diags = Context.getDiags();
> + unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
> + "cannot yet mangle __uuidof expression");
> + Diags.Report(E->getExprLoc(), DiagID)
> + << E->getStmtClassName() << E->getSourceRange();
>
> You don’t need this. We should never see these expressions except that
> language flag is set, and even if we do, it’s okay to mangle them this way.
>
> + } else {
> + const CXXUuidofExpr *UE = cast<CXXUuidofExpr>(E);
> + // This CXXUuidofExpr is mangled as-if it were actually a VarDecl from
> + // const __s_GUID _GUID_{lower case UUID with underscores}
> + StringRef Uuid = UE->getUuidAsStringRef(Context.getASTContext());
> + std::string Name = "_GUID_" + Uuid.lower();
> + std::replace(Name.begin(), Name.end(), '-', '_');
> + Out << "$E?";
> + Out << Name << "@@3U__s_GUID@@B";
> + }
>
> You need to use an Itanium-style mangling here, not a Microsoft-style one.
> That specifically means only using alphanumeric characters.
>
> Also, since we’re using a different mangling, we should also properly
> handle dependent operands instead of assuming that the operand can
> always be fully resolved.
>
> In the Itanium scheme, this falls into the general category of a
> vendor-extended operator, which is mangled as
> u <name-of-operator> <operands...>
> As far as I can tell, it’s impossible to demangle these without knowledge of
> the specific vendor extension, because nothing in the mangling actually
> indicates how many operands follow. So I don’t see any reason to actually
> insist that the operand actually be an expression, which is good, because
> __uuidof is like sizeof in that its operand can be either a type or an expression.
>
> For sizeof, the mangling prefix is either “st” or “sz”, respectively.
> So let’s use these manglings:
>
> u8__uuidoft <type> # __uuidof (a type)
> u8__uuidofz <expression> # __uuidof (an expression)
Hi John,
Please review the new patch.
- Thanks, Fariborz
>
> John.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140923/1b030716/attachment.html>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: uuid-patch.txt
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140923/1b030716/attachment.txt>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140923/1b030716/attachment-0001.html>
More information about the cfe-commits
mailing list