Skip to content

Commit 31cc069

Browse files
committed
[Demangle] demangle builtin type transformations
Fixed: #62127 https://reviews.llvm.org/D116203 introduced several compiler builtin equivalents of the unary type traits. In some cases (e.g. template) those builtin will be dependent and need to be mangle. This patch add the check for `u{builtin}I{type}E` to demangle it. Reviewed By: rjmccall Differential Revision: https://reviews.llvm.org/D148465
1 parent 89471d5 commit 31cc069

File tree

5 files changed

+57
-2
lines changed

5 files changed

+57
-2
lines changed

libcxxabi/src/demangle/ItaniumDemangle.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,23 @@ class ElaboratedTypeSpefType : public Node {
534534
}
535535
};
536536

537+
class TransformedType : public Node {
538+
StringView Transform;
539+
Node *BaseType;
540+
public:
541+
TransformedType(StringView Transform_, Node *BaseType_)
542+
: Node(KTransformedType), Transform(Transform_), BaseType(BaseType_) {}
543+
544+
template<typename Fn> void match(Fn F) const { F(Transform, BaseType); }
545+
546+
void printLeft(OutputBuffer &OB) const override {
547+
OB += Transform;
548+
OB += '(';
549+
BaseType->print(OB);
550+
OB += ')';
551+
}
552+
};
553+
537554
struct AbiTagAttr : Node {
538555
Node *Base;
539556
std::string_view Tag;
@@ -3894,7 +3911,15 @@ Node *AbstractManglingParser<Derived, Alloc>::parseType() {
38943911
// Typically, <builtin-type>s are not considered substitution candidates,
38953912
// but the exception to that exception is vendor extended types (Itanium C++
38963913
// ABI 5.9.1).
3897-
Result = make<NameType>(Res);
3914+
if (consumeIf('I')) {
3915+
Node *BaseType = parseType();
3916+
if (BaseType == nullptr)
3917+
return nullptr;
3918+
if (!consumeIf('E'))
3919+
return nullptr;
3920+
Result = make<TransformedType>(Res, BaseType);
3921+
} else
3922+
Result = make<NameType>(Res);
38983923
break;
38993924
}
39003925
case 'D':

libcxxabi/src/demangle/ItaniumNodes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ NODE(QualType)
1919
NODE(ConversionOperatorType)
2020
NODE(PostfixQualifiedType)
2121
NODE(ElaboratedTypeSpefType)
22+
NODE(TransformedType)
2223
NODE(NameType)
2324
NODE(AbiTagAttr)
2425
NODE(EnableIfAttr)

libcxxabi/test/test_demangle.pass.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30114,6 +30114,9 @@ const char* cases[][2] =
3011430114
" std::allocator<char>>::basic_string()"},
3011530115
{"_ZN1SB8ctor_tagC2Ev", "S[abi:ctor_tag]::S()"},
3011630116
{"_ZN1SB8ctor_tagD2Ev", "S[abi:ctor_tag]::~S()"},
30117+
30118+
// clang builtin type transform
30119+
{"_Z2f5IiEvu7__decayIT_E", "void f5<int>(__decay(int))"},
3011730120
};
3011830121

3011930122
const unsigned N = sizeof(cases) / sizeof(cases[0]);

llvm/include/llvm/Demangle/ItaniumDemangle.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,23 @@ class ElaboratedTypeSpefType : public Node {
528528
}
529529
};
530530

531+
class TransformedType : public Node {
532+
StringView Transform;
533+
Node *BaseType;
534+
public:
535+
TransformedType(StringView Transform_, Node *BaseType_)
536+
: Node(KTransformedType), Transform(Transform_), BaseType(BaseType_) {}
537+
538+
template<typename Fn> void match(Fn F) const { F(Transform, BaseType); }
539+
540+
void printLeft(OutputBuffer &OB) const override {
541+
OB += Transform;
542+
OB += '(';
543+
BaseType->print(OB);
544+
OB += ')';
545+
}
546+
};
547+
531548
struct AbiTagAttr : Node {
532549
Node *Base;
533550
std::string_view Tag;
@@ -3889,7 +3906,15 @@ Node *AbstractManglingParser<Derived, Alloc>::parseType() {
38893906
// Typically, <builtin-type>s are not considered substitution candidates,
38903907
// but the exception to that exception is vendor extended types (Itanium C++
38913908
// ABI 5.9.1).
3892-
Result = make<NameType>(Res);
3909+
if (consumeIf('I')) {
3910+
Node *BaseType = parseType();
3911+
if (BaseType == nullptr)
3912+
return nullptr;
3913+
if (!consumeIf('E'))
3914+
return nullptr;
3915+
Result = make<TransformedType>(Res, BaseType);
3916+
} else
3917+
Result = make<NameType>(Res);
38933918
break;
38943919
}
38953920
case 'D':

llvm/include/llvm/Demangle/ItaniumNodes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ NODE(QualType)
1919
NODE(ConversionOperatorType)
2020
NODE(PostfixQualifiedType)
2121
NODE(ElaboratedTypeSpefType)
22+
NODE(TransformedType)
2223
NODE(NameType)
2324
NODE(AbiTagAttr)
2425
NODE(EnableIfAttr)

0 commit comments

Comments
 (0)