Index: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h +++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h @@ -279,6 +279,8 @@ void addToUDTs(const DIType *Ty); + void addUDTSrcLine(const DIType *Ty, codeview::TypeIndex TI); + codeview::TypeIndex lowerType(const DIType *Ty, const DIType *ClassTy); codeview::TypeIndex lowerTypeAlias(const DIDerivedType *Ty); codeview::TypeIndex lowerTypeArray(const DICompositeType *Ty); Index: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -1769,6 +1769,26 @@ return CO; } +void CodeViewDebug::addUDTSrcLine(const DIType *Ty, TypeIndex TI) { + switch (Ty->getTag()) { + case dwarf::DW_TAG_class_type: + case dwarf::DW_TAG_structure_type: + case dwarf::DW_TAG_union_type: + case dwarf::DW_TAG_enumeration_type: + break; + default: + return; + } + + if (const auto *File = Ty->getFile()) { + StringIdRecord SIDR(TypeIndex(0x0), getFullFilepath(File)); + TypeIndex SIDI = TypeTable.writeLeafType(SIDR); + + UdtSourceLineRecord USLR(TI, SIDI, Ty->getLine()); + TypeTable.writeLeafType(USLR); + } +} + TypeIndex CodeViewDebug::lowerTypeEnum(const DICompositeType *Ty) { ClassOptions CO = getCommonClassOptions(Ty); TypeIndex FTI; @@ -1797,7 +1817,11 @@ EnumRecord ER(EnumeratorCount, CO, FTI, FullName, Ty->getIdentifier(), getTypeIndex(Ty->getBaseType())); - return TypeTable.writeLeafType(ER); + TypeIndex EnumTI = TypeTable.writeLeafType(ER); + + addUDTSrcLine(Ty, EnumTI); + + return EnumTI; } //===----------------------------------------------------------------------===// @@ -1949,13 +1973,7 @@ SizeInBytes, FullName, Ty->getIdentifier()); TypeIndex ClassTI = TypeTable.writeLeafType(CR); - if (const auto *File = Ty->getFile()) { - StringIdRecord SIDR(TypeIndex(0x0), getFullFilepath(File)); - TypeIndex SIDI = TypeTable.writeLeafType(SIDR); - - UdtSourceLineRecord USLR(ClassTI, SIDI, Ty->getLine()); - TypeTable.writeLeafType(USLR); - } + addUDTSrcLine(Ty, ClassTI); addToUDTs(Ty); @@ -1991,11 +2009,7 @@ Ty->getIdentifier()); TypeIndex UnionTI = TypeTable.writeLeafType(UR); - StringIdRecord SIR(TypeIndex(0x0), getFullFilepath(Ty->getFile())); - TypeIndex SIRI = TypeTable.writeLeafType(SIR); - - UdtSourceLineRecord USLR(UnionTI, SIRI, Ty->getLine()); - TypeTable.writeLeafType(USLR); + addUDTSrcLine(Ty, UnionTI); addToUDTs(Ty); Index: llvm/trunk/test/DebugInfo/COFF/enum.ll =================================================================== --- llvm/trunk/test/DebugInfo/COFF/enum.ll +++ llvm/trunk/test/DebugInfo/COFF/enum.ll @@ -23,6 +23,17 @@ ; CHECK-NEXT: FieldListType: (0x1000) ; CHECK-NEXT: Name: E ; CHECK-NEXT: } +; CHECK-NEXT: StringId (0x1002) { +; CHECK-NEXT: TypeLeafKind: LF_STRING_ID (0x1605) +; CHECK-NEXT: Id: 0x0 +; CHECK-NEXT: StringData: \ +; CHECK-NEXT: } +; CHECK-NEXT: UdtSourceLine (0x1003) { +; CHECK-NEXT: TypeLeafKind: LF_UDT_SRC_LINE (0x1606) +; CHECK-NEXT: UDT: E (0x1001) +; CHECK-NEXT: SourceFile: \ (0x1002) +; CHECK-NEXT: LineNumber: 1 +; CHECK_NEXT } source_filename = "test/DebugInfo/COFF/enum.ll" target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" Index: llvm/trunk/test/DebugInfo/COFF/nested-types.ll =================================================================== --- llvm/trunk/test/DebugInfo/COFF/nested-types.ll +++ llvm/trunk/test/DebugInfo/COFF/nested-types.ll @@ -134,7 +134,7 @@ ; CHECK-NEXT: } ; CHECK-NEXT: } ; -; CHECK: Struct (0x1007) { +; CHECK: Struct (0x{{.*}}) { ; CHECK-NEXT: TypeLeafKind: LF_STRUCTURE (0x1505) ; CHECK-NEXT: MemberCount: 4 ; CHECK-NEXT: Properties [ (0x210)