[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