--- /dev/null
+//===- NativeTypeFunctionSig.cpp - info about function signature -*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/PDB/Native/NativeTypeFunctionSig.h"
+
+#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
+#include "llvm/DebugInfo/PDB/Native/NativeEnumTypes.h"
+#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
+#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+using namespace llvm::pdb;
+
+namespace {
+// This is kind of a silly class, hence why we keep it private to the file.
+// It's only purpose is to wrap the real type record. I guess this is so that
+// we can have the lexical parent point to the function instead of the global
+// scope.
+class NativeTypeFunctionArg : public NativeRawSymbol {
+public:
+ NativeTypeFunctionArg(NativeSession &Session,
+ std::unique_ptr<PDBSymbol> RealType)
+ : NativeRawSymbol(Session, PDB_SymType::FunctionArg, 0),
+ RealType(std::move(RealType)) {}
+
+ void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const override {
+ NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields);
+
+ dumpSymbolIdField(OS, "typeId", getTypeId(), Indent, Session,
+ PdbSymbolIdField::Type, ShowIdFields, RecurseIdFields);
+ }
+
+ SymIndexId getTypeId() const override { return RealType->getSymIndexId(); }
+
+ std::unique_ptr<PDBSymbol> RealType;
+};
+
+class NativeEnumFunctionArgs : public IPDBEnumChildren<PDBSymbol> {
+public:
+ NativeEnumFunctionArgs(NativeSession &Session,
+ std::unique_ptr<NativeEnumTypes> TypeEnumerator)
+ : Session(Session), TypeEnumerator(std::move(TypeEnumerator)) {}
+
+ uint32_t getChildCount() const override {
+ return TypeEnumerator->getChildCount();
+ }
+ std::unique_ptr<PDBSymbol> getChildAtIndex(uint32_t Index) const override {
+ return wrap(TypeEnumerator->getChildAtIndex(Index));
+ }
+ std::unique_ptr<PDBSymbol> getNext() override {
+ return wrap(TypeEnumerator->getNext());
+ }
+
+ void reset() override { TypeEnumerator->reset(); }
+
+private:
+ std::unique_ptr<PDBSymbol> wrap(std::unique_ptr<PDBSymbol> S) const {
+ if (!S)
+ return nullptr;
+ auto NTFA = llvm::make_unique<NativeTypeFunctionArg>(Session, std::move(S));
+ return PDBSymbol::create(Session, std::move(NTFA));
+ }
+ NativeSession &Session;
+ std::unique_ptr<NativeEnumTypes> TypeEnumerator;
+};
+} // namespace
+
+NativeTypeFunctionSig::NativeTypeFunctionSig(NativeSession &Session,
+ SymIndexId Id,
+ codeview::TypeIndex Index,
+ codeview::ProcedureRecord Proc)
+ : NativeRawSymbol(Session, PDB_SymType::FunctionSig, Id),
+ Proc(std::move(Proc)), Index(Index), IsMemberFunction(false) {}
+
+NativeTypeFunctionSig::NativeTypeFunctionSig(
+ NativeSession &Session, SymIndexId Id, codeview::TypeIndex Index,
+ codeview::MemberFunctionRecord MemberFunc)
+ : NativeRawSymbol(Session, PDB_SymType::FunctionSig, Id),
+ MemberFunc(std::move(MemberFunc)), Index(Index), IsMemberFunction(true) {}
+
+void NativeTypeFunctionSig::initialize() {
+ if (IsMemberFunction) {
+ ClassParentId =
+ Session.getSymbolCache().findSymbolByTypeIndex(MemberFunc.ClassType);
+ initializeArgList(MemberFunc.ArgumentList);
+ } else {
+ initializeArgList(Proc.ArgumentList);
+ }
+}
+
+NativeTypeFunctionSig::~NativeTypeFunctionSig() {}
+
+void NativeTypeFunctionSig::initializeArgList(codeview::TypeIndex ArgListTI) {
+ TpiStream &Tpi = cantFail(Session.getPDBFile().getPDBTpiStream());
+ CVType CVT = Tpi.typeCollection().getType(ArgListTI);
+
+ cantFail(TypeDeserializer::deserializeAs<ArgListRecord>(CVT, ArgList));
+}
+
+void NativeTypeFunctionSig::dump(raw_ostream &OS, int Indent,
+ PdbSymbolIdField ShowIdFields,
+ PdbSymbolIdField RecurseIdFields) const {
+
+ NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields);
+
+ dumpSymbolIdField(OS, "lexicalParentId", 0, Indent, Session,
+ PdbSymbolIdField::LexicalParent, ShowIdFields,
+ RecurseIdFields);
+
+ dumpSymbolField(OS, "callingConvention", getCallingConvention(), Indent);
+ dumpSymbolField(OS, "count", getCount(), Indent);
+ dumpSymbolIdField(OS, "typeId", getTypeId(), Indent, Session,
+ PdbSymbolIdField::Type, ShowIdFields, RecurseIdFields);
+ if (IsMemberFunction)
+ dumpSymbolField(OS, "thisAdjust", getThisAdjust(), Indent);
+ dumpSymbolField(OS, "constructor", hasConstructor(), Indent);
+ dumpSymbolField(OS, "constType", isConstType(), Indent);
+ dumpSymbolField(OS, "isConstructorVirtualBase", isConstructorVirtualBase(),
+ Indent);
+ dumpSymbolField(OS, "isCxxReturnUdt", isCxxReturnUdt(), Indent);
+ dumpSymbolField(OS, "unalignedType", isUnalignedType(), Indent);
+ dumpSymbolField(OS, "volatileType", isVolatileType(), Indent);
+}
+
+std::unique_ptr<IPDBEnumSymbols>
+NativeTypeFunctionSig::findChildren(PDB_SymType Type) const {
+ if (Type != PDB_SymType::FunctionArg)
+ return llvm::make_unique<NullEnumerator<PDBSymbol>>();
+
+ auto NET = llvm::make_unique<NativeEnumTypes>(Session,
+ /* copy */ ArgList.ArgIndices);
+ return std::unique_ptr<IPDBEnumSymbols>(
+ new NativeEnumFunctionArgs(Session, std::move(NET)));
+}
+
+SymIndexId NativeTypeFunctionSig::getClassParentId() const {
+ if (!IsMemberFunction)
+ return 0;
+
+ return ClassParentId;
+}
+
+PDB_CallingConv NativeTypeFunctionSig::getCallingConvention() const {
+ return IsMemberFunction ? MemberFunc.CallConv : Proc.CallConv;
+}
+
+uint32_t NativeTypeFunctionSig::getCount() const {
+ return IsMemberFunction ? (1 + MemberFunc.getParameterCount())
+ : Proc.getParameterCount();
+}
+
+SymIndexId NativeTypeFunctionSig::getTypeId() const {
+ TypeIndex ReturnTI =
+ IsMemberFunction ? MemberFunc.getReturnType() : Proc.getReturnType();
+
+ return Session.getSymbolCache().findSymbolByTypeIndex(ReturnTI);
+}
+
+int32_t NativeTypeFunctionSig::getThisAdjust() const {
+ return IsMemberFunction ? MemberFunc.getThisPointerAdjustment() : 0;
+}
+
+bool NativeTypeFunctionSig::hasConstructor() const {
+ if (!IsMemberFunction)
+ return false;
+
+ return (MemberFunc.getOptions() & FunctionOptions::Constructor) !=
+ FunctionOptions::None;
+}
+
+bool NativeTypeFunctionSig::isConstType() const { return false; }
+
+bool NativeTypeFunctionSig::isConstructorVirtualBase() const {
+ if (!IsMemberFunction)
+ return false;
+
+ return (MemberFunc.getOptions() &
+ FunctionOptions::ConstructorWithVirtualBases) !=
+ FunctionOptions::None;
+}
+
+bool NativeTypeFunctionSig::isCxxReturnUdt() const {
+ FunctionOptions Options =
+ IsMemberFunction ? MemberFunc.getOptions() : Proc.getOptions();
+ return (Options & FunctionOptions::CxxReturnUdt) != FunctionOptions::None;
+}
+
+bool NativeTypeFunctionSig::isUnalignedType() const { return false; }
+
+bool NativeTypeFunctionSig::isVolatileType() const { return false; }
--- /dev/null
+; Test that the native PDB reader can enumerate pointer types. The output
+; being checked against is golden output generated by llvm-pdbutil without
+; the -native flag. Then we check that we generate the same output.
+
+; RUN: llvm-pdbutil pretty -native -funcsigs %p/../Inputs/every-function.pdb \
+; RUN: | FileCheck -check-prefix=PRETTY %s
+
+; RUN: llvm-pdbutil diadump -native -funcsigs %p/../Inputs/every-function.pdb \
+; RUN: | FileCheck -check-prefix=DUMP %s
+
+
+; PRETTY: void __cdecl (void*, unsigned int)
+; PRETTY-NEXT: void __cdecl (void*, unsigned __int64)
+; PRETTY-NEXT: int __cdecl ()
+; PRETTY-NEXT: int ()
+; PRETTY-NEXT: int __fastcall ()
+; PRETTY-NEXT: int __vectorcall ()
+; PRETTY-NEXT: int __cdecl (int)
+; PRETTY-NEXT: int __cdecl (int, char)
+; PRETTY-NEXT: void __cdecl (Struct)
+; PRETTY-NEXT: void (Struct::)()
+; PRETTY-NEXT: int (Struct::)()
+; PRETTY-NEXT: void (Struct::)()
+; PRETTY-NEXT: void (Struct::)()
+; PRETTY-NEXT: void (Struct::)()
+; PRETTY-NEXT: void (Struct::)()
+; PRETTY-NEXT: void __cdecl (const int)
+; PRETTY-NEXT: void __cdecl (Struct)
+; PRETTY-NEXT: void __cdecl (int*)
+; PRETTY-NEXT: void __cdecl (Struct*)
+; PRETTY-NEXT: void __cdecl (const int*)
+; PRETTY-NEXT: void __cdecl (Struct*)
+; PRETTY-NEXT: Struct __cdecl ()
+; PRETTY-NEXT: void (Derived::)(Derived*)
+; PRETTY-NEXT: void (Derived::)(Derived&)
+; PRETTY-NEXT: void (Derived::)()
+; PRETTY-NEXT: void (Derived::)()
+; PRETTY-NEXT: Derived& (Derived::)(Derived*)
+; PRETTY-NEXT: Derived& (Derived::)(Derived&)
+; PRETTY-NEXT: void (Derived::)()
+; PRETTY-NEXT: void* (Derived::)(unsigned int)
+; PRETTY-NEXT: void (__vc_attributes::event_sourceAttribute::)(__vc_attributes::event_sourceAttribute::type_e)
+; PRETTY-NEXT: void (__vc_attributes::event_sourceAttribute::)()
+; PRETTY-NEXT: void (__vc_attributes::helper_attributes::v1_alttypeAttribute::)(__vc_attributes::helper_attributes::v1_alttypeAttribute::type_e)
+; PRETTY-NEXT: void (__vc_attributes::helper_attributes::usageAttribute::)(unsigned int)
+; PRETTY-NEXT: void (__vc_attributes::threadingAttribute::)(__vc_attributes::threadingAttribute::threading_e)
+; PRETTY-NEXT: void (__vc_attributes::threadingAttribute::)()
+; PRETTY-NEXT: void (__vc_attributes::aggregatableAttribute::)(__vc_attributes::aggregatableAttribute::type_e)
+; PRETTY-NEXT: void (__vc_attributes::aggregatableAttribute::)()
+; PRETTY-NEXT: void (__vc_attributes::event_receiverAttribute::)(__vc_attributes::event_receiverAttribute::type_e, bool)
+; PRETTY-NEXT: void (__vc_attributes::event_receiverAttribute::)(__vc_attributes::event_receiverAttribute::type_e)
+; PRETTY-NEXT: void (__vc_attributes::event_receiverAttribute::)()
+; PRETTY-NEXT: void (__vc_attributes::moduleAttribute::)(__vc_attributes::moduleAttribute::type_e, const char*, const char*, const char*, int, bool, const char*, int, const char*, const char*, int, bool, bool, const char*, const char*)
+; PRETTY-NEXT: void (__vc_attributes::moduleAttribute::)(__vc_attributes::moduleAttribute::type_e)
+; PRETTY-NEXT: void (__vc_attributes::moduleAttribute::)()
+; PRETTY-NEXT: void (Base1::)()
+; PRETTY-NEXT: void (Base1::)(Base1&)
+; PRETTY-NEXT: void (Base1::)()
+; PRETTY-NEXT: Base1& (Base1::)(Base1&)
+; PRETTY-NEXT: void* (Base1::)(unsigned int)
+; PRETTY-NEXT: void (Base2::)(Base2*)
+; PRETTY-NEXT: void (Base2::)(Base2&)
+; PRETTY-NEXT: void (Base2::)()
+; PRETTY-NEXT: void (Base2::)()
+; PRETTY-NEXT: Base2& (Base2::)(Base2*)
+; PRETTY-NEXT: Base2& (Base2::)(Base2&)
+; PRETTY-NEXT: void (Base2::)()
+; PRETTY-NEXT: void* (Base2::)(unsigned int)
+; PRETTY-NEXT: void __cdecl ()
+
+; DUMP: {
+; DUMP-NEXT: symIndexId: 2
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 4
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 5
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 0
+; DUMP-NEXT: typeId: 6
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 7
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __stdcall
+; DUMP-NEXT: count: 0
+; DUMP-NEXT: typeId: 6
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 8
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __fastcall
+; DUMP-NEXT: count: 0
+; DUMP-NEXT: typeId: 6
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 9
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __vectorcall
+; DUMP-NEXT: count: 0
+; DUMP-NEXT: typeId: 6
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 10
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 6
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 11
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 6
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 12
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 13
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 15
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 6
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 16
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 17
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 18
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 19
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 20
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 21
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 22
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 23
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 24
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 25
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 26
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 0
+; DUMP-NEXT: typeId: 14
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 1
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 27
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 1
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 29
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 1
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 30
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 1
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 31
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 4
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 32
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 33
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 34
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 33
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 35
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 36
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 37
+; DUMP-NEXT: thisAdjust: 4
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 38
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 40
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 41
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 43
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 45
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 47
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 48
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 50
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 51
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 3
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 53
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 54
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 55
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 16
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 57
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 58
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 59
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 61
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 62
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 63
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 64
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 65
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 37
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 66
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 1
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 68
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 1
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 69
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 1
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 1
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 70
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 4
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 71
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 72
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 73
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 72
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 74
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 1
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: thisAdjust: 0
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 75
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __thiscall
+; DUMP-NEXT: count: 2
+; DUMP-NEXT: typeId: 37
+; DUMP-NEXT: thisAdjust: 4
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }
+; DUMP-NEXT: {
+; DUMP-NEXT: symIndexId: 76
+; DUMP-NEXT: symTag: FunctionSig
+; DUMP-NEXT: callingConvention: __cdecl
+; DUMP-NEXT: count: 0
+; DUMP-NEXT: typeId: 3
+; DUMP-NEXT: constructor: 0
+; DUMP-NEXT: constType: 0
+; DUMP-NEXT: isConstructorVirtualBase: 0
+; DUMP-NEXT: isCxxReturnUdt: 0
+; DUMP-NEXT: unalignedType: 0
+; DUMP-NEXT: volatileType: 0
+; DUMP-NEXT: }