@@ -66,7 +66,7 @@ static bool startsWith(std::string_view S, std::string_view PrefixA,
6666 return llvm::itanium_demangle::starts_with (S, Prefix);
6767}
6868
69- static bool isMemberPointer (std::string_view MangledName, bool &Error) {
69+ bool Demangler:: isMemberPointer (std::string_view MangledName, bool &Error) {
7070 Error = false ;
7171 const char F = MangledName.front ();
7272 MangledName.remove_prefix (1 );
@@ -107,6 +107,7 @@ static bool isMemberPointer(std::string_view MangledName, bool &Error) {
107107 consumeFront (MangledName, ' E' ); // 64-bit
108108 consumeFront (MangledName, ' I' ); // restrict
109109 consumeFront (MangledName, ' F' ); // unaligned
110+ demanglePointerAuthQualifier (MangledName);
110111
111112 if (MangledName.empty ()) {
112113 Error = true ;
@@ -2094,6 +2095,8 @@ PointerTypeNode *Demangler::demanglePointerType(std::string_view &MangledName) {
20942095 Qualifiers ExtQuals = demanglePointerExtQualifiers (MangledName);
20952096 Pointer->Quals = Qualifiers (Pointer->Quals | ExtQuals);
20962097
2098+ Pointer->PointerAuthQualifier = createPointerAuthQualifier (MangledName);
2099+
20972100 Pointer->Pointee = demangleType (MangledName, QualifierMangleMode::Mangle);
20982101 return Pointer;
20992102}
@@ -2142,6 +2145,49 @@ Demangler::demanglePointerExtQualifiers(std::string_view &MangledName) {
21422145 return Quals;
21432146}
21442147
2148+ std::optional<PointerAuthQualifierNode::ArgArray>
2149+ Demangler::demanglePointerAuthQualifier (std::string_view &MangledName) {
2150+ if (!consumeFront (MangledName, " __ptrauth" ))
2151+ return std::nullopt ;
2152+
2153+ constexpr unsigned NumArgs = PointerAuthQualifierNode::NumArgs;
2154+ PointerAuthQualifierNode::ArgArray Array;
2155+
2156+ for (unsigned I = 0 ; I < NumArgs; ++I) {
2157+ bool IsNegative = false ;
2158+ uint64_t Value = 0 ;
2159+ std::tie (Value, IsNegative) = demangleNumber (MangledName);
2160+ if (IsNegative)
2161+ return std::nullopt ;
2162+
2163+ Array[I] = Value;
2164+ }
2165+
2166+ return Array;
2167+ }
2168+
2169+ PointerAuthQualifierNode *
2170+ Demangler::createPointerAuthQualifier (std::string_view &MangledName) {
2171+ constexpr unsigned NumArgs = PointerAuthQualifierNode::NumArgs;
2172+ std::optional<PointerAuthQualifierNode::ArgArray> Vals =
2173+ demanglePointerAuthQualifier (MangledName);
2174+
2175+ if (!Vals)
2176+ return nullptr ;
2177+
2178+ PointerAuthQualifierNode *PtrAuthQual =
2179+ Arena.alloc <PointerAuthQualifierNode>();
2180+ NodeArrayNode *Array = Arena.alloc <NodeArrayNode>();
2181+ PtrAuthQual->Components = Array;
2182+ Array->Count = NumArgs;
2183+ Array->Nodes = Arena.allocArray <Node *>(NumArgs);
2184+
2185+ for (unsigned I = 0 ; I < NumArgs; ++I)
2186+ Array->Nodes [I] = Arena.alloc <IntegerLiteralNode>((*Vals)[I], false );
2187+
2188+ return PtrAuthQual;
2189+ }
2190+
21452191ArrayTypeNode *Demangler::demangleArrayType (std::string_view &MangledName) {
21462192 assert (MangledName.front () == ' Y' );
21472193 MangledName.remove_prefix (1 );
0 commit comments