]> granicus.if.org Git - llvm/commitdiff
llvm-undname: Add support for local static thread guards
authorNico Weber <nicolasweber@gmx.de>
Tue, 28 May 2019 14:54:49 +0000 (14:54 +0000)
committerNico Weber <nicolasweber@gmx.de>
Tue, 28 May 2019 14:54:49 +0000 (14:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361835 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Demangle/MicrosoftDemangle.h
include/llvm/Demangle/MicrosoftDemangleNodes.h
lib/Demangle/MicrosoftDemangle.cpp
lib/Demangle/MicrosoftDemangleNodes.cpp
test/Demangle/ms-operators.test

index 6b3c7c9967fbdb30d97586b1827330969ecf94b4..423fc2eac85880dd9b2b0afe148f08901c232578 100644 (file)
@@ -223,7 +223,7 @@ private:
   demangleSpecialTableSymbolNode(StringView &MangledName,
                                  SpecialIntrinsicKind SIK);
   LocalStaticGuardVariableNode *
-  demangleLocalStaticGuard(StringView &MangledName);
+  demangleLocalStaticGuard(StringView &MangledName, bool IsThread);
   VariableSymbolNode *demangleUntypedVariable(ArenaAllocator &Arena,
                                               StringView &MangledName,
                                               StringView VariableName);
index dde9ae7bca63699873fcd3d8d72d9bedcc962cbe..63111bc55910088a8cc5935adee88d5d5f5c43f4 100644 (file)
@@ -408,6 +408,7 @@ struct LocalStaticGuardIdentifierNode : public IdentifierNode {
 
   void output(OutputStream &OS, OutputFlags Flags) const override;
 
+  bool IsThread = false;
   uint32_t ScopeIndex = 0;
 };
 
index e596f0cea1c8e659a78083b9c0cbcbb21a4e245f..4abb48e575733fca386dccd0cebb900e73a702ea 100644 (file)
@@ -293,9 +293,10 @@ Demangler::demangleSpecialTableSymbolNode(StringView &MangledName,
 }
 
 LocalStaticGuardVariableNode *
-Demangler::demangleLocalStaticGuard(StringView &MangledName) {
+Demangler::demangleLocalStaticGuard(StringView &MangledName, bool IsThread) {
   LocalStaticGuardIdentifierNode *LSGI =
       Arena.alloc<LocalStaticGuardIdentifierNode>();
+  LSGI->IsThread = IsThread;
   QualifiedNameNode *QN = demangleNameScopeChain(MangledName, LSGI);
   LocalStaticGuardVariableNode *LSGVN =
       Arena.alloc<LocalStaticGuardVariableNode>();
@@ -443,7 +444,9 @@ SymbolNode *Demangler::demangleSpecialIntrinsic(StringView &MangledName) {
   case SpecialIntrinsicKind::VcallThunk:
     return demangleVcallThunkNode(MangledName);
   case SpecialIntrinsicKind::LocalStaticGuard:
-    return demangleLocalStaticGuard(MangledName);
+    return demangleLocalStaticGuard(MangledName, /*IsThread=*/false);
+  case SpecialIntrinsicKind::LocalStaticThreadGuard:
+    return demangleLocalStaticGuard(MangledName, /*IsThread=*/true);
   case SpecialIntrinsicKind::RttiTypeDescriptor: {
     TypeNode *T = demangleType(MangledName, QualifierMangleMode::Result);
     if (Error)
index a3ee5f9d91d4d87386bdbfc16a92b830f3903787..2c1e5f44f4227a2132e85f5f8bdd560c52a60fa4 100644 (file)
@@ -349,7 +349,10 @@ void IntrinsicFunctionIdentifierNode::output(OutputStream &OS,
 
 void LocalStaticGuardIdentifierNode::output(OutputStream &OS,
                                             OutputFlags Flags) const {
-  OS << "`local static guard'";
+  if (IsThread)
+    OS << "`local static thread guard'";
+  else
+    OS << "`local static guard'";
   if (ScopeIndex > 0)
     OS << "{" << ScopeIndex << "}";
 }
index d18c2794d2d41ebc4d4d633008d81ec60a2abe0d..6a22ebda1714515c050fe4658e05fe4a593b1ef1 100644 (file)
 ??__F_decisionToDFA@XPathLexer@@0V?$vector@VDFA@dfa@antlr4@@V?$allocator@VDFA@dfa@antlr4@@@std@@@std@@A@YAXXZ
 ; CHECK: void __cdecl `dynamic atexit destructor for `private: static class std::vector<class antlr4::dfa::DFA, class std::allocator<class antlr4::dfa::DFA>> XPathLexer::_decisionToDFA''(void)
 
+??__J?1??f@@YAAAUS@@XZ@51
+; CHECK: `struct S & __cdecl f(void)'::`2'::`local static thread guard'{2}
+
 ??__K_deg@@YAHO@Z
 ; CHECK: int __cdecl operator ""_deg(long double)