diff options
author | Zachary Turner <zturner@google.com> | 2018-08-20 23:59:21 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2018-08-20 23:59:21 +0000 |
commit | c175310a0939b8c369d395df41c28fd06ef86144 (patch) | |
tree | 7d97a449253b6dd8fa0a3efa4ab50bdd617fe07d /llvm/lib/Demangle | |
parent | 0002dd467d88c516b13d4b2877576c6608e6aca3 (diff) | |
download | bcm5719-llvm-c175310a0939b8c369d395df41c28fd06ef86144.tar.gz bcm5719-llvm-c175310a0939b8c369d395df41c28fd06ef86144.zip |
[MS Demangler] Demangle special operator 'dynamic initializer'.
This is encoded as __E and should print something like
"dynamic initializer for 'Foo'(void)"
This also adds support for dynamic atexit destructor, which is
basically identical but encoded as __F with slightly different
description.
llvm-svn: 340239
Diffstat (limited to 'llvm/lib/Demangle')
-rw-r--r-- | llvm/lib/Demangle/MicrosoftDemangle.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index f2ad6899735..69e0a73e651 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -271,6 +271,8 @@ enum class OperatorTy : uint8_t { LocalVftableCtorClosure, // ?_T # local vftable constructor closure ArrayNew, // ?_U operator new[] ArrayDelete, // ?_V operator delete[] + DynamicInitializer, // ?__E dynamic initializer for `T' + DynamicAtexitDestructor, // ?__F dynamic atexit destructor for `T' LiteralOperator, // ?__K operator ""_name CoAwait, // ?__L co_await Spaceship, // operator<=> @@ -360,6 +362,8 @@ OperatorMapEntry OperatorMap[] = { {"_T", "`local vftable ctor closure'", OperatorTy::LocalVftableCtorClosure}, {"_U", "operator new[]", OperatorTy::ArrayNew}, {"_V", "operator delete[]", OperatorTy::ArrayDelete}, + {"__E", "dynamic initializer", OperatorTy::DynamicInitializer}, + {"__F", "dynamic atexit destructor", OperatorTy::DynamicAtexitDestructor}, {"__K", "operator \"\"", OperatorTy::LiteralOperator}, {"__L", "co_await", OperatorTy::CoAwait}, }; @@ -883,12 +887,20 @@ static void outputName(OutputStream &OS, const Name *TheName, const Type *Ty) { const OperatorInfo *Operator = lastComponentAsOperator(TheName); const VirtualMemberPtrThunk *Thunk = nullptr; + bool PrintLastScopeSeparator = true; if (Operator) { if (Operator->Info->Operator == OperatorTy::Vcall) { Thunk = static_cast<const VirtualMemberPtrThunk *>(Operator); OS << "[thunk]: "; outputCallingConvention(OS, Thunk->CC); OS << " "; + } else if (Operator->Info->Operator == OperatorTy::DynamicInitializer) { + OS << "`dynamic initializer for '"; + PrintLastScopeSeparator = false; + } else if (Operator->Info->Operator == + OperatorTy::DynamicAtexitDestructor) { + OS << "`dynamic atexit destructor for '"; + PrintLastScopeSeparator = false; } } @@ -897,7 +909,8 @@ static void outputName(OutputStream &OS, const Name *TheName, const Type *Ty) { for (; TheName->Next; TheName = TheName->Next) { Previous = TheName; outputNameComponent(OS, *TheName); - OS << "::"; + if (TheName->Next != Operator || PrintLastScopeSeparator) + OS << "::"; } // Print out a regular name. @@ -946,6 +959,10 @@ static void outputName(OutputStream &OS, const Name *TheName, const Type *Ty) { OS << Thunk->OffsetInVTable << ", {flat}}"; break; } + case OperatorTy::DynamicInitializer: + case OperatorTy::DynamicAtexitDestructor: + OS << "''"; + break; case OperatorTy::LocalStaticGuard: { const LocalStaticGuardVariable &LSG = |