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

Tue, 31 Jan 2017 07:31:35 -0800

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]);


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to