From 34d37a4707cbcd062e9f3e698d2356a55187b544 Mon Sep 17 00:00:00 2001 From: David Bozier Date: Tue, 31 Jan 2017 15:56:36 +0000 Subject: [PATCH] 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. Initial change was made in libccxxabi r293638 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293643 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Demangle/ItaniumDemangle.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/Demangle/ItaniumDemangle.cpp b/lib/Demangle/ItaniumDemangle.cpp index 5a0352c5390..49dbe74d25d 100644 --- a/lib/Demangle/ItaniumDemangle.cpp +++ b/lib/Demangle/ItaniumDemangle.cpp @@ -3836,6 +3836,8 @@ static const char *parse_call_offset(const char *first, const char *last) { // ::= GV # Guard variable for one-time // initialization // # No +// ::= TW # Thread-local wrapper +// ::= TH # Thread-local initialization // extension ::= TC _ # construction // vtable for second-in-first // extension ::= GR # reference temporary for object @@ -3929,6 +3931,27 @@ static const char *parse_special_name(const char *first, const char *last, } } break; + case 'W': + // TW # 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 # 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 {