[libcxxabi] r293638 - Add support for demangling C++11 thread_local variables. In clang, the grammar for mangling for these names are "<special-name> ::= TW <object name>" for wrapper variables or "<special-name> ::= TH <object name>" for initialization variables.

David Bozier via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 31 07:18:57 PST 2017


Author: davidb
Date: Tue Jan 31 09:18:56 2017
New Revision: 293638

URL: http://llvm.org/viewvc/llvm-project?rev=293638&view=rev
Log:
Add support for demangling C++11 thread_local variables. In clang, the grammar for mangling for these names are "<special-name> ::= TW <object name>" for wrapper variables or "<special-name> ::= TH <object name>" for initialization variables.

Modified:
    libcxxabi/trunk/src/cxa_demangle.cpp
    libcxxabi/trunk/test/test_demangle.pass.cpp

Modified: libcxxabi/trunk/src/cxa_demangle.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=293638&r1=293637&r2=293638&view=diff
==============================================================================
--- libcxxabi/trunk/src/cxa_demangle.cpp (original)
+++ libcxxabi/trunk/src/cxa_demangle.cpp Tue Jan 31 09:18:56 2017
@@ -4345,6 +4345,8 @@ parse_call_offset(const char* first, con
 //                    # base is the nominal target function of thunk
 //                ::= GV <object name> # Guard variable for one-time initialization
 //                                     # No <type>
+//                ::= TW <object name> # Thread-local wrapper
+//                ::= TH <object name> # Thread-local initialization
 //      extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
 //      extension ::= GR <object name> # reference temporary for object
 
@@ -4448,6 +4450,28 @@ parse_special_name(const char* first, co
                     }
                 }
                 break;
+            case 'W':
+                // TW <object name> # Thread-local wrapper
+                t = parse_name(first + 2, last, db);
+                if (t != first + 2) 
+                {
+                    if (db.names.empty())
+                    return first;
+                    db.names.back().first.insert(0, "thread-local wrapper routine for ");
+                    first = t;
+                }
+                break;
+            case 'H':
+                //TH <object name> # Thread-local initialization
+                t = parse_name(first + 2, last, db);
+                if (t != first + 2) 
+                {
+                    if (db.names.empty())
+                    return first;
+                    db.names.back().first.insert(0, "thread-local initialization routine for ");
+                    first = t;
+                }
+                break;
             default:
                 // T <call-offset> <base encoding>
                 {

Modified: libcxxabi/trunk/test/test_demangle.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.pass.cpp?rev=293638&r1=293637&r2=293638&view=diff
==============================================================================
--- libcxxabi/trunk/test/test_demangle.pass.cpp (original)
+++ libcxxabi/trunk/test/test_demangle.pass.cpp Tue Jan 31 09:18:56 2017
@@ -29602,6 +29602,8 @@ const char* cases[][2] =
     // FIXME(compnerd) pretty print this as void (*)(unsigned long &) volatile &&
     {"PVFvRmOE", "void (*)(unsigned long&)  volatile&&"},
     {"PFvRmOE", "void (*)(unsigned long&) &&"},
+    {"_ZTW1x", "thread-local wrapper routine for x"},
+    {"_ZTHN3fooE", "thread-local initialization routine for foo"},
 };
 
 const unsigned N = sizeof(cases) / sizeof(cases[0]);




More information about the cfe-commits mailing list