9#ifndef LLVM_DEMANGLE_MICROSOFTDEMANGLE_H
10#define LLVM_DEMANGLE_MICROSOFTDEMANGLE_H
19namespace ms_demangle {
28 struct AllocatorNode {
29 uint8_t *Buf =
nullptr;
32 AllocatorNode *Next =
nullptr;
35 void addNode(
size_t Capacity) {
36 AllocatorNode *NewHead =
new AllocatorNode;
37 NewHead->Buf =
new uint8_t[Capacity];
39 NewHead->Capacity = Capacity;
51 AllocatorNode *Next = Head->Next;
60 uint8_t *
P = Head->Buf + Head->Used;
63 if (Head->Used <= Head->Capacity)
64 return reinterpret_cast<char *
>(
P);
68 return reinterpret_cast<char *
>(Head->Buf);
71 template <
typename T,
typename... Args>
T *
allocArray(
size_t Count) {
72 size_t Size = Count *
sizeof(
T);
75 size_t P = (size_t)Head->Buf + Head->Used;
77 (((
size_t)
P +
alignof(
T) - 1) & ~(size_t)(
alignof(
T) - 1));
78 uint8_t *PP = (uint8_t *)AlignedP;
79 size_t Adjustment = AlignedP -
P;
81 Head->Used +=
Size + Adjustment;
82 if (Head->Used <= Head->Capacity)
83 return new (PP)
T[Count]();
87 return new (Head->Buf)
T[Count]();
90 template <
typename T,
typename... Args>
T *
alloc(Args &&... ConstructorArgs) {
91 constexpr size_t Size =
sizeof(
T);
94 size_t P = (size_t)Head->Buf + Head->Used;
96 (((
size_t)
P +
alignof(
T) - 1) & ~(size_t)(
alignof(
T) - 1));
97 uint8_t *PP = (uint8_t *)AlignedP;
98 size_t Adjustment = AlignedP -
P;
100 Head->Used +=
Size + Adjustment;
101 if (Head->Used <= Head->Capacity)
102 return new (PP)
T(std::forward<Args>(ConstructorArgs)...);
107 return new (Head->Buf)
T(std::forward<Args>(ConstructorArgs)...);
111 AllocatorNode *Head =
nullptr;
115 static constexpr size_t Max = 10;
156 SymbolNode *demangleEncodedSymbol(std::string_view &MangledName,
158 SymbolNode *demangleDeclarator(std::string_view &MangledName);
159 SymbolNode *demangleMD5Name(std::string_view &MangledName);
160 SymbolNode *demangleTypeinfoName(std::string_view &MangledName);
166 Qualifiers demanglePointerExtQualifiers(std::string_view &MangledName);
169 TypeNode *demangleType(std::string_view &MangledName,
172 CustomTypeNode *demangleCustomType(std::string_view &MangledName);
173 TagTypeNode *demangleClassType(std::string_view &MangledName);
175 PointerTypeNode *demangleMemberPointerType(std::string_view &MangledName);
179 ArrayTypeNode *demangleArrayType(std::string_view &MangledName);
181 NodeArrayNode *demangleFunctionParameterList(std::string_view &MangledName,
183 NodeArrayNode *demangleTemplateParameterList(std::string_view &MangledName);
185 std::pair<uint64_t, bool> demangleNumber(std::string_view &MangledName);
186 uint64_t demangleUnsigned(std::string_view &MangledName);
187 int64_t demangleSigned(std::string_view &MangledName);
189 void memorizeString(std::string_view s);
193 std::string_view copyString(std::string_view Borrowed);
196 demangleFullyQualifiedTypeName(std::string_view &MangledName);
198 demangleFullyQualifiedSymbolName(std::string_view &MangledName);
200 IdentifierNode *demangleUnqualifiedTypeName(std::string_view &MangledName,
202 IdentifierNode *demangleUnqualifiedSymbolName(std::string_view &MangledName,
207 IdentifierNode *demangleNameScopePiece(std::string_view &MangledName);
211 demangleTemplateInstantiationName(std::string_view &MangledName,
215 IdentifierNode *demangleFunctionIdentifierCode(std::string_view &MangledName);
217 demangleFunctionIdentifierCode(std::string_view &MangledName,
220 demangleStructorIdentifier(std::string_view &MangledName,
bool IsDestructor);
222 demangleConversionOperatorIdentifier(std::string_view &MangledName);
224 demangleLiteralOperatorIdentifier(std::string_view &MangledName);
226 SymbolNode *demangleSpecialIntrinsic(std::string_view &MangledName);
228 demangleSpecialTableSymbolNode(std::string_view &MangledName,
231 demangleLocalStaticGuard(std::string_view &MangledName,
bool IsThread);
233 std::string_view &MangledName,
234 std::string_view VariableName);
237 std::string_view &MangledName);
244 demangleAnonymousNamespaceName(std::string_view &MangledName);
246 demangleLocallyScopedNamePiece(std::string_view &MangledName);
248 demangleStringLiteral(std::string_view &MangledName);
251 std::string_view demangleSimpleString(std::string_view &MangledName,
254 FuncClass demangleFunctionClass(std::string_view &MangledName);
255 CallingConv demangleCallingConvention(std::string_view &MangledName);
256 StorageClass demangleVariableStorageClass(std::string_view &MangledName);
257 bool demangleThrowSpecification(std::string_view &MangledName);
258 wchar_t demangleWcharLiteral(std::string_view &MangledName);
259 uint8_t demangleCharLiteral(std::string_view &MangledName);
261 std::pair<Qualifiers, bool> demangleQualifiers(std::string_view &MangledName);
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Lightweight error class with error context and mandatory checking.
T * alloc(Args &&... ConstructorArgs)
char * allocUnalignedBuffer(size_t Size)
T * allocArray(size_t Count)
TagTypeNode * parseTagUniqueName(std::string_view &MangledName)
virtual ~Demangler()=default
void dumpBackReferences()
FunctionIdentifierCodeGroup
constexpr size_t AllocUnit
This is an optimization pass for GlobalISel generic memory operations.
static constexpr size_t Max
NamedIdentifierNode * Names[Max]
TypeNode * FunctionParams[Max]
size_t FunctionParamCount