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