summaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm18/patches/demangler.patch
blob: a68946e85fcafb61a18b8990b63741acf2240275 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
--- a/include/llvm/Demangle/ItaniumDemangle.h
+++ b/include/llvm/Demangle/ItaniumDemangle.h
@@ -216,6 +216,13 @@
 #endif
 };
 
+class IASTProcessor {
+public:
+    virtual void Process(const Node*) = 0;
+};
+
+void demangleAST(const char *MangledName, IASTProcessor *Processor);
+
 class NodeArray {
   Node **Elements;
   size_t NumElements;
@@ -5458,6 +5465,7 @@
       return nullptr;
     return Arg;
   }
+  case 'I': // 'I' here is an old GCC mangling ABI. It is common in outside binaries.
   case 'J': {
     ++First;
     size_t ArgsBegin = Names.size();
--- a/lib/Demangle/ItaniumDemangle.cpp
+++ b/lib/Demangle/ItaniumDemangle.cpp
@@ -366,6 +366,12 @@

 using Demangler = itanium_demangle::ManglingParser<DefaultAllocator>;

+void llvm::itanium_demangle::demangleAST(const char *MangledName, IASTProcessor *Processor) {
+  Demangler Parser(MangledName, MangledName + std::strlen(MangledName));
+  Node* node = Parser.parse();
+  Processor->Process(node);
+}
+
 char *llvm::itaniumDemangle(std::string_view MangledName, bool ParseParams) {
   if (MangledName.empty())
     return nullptr;