Index: llvm/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h =================================================================== --- llvm/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h +++ llvm/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h @@ -33,6 +33,9 @@ virtual void EmitIntValue(uint64_t Value, unsigned Size) = 0; virtual void EmitBinaryData(StringRef Data) = 0; virtual void AddComment(const Twine &T) = 0; + virtual void AddRawComment(const Twine &T) = 0; + virtual bool isVerboseAsm() = 0; + virtual std::string getTypeName(TypeIndex TI) = 0; virtual ~CodeViewRecordStreamer() = default; }; @@ -206,6 +209,11 @@ return 0; } + void emitRawComment(const Twine &T) { + if (isStreaming() && Streamer->isVerboseAsm()) + Streamer->AddRawComment(T); + } + private: void emitEncodedSignedInteger(const int64_t &Value, const Twine &Comment = ""); @@ -225,7 +233,7 @@ } void emitComment(const Twine &Comment) { - if (isStreaming()) { + if (isStreaming() && Streamer->isVerboseAsm()) { Twine TComment(Comment); if (!TComment.isTriviallyEmpty()) Streamer->AddComment(TComment); Index: llvm/include/llvm/DebugInfo/CodeView/EnumTables.h =================================================================== --- llvm/include/llvm/DebugInfo/CodeView/EnumTables.h +++ llvm/include/llvm/DebugInfo/CodeView/EnumTables.h @@ -37,6 +37,17 @@ ArrayRef> getTrampolineNames(); ArrayRef> getImageSectionCharacteristicNames(); +ArrayRef> getClassOptionNames(); +ArrayRef> getMemberAccessNames(); +ArrayRef> getMethodOptionNames(); +ArrayRef> getMemberKindNames(); +ArrayRef> getPtrKindNames(); +ArrayRef> getPtrModeNames(); +ArrayRef> getPtrMemberRepNames(); +ArrayRef> getTypeModifierNames(); +ArrayRef> getCallingConventions(); +ArrayRef> getFunctionOptionEnum(); +ArrayRef> getLabelTypeEnum(); } // end namespace codeview } // end namespace llvm Index: llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp =================================================================== --- llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -98,7 +98,8 @@ namespace { class CVMCAdapter : public CodeViewRecordStreamer { public: - CVMCAdapter(MCStreamer &OS) : OS(&OS) {} + CVMCAdapter(MCStreamer &OS, TypeCollection &TypeTable) + : OS(&OS), TypeTable(TypeTable) {} void EmitBytes(StringRef Data) { OS->EmitBytes(Data); } @@ -110,8 +111,24 @@ void AddComment(const Twine &T) { OS->AddComment(T); } + void AddRawComment(const Twine &T) { OS->emitRawComment(T); } + + bool isVerboseAsm() { return OS->isVerboseAsm(); } + + std::string getTypeName(TypeIndex TI) { + std::string TypeName; + if (!TI.isNoneType()) { + if (TI.isSimple()) + TypeName = TypeIndex::simpleTypeName(TI); + else + TypeName = TypeTable.getTypeName(TI); + } + return TypeName; + } + private: MCStreamer *OS = nullptr; + TypeCollection &TypeTable; }; } // namespace @@ -617,13 +634,6 @@ OS.EmitBytes(NullTerminatedString); } -static StringRef getTypeLeafName(TypeLeafKind TypeKind) { - for (const EnumEntry &EE : getTypeLeafNames()) - if (EE.Value == TypeKind) - return EE.Name; - return ""; -} - void CodeViewDebug::emitTypeInformation() { if (TypeTable.empty()) return; @@ -640,11 +650,11 @@ } TypeTableCollection Table(TypeTable.records()); + TypeVisitorCallbackPipeline Pipeline; SmallString<512> CommentBlock; raw_svector_ostream CommentOS(CommentBlock); std::unique_ptr SP; std::unique_ptr TDV; - TypeVisitorCallbackPipeline Pipeline; if (OS.isVerboseAsm()) { // To construct block comment describing the type record for readability. @@ -655,7 +665,7 @@ } // To emit type record using Codeview MCStreamer adapter - CVMCAdapter CVMCOS(OS); + CVMCAdapter CVMCOS(OS, Table); TypeRecordMapping typeMapping(CVMCOS); Pipeline.addCallbackToPipeline(typeMapping); @@ -665,16 +675,6 @@ CVType Record = Table.getType(*B); CommentBlock.clear(); - - auto RecordLen = Record.length(); - auto RecordKind = Record.kind(); - if (OS.isVerboseAsm()) - CVMCOS.AddComment("Record length"); - CVMCOS.EmitIntValue(RecordLen - 2, 2); - if (OS.isVerboseAsm()) - CVMCOS.AddComment("Record kind: " + getTypeLeafName(RecordKind)); - CVMCOS.EmitIntValue(RecordKind, sizeof(RecordKind)); - Error E = codeview::visitTypeRecord(Record, *B, Pipeline); if (E) { Index: llvm/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp =================================================================== --- llvm/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp +++ llvm/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp @@ -126,7 +126,11 @@ Error CodeViewRecordIO::mapInteger(TypeIndex &TypeInd, const Twine &Comment) { if (isStreaming()) { - emitComment(Comment); + std::string TypeNameStr = Streamer->getTypeName(TypeInd); + if (!TypeNameStr.empty()) + emitComment(Comment + ": " + TypeNameStr); + else + emitComment(Comment); Streamer->EmitIntValue(TypeInd.getIndex(), sizeof(TypeInd.getIndex())); incrStreamedLen(sizeof(TypeInd.getIndex())); } else if (isWriting()) { Index: llvm/lib/DebugInfo/CodeView/EnumTables.cpp =================================================================== --- llvm/lib/DebugInfo/CodeView/EnumTables.cpp +++ llvm/lib/DebugInfo/CodeView/EnumTables.cpp @@ -300,6 +300,128 @@ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_READ), CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_WRITE)}; +static const EnumEntry ClassOptionNames[] = { + CV_ENUM_CLASS_ENT(ClassOptions, Packed), + CV_ENUM_CLASS_ENT(ClassOptions, HasConstructorOrDestructor), + CV_ENUM_CLASS_ENT(ClassOptions, HasOverloadedOperator), + CV_ENUM_CLASS_ENT(ClassOptions, Nested), + CV_ENUM_CLASS_ENT(ClassOptions, ContainsNestedClass), + CV_ENUM_CLASS_ENT(ClassOptions, HasOverloadedAssignmentOperator), + CV_ENUM_CLASS_ENT(ClassOptions, HasConversionOperator), + CV_ENUM_CLASS_ENT(ClassOptions, ForwardReference), + CV_ENUM_CLASS_ENT(ClassOptions, Scoped), + CV_ENUM_CLASS_ENT(ClassOptions, HasUniqueName), + CV_ENUM_CLASS_ENT(ClassOptions, Sealed), + CV_ENUM_CLASS_ENT(ClassOptions, Intrinsic), +}; + +static const EnumEntry MemberAccessNames[] = { + CV_ENUM_CLASS_ENT(MemberAccess, None), + CV_ENUM_CLASS_ENT(MemberAccess, Private), + CV_ENUM_CLASS_ENT(MemberAccess, Protected), + CV_ENUM_CLASS_ENT(MemberAccess, Public), +}; + +static const EnumEntry MethodOptionNames[] = { + CV_ENUM_CLASS_ENT(MethodOptions, Pseudo), + CV_ENUM_CLASS_ENT(MethodOptions, NoInherit), + CV_ENUM_CLASS_ENT(MethodOptions, NoConstruct), + CV_ENUM_CLASS_ENT(MethodOptions, CompilerGenerated), + CV_ENUM_CLASS_ENT(MethodOptions, Sealed), +}; + +static const EnumEntry MemberKindNames[] = { + CV_ENUM_CLASS_ENT(MethodKind, Vanilla), + CV_ENUM_CLASS_ENT(MethodKind, Virtual), + CV_ENUM_CLASS_ENT(MethodKind, Static), + CV_ENUM_CLASS_ENT(MethodKind, Friend), + CV_ENUM_CLASS_ENT(MethodKind, IntroducingVirtual), + CV_ENUM_CLASS_ENT(MethodKind, PureVirtual), + CV_ENUM_CLASS_ENT(MethodKind, PureIntroducingVirtual), +}; + +static const EnumEntry PtrKindNames[] = { + CV_ENUM_CLASS_ENT(PointerKind, Near16), + CV_ENUM_CLASS_ENT(PointerKind, Far16), + CV_ENUM_CLASS_ENT(PointerKind, Huge16), + CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegment), + CV_ENUM_CLASS_ENT(PointerKind, BasedOnValue), + CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegmentValue), + CV_ENUM_CLASS_ENT(PointerKind, BasedOnAddress), + CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegmentAddress), + CV_ENUM_CLASS_ENT(PointerKind, BasedOnType), + CV_ENUM_CLASS_ENT(PointerKind, BasedOnSelf), + CV_ENUM_CLASS_ENT(PointerKind, Near32), + CV_ENUM_CLASS_ENT(PointerKind, Far32), + CV_ENUM_CLASS_ENT(PointerKind, Near64), +}; + +static const EnumEntry PtrModeNames[] = { + CV_ENUM_CLASS_ENT(PointerMode, Pointer), + CV_ENUM_CLASS_ENT(PointerMode, LValueReference), + CV_ENUM_CLASS_ENT(PointerMode, PointerToDataMember), + CV_ENUM_CLASS_ENT(PointerMode, PointerToMemberFunction), + CV_ENUM_CLASS_ENT(PointerMode, RValueReference), +}; + +static const EnumEntry PtrMemberRepNames[] = { + CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, Unknown), + CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, SingleInheritanceData), + CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, MultipleInheritanceData), + CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, VirtualInheritanceData), + CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, GeneralData), + CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, SingleInheritanceFunction), + CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, + MultipleInheritanceFunction), + CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, + VirtualInheritanceFunction), + CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, GeneralFunction), +}; + +static const EnumEntry TypeModifierNames[] = { + CV_ENUM_CLASS_ENT(ModifierOptions, Const), + CV_ENUM_CLASS_ENT(ModifierOptions, Volatile), + CV_ENUM_CLASS_ENT(ModifierOptions, Unaligned), +}; + +static const EnumEntry CallingConventions[] = { + CV_ENUM_CLASS_ENT(CallingConvention, NearC), + CV_ENUM_CLASS_ENT(CallingConvention, FarC), + CV_ENUM_CLASS_ENT(CallingConvention, NearPascal), + CV_ENUM_CLASS_ENT(CallingConvention, FarPascal), + CV_ENUM_CLASS_ENT(CallingConvention, NearFast), + CV_ENUM_CLASS_ENT(CallingConvention, FarFast), + CV_ENUM_CLASS_ENT(CallingConvention, NearStdCall), + CV_ENUM_CLASS_ENT(CallingConvention, FarStdCall), + CV_ENUM_CLASS_ENT(CallingConvention, NearSysCall), + CV_ENUM_CLASS_ENT(CallingConvention, FarSysCall), + CV_ENUM_CLASS_ENT(CallingConvention, ThisCall), + CV_ENUM_CLASS_ENT(CallingConvention, MipsCall), + CV_ENUM_CLASS_ENT(CallingConvention, Generic), + CV_ENUM_CLASS_ENT(CallingConvention, AlphaCall), + CV_ENUM_CLASS_ENT(CallingConvention, PpcCall), + CV_ENUM_CLASS_ENT(CallingConvention, SHCall), + CV_ENUM_CLASS_ENT(CallingConvention, ArmCall), + CV_ENUM_CLASS_ENT(CallingConvention, AM33Call), + CV_ENUM_CLASS_ENT(CallingConvention, TriCall), + CV_ENUM_CLASS_ENT(CallingConvention, SH5Call), + CV_ENUM_CLASS_ENT(CallingConvention, M32RCall), + CV_ENUM_CLASS_ENT(CallingConvention, ClrCall), + CV_ENUM_CLASS_ENT(CallingConvention, Inline), + CV_ENUM_CLASS_ENT(CallingConvention, NearVector), +}; + +static const EnumEntry FunctionOptionEnum[] = { + CV_ENUM_CLASS_ENT(FunctionOptions, CxxReturnUdt), + CV_ENUM_CLASS_ENT(FunctionOptions, Constructor), + CV_ENUM_CLASS_ENT(FunctionOptions, ConstructorWithVirtualBases), +}; + +static const EnumEntry LabelTypeEnum[] = { + CV_ENUM_CLASS_ENT(LabelType, Near), + CV_ENUM_CLASS_ENT(LabelType, Far), +}; + namespace llvm { namespace codeview { @@ -379,5 +501,49 @@ return makeArrayRef(ImageSectionCharacteristicNames); } +ArrayRef> getClassOptionNames() { + return makeArrayRef(ClassOptionNames); +} + +ArrayRef> getMemberAccessNames() { + return makeArrayRef(MemberAccessNames); +} + +ArrayRef> getMethodOptionNames() { + return makeArrayRef(MethodOptionNames); +} + +ArrayRef> getMemberKindNames() { + return makeArrayRef(MemberKindNames); +} + +ArrayRef> getPtrKindNames() { + return makeArrayRef(PtrKindNames); +} + +ArrayRef> getPtrModeNames() { + return makeArrayRef(PtrModeNames); +} + +ArrayRef> getPtrMemberRepNames() { + return makeArrayRef(PtrMemberRepNames); +} + +ArrayRef> getTypeModifierNames() { + return makeArrayRef(TypeModifierNames); +} + +ArrayRef> getCallingConventions() { + return makeArrayRef(CallingConventions); +} + +ArrayRef> getFunctionOptionEnum() { + return makeArrayRef(FunctionOptionEnum); +} + +ArrayRef> getLabelTypeEnum() { + return makeArrayRef(LabelTypeEnum); +} + } // end namespace codeview } // end namespace llvm Index: llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp =================================================================== --- llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp +++ llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp @@ -7,24 +7,125 @@ //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/CodeView/TypeRecordMapping.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/DebugInfo/CodeView/EnumTables.h" using namespace llvm; using namespace llvm::codeview; +namespace { + #define error(X) \ if (auto EC = X) \ return EC; -namespace { +static const EnumEntry LeafTypeNames[] = { +#define CV_TYPE(enum, val) {#enum, enum}, +#include "llvm/DebugInfo/CodeView/CodeViewTypes.def" +}; + +static std::string getLeafTypeName(TypeLeafKind LT) { + switch (LT) { +#define TYPE_RECORD(ename, value, name) \ + case ename: \ + return std::string(#name); +#include "llvm/DebugInfo/CodeView/CodeViewTypes.def" + default: + break; + } + return std::string("UnknownLeaf"); +} + +template +static bool compEnumNames(const EnumEntry &lhs, const EnumEntry &rhs) { + return lhs.Name < rhs.Name; +} + +template +static std::string getFlagNames(CodeViewRecordIO &IO, T Value, + ArrayRef> Flags) { + if (!IO.isStreaming()) + return std::string(""); + typedef EnumEntry FlagEntry; + typedef SmallVector FlagVector; + FlagVector SetFlags; + for (const auto &Flag : Flags) { + if (Flag.Value == 0) + continue; + if ((Value & Flag.Value) == Flag.Value) { + SetFlags.push_back(Flag); + } + } + + llvm::sort(SetFlags, &compEnumNames); + + std::string FlagLabel; + bool FirstOcc = true; + for (const auto &Flag : SetFlags) { + if (FirstOcc) + FirstOcc = false; + else + FlagLabel += (" | "); + + FlagLabel += (Flag.Name.str() + " (0x" + utohexstr(Flag.Value) + ")"); + } + + if (!FlagLabel.empty()) { + std::string LabelWithBraces(" ( "); + LabelWithBraces += FlagLabel + " )"; + return LabelWithBraces; + } else + return FlagLabel; +} + +template +static std::string getEnumName(CodeViewRecordIO &IO, T Value, + ArrayRef> EnumValues) { + if (!IO.isStreaming()) + return ""; + StringRef Name; + for (const auto &EnumItem : EnumValues) { + if (EnumItem.Value == Value) { + Name = EnumItem.Name; + break; + } + } + + return Name.str(); +} + +static std::string getMemberAttributes(CodeViewRecordIO &IO, + MemberAccess Access, MethodKind Kind, + MethodOptions Options) { + if (!IO.isStreaming()) + return ""; + std::string AccessSpecifier = + getEnumName(IO, uint8_t(Access), makeArrayRef(getMemberAccessNames())); + std::string MemberAttrs(AccessSpecifier); + if (Kind != MethodKind::Vanilla) { + std::string MethodKind = + getEnumName(IO, unsigned(Kind), makeArrayRef(getMemberKindNames())); + MemberAttrs += ", " + MethodKind; + } + if (Options != MethodOptions::None) { + std::string MethodOptions = getFlagNames( + IO, unsigned(Options), makeArrayRef(getMethodOptionNames())); + MemberAttrs += ", " + MethodOptions; + } + return MemberAttrs; +} + struct MapOneMethodRecord { explicit MapOneMethodRecord(bool IsFromOverloadList) : IsFromOverloadList(IsFromOverloadList) {} Error operator()(CodeViewRecordIO &IO, OneMethodRecord &Method) const { - error(IO.mapInteger(Method.Attrs.Attrs, "AccessSpecifier")); + std::string Attrs = getMemberAttributes( + IO, Method.getAccess(), Method.getMethodKind(), Method.getOptions()); + error(IO.mapInteger(Method.Attrs.Attrs, "Attrs: " + Attrs)); if (IsFromOverloadList) { uint16_t Padding = 0; - error(IO.mapInteger(Padding, "Padding")); + error(IO.mapInteger(Padding)); } error(IO.mapInteger(Method.Type, "Type")); if (Method.isIntroducingVirtual()) { @@ -41,7 +142,7 @@ private: bool IsFromOverloadList; }; -} +} // namespace static Error mapNameAndUniqueName(CodeViewRecordIO &IO, StringRef &Name, StringRef &UniqueName, bool HasUniqueName) { @@ -83,18 +184,6 @@ return Error::success(); } -static StringRef getLeafTypeName(TypeLeafKind LT) { - switch (LT) { -#define TYPE_RECORD(ename, value, name) \ - case ename: \ - return #ename; -#include "llvm/DebugInfo/CodeView/CodeViewTypes.def" - default: - break; - } - return "UnknownLeaf"; -} - Error TypeRecordMapping::visitTypeBegin(CVType &CVR) { assert(!TypeKind.hasValue() && "Already in a type mapping!"); assert(!MemberKind.hasValue() && "Already in a member mapping!"); @@ -108,10 +197,22 @@ MaxLen = MaxRecordLength - sizeof(RecordPrefix); error(IO.beginRecord(MaxLen)); TypeKind = CVR.kind(); + + if (IO.isStreaming()) { + auto RecordKind = CVR.kind(); + uint16_t RecordLen = CVR.length() - 2; + std::string RecordKindName = + getEnumName(IO, unsigned(RecordKind), makeArrayRef(LeafTypeNames)); + error(IO.mapInteger(RecordLen, "Record length")); + error(IO.mapEnum(RecordKind, "Record kind: " + RecordKindName)); + } return Error::success(); } Error TypeRecordMapping::visitTypeBegin(CVType &CVR, TypeIndex Index) { + if (IO.isStreaming()) + IO.emitRawComment(" " + getLeafTypeName(CVR.kind()) + " (0x" + + utohexstr(Index.getIndex()) + ")"); return visitTypeBegin(CVR); } @@ -140,8 +241,12 @@ MemberKind = Record.Kind; if (IO.isStreaming()) { - error(IO.mapEnum(Record.Kind, - "Member kind: " + getLeafTypeName(Record.Kind))); + std::string MemberKindName = getLeafTypeName(Record.Kind); + MemberKindName += + " ( " + + getEnumName(IO, unsigned(Record.Kind), makeArrayRef(LeafTypeNames)) + + " )"; + error(IO.mapEnum(Record.Kind, "Member kind: " + MemberKindName)); } return Error::success(); } @@ -161,16 +266,24 @@ } Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ModifierRecord &Record) { + std::string ModifierNames = + getFlagNames(IO, static_cast(Record.Modifiers), + makeArrayRef(getTypeModifierNames())); error(IO.mapInteger(Record.ModifiedType, "ModifiedType")); - error(IO.mapEnum(Record.Modifiers, "Modifiers")); + error(IO.mapEnum(Record.Modifiers, "Modifiers" + ModifierNames)); return Error::success(); } Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ProcedureRecord &Record) { + std::string CallingConvName = getEnumName( + IO, uint8_t(Record.CallConv), makeArrayRef(getCallingConventions())); + std::string FuncOptionNames = + getFlagNames(IO, static_cast(Record.Options), + makeArrayRef(getFunctionOptionEnum())); error(IO.mapInteger(Record.ReturnType, "ReturnType")); - error(IO.mapEnum(Record.CallConv, "CallingConvention")); - error(IO.mapEnum(Record.Options, "FunctionOptions")); + error(IO.mapEnum(Record.CallConv, "CallingConvention: " + CallingConvName)); + error(IO.mapEnum(Record.Options, "FunctionOptions" + FuncOptionNames)); error(IO.mapInteger(Record.ParameterCount, "NumParameters")); error(IO.mapInteger(Record.ArgumentList, "ArgListType")); @@ -179,11 +292,16 @@ Error TypeRecordMapping::visitKnownRecord(CVType &CVR, MemberFunctionRecord &Record) { + std::string CallingConvName = getEnumName( + IO, uint8_t(Record.CallConv), makeArrayRef(getCallingConventions())); + std::string FuncOptionNames = + getFlagNames(IO, static_cast(Record.Options), + makeArrayRef(getFunctionOptionEnum())); error(IO.mapInteger(Record.ReturnType, "ReturnType")); error(IO.mapInteger(Record.ClassType, "ClassType")); error(IO.mapInteger(Record.ThisType, "ThisType")); - error(IO.mapEnum(Record.CallConv, "CallingConvention")); - error(IO.mapEnum(Record.Options, "FunctionOptions")); + error(IO.mapEnum(Record.CallConv, "CallingConvention: " + CallingConvName)); + error(IO.mapEnum(Record.Options, "FunctionOptions" + FuncOptionNames)); error(IO.mapInteger(Record.ParameterCount, "NumParameters")); error(IO.mapInteger(Record.ArgumentList, "ArgListType")); error(IO.mapInteger(Record.ThisPointerAdjustment, "ThisAdjustment")); @@ -214,8 +332,40 @@ } Error TypeRecordMapping::visitKnownRecord(CVType &CVR, PointerRecord &Record) { + + SmallString<128> Attr("Attrs: "); + + if (IO.isStreaming()) { + std::string PtrType = getEnumName(IO, unsigned(Record.getPointerKind()), + makeArrayRef(getPtrKindNames())); + Attr += "[ Type: " + PtrType; + + std::string PtrMode = getEnumName(IO, unsigned(Record.getMode()), + makeArrayRef(getPtrModeNames())); + Attr += ", Mode: " + PtrMode; + + auto PtrSizeOf = Record.getSize(); + Attr += ", SizeOf: " + itostr(PtrSizeOf); + + if (Record.isFlat()) + Attr += ", isFlat"; + if (Record.isConst()) + Attr += ", isConst"; + if (Record.isVolatile()) + Attr += ", isVolatile"; + if (Record.isUnaligned()) + Attr += ", isUnaligned"; + if (Record.isRestrict()) + Attr += ", isRestricted"; + if (Record.isLValueReferenceThisPtr()) + Attr += ", isThisPtr&"; + if (Record.isRValueReferenceThisPtr()) + Attr += ", isThisPtr&&"; + Attr += " ]"; + } + error(IO.mapInteger(Record.ReferentType, "PointeeType")); - error(IO.mapInteger(Record.Attrs, "Attributes")); + error(IO.mapInteger(Record.Attrs, Attr)); if (Record.isPointerToMember()) { if (IO.isReading()) @@ -223,7 +373,10 @@ MemberPointerInfo &M = *Record.MemberInfo; error(IO.mapInteger(M.ContainingType, "ClassType")); - error(IO.mapEnum(M.Representation, "Representation")); + std::string PtrMemberGetRepresentation = getEnumName( + IO, uint16_t(M.Representation), makeArrayRef(getPtrMemberRepNames())); + error(IO.mapEnum(M.Representation, + "Representation: " + PtrMemberGetRepresentation)); } return Error::success(); @@ -243,8 +396,11 @@ (CVR.kind() == TypeLeafKind::LF_CLASS) || (CVR.kind() == TypeLeafKind::LF_INTERFACE)); + std::string PropertiesNames = + getFlagNames(IO, static_cast(Record.Options), + makeArrayRef(getClassOptionNames())); error(IO.mapInteger(Record.MemberCount, "MemberCount")); - error(IO.mapEnum(Record.Options, "Properties")); + error(IO.mapEnum(Record.Options, "Properties" + PropertiesNames)); error(IO.mapInteger(Record.FieldList, "FieldList")); error(IO.mapInteger(Record.DerivationList, "DerivedFrom")); error(IO.mapInteger(Record.VTableShape, "VShape")); @@ -256,8 +412,11 @@ } Error TypeRecordMapping::visitKnownRecord(CVType &CVR, UnionRecord &Record) { + std::string PropertiesNames = + getFlagNames(IO, static_cast(Record.Options), + makeArrayRef(getClassOptionNames())); error(IO.mapInteger(Record.MemberCount, "MemberCount")); - error(IO.mapEnum(Record.Options, "Properties")); + error(IO.mapEnum(Record.Options, "Properties" + PropertiesNames)); error(IO.mapInteger(Record.FieldList, "FieldList")); error(IO.mapEncodedInteger(Record.Size, "SizeOf")); error(mapNameAndUniqueName(IO, Record.Name, Record.UniqueName, @@ -267,8 +426,11 @@ } Error TypeRecordMapping::visitKnownRecord(CVType &CVR, EnumRecord &Record) { + std::string PropertiesNames = + getFlagNames(IO, static_cast(Record.Options), + makeArrayRef(getClassOptionNames())); error(IO.mapInteger(Record.MemberCount, "NumEnumerators")); - error(IO.mapEnum(Record.Options, "Properties")); + error(IO.mapEnum(Record.Options, "Properties" + PropertiesNames)); error(IO.mapInteger(Record.UnderlyingType, "UnderlyingType")); error(IO.mapInteger(Record.FieldList, "FieldListType")); error(mapNameAndUniqueName(IO, Record.Name, Record.UniqueName, @@ -418,13 +580,17 @@ } Error TypeRecordMapping::visitKnownRecord(CVType &CVR, LabelRecord &Record) { - error(IO.mapEnum(Record.Mode, "Mode")); + std::string ModeName = + getEnumName(IO, uint16_t(Record.Mode), makeArrayRef(getLabelTypeEnum())); + error(IO.mapEnum(Record.Mode, "Mode: " + ModeName)); return Error::success(); } Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR, BaseClassRecord &Record) { - error(IO.mapInteger(Record.Attrs.Attrs, "AccessSpecifier")); + std::string Attrs = getMemberAttributes( + IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None); + error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs)); error(IO.mapInteger(Record.Type, "BaseType")); error(IO.mapEncodedInteger(Record.Offset, "BaseOffset")); @@ -433,7 +599,9 @@ Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR, EnumeratorRecord &Record) { - error(IO.mapInteger(Record.Attrs.Attrs)); + std::string Attrs = getMemberAttributes( + IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None); + error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs)); // FIXME: Handle full APInt such as __int128. error(IO.mapEncodedInteger(Record.Value, "EnumValue")); @@ -444,7 +612,9 @@ Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR, DataMemberRecord &Record) { - error(IO.mapInteger(Record.Attrs.Attrs, "AccessSpecifier")); + std::string Attrs = getMemberAttributes( + IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None); + error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs)); error(IO.mapInteger(Record.Type, "Type")); error(IO.mapEncodedInteger(Record.FieldOffset, "FieldOffset")); error(IO.mapStringZ(Record.Name, "Name")); @@ -481,7 +651,9 @@ Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR, StaticDataMemberRecord &Record) { - error(IO.mapInteger(Record.Attrs.Attrs, "AccessSpecifier")); + std::string Attrs = getMemberAttributes( + IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None); + error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs)); error(IO.mapInteger(Record.Type, "Type")); error(IO.mapStringZ(Record.Name, "Name")); @@ -491,7 +663,9 @@ Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR, VirtualBaseClassRecord &Record) { - error(IO.mapInteger(Record.Attrs.Attrs, "AccessSpecifier")); + std::string Attrs = getMemberAttributes( + IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None); + error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs)); error(IO.mapInteger(Record.BaseType, "BaseType")); error(IO.mapInteger(Record.VBPtrType, "VBPtrType")); error(IO.mapEncodedInteger(Record.VBPtrOffset, "VBPtrOffset")); Index: llvm/test/DebugInfo/COFF/class-options-common.ll =================================================================== --- llvm/test/DebugInfo/COFF/class-options-common.ll +++ llvm/test/DebugInfo/COFF/class-options-common.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s ; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s +; RUN: llc < %s | FileCheck %s --check-prefix=ASM-INLINE-COMMENTS ; ; Command to generate function-options.ll ; $ clang++ class-options-common.cpp -S -emit-llvm -g -gcodeview -o class-options-common.ll @@ -651,6 +652,28 @@ ; CHECK: } ; CHECK: ] +; ASM-INLINE-COMMENTS: # MethodOverloadList (0x1088) +; ASM-INLINE-COMMENTS: .short 0x12 # Record length +; ASM-INLINE-COMMENTS: .short 0x1206 # Record kind: LF_METHODLIST +; ASM-INLINE-COMMENTS: .short 0x3 # Method +; ASM-INLINE-COMMENTS: # Attrs: Public +; ASM-INLINE-COMMENTS: .short 0x0 +; ASM-INLINE-COMMENTS: .long 0x1083 # Type: void Foo::() +; ASM-INLINE-COMMENTS: .short 0x3 # Attrs: Public +; ASM-INLINE-COMMENTS: .short 0x0 +; ASM-INLINE-COMMENTS: .long 0x1087 # Type: void Foo::(const Foo&) +; ASM-INLINE-COMMENTS: # MethodOverloadList (0x1088) { +; ASM-INLINE-COMMENTS: # TypeLeafKind: LF_METHODLIST (0x1206) +; ASM-INLINE-COMMENTS: # Method [ +; ASM-INLINE-COMMENTS: # AccessSpecifier: Public (0x3) +; ASM-INLINE-COMMENTS: # Type: void Foo::() (0x1083) +; ASM-INLINE-COMMENTS: # ] +; ASM-INLINE-COMMENTS: # Method [ +; ASM-INLINE-COMMENTS: # AccessSpecifier: Public (0x3) +; ASM-INLINE-COMMENTS: # Type: void Foo::(const Foo&) (0x1087) +; ASM-INLINE-COMMENTS: # ] +; ASM-INLINE-COMMENTS: # } + ; ModuleID = 'class-options-common.cpp' source_filename = "class-options.cpp" Index: llvm/test/DebugInfo/COFF/types-basic.ll =================================================================== --- llvm/test/DebugInfo/COFF/types-basic.ll +++ llvm/test/DebugInfo/COFF/types-basic.ll @@ -350,12 +350,13 @@ ; ASM: .section .debug$T,"dr" ; ASM: .p2align 2 ; ASM: .long 4 # Debug section magic +; ASM: # ArgList (0x1000) ; ASM: .short 0x12 # Record length ; ASM: .short 0x1201 # Record kind: LF_ARGLIST ; ASM: .long 0x3 # NumArgs -; ASM: .long 0x40 # Argument -; ASM: .long 0x41 # Argument -; ASM: .long 0x13 # Argument +; ASM: .long 0x40 # Argument: float +; ASM: .long 0x41 # Argument: double +; ASM: .long 0x13 # Argument: __int64 ; ASM: # ArgList (0x1000) { ; ASM: # TypeLeafKind: LF_ARGLIST (0x1201) ; ASM: # NumArgs: 3 @@ -365,13 +366,14 @@ ; ASM: # ArgType: __int64 (0x13) ; ASM: # ] ; ASM: # } +; ASM: # Procedure (0x1001) ; ASM: .short 0xe # Record length ; ASM: .short 0x1008 # Record kind: LF_PROCEDURE -; ASM: .long 0x3 # ReturnType -; ASM: .byte 0x0 # CallingConvention +; ASM: .long 0x3 # ReturnType: void +; ASM: .byte 0x0 # CallingConvention: NearC ; ASM: .byte 0x0 # FunctionOptions ; ASM: .short 0x3 # NumParameters -; ASM: .long 0x1000 # ArgListType +; ASM: .long 0x1000 # ArgListType: (float, double, __int64) ; ASM: # Procedure (0x1001) { ; ASM: # TypeLeafKind: LF_PROCEDURE (0x1008) ; ASM: # ReturnType: void (0x3) @@ -381,10 +383,11 @@ ; ASM: # NumParameters: 3 ; ASM: # ArgListType: (float, double, __int64) (0x1000) ; ASM: # } +; ASM: # FuncId (0x1002) ; ASM: .short 0xe # Record length ; ASM: .short 0x1601 # Record kind: LF_FUNC_ID ; ASM: .long 0x0 # ParentScope -; ASM: .long 0x1001 # FunctionType +; ASM: .long 0x1001 # FunctionType: void (float, double, __int64) ; ASM: .asciz "f" # Name ; ASM: .byte 242 ; ASM: .byte 241 @@ -394,10 +397,11 @@ ; ASM: # FunctionType: void (float, double, __int64) (0x1001) ; ASM: # Name: f ; ASM: # } +; ASM: # Modifier (0x1003) ; ASM: .short 0xa # Record length ; ASM: .short 0x1001 # Record kind: LF_MODIFIER -; ASM: .long 0x74 # ModifiedType -; ASM: .short 0x1 # Modifiers +; ASM: .long 0x74 # ModifiedType: int +; ASM: .short 0x1 # Modifiers ( Const (0x1) ) ; ASM: .byte 242 ; ASM: .byte 241 ; ASM: # Modifier (0x1003) { @@ -407,10 +411,11 @@ ; ASM: # Const (0x1) ; ASM: # ] ; ASM: # } +; ASM: # Pointer (0x1004) ; ASM: .short 0xa # Record length ; ASM: .short 0x1002 # Record kind: LF_POINTER -; ASM: .long 0x1003 # PointeeType -; ASM: .long 0x1000c # Attributes +; ASM: .long 0x1003 # PointeeType: const int +; ASM: .long 0x1000c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8 ] ; ASM: # Pointer (0x1004) { ; ASM: # TypeLeafKind: LF_POINTER (0x1002) ; ASM: # PointeeType: const int (0x1003) @@ -425,10 +430,11 @@ ; ASM: # IsThisPtr&&: 0 ; ASM: # SizeOf: 8 ; ASM: # } +; ASM: # Struct (0x1005) ; ASM: .short 0x16 # Record length ; ASM: .short 0x1505 # Record kind: LF_STRUCTURE ; ASM: .short 0x0 # MemberCount -; ASM: .short 0x80 # Properties +; ASM: .short 0x80 # Properties ( ForwardReference (0x80) ) ; ASM: .long 0x0 # FieldList ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape @@ -446,12 +452,13 @@ ; ASM: # SizeOf: 0 ; ASM: # Name: A ; ASM: # } +; ASM: # Pointer (0x1006) ; ASM: .short 0x12 # Record length ; ASM: .short 0x1002 # Record kind: LF_POINTER -; ASM: .long 0x74 # PointeeType -; ASM: .long 0x804c # Attributes -; ASM: .long 0x1005 # ClassType -; ASM: .short 0x4 # Representation +; ASM: .long 0x74 # PointeeType: int +; ASM: .long 0x804c # Attrs: [ Type: Near64, Mode: PointerToDataMember, SizeOf: 4 ] +; ASM: .long 0x1005 # ClassType: A +; ASM: .short 0x4 # Representation: GeneralData ; ASM: .byte 242 ; ASM: .byte 241 ; ASM: # Pointer (0x1006) { @@ -470,10 +477,11 @@ ; ASM: # ClassType: A (0x1005) ; ASM: # Representation: GeneralData (0x4) ; ASM: # } +; ASM: # Pointer (0x1007) ; ASM: .short 0xa # Record length ; ASM: .short 0x1002 # Record kind: LF_POINTER -; ASM: .long 0x1005 # PointeeType -; ASM: .long 0x1040c # Attributes +; ASM: .long 0x1005 # PointeeType: A +; ASM: .long 0x1040c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8, isConst ] ; ASM: # Pointer (0x1007) { ; ASM: # TypeLeafKind: LF_POINTER (0x1002) ; ASM: # PointeeType: A (0x1005) @@ -488,6 +496,7 @@ ; ASM: # IsThisPtr&&: 0 ; ASM: # SizeOf: 8 ; ASM: # } +; ASM: # ArgList (0x1008) ; ASM: .short 0x6 # Record length ; ASM: .short 0x1201 # Record kind: LF_ARGLIST ; ASM: .long 0x0 # NumArgs @@ -497,15 +506,16 @@ ; ASM: # Arguments [ ; ASM: # ] ; ASM: # } +; ASM: # MemberFunction (0x1009) ; ASM: .short 0x1a # Record length ; ASM: .short 0x1009 # Record kind: LF_MFUNCTION -; ASM: .long 0x3 # ReturnType -; ASM: .long 0x1005 # ClassType -; ASM: .long 0x1007 # ThisType -; ASM: .byte 0x0 # CallingConvention +; ASM: .long 0x3 # ReturnType: void +; ASM: .long 0x1005 # ClassType: A +; ASM: .long 0x1007 # ThisType: A* const +; ASM: .byte 0x0 # CallingConvention: NearC ; ASM: .byte 0x0 # FunctionOptions ; ASM: .short 0x0 # NumParameters -; ASM: .long 0x1008 # ArgListType +; ASM: .long 0x1008 # ArgListType: () ; ASM: .long 0x0 # ThisAdjustment ; ASM: # MemberFunction (0x1009) { ; ASM: # TypeLeafKind: LF_MFUNCTION (0x1009) @@ -519,16 +529,17 @@ ; ASM: # ArgListType: () (0x1008) ; ASM: # ThisAdjustment: 0 ; ASM: # } +; ASM: # FieldList (0x100A) ; ASM: .short 0x1e # Record length ; ASM: .short 0x1203 # Record kind: LF_FIELDLIST -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x74 # Type: int ; ASM: .short 0x0 # FieldOffset ; ASM: .asciz "a" # Name -; ASM: .short 0x1511 # Member kind: LF_ONEMETHOD -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x1009 # Type +; ASM: .short 0x1511 # Member kind: OneMethod ( LF_ONEMETHOD ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x1009 # Type: void A::() ; ASM: .asciz "A::f" # Name ; ASM: .byte 243 ; ASM: .byte 242 @@ -549,11 +560,12 @@ ; ASM: # Name: A::f ; ASM: # } ; ASM: # } +; ASM: # Struct (0x100B) ; ASM: .short 0x16 # Record length ; ASM: .short 0x1505 # Record kind: LF_STRUCTURE ; ASM: .short 0x2 # MemberCount ; ASM: .short 0x0 # Properties -; ASM: .long 0x100a # FieldList +; ASM: .long 0x100a # FieldList: ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape ; ASM: .short 0x4 # SizeOf @@ -569,6 +581,7 @@ ; ASM: # SizeOf: 4 ; ASM: # Name: A ; ASM: # } +; ASM: # StringId (0x100C) ; ASM: .short 0x1e # Record length ; ASM: .short 0x1605 # Record kind: LF_STRING_ID ; ASM: .long 0x0 # Id @@ -578,10 +591,11 @@ ; ASM: # Id: 0x0 ; ASM: # StringData: D:\src\llvm\build\t.cpp ; ASM: # } +; ASM: # UdtSourceLine (0x100D) ; ASM: .short 0xe # Record length ; ASM: .short 0x1606 # Record kind: LF_UDT_SRC_LINE -; ASM: .long 0x100b # UDT -; ASM: .long 0x100c # SourceFile +; ASM: .long 0x100b # UDT: A +; ASM: .long 0x100c # SourceFile: D:\src\llvm\build\t.cpp ; ASM: .long 0x1 # LineNumber ; ASM: # UdtSourceLine (0x100D) { ; ASM: # TypeLeafKind: LF_UDT_SRC_LINE (0x1606) @@ -589,12 +603,13 @@ ; ASM: # SourceFile: D:\src\llvm\build\t.cpp (0x100C) ; ASM: # LineNumber: 1 ; ASM: # } +; ASM: # Pointer (0x100E) ; ASM: .short 0x12 # Record length ; ASM: .short 0x1002 # Record kind: LF_POINTER -; ASM: .long 0x1009 # PointeeType -; ASM: .long 0x1006c # Attributes -; ASM: .long 0x1005 # ClassType -; ASM: .short 0x8 # Representation +; ASM: .long 0x1009 # PointeeType: void A::() +; ASM: .long 0x1006c # Attrs: [ Type: Near64, Mode: PointerToMemberFunction, SizeOf: 8 ] +; ASM: .long 0x1005 # ClassType: A +; ASM: .short 0x8 # Representation: GeneralFunction ; ASM: .byte 242 ; ASM: .byte 241 ; ASM: # Pointer (0x100E) { @@ -613,10 +628,11 @@ ; ASM: # ClassType: A (0x1005) ; ASM: # Representation: GeneralFunction (0x8) ; ASM: # } +; ASM: # Modifier (0x100F) ; ASM: .short 0xa # Record length ; ASM: .short 0x1001 # Record kind: LF_MODIFIER -; ASM: .long 0x3 # ModifiedType -; ASM: .short 0x1 # Modifiers +; ASM: .long 0x3 # ModifiedType: void +; ASM: .short 0x1 # Modifiers ( Const (0x1) ) ; ASM: .byte 242 ; ASM: .byte 241 ; ASM: # Modifier (0x100F) { @@ -626,10 +642,11 @@ ; ASM: # Const (0x1) ; ASM: # ] ; ASM: # } +; ASM: # Pointer (0x1010) ; ASM: .short 0xa # Record length ; ASM: .short 0x1002 # Record kind: LF_POINTER -; ASM: .long 0x100f # PointeeType -; ASM: .long 0x1000c # Attributes +; ASM: .long 0x100f # PointeeType: const void +; ASM: .long 0x1000c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8 ] ; ASM: # Pointer (0x1010) { ; ASM: # TypeLeafKind: LF_POINTER (0x1002) ; ASM: # PointeeType: const void (0x100F) @@ -644,13 +661,14 @@ ; ASM: # IsThisPtr&&: 0 ; ASM: # SizeOf: 8 ; ASM: # } +; ASM: # Procedure (0x1011) ; ASM: .short 0xe # Record length ; ASM: .short 0x1008 # Record kind: LF_PROCEDURE -; ASM: .long 0x3 # ReturnType -; ASM: .byte 0x0 # CallingConvention +; ASM: .long 0x3 # ReturnType: void +; ASM: .byte 0x0 # CallingConvention: NearC ; ASM: .byte 0x0 # FunctionOptions ; ASM: .short 0x0 # NumParameters -; ASM: .long 0x1008 # ArgListType +; ASM: .long 0x1008 # ArgListType: () ; ASM: # Procedure (0x1011) { ; ASM: # TypeLeafKind: LF_PROCEDURE (0x1008) ; ASM: # ReturnType: void (0x3) @@ -660,10 +678,11 @@ ; ASM: # NumParameters: 0 ; ASM: # ArgListType: () (0x1008) ; ASM: # } +; ASM: # FuncId (0x1012) ; ASM: .short 0x16 # Record length ; ASM: .short 0x1601 # Record kind: LF_FUNC_ID ; ASM: .long 0x0 # ParentScope -; ASM: .long 0x1011 # FunctionType +; ASM: .long 0x1011 # FunctionType: void () ; ASM: .asciz "CharTypes" # Name ; ASM: .byte 242 ; ASM: .byte 241 @@ -673,6 +692,7 @@ ; ASM: # FunctionType: void () (0x1011) ; ASM: # Name: CharTypes ; ASM: # } +; ASM: # StringId (0x1013) ; ASM: .short 0x1a # Record length ; ASM: .short 0x1605 # Record kind: LF_STRING_ID ; ASM: .long 0x0 # Id @@ -684,6 +704,7 @@ ; ASM: # Id: 0x0 ; ASM: # StringData: D:\src\llvm\build ; ASM: # } +; ASM: # StringId (0x1014) ; ASM: .short 0xe # Record length ; ASM: .short 0x1605 # Record kind: LF_STRING_ID ; ASM: .long 0x0 # Id @@ -695,12 +716,13 @@ ; ASM: # Id: 0x0 ; ASM: # StringData: t.cpp ; ASM: # } +; ASM: # BuildInfo (0x1015) ; ASM: .short 0x1a # Record length ; ASM: .short 0x1603 # Record kind: LF_BUILDINFO ; ASM: .short 0x5 # NumArgs -; ASM: .long 0x1013 # Argument +; ASM: .long 0x1013 # Argument: D:\src\llvm\build ; ASM: .long 0x0 # Argument -; ASM: .long 0x1014 # Argument +; ASM: .long 0x1014 # Argument: t.cpp ; ASM: .long 0x0 # Argument ; ASM: .long 0x0 # Argument ; ASM: .byte 242 Index: llvm/test/DebugInfo/COFF/types-data-members.ll =================================================================== --- llvm/test/DebugInfo/COFF/types-data-members.ll +++ llvm/test/DebugInfo/COFF/types-data-members.ll @@ -393,6 +393,7 @@ ; ASM: .section .debug$T,"dr" ; ASM: .p2align 2 ; ASM: .long 4 # Debug section magic +; ASM: # ArgList (0x1000) ; ASM: .short 0x6 # Record length ; ASM: .short 0x1201 # Record kind: LF_ARGLIST ; ASM: .long 0x0 # NumArgs @@ -402,13 +403,14 @@ ; ASM: # Arguments [ ; ASM: # ] ; ASM: # } +; ASM: # Procedure (0x1001) ; ASM: .short 0xe # Record length ; ASM: .short 0x1008 # Record kind: LF_PROCEDURE -; ASM: .long 0x3 # ReturnType -; ASM: .byte 0x0 # CallingConvention +; ASM: .long 0x3 # ReturnType: void +; ASM: .byte 0x0 # CallingConvention: NearC ; ASM: .byte 0x0 # FunctionOptions ; ASM: .short 0x0 # NumParameters -; ASM: .long 0x1000 # ArgListType +; ASM: .long 0x1000 # ArgListType: () ; ASM: # Procedure (0x1001) { ; ASM: # TypeLeafKind: LF_PROCEDURE (0x1008) ; ASM: # ReturnType: void (0x3) @@ -418,10 +420,11 @@ ; ASM: # NumParameters: 0 ; ASM: # ArgListType: () (0x1000) ; ASM: # } +; ASM: # FuncId (0x1002) ; ASM: .short 0x16 # Record length ; ASM: .short 0x1601 # Record kind: LF_FUNC_ID ; ASM: .long 0x0 # ParentScope -; ASM: .long 0x1001 # FunctionType +; ASM: .long 0x1001 # FunctionType: void () ; ASM: .asciz "UseTypes" # Name ; ASM: .byte 243 ; ASM: .byte 242 @@ -432,10 +435,11 @@ ; ASM: # FunctionType: void () (0x1001) ; ASM: # Name: UseTypes ; ASM: # } +; ASM: # Struct (0x1003) ; ASM: .short 0x2a # Record length ; ASM: .short 0x1505 # Record kind: LF_STRUCTURE ; ASM: .short 0x0 # MemberCount -; ASM: .short 0x280 # Properties +; ASM: .short 0x280 # Properties ( ForwardReference (0x80) | HasUniqueName (0x200) ) ; ASM: .long 0x0 # FieldList ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape @@ -458,10 +462,11 @@ ; ASM: # Name: Struct ; ASM: # LinkageName: .?AUStruct@@ ; ASM: # } +; ASM: # Modifier (0x1004) ; ASM: .short 0xa # Record length ; ASM: .short 0x1001 # Record kind: LF_MODIFIER -; ASM: .long 0x74 # ModifiedType -; ASM: .short 0x1 # Modifiers +; ASM: .long 0x74 # ModifiedType: int +; ASM: .short 0x1 # Modifiers ( Const (0x1) ) ; ASM: .byte 242 ; ASM: .byte 241 ; ASM: # Modifier (0x1004) { @@ -471,35 +476,36 @@ ; ASM: # Const (0x1) ; ASM: # ] ; ASM: # } +; ASM: # FieldList (0x1005) ; ASM: .short 0x3e # Record length ; ASM: .short 0x1203 # Record kind: LF_FIELDLIST -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x74 # Type: int ; ASM: .short 0x0 # FieldOffset ; ASM: .asciz "s1" # Name ; ASM: .byte 243 ; ASM: .byte 242 ; ASM: .byte 241 -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x74 # Type: int ; ASM: .short 0x4 # FieldOffset ; ASM: .asciz "s2" # Name ; ASM: .byte 243 ; ASM: .byte 242 ; ASM: .byte 241 -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x74 # Type: int ; ASM: .short 0x8 # FieldOffset ; ASM: .asciz "s3" # Name ; ASM: .byte 243 ; ASM: .byte 242 ; ASM: .byte 241 -; ASM: .short 0x150e # Member kind: LF_STMEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x1004 # Type +; ASM: .short 0x150e # Member kind: StaticDataMember ( LF_STMEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x1004 # Type: const int ; ASM: .asciz "sdm" # Name ; ASM: # FieldList (0x1005) { ; ASM: # TypeLeafKind: LF_FIELDLIST (0x1203) @@ -531,11 +537,12 @@ ; ASM: # Name: sdm ; ASM: # } ; ASM: # } +; ASM: # Struct (0x1006) ; ASM: .short 0x2a # Record length ; ASM: .short 0x1505 # Record kind: LF_STRUCTURE ; ASM: .short 0x4 # MemberCount -; ASM: .short 0x200 # Properties -; ASM: .long 0x1005 # FieldList +; ASM: .short 0x200 # Properties ( HasUniqueName (0x200) ) +; ASM: .long 0x1005 # FieldList: ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape ; ASM: .short 0xc # SizeOf @@ -556,6 +563,7 @@ ; ASM: # Name: Struct ; ASM: # LinkageName: .?AUStruct@@ ; ASM: # } +; ASM: # StringId (0x1007) ; ASM: .short 0x1e # Record length ; ASM: .short 0x1605 # Record kind: LF_STRING_ID ; ASM: .long 0x0 # Id @@ -565,10 +573,11 @@ ; ASM: # Id: 0x0 ; ASM: # StringData: D:\src\llvm\build\t.cpp ; ASM: # } +; ASM: # UdtSourceLine (0x1008) ; ASM: .short 0xe # Record length ; ASM: .short 0x1606 # Record kind: LF_UDT_SRC_LINE -; ASM: .long 0x1006 # UDT -; ASM: .long 0x1007 # SourceFile +; ASM: .long 0x1006 # UDT: Struct +; ASM: .long 0x1007 # SourceFile: D:\src\llvm\build\t.cpp ; ASM: .long 0x1 # LineNumber ; ASM: # UdtSourceLine (0x1008) { ; ASM: # TypeLeafKind: LF_UDT_SRC_LINE (0x1606) @@ -576,10 +585,11 @@ ; ASM: # SourceFile: D:\src\llvm\build\t.cpp (0x1007) ; ASM: # LineNumber: 1 ; ASM: # } +; ASM: # Union (0x1009) ; ASM: .short 0x1e # Record length ; ASM: .short 0x1506 # Record kind: LF_UNION ; ASM: .short 0x0 # MemberCount -; ASM: .short 0x280 # Properties +; ASM: .short 0x280 # Properties ( ForwardReference (0x80) | HasUniqueName (0x200) ) ; ASM: .long 0x0 # FieldList ; ASM: .short 0x0 # SizeOf ; ASM: .asciz "Union" # Name @@ -596,16 +606,17 @@ ; ASM: # Name: Union ; ASM: # LinkageName: .?ATUnion@@ ; ASM: # } +; ASM: # FieldList (0x100A) ; ASM: .short 0x1a # Record length ; ASM: .short 0x1203 # Record kind: LF_FIELDLIST -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x74 # Type: int ; ASM: .short 0x0 # FieldOffset ; ASM: .asciz "a" # Name -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x40 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x40 # Type: float ; ASM: .short 0x0 # FieldOffset ; ASM: .asciz "b" # Name ; ASM: # FieldList (0x100A) { @@ -625,11 +636,12 @@ ; ASM: # Name: b ; ASM: # } ; ASM: # } +; ASM: # Union (0x100B) ; ASM: .short 0x1e # Record length ; ASM: .short 0x1506 # Record kind: LF_UNION ; ASM: .short 0x2 # MemberCount -; ASM: .short 0x600 # Properties -; ASM: .long 0x100a # FieldList +; ASM: .short 0x600 # Properties ( HasUniqueName (0x200) | Sealed (0x400) ) +; ASM: .long 0x100a # FieldList: ; ASM: .short 0x4 # SizeOf ; ASM: .asciz "Union" # Name ; ASM: .asciz ".?ATUnion@@" # LinkageName @@ -645,10 +657,11 @@ ; ASM: # Name: Union ; ASM: # LinkageName: .?ATUnion@@ ; ASM: # } +; ASM: # UdtSourceLine (0x100C) ; ASM: .short 0xe # Record length ; ASM: .short 0x1606 # Record kind: LF_UDT_SRC_LINE -; ASM: .long 0x100b # UDT -; ASM: .long 0x1007 # SourceFile +; ASM: .long 0x100b # UDT: Union +; ASM: .long 0x1007 # SourceFile: D:\src\llvm\build\t.cpp ; ASM: .long 0x7 # LineNumber ; ASM: # UdtSourceLine (0x100C) { ; ASM: # TypeLeafKind: LF_UDT_SRC_LINE (0x1606) @@ -656,10 +669,11 @@ ; ASM: # SourceFile: D:\src\llvm\build\t.cpp (0x1007) ; ASM: # LineNumber: 7 ; ASM: # } +; ASM: # Class (0x100D) ; ASM: .short 0x26 # Record length ; ASM: .short 0x1504 # Record kind: LF_CLASS ; ASM: .short 0x0 # MemberCount -; ASM: .short 0x280 # Properties +; ASM: .short 0x280 # Properties ( ForwardReference (0x80) | HasUniqueName (0x200) ) ; ASM: .long 0x0 # FieldList ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape @@ -680,24 +694,25 @@ ; ASM: # Name: Class ; ASM: # LinkageName: .?AVClass@@ ; ASM: # } +; ASM: # FieldList (0x100E) ; ASM: .short 0x32 # Record length ; ASM: .short 0x1203 # Record kind: LF_FIELDLIST -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x74 # Type: int ; ASM: .short 0x0 # FieldOffset ; ASM: .asciz "pub" # Name ; ASM: .byte 242 ; ASM: .byte 241 -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x1 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x1 # Attrs: Private +; ASM: .long 0x74 # Type: int ; ASM: .short 0x4 # FieldOffset ; ASM: .asciz "priv" # Name ; ASM: .byte 241 -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x2 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x2 # Attrs: Protected +; ASM: .long 0x74 # Type: int ; ASM: .short 0x8 # FieldOffset ; ASM: .asciz "prot" # Name ; ASM: .byte 241 @@ -725,11 +740,12 @@ ; ASM: # Name: prot ; ASM: # } ; ASM: # } +; ASM: # Class (0x100F) ; ASM: .short 0x26 # Record length ; ASM: .short 0x1504 # Record kind: LF_CLASS ; ASM: .short 0x3 # MemberCount -; ASM: .short 0x200 # Properties -; ASM: .long 0x100e # FieldList +; ASM: .short 0x200 # Properties ( HasUniqueName (0x200) ) +; ASM: .long 0x100e # FieldList: ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape ; ASM: .short 0xc # SizeOf @@ -748,10 +764,11 @@ ; ASM: # Name: Class ; ASM: # LinkageName: .?AVClass@@ ; ASM: # } +; ASM: # UdtSourceLine (0x1010) ; ASM: .short 0xe # Record length ; ASM: .short 0x1606 # Record kind: LF_UDT_SRC_LINE -; ASM: .long 0x100f # UDT -; ASM: .long 0x1007 # SourceFile +; ASM: .long 0x100f # UDT: Class +; ASM: .long 0x1007 # SourceFile: D:\src\llvm\build\t.cpp ; ASM: .long 0xb # LineNumber ; ASM: # UdtSourceLine (0x1010) { ; ASM: # TypeLeafKind: LF_UDT_SRC_LINE (0x1606) @@ -759,10 +776,11 @@ ; ASM: # SourceFile: D:\src\llvm\build\t.cpp (0x1007) ; ASM: # LineNumber: 11 ; ASM: # } +; ASM: # Struct (0x1011) ; ASM: .short 0x36 # Record length ; ASM: .short 0x1505 # Record kind: LF_STRUCTURE ; ASM: .short 0x0 # MemberCount -; ASM: .short 0x280 # Properties +; ASM: .short 0x280 # Properties ( ForwardReference (0x80) | HasUniqueName (0x200) ) ; ASM: .long 0x0 # FieldList ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape @@ -785,10 +803,11 @@ ; ASM: # Name: DerivedClass ; ASM: # LinkageName: .?AUDerivedClass@@ ; ASM: # } +; ASM: # Pointer (0x1012) ; ASM: .short 0xa # Record length ; ASM: .short 0x1002 # Record kind: LF_POINTER -; ASM: .long 0x1004 # PointeeType -; ASM: .long 0x1000c # Attributes +; ASM: .long 0x1004 # PointeeType: const int +; ASM: .long 0x1000c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8 ] ; ASM: # Pointer (0x1012) { ; ASM: # TypeLeafKind: LF_POINTER (0x1002) ; ASM: # PointeeType: const int (0x1004) @@ -803,6 +822,7 @@ ; ASM: # IsThisPtr&&: 0 ; ASM: # SizeOf: 8 ; ASM: # } +; ASM: # VFTableShape (0x1013) ; ASM: .short 0x6 # Record length ; ASM: .short 0xa # Record kind: LF_VTSHAPE ; ASM: .short 0x1 # VFEntryCount @@ -812,10 +832,11 @@ ; ASM: # TypeLeafKind: LF_VTSHAPE (0xA) ; ASM: # VFEntryCount: 1 ; ASM: # } +; ASM: # Pointer (0x1014) ; ASM: .short 0xa # Record length ; ASM: .short 0x1002 # Record kind: LF_POINTER -; ASM: .long 0x1013 # PointeeType -; ASM: .long 0x1000c # Attributes +; ASM: .long 0x1013 # PointeeType: +; ASM: .long 0x1000c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8 ] ; ASM: # Pointer (0x1014) { ; ASM: # TypeLeafKind: LF_POINTER (0x1002) ; ASM: # PointeeType: (0x1013) @@ -830,26 +851,27 @@ ; ASM: # IsThisPtr&&: 0 ; ASM: # SizeOf: 8 ; ASM: # } +; ASM: # FieldList (0x1015) ; ASM: .short 0x32 # Record length ; ASM: .short 0x1203 # Record kind: LF_FIELDLIST -; ASM: .short 0x1400 # Member kind: LF_BCLASS -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x1003 # BaseType +; ASM: .short 0x1400 # Member kind: BaseClass ( LF_BCLASS ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x1003 # BaseType: Struct ; ASM: .short 0x0 # BaseOffset ; ASM: .byte 242 ; ASM: .byte 241 -; ASM: .short 0x1401 # Member kind: LF_VBCLASS -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x100d # BaseType -; ASM: .long 0x1012 # VBPtrType +; ASM: .short 0x1401 # Member kind: VirtualBaseClass ( LF_VBCLASS ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x100d # BaseType: Class +; ASM: .long 0x1012 # VBPtrType: const int* ; ASM: .short 0x0 # VBPtrOffset ; ASM: .short 0x1 # VBTableIndex -; ASM: .short 0x1409 # Member kind: LF_VFUNCTAB +; ASM: .short 0x1409 # Member kind: VFPtr ( LF_VFUNCTAB ) ; ASM: .short 0x0 # Padding -; ASM: .long 0x1014 # Type -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .long 0x1014 # Type: * +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x74 # Type: int ; ASM: .short 0x18 # FieldOffset ; ASM: .asciz "d" # Name ; ASM: # FieldList (0x1015) { @@ -880,11 +902,12 @@ ; ASM: # Name: d ; ASM: # } ; ASM: # } +; ASM: # Struct (0x1016) ; ASM: .short 0x36 # Record length ; ASM: .short 0x1505 # Record kind: LF_STRUCTURE ; ASM: .short 0x4 # MemberCount -; ASM: .short 0x200 # Properties -; ASM: .long 0x1015 # FieldList +; ASM: .short 0x200 # Properties ( HasUniqueName (0x200) ) +; ASM: .long 0x1015 # FieldList: ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape ; ASM: .short 0x30 # SizeOf @@ -905,10 +928,11 @@ ; ASM: # Name: DerivedClass ; ASM: # LinkageName: .?AUDerivedClass@@ ; ASM: # } +; ASM: # UdtSourceLine (0x1017) ; ASM: .short 0xe # Record length ; ASM: .short 0x1606 # Record kind: LF_UDT_SRC_LINE -; ASM: .long 0x1016 # UDT -; ASM: .long 0x1007 # SourceFile +; ASM: .long 0x1016 # UDT: DerivedClass +; ASM: .long 0x1007 # SourceFile: D:\src\llvm\build\t.cpp ; ASM: .long 0x14 # LineNumber ; ASM: # UdtSourceLine (0x1017) { ; ASM: # TypeLeafKind: LF_UDT_SRC_LINE (0x1606) @@ -916,10 +940,11 @@ ; ASM: # SourceFile: D:\src\llvm\build\t.cpp (0x1007) ; ASM: # LineNumber: 20 ; ASM: # } +; ASM: # Struct (0x1018) ; ASM: .short 0x36 # Record length ; ASM: .short 0x1505 # Record kind: LF_STRUCTURE ; ASM: .short 0x0 # MemberCount -; ASM: .short 0x288 # Properties +; ASM: .short 0x288 # Properties ( ForwardReference (0x80) | HasUniqueName (0x200) | Nested (0x8) ) ; ASM: .long 0x0 # FieldList ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape @@ -942,11 +967,12 @@ ; ASM: # Name: Class::Nested ; ASM: # LinkageName: .?AUNested@Class@@ ; ASM: # } +; ASM: # FieldList (0x1019) ; ASM: .short 0xe # Record length ; ASM: .short 0x1203 # Record kind: LF_FIELDLIST -; ASM: .short 0x150d # Member kind: LF_MEMBER -; ASM: .short 0x3 # AccessSpecifier -; ASM: .long 0x74 # Type +; ASM: .short 0x150d # Member kind: DataMember ( LF_MEMBER ) +; ASM: .short 0x3 # Attrs: Public +; ASM: .long 0x74 # Type: int ; ASM: .short 0x0 # FieldOffset ; ASM: .asciz "n" # Name ; ASM: # FieldList (0x1019) { @@ -959,11 +985,12 @@ ; ASM: # Name: n ; ASM: # } ; ASM: # } +; ASM: # Struct (0x101A) ; ASM: .short 0x36 # Record length ; ASM: .short 0x1505 # Record kind: LF_STRUCTURE ; ASM: .short 0x1 # MemberCount -; ASM: .short 0x208 # Properties -; ASM: .long 0x1019 # FieldList +; ASM: .short 0x208 # Properties ( HasUniqueName (0x200) | Nested (0x8) ) +; ASM: .long 0x1019 # FieldList: ; ASM: .long 0x0 # DerivedFrom ; ASM: .long 0x0 # VShape ; ASM: .short 0x4 # SizeOf @@ -984,10 +1011,11 @@ ; ASM: # Name: Class::Nested ; ASM: # LinkageName: .?AUNested@Class@@ ; ASM: # } +; ASM: # UdtSourceLine (0x101B) ; ASM: .short 0xe # Record length ; ASM: .short 0x1606 # Record kind: LF_UDT_SRC_LINE -; ASM: .long 0x101a # UDT -; ASM: .long 0x1007 # SourceFile +; ASM: .long 0x101a # UDT: Class::Nested +; ASM: .long 0x1007 # SourceFile: D:\src\llvm\build\t.cpp ; ASM: .long 0x17 # LineNumber ; ASM: # UdtSourceLine (0x101B) { ; ASM: # TypeLeafKind: LF_UDT_SRC_LINE (0x1606) @@ -995,10 +1023,11 @@ ; ASM: # SourceFile: D:\src\llvm\build\t.cpp (0x1007) ; ASM: # LineNumber: 23 ; ASM: # } +; ASM: # Pointer (0x101C) ; ASM: .short 0xa # Record length ; ASM: .short 0x1002 # Record kind: LF_POINTER -; ASM: .long 0x1011 # PointeeType -; ASM: .long 0x1040c # Attributes +; ASM: .long 0x1011 # PointeeType: DerivedClass +; ASM: .long 0x1040c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8, isConst ] ; ASM: # Pointer (0x101C) { ; ASM: # TypeLeafKind: LF_POINTER (0x1002) ; ASM: # PointeeType: DerivedClass (0x1011) @@ -1013,15 +1042,16 @@ ; ASM: # IsThisPtr&&: 0 ; ASM: # SizeOf: 8 ; ASM: # } +; ASM: # MemberFunction (0x101D) ; ASM: .short 0x1a # Record length ; ASM: .short 0x1009 # Record kind: LF_MFUNCTION -; ASM: .long 0x3 # ReturnType -; ASM: .long 0x1011 # ClassType -; ASM: .long 0x101c # ThisType -; ASM: .byte 0x0 # CallingConvention +; ASM: .long 0x3 # ReturnType: void +; ASM: .long 0x1011 # ClassType: DerivedClass +; ASM: .long 0x101c # ThisType: DerivedClass* const +; ASM: .byte 0x0 # CallingConvention: NearC ; ASM: .byte 0x0 # FunctionOptions ; ASM: .short 0x0 # NumParameters -; ASM: .long 0x1000 # ArgListType +; ASM: .long 0x1000 # ArgListType: () ; ASM: .long 0x0 # ThisAdjustment ; ASM: # MemberFunction (0x101D) { ; ASM: # TypeLeafKind: LF_MFUNCTION (0x1009) @@ -1035,10 +1065,11 @@ ; ASM: # ArgListType: () (0x1000) ; ASM: # ThisAdjustment: 0 ; ASM: # } +; ASM: # MemberFuncId (0x101E) ; ASM: .short 0x26 # Record length ; ASM: .short 0x1602 # Record kind: LF_MFUNC_ID -; ASM: .long 0x1011 # ClassType -; ASM: .long 0x101d # FunctionType +; ASM: .long 0x1011 # ClassType: DerivedClass +; ASM: .long 0x101d # FunctionType: void DerivedClass::() ; ASM: .asciz "DerivedClass::DerivedClass" # Name ; ASM: .byte 241 ; ASM: # MemberFuncId (0x101E) { @@ -1047,10 +1078,11 @@ ; ASM: # FunctionType: void DerivedClass::() (0x101D) ; ASM: # Name: DerivedClass::DerivedClass ; ASM: # } +; ASM: # Pointer (0x101F) ; ASM: .short 0xa # Record length ; ASM: .short 0x1002 # Record kind: LF_POINTER -; ASM: .long 0x1011 # PointeeType -; ASM: .long 0x1000c # Attributes +; ASM: .long 0x1011 # PointeeType: DerivedClass +; ASM: .long 0x1000c # Attrs: [ Type: Near64, Mode: Pointer, SizeOf: 8 ] ; ASM: # Pointer (0x101F) { ; ASM: # TypeLeafKind: LF_POINTER (0x1002) ; ASM: # PointeeType: DerivedClass (0x1011) @@ -1065,6 +1097,7 @@ ; ASM: # IsThisPtr&&: 0 ; ASM: # SizeOf: 8 ; ASM: # } +; ASM: # StringId (0x1020) ; ASM: .short 0x1a # Record length ; ASM: .short 0x1605 # Record kind: LF_STRING_ID ; ASM: .long 0x0 # Id @@ -1076,6 +1109,7 @@ ; ASM: # Id: 0x0 ; ASM: # StringData: D:\src\llvm\build ; ASM: # } +; ASM: # StringId (0x1021) ; ASM: .short 0xe # Record length ; ASM: .short 0x1605 # Record kind: LF_STRING_ID ; ASM: .long 0x0 # Id @@ -1087,12 +1121,13 @@ ; ASM: # Id: 0x0 ; ASM: # StringData: t.cpp ; ASM: # } +; ASM: # BuildInfo (0x1022) ; ASM: .short 0x1a # Record length ; ASM: .short 0x1603 # Record kind: LF_BUILDINFO ; ASM: .short 0x5 # NumArgs -; ASM: .long 0x1020 # Argument +; ASM: .long 0x1020 # Argument: D:\src\llvm\build ; ASM: .long 0x0 # Argument -; ASM: .long 0x1021 # Argument +; ASM: .long 0x1021 # Argument: t.cpp ; ASM: .long 0x0 # Argument ; ASM: .long 0x0 # Argument ; ASM: .byte 242