LLVM: include/llvm/Demangle/MicrosoftDemangle.h Source File (original) (raw)

30 struct AllocatorNode {

32 size_t Used = 0;

33 size_t Capacity = 0;

34 AllocatorNode *Next = nullptr;

35 };

36

37 void addNode(size_t Capacity) {

38 AllocatorNode *NewHead = new AllocatorNode;

39 NewHead->Buf = new uint8_t[Capacity];

40 NewHead->Next = Head;

41 NewHead->Capacity = Capacity;

42 Head = NewHead;

43 NewHead->Used = 0;

44 }

45

46public:

48

50 while (Head) {

52 delete[] Head->Buf;

53 AllocatorNode *Next = Head->Next;

54 delete Head;

56 }

57 }

58

59

62

64 assert(Head && Head->Buf);

65

66 uint8_t *P = Head->Buf + Head->Used;

67

68 Head->Used += Size;

69 if (Head->Used <= Head->Capacity)

70 return reinterpret_cast<char *>(P);

71

73 Head->Used = Size;

74 return reinterpret_cast<char *>(Head->Buf);

75 }

76

79 assert(Head && Head->Buf);

80

81 size_t P = (size_t)Head->Buf + Head->Used;

82 uintptr_t AlignedP =

83 (((size_t)P + alignof(T) - 1) & ~(size_t)(alignof(T) - 1));

85 size_t Adjustment = AlignedP - P;

86

87 Head->Used += Size + Adjustment;

88 if (Head->Used <= Head->Capacity)

89 return new (PP) T[Count]();

90

92 Head->Used = Size;

93 return new (Head->Buf) T[Count]();

94 }

95

96 template <typename T, typename... Args> T *alloc(Args &&... ConstructorArgs) {

97 constexpr size_t Size = sizeof(T);

98 assert(Head && Head->Buf);

99

100 size_t P = (size_t)Head->Buf + Head->Used;

101 uintptr_t AlignedP =

102 (((size_t)P + alignof(T) - 1) & ~(size_t)(alignof(T) - 1));

104 size_t Adjustment = AlignedP - P;

105

106 Head->Used += Size + Adjustment;

107 if (Head->Used <= Head->Capacity)

108 return new (PP) T(std::forward(ConstructorArgs)...);

109

112 Head->Used = Size;

113 return new (Head->Buf) T(std::forward(ConstructorArgs)...);

114 }

115

116private:

117 AllocatorNode *Head = nullptr;

118};

121 static constexpr size_t Max = 10;

122

125

126

127

130};

146 friend std::optional<size_t>

148

149public:

152

153

154

156

158

159

161

163

164private:

165 SymbolNode *demangleEncodedSymbol(std::string_view &MangledName,

167 SymbolNode *demangleDeclarator(std::string_view &MangledName);

168 SymbolNode *demangleMD5Name(std::string_view &MangledName);

169 SymbolNode *demangleTypeinfoName(std::string_view &MangledName);

170

171 VariableSymbolNode *demangleVariableEncoding(std::string_view &MangledName,

173 FunctionSymbolNode *demangleFunctionEncoding(std::string_view &MangledName);

174

175 Qualifiers demanglePointerExtQualifiers(std::string_view &MangledName);

176

177 bool isMemberPointer(std::string_view MangledName, bool &Error);

178

179 std::optionalPointerAuthQualifierNode::ArgArray

180 demanglePointerAuthQualifier(std::string_view &MangledName);

181

183 createPointerAuthQualifier(std::string_view &MangledName);

184

185

186 TypeNode *demangleType(std::string_view &MangledName,

188 PrimitiveTypeNode *demanglePrimitiveType(std::string_view &MangledName);

189 CustomTypeNode *demangleCustomType(std::string_view &MangledName);

190 TagTypeNode *demangleClassType(std::string_view &MangledName);

191 PointerTypeNode *demanglePointerType(std::string_view &MangledName);

192 PointerTypeNode *demangleMemberPointerType(std::string_view &MangledName);

194 bool HasThisQuals);

195

196 ArrayTypeNode *demangleArrayType(std::string_view &MangledName);

197

198 NodeArrayNode *demangleFunctionParameterList(std::string_view &MangledName,

199 bool &IsVariadic);

200 NodeArrayNode *demangleTemplateParameterList(std::string_view &MangledName);

201

202 std::pair<uint64_t, bool> demangleNumber(std::string_view &MangledName);

203 uint64_t demangleUnsigned(std::string_view &MangledName);

204 int64_t demangleSigned(std::string_view &MangledName);

205

206 void memorizeString(std::string_view s);

208

209

210 std::string_view copyString(std::string_view Borrowed);

211

213 demangleFullyQualifiedTypeName(std::string_view &MangledName);

215 demangleFullyQualifiedSymbolName(std::string_view &MangledName);

216

217 IdentifierNode *demangleUnqualifiedTypeName(std::string_view &MangledName,

218 bool Memorize);

219 IdentifierNode *demangleUnqualifiedSymbolName(std::string_view &MangledName,

221

222 QualifiedNameNode *demangleNameScopeChain(std::string_view &MangledName,

224 IdentifierNode *demangleNameScopePiece(std::string_view &MangledName);

225

228 demangleTemplateInstantiationName(std::string_view &MangledName,

232 IdentifierNode *demangleFunctionIdentifierCode(std::string_view &MangledName);

234 demangleFunctionIdentifierCode(std::string_view &MangledName,

237 demangleStructorIdentifier(std::string_view &MangledName, bool IsDestructor);

239 demangleConversionOperatorIdentifier(std::string_view &MangledName);

241 demangleLiteralOperatorIdentifier(std::string_view &MangledName);

242

243 SymbolNode *demangleSpecialIntrinsic(std::string_view &MangledName);

245 demangleSpecialTableSymbolNode(std::string_view &MangledName,

248 demangleLocalStaticGuard(std::string_view &MangledName, bool IsThread);

250 std::string_view &MangledName,

251 std::string_view VariableName);

253 demangleRttiBaseClassDescriptorNode(ArenaAllocator &Arena,

254 std::string_view &MangledName);

255 FunctionSymbolNode *demangleInitFiniStub(std::string_view &MangledName,

256 bool IsDestructor);

257

259 bool Memorize);

261 demangleAnonymousNamespaceName(std::string_view &MangledName);

263 demangleLocallyScopedNamePiece(std::string_view &MangledName);

265 demangleStringLiteral(std::string_view &MangledName);

266 FunctionSymbolNode *demangleVcallThunkNode(std::string_view &MangledName);

267

268 std::string_view demangleSimpleString(std::string_view &MangledName,

269 bool Memorize);

270

271 FuncClass demangleFunctionClass(std::string_view &MangledName);

272 CallingConv demangleCallingConvention(std::string_view &MangledName);

273 StorageClass demangleVariableStorageClass(std::string_view &MangledName);

274 bool demangleThrowSpecification(std::string_view &MangledName);

275 wchar_t demangleWcharLiteral(std::string_view &MangledName);

276 uint8_t demangleCharLiteral(std::string_view &MangledName);

277

278 std::pair<Qualifiers, bool> demangleQualifiers(std::string_view &MangledName);

279

280

282

283

284

285

286

287

288

289

290

291

292

293

294

295

297};