|
@@ -170,6 +170,8 @@ public:
|
|
|
|
|
|
void mangleStringLiteral(const StringLiteral *, raw_ostream &) override;
|
|
void mangleStringLiteral(const StringLiteral *, raw_ostream &) override;
|
|
|
|
|
|
|
|
+ void mangleLambdaSig(const CXXRecordDecl *Lambda, raw_ostream &) override;
|
|
|
|
+
|
|
bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
|
|
bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
|
|
// Lambda closure types are already numbered.
|
|
// Lambda closure types are already numbered.
|
|
if (isLambda(ND))
|
|
if (isLambda(ND))
|
|
@@ -424,6 +426,7 @@ public:
|
|
void mangleName(const NamedDecl *ND);
|
|
void mangleName(const NamedDecl *ND);
|
|
void mangleType(QualType T);
|
|
void mangleType(QualType T);
|
|
void mangleNameOrStandardSubstitution(const NamedDecl *ND);
|
|
void mangleNameOrStandardSubstitution(const NamedDecl *ND);
|
|
|
|
+ void mangleLambdaSig(const CXXRecordDecl *Lambda);
|
|
|
|
|
|
private:
|
|
private:
|
|
|
|
|
|
@@ -550,7 +553,7 @@ private:
|
|
void mangleTemplateArgs(const TemplateArgumentList &AL);
|
|
void mangleTemplateArgs(const TemplateArgumentList &AL);
|
|
void mangleTemplateArg(TemplateArgument A);
|
|
void mangleTemplateArg(TemplateArgument A);
|
|
|
|
|
|
- void mangleTemplateParameter(unsigned Index);
|
|
|
|
|
|
+ void mangleTemplateParameter(unsigned Depth, unsigned Index);
|
|
|
|
|
|
void mangleFunctionParam(const ParmVarDecl *parm);
|
|
void mangleFunctionParam(const ParmVarDecl *parm);
|
|
|
|
|
|
@@ -965,7 +968,7 @@ void CXXNameMangler::mangleUnscopedTemplateName(
|
|
if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
|
|
if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
|
|
assert(!AdditionalAbiTags &&
|
|
assert(!AdditionalAbiTags &&
|
|
"template template param cannot have abi tags");
|
|
"template template param cannot have abi tags");
|
|
- mangleTemplateParameter(TTP->getIndex());
|
|
|
|
|
|
+ mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
|
|
} else if (isa<BuiltinTemplateDecl>(ND)) {
|
|
} else if (isa<BuiltinTemplateDecl>(ND)) {
|
|
mangleUnscopedName(ND, AdditionalAbiTags);
|
|
mangleUnscopedName(ND, AdditionalAbiTags);
|
|
} else {
|
|
} else {
|
|
@@ -1686,16 +1689,42 @@ void CXXNameMangler::mangleUnqualifiedBlock(const BlockDecl *Block) {
|
|
// ::= Tn <type> # template non-type parameter
|
|
// ::= Tn <type> # template non-type parameter
|
|
// ::= Tt <template-param-decl>* E # template template parameter
|
|
// ::= Tt <template-param-decl>* E # template template parameter
|
|
void CXXNameMangler::mangleTemplateParamDecl(const NamedDecl *Decl) {
|
|
void CXXNameMangler::mangleTemplateParamDecl(const NamedDecl *Decl) {
|
|
- if (isa<TemplateTypeParmDecl>(Decl)) {
|
|
|
|
|
|
+ if (auto *Ty = dyn_cast<TemplateTypeParmDecl>(Decl)) {
|
|
|
|
+ if (Ty->isParameterPack())
|
|
|
|
+ Out << "Tp";
|
|
Out << "Ty";
|
|
Out << "Ty";
|
|
} else if (auto *Tn = dyn_cast<NonTypeTemplateParmDecl>(Decl)) {
|
|
} else if (auto *Tn = dyn_cast<NonTypeTemplateParmDecl>(Decl)) {
|
|
- Out << "Tn";
|
|
|
|
- mangleType(Tn->getType());
|
|
|
|
|
|
+ if (Tn->isExpandedParameterPack()) {
|
|
|
|
+ for (unsigned I = 0, N = Tn->getNumExpansionTypes(); I != N; ++I) {
|
|
|
|
+ Out << "Tn";
|
|
|
|
+ mangleType(Tn->getExpansionType(I));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ QualType T = Tn->getType();
|
|
|
|
+ if (Tn->isParameterPack()) {
|
|
|
|
+ Out << "Tp";
|
|
|
|
+ T = T->castAs<PackExpansionType>()->getPattern();
|
|
|
|
+ }
|
|
|
|
+ Out << "Tn";
|
|
|
|
+ mangleType(T);
|
|
|
|
+ }
|
|
} else if (auto *Tt = dyn_cast<TemplateTemplateParmDecl>(Decl)) {
|
|
} else if (auto *Tt = dyn_cast<TemplateTemplateParmDecl>(Decl)) {
|
|
- Out << "Tt";
|
|
|
|
- for (auto *Param : *Tt->getTemplateParameters())
|
|
|
|
- mangleTemplateParamDecl(Param);
|
|
|
|
- Out << "E";
|
|
|
|
|
|
+ if (Tt->isExpandedParameterPack()) {
|
|
|
|
+ for (unsigned I = 0, N = Tt->getNumExpansionTemplateParameters(); I != N;
|
|
|
|
+ ++I) {
|
|
|
|
+ Out << "Tt";
|
|
|
|
+ for (auto *Param : *Tt->getExpansionTemplateParameters(I))
|
|
|
|
+ mangleTemplateParamDecl(Param);
|
|
|
|
+ Out << "E";
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if (Tt->isParameterPack())
|
|
|
|
+ Out << "Tp";
|
|
|
|
+ Out << "Tt";
|
|
|
|
+ for (auto *Param : *Tt->getTemplateParameters())
|
|
|
|
+ mangleTemplateParamDecl(Param);
|
|
|
|
+ Out << "E";
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1726,12 +1755,7 @@ void CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) {
|
|
}
|
|
}
|
|
|
|
|
|
Out << "Ul";
|
|
Out << "Ul";
|
|
- for (auto *D : Lambda->getLambdaExplicitTemplateParameters())
|
|
|
|
- mangleTemplateParamDecl(D);
|
|
|
|
- const FunctionProtoType *Proto = Lambda->getLambdaTypeInfo()->getType()->
|
|
|
|
- getAs<FunctionProtoType>();
|
|
|
|
- mangleBareFunctionType(Proto, /*MangleReturnType=*/false,
|
|
|
|
- Lambda->getLambdaStaticInvoker());
|
|
|
|
|
|
+ mangleLambdaSig(Lambda);
|
|
Out << "E";
|
|
Out << "E";
|
|
|
|
|
|
// The number is omitted for the first closure type with a given
|
|
// The number is omitted for the first closure type with a given
|
|
@@ -1746,6 +1770,15 @@ void CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) {
|
|
Out << '_';
|
|
Out << '_';
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void CXXNameMangler::mangleLambdaSig(const CXXRecordDecl *Lambda) {
|
|
|
|
+ for (auto *D : Lambda->getLambdaExplicitTemplateParameters())
|
|
|
|
+ mangleTemplateParamDecl(D);
|
|
|
|
+ const FunctionProtoType *Proto = Lambda->getLambdaTypeInfo()->getType()->
|
|
|
|
+ getAs<FunctionProtoType>();
|
|
|
|
+ mangleBareFunctionType(Proto, /*MangleReturnType=*/false,
|
|
|
|
+ Lambda->getLambdaStaticInvoker());
|
|
|
|
+}
|
|
|
|
+
|
|
void CXXNameMangler::manglePrefix(NestedNameSpecifier *qualifier) {
|
|
void CXXNameMangler::manglePrefix(NestedNameSpecifier *qualifier) {
|
|
switch (qualifier->getKind()) {
|
|
switch (qualifier->getKind()) {
|
|
case NestedNameSpecifier::Global:
|
|
case NestedNameSpecifier::Global:
|
|
@@ -1852,7 +1885,7 @@ void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND,
|
|
|
|
|
|
// <template-template-param> ::= <template-param>
|
|
// <template-template-param> ::= <template-param>
|
|
if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
|
|
if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
|
|
- mangleTemplateParameter(TTP->getIndex());
|
|
|
|
|
|
+ mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
|
|
} else {
|
|
} else {
|
|
manglePrefix(getEffectiveDeclContext(ND), NoFunction);
|
|
manglePrefix(getEffectiveDeclContext(ND), NoFunction);
|
|
if (isa<BuiltinTemplateDecl>(ND))
|
|
if (isa<BuiltinTemplateDecl>(ND))
|
|
@@ -1885,8 +1918,8 @@ void CXXNameMangler::mangleType(TemplateName TN) {
|
|
goto HaveDecl;
|
|
goto HaveDecl;
|
|
|
|
|
|
HaveDecl:
|
|
HaveDecl:
|
|
- if (isa<TemplateTemplateParmDecl>(TD))
|
|
|
|
- mangleTemplateParameter(cast<TemplateTemplateParmDecl>(TD)->getIndex());
|
|
|
|
|
|
+ if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TD))
|
|
|
|
+ mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
|
|
else
|
|
else
|
|
mangleName(TD);
|
|
mangleName(TD);
|
|
break;
|
|
break;
|
|
@@ -2964,7 +2997,7 @@ void CXXNameMangler::mangleType(const MemberPointerType *T) {
|
|
|
|
|
|
// <type> ::= <template-param>
|
|
// <type> ::= <template-param>
|
|
void CXXNameMangler::mangleType(const TemplateTypeParmType *T) {
|
|
void CXXNameMangler::mangleType(const TemplateTypeParmType *T) {
|
|
- mangleTemplateParameter(T->getIndex());
|
|
|
|
|
|
+ mangleTemplateParameter(T->getDepth(), T->getIndex());
|
|
}
|
|
}
|
|
|
|
|
|
// <type> ::= <template-param>
|
|
// <type> ::= <template-param>
|
|
@@ -3535,7 +3568,7 @@ void CXXNameMangler::mangleDeclRefExpr(const NamedDecl *D) {
|
|
|
|
|
|
case Decl::NonTypeTemplateParm:
|
|
case Decl::NonTypeTemplateParm:
|
|
const NonTypeTemplateParmDecl *PD = cast<NonTypeTemplateParmDecl>(D);
|
|
const NonTypeTemplateParmDecl *PD = cast<NonTypeTemplateParmDecl>(D);
|
|
- mangleTemplateParameter(PD->getIndex());
|
|
|
|
|
|
+ mangleTemplateParameter(PD->getDepth(), PD->getIndex());
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -4264,13 +4297,13 @@ recurse:
|
|
Out << "sZ";
|
|
Out << "sZ";
|
|
const NamedDecl *Pack = SPE->getPack();
|
|
const NamedDecl *Pack = SPE->getPack();
|
|
if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack))
|
|
if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack))
|
|
- mangleTemplateParameter(TTP->getIndex());
|
|
|
|
|
|
+ mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
|
|
else if (const NonTypeTemplateParmDecl *NTTP
|
|
else if (const NonTypeTemplateParmDecl *NTTP
|
|
= dyn_cast<NonTypeTemplateParmDecl>(Pack))
|
|
= dyn_cast<NonTypeTemplateParmDecl>(Pack))
|
|
- mangleTemplateParameter(NTTP->getIndex());
|
|
|
|
|
|
+ mangleTemplateParameter(NTTP->getDepth(), NTTP->getIndex());
|
|
else if (const TemplateTemplateParmDecl *TempTP
|
|
else if (const TemplateTemplateParmDecl *TempTP
|
|
= dyn_cast<TemplateTemplateParmDecl>(Pack))
|
|
= dyn_cast<TemplateTemplateParmDecl>(Pack))
|
|
- mangleTemplateParameter(TempTP->getIndex());
|
|
|
|
|
|
+ mangleTemplateParameter(TempTP->getDepth(), TempTP->getIndex());
|
|
else
|
|
else
|
|
mangleFunctionParam(cast<ParmVarDecl>(Pack));
|
|
mangleFunctionParam(cast<ParmVarDecl>(Pack));
|
|
break;
|
|
break;
|
|
@@ -4557,13 +4590,21 @@ void CXXNameMangler::mangleTemplateArg(TemplateArgument A) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void CXXNameMangler::mangleTemplateParameter(unsigned Index) {
|
|
|
|
|
|
+void CXXNameMangler::mangleTemplateParameter(unsigned Depth, unsigned Index) {
|
|
// <template-param> ::= T_ # first template parameter
|
|
// <template-param> ::= T_ # first template parameter
|
|
// ::= T <parameter-2 non-negative number> _
|
|
// ::= T <parameter-2 non-negative number> _
|
|
- if (Index == 0)
|
|
|
|
- Out << "T_";
|
|
|
|
- else
|
|
|
|
- Out << 'T' << (Index - 1) << '_';
|
|
|
|
|
|
+ // ::= TL <L-1 non-negative number> __
|
|
|
|
+ // ::= TL <L-1 non-negative number> _
|
|
|
|
+ // <parameter-2 non-negative number> _
|
|
|
|
+ //
|
|
|
|
+ // The latter two manglings are from a proposal here:
|
|
|
|
+ // https://github.com/itanium-cxx-abi/cxx-abi/issues/31#issuecomment-528122117
|
|
|
|
+ Out << 'T';
|
|
|
|
+ if (Depth != 0)
|
|
|
|
+ Out << 'L' << (Depth - 1) << '_';
|
|
|
|
+ if (Index != 0)
|
|
|
|
+ Out << (Index - 1);
|
|
|
|
+ Out << '_';
|
|
}
|
|
}
|
|
|
|
|
|
void CXXNameMangler::mangleSeqID(unsigned SeqID) {
|
|
void CXXNameMangler::mangleSeqID(unsigned SeqID) {
|
|
@@ -5080,6 +5121,12 @@ void ItaniumMangleContextImpl::mangleStringLiteral(const StringLiteral *, raw_os
|
|
llvm_unreachable("Can't mangle string literals");
|
|
llvm_unreachable("Can't mangle string literals");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void ItaniumMangleContextImpl::mangleLambdaSig(const CXXRecordDecl *Lambda,
|
|
|
|
+ raw_ostream &Out) {
|
|
|
|
+ CXXNameMangler Mangler(*this, Out);
|
|
|
|
+ Mangler.mangleLambdaSig(Lambda);
|
|
|
|
+}
|
|
|
|
+
|
|
ItaniumMangleContext *
|
|
ItaniumMangleContext *
|
|
ItaniumMangleContext::create(ASTContext &Context, DiagnosticsEngine &Diags) {
|
|
ItaniumMangleContext::create(ASTContext &Context, DiagnosticsEngine &Diags) {
|
|
return new ItaniumMangleContextImpl(Context, Diags);
|
|
return new ItaniumMangleContextImpl(Context, Diags);
|