summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Demangle
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-08-20 23:59:21 +0000
committerZachary Turner <zturner@google.com>2018-08-20 23:59:21 +0000
commitc175310a0939b8c369d395df41c28fd06ef86144 (patch)
tree7d97a449253b6dd8fa0a3efa4ab50bdd617fe07d /llvm/lib/Demangle
parent0002dd467d88c516b13d4b2877576c6608e6aca3 (diff)
downloadbcm5719-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.cpp19
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 =
OpenPOWER on IntegriCloud