aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Demangle/MicrosoftDemangleNodes.cpp')
-rw-r--r--llvm/lib/Demangle/MicrosoftDemangleNodes.cpp167
1 files changed, 90 insertions, 77 deletions
diff --git a/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp b/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
index 0e0b01d..9610981 100644
--- a/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
+++ b/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
@@ -115,7 +115,7 @@ static void outputCallingConvention(OutputStream &OS, CallingConv CC) {
void TypeNode::outputQuals(bool SpaceBefore, bool SpaceAfter) const {}
-void PrimitiveTypeNode::outputPre(OutputStream &OS) const {
+void PrimitiveTypeNode::outputPre(OutputStream &OS, OutputFlags Flags) const {
switch (PrimKind) {
OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Void, "void");
OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Bool, "bool");
@@ -141,20 +141,24 @@ void PrimitiveTypeNode::outputPre(OutputStream &OS) const {
outputQualifiers(OS, Quals, true, false);
}
-void NodeArrayNode::output(OutputStream &OS) const { output(OS, ", "); }
+void NodeArrayNode::output(OutputStream &OS, OutputFlags Flags) const {
+ output(OS, Flags, ", ");
+}
-void NodeArrayNode::output(OutputStream &OS, StringView Separator) const {
+void NodeArrayNode::output(OutputStream &OS, OutputFlags Flags,
+ StringView Separator) const {
if (Count == 0)
return;
if (Nodes[0])
- Nodes[0]->output(OS);
+ Nodes[0]->output(OS, Flags);
for (size_t I = 1; I < Count; ++I) {
OS << Separator;
- Nodes[I]->output(OS);
+ Nodes[I]->output(OS, Flags);
}
}
-void EncodedStringLiteralNode::output(OutputStream &OS) const {
+void EncodedStringLiteralNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
switch (Char) {
case CharKind::Wchar:
OS << "const wchar_t * {L\"";
@@ -175,20 +179,21 @@ void EncodedStringLiteralNode::output(OutputStream &OS) const {
OS << "}";
}
-void IntegerLiteralNode::output(OutputStream &OS) const {
+void IntegerLiteralNode::output(OutputStream &OS, OutputFlags Flags) const {
if (IsNegative)
OS << '-';
OS << Value;
}
-void TemplateParameterReferenceNode::output(OutputStream &OS) const {
+void TemplateParameterReferenceNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
if (ThunkOffsetCount > 0)
OS << "{";
else if (Affinity == PointerAffinity::Pointer)
OS << "&";
if (Symbol) {
- Symbol->output(OS);
+ Symbol->output(OS, Flags);
if (ThunkOffsetCount > 0)
OS << ", ";
}
@@ -202,31 +207,34 @@ void TemplateParameterReferenceNode::output(OutputStream &OS) const {
OS << "}";
}
-void IdentifierNode::outputTemplateParameters(OutputStream &OS) const {
+void IdentifierNode::outputTemplateParameters(OutputStream &OS,
+ OutputFlags Flags) const {
if (!TemplateParams)
return;
OS << "<";
- TemplateParams->output(OS);
+ TemplateParams->output(OS, Flags);
OS << ">";
}
-void DynamicStructorIdentifierNode::output(OutputStream &OS) const {
+void DynamicStructorIdentifierNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
if (IsDestructor)
OS << "`dynamic atexit destructor for ";
else
OS << "`dynamic initializer for ";
OS << "'";
- Name->output(OS);
+ Name->output(OS, Flags);
OS << "''";
}
-void NamedIdentifierNode::output(OutputStream &OS) const {
+void NamedIdentifierNode::output(OutputStream &OS, OutputFlags Flags) const {
OS << Name;
- outputTemplateParameters(OS);
+ outputTemplateParameters(OS, Flags);
}
-void IntrinsicFunctionIdentifierNode::output(OutputStream &OS) const {
+void IntrinsicFunctionIdentifierNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
switch (Operator) {
OUTPUT_ENUM_CLASS_VALUE(IntrinsicFunctionKind, New, "operator new");
OUTPUT_ENUM_CLASS_VALUE(IntrinsicFunctionKind, Delete, "operator delete");
@@ -322,36 +330,39 @@ void IntrinsicFunctionIdentifierNode::output(OutputStream &OS) const {
case IntrinsicFunctionKind::None:
break;
}
- outputTemplateParameters(OS);
+ outputTemplateParameters(OS, Flags);
}
-void LocalStaticGuardIdentifierNode::output(OutputStream &OS) const {
+void LocalStaticGuardIdentifierNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
OS << "`local static guard'";
if (ScopeIndex > 0)
OS << "{" << ScopeIndex << "}";
}
-void ConversionOperatorIdentifierNode::output(OutputStream &OS) const {
+void ConversionOperatorIdentifierNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
OS << "operator";
- outputTemplateParameters(OS);
+ outputTemplateParameters(OS, Flags);
OS << " ";
- TargetType->output(OS);
+ TargetType->output(OS, Flags);
}
-void StructorIdentifierNode::output(OutputStream &OS) const {
+void StructorIdentifierNode::output(OutputStream &OS, OutputFlags Flags) const {
if (IsDestructor)
OS << "~";
- Class->output(OS);
- outputTemplateParameters(OS);
+ Class->output(OS, Flags);
+ outputTemplateParameters(OS, Flags);
}
-void LiteralOperatorIdentifierNode::output(OutputStream &OS) const {
+void LiteralOperatorIdentifierNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
OS << "operator \"\"" << Name;
- outputTemplateParameters(OS);
+ outputTemplateParameters(OS, Flags);
}
void FunctionSignatureNode::outputPre(OutputStream &OS,
- FunctionSigFlags Flags) const {
+ OutputFlags Flags) const {
if (!(FunctionClass & FC_Global)) {
if (FunctionClass & FC_Static)
OS << "static ";
@@ -363,20 +374,20 @@ void FunctionSignatureNode::outputPre(OutputStream &OS,
OS << "virtual ";
if (ReturnType) {
- ReturnType->outputPre(OS);
+ ReturnType->outputPre(OS, Flags);
OS << " ";
}
- if (!(Flags & FSF_NoCallingConvention))
+ if (!(Flags & OF_NoCallingConvention))
outputCallingConvention(OS, CallConvention);
}
void FunctionSignatureNode::outputPost(OutputStream &OS,
- FunctionSigFlags Flags) const {
+ OutputFlags Flags) const {
if (!(FunctionClass & FC_NoParameterList)) {
OS << "(";
if (Params)
- Params->output(OS);
+ Params->output(OS, Flags);
else
OS << "void";
OS << ")";
@@ -397,18 +408,16 @@ void FunctionSignatureNode::outputPost(OutputStream &OS,
OS << " &&";
if (ReturnType)
- ReturnType->outputPost(OS);
+ ReturnType->outputPost(OS, Flags);
}
-void ThunkSignatureNode::outputPre(OutputStream &OS,
- FunctionSigFlags Flags) const {
+void ThunkSignatureNode::outputPre(OutputStream &OS, OutputFlags Flags) const {
OS << "[thunk]: ";
FunctionSignatureNode::outputPre(OS, Flags);
}
-void ThunkSignatureNode::outputPost(OutputStream &OS,
- FunctionSigFlags Flags) const {
+void ThunkSignatureNode::outputPost(OutputStream &OS, OutputFlags Flags) const {
if (FunctionClass & FC_StaticThisAdjust) {
OS << "`adjustor{" << ThisAdjust.StaticOffset << "}'";
} else if (FunctionClass & FC_VirtualThisAdjust) {
@@ -425,15 +434,15 @@ void ThunkSignatureNode::outputPost(OutputStream &OS,
FunctionSignatureNode::outputPost(OS, Flags);
}
-void PointerTypeNode::outputPre(OutputStream &OS) const {
+void PointerTypeNode::outputPre(OutputStream &OS, OutputFlags Flags) const {
if (Pointee->kind() == NodeKind::FunctionSignature) {
// If this is a pointer to a function, don't output the calling convention.
// It needs to go inside the parentheses.
const FunctionSignatureNode *Sig =
static_cast<const FunctionSignatureNode *>(Pointee);
- Sig->outputPre(OS, FSF_NoCallingConvention);
+ Sig->outputPre(OS, OF_NoCallingConvention);
} else
- Pointee->outputPre(OS);
+ Pointee->outputPre(OS, Flags);
outputSpaceIfNecessary(OS);
@@ -451,7 +460,7 @@ void PointerTypeNode::outputPre(OutputStream &OS) const {
}
if (ClassParent) {
- ClassParent->output(OS);
+ ClassParent->output(OS, Flags);
OS << "::";
}
@@ -471,15 +480,15 @@ void PointerTypeNode::outputPre(OutputStream &OS) const {
outputQualifiers(OS, Quals, false, false);
}
-void PointerTypeNode::outputPost(OutputStream &OS) const {
+void PointerTypeNode::outputPost(OutputStream &OS, OutputFlags Flags) const {
if (Pointee->kind() == NodeKind::ArrayType ||
Pointee->kind() == NodeKind::FunctionSignature)
OS << ")";
- Pointee->outputPost(OS);
+ Pointee->outputPost(OS, Flags);
}
-void TagTypeNode::outputPre(OutputStream &OS) const {
+void TagTypeNode::outputPre(OutputStream &OS, OutputFlags Flags) const {
switch (Tag) {
OUTPUT_ENUM_CLASS_VALUE(TagKind, Class, "class");
OUTPUT_ENUM_CLASS_VALUE(TagKind, Struct, "struct");
@@ -487,58 +496,57 @@ void TagTypeNode::outputPre(OutputStream &OS) const {
OUTPUT_ENUM_CLASS_VALUE(TagKind, Enum, "enum");
}
OS << " ";
- QualifiedName->output(OS);
+ QualifiedName->output(OS, Flags);
outputQualifiers(OS, Quals, true, false);
}
-void TagTypeNode::outputPost(OutputStream &OS) const {}
+void TagTypeNode::outputPost(OutputStream &OS, OutputFlags Flags) const {}
-void ArrayTypeNode::outputPre(OutputStream &OS) const {
- ElementType->outputPre(OS);
+void ArrayTypeNode::outputPre(OutputStream &OS, OutputFlags Flags) const {
+ ElementType->outputPre(OS, Flags);
outputQualifiers(OS, Quals, true, false);
}
-void ArrayTypeNode::outputOneDimension(OutputStream &OS, Node *N) const {
+void ArrayTypeNode::outputOneDimension(OutputStream &OS, OutputFlags Flags,
+ Node *N) const {
assert(N->kind() == NodeKind::IntegerLiteral);
IntegerLiteralNode *ILN = static_cast<IntegerLiteralNode *>(N);
if (ILN->Value != 0)
- ILN->output(OS);
+ ILN->output(OS, Flags);
}
-void ArrayTypeNode::outputDimensionsImpl(OutputStream &OS) const {
+void ArrayTypeNode::outputDimensionsImpl(OutputStream &OS,
+ OutputFlags Flags) const {
if (Dimensions->Count == 0)
return;
- outputOneDimension(OS, Dimensions->Nodes[0]);
+ outputOneDimension(OS, Flags, Dimensions->Nodes[0]);
for (size_t I = 1; I < Dimensions->Count; ++I) {
OS << "][";
- outputOneDimension(OS, Dimensions->Nodes[I]);
+ outputOneDimension(OS, Flags, Dimensions->Nodes[I]);
}
}
-void ArrayTypeNode::outputPost(OutputStream &OS) const {
+void ArrayTypeNode::outputPost(OutputStream &OS, OutputFlags Flags) const {
OS << "[";
- outputDimensionsImpl(OS);
+ outputDimensionsImpl(OS, Flags);
OS << "]";
- ElementType->outputPost(OS);
+ ElementType->outputPost(OS, Flags);
}
-void SymbolNode::output(OutputStream &OS) const { Name->output(OS); }
-
-void FunctionSymbolNode::output(OutputStream &OS) const {
- output(OS, FunctionSigFlags::FSF_Default);
+void SymbolNode::output(OutputStream &OS, OutputFlags Flags) const {
+ Name->output(OS, Flags);
}
-void FunctionSymbolNode::output(OutputStream &OS,
- FunctionSigFlags Flags) const {
+void FunctionSymbolNode::output(OutputStream &OS, OutputFlags Flags) const {
Signature->outputPre(OS, Flags);
outputSpaceIfNecessary(OS);
- Name->output(OS);
+ Name->output(OS, Flags);
Signature->outputPost(OS, Flags);
}
-void VariableSymbolNode::output(OutputStream &OS) const {
+void VariableSymbolNode::output(OutputStream &OS, OutputFlags Flags) const {
switch (SC) {
case StorageClass::PrivateStatic:
case StorageClass::PublicStatic:
@@ -549,41 +557,46 @@ void VariableSymbolNode::output(OutputStream &OS) const {
}
if (Type) {
- Type->outputPre(OS);
+ Type->outputPre(OS, Flags);
outputSpaceIfNecessary(OS);
}
- Name->output(OS);
+ Name->output(OS, Flags);
if (Type)
- Type->outputPost(OS);
+ Type->outputPost(OS, Flags);
}
-void CustomNode::output(OutputStream &OS) const { OS << Name; }
+void CustomNode::output(OutputStream &OS, OutputFlags Flags) const {
+ OS << Name;
+}
-void QualifiedNameNode::output(OutputStream &OS) const {
- Components->output(OS, "::");
+void QualifiedNameNode::output(OutputStream &OS, OutputFlags Flags) const {
+ Components->output(OS, Flags, "::");
}
-void RttiBaseClassDescriptorNode::output(OutputStream &OS) const {
+void RttiBaseClassDescriptorNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
OS << "`RTTI Base Class Descriptor at (";
OS << NVOffset << ", " << VBPtrOffset << ", " << VBTableOffset << ", "
- << Flags;
+ << this->Flags;
OS << ")'";
}
-void LocalStaticGuardVariableNode::output(OutputStream &OS) const {
- Name->output(OS);
+void LocalStaticGuardVariableNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
+ Name->output(OS, Flags);
}
-void VcallThunkIdentifierNode::output(OutputStream &OS) const {
+void VcallThunkIdentifierNode::output(OutputStream &OS,
+ OutputFlags Flags) const {
OS << "`vcall'{" << OffsetInVTable << ", {flat}}";
}
-void SpecialTableSymbolNode::output(OutputStream &OS) const {
+void SpecialTableSymbolNode::output(OutputStream &OS, OutputFlags Flags) const {
outputQualifiers(OS, Quals, false, true);
- Name->output(OS);
+ Name->output(OS, Flags);
if (TargetName) {
OS << "{for `";
- TargetName->output(OS);
+ TargetName->output(OS, Flags);
OS << "'}";
}
return;