[CodeView] Emit UdtSourceLine information for enums
authorAaron Smith <aaron.smith@microsoft.com>
Tue, 6 Mar 2018 18:20:22 +0000 (18:20 +0000)
committerAaron Smith <aaron.smith@microsoft.com>
Tue, 6 Mar 2018 18:20:22 +0000 (18:20 +0000)
Summary:
- Emit UdtSourceLine information for enums to match MSVC

- Add a method to add UDTSrcLine and call it for all Class/Struct/Union/Enum

- Update test cases to verify the changes

Reviewers: zturner, llvm-commits, rnk

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D44116

llvm-svn: 326824

llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h
llvm/test/DebugInfo/COFF/enum.ll
llvm/test/DebugInfo/COFF/nested-types.ll

index 058a0e89c5f87b3e0d88e07754563843f73fd163..3fac7220727b774149a943dfaa371762942ff816 100644 (file)
@@ -1769,6 +1769,26 @@ static ClassOptions getCommonClassOptions(const DICompositeType *Ty) {
   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 @@ TypeIndex CodeViewDebug::lowerTypeEnum(const DICompositeType *Ty) {
 
   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 @@ TypeIndex CodeViewDebug::lowerCompleteTypeClass(const DICompositeType *Ty) {
                  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 @@ TypeIndex CodeViewDebug::lowerCompleteTypeUnion(const DICompositeType *Ty) {
                  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 62fc4eaba7e68a14d01fce66a35ada202fb31d4d..fdc8dd4a1e8b17ef2a52c50b4e5ee164ad4b0723 100644 (file)
@@ -279,6 +279,8 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {
 
   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 04e4e934ca274447596e404f3a9d8e6dd35bcb6b..108fd4d1b715415403f2336d383b22425ba16038 100644 (file)
 ; CHECK-NEXT:    FieldListType: <field list> (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: \<stdin>
+; CHECK-NEXT:  }
+; CHECK-NEXT:  UdtSourceLine (0x1003) {
+; CHECK-NEXT:    TypeLeafKind: LF_UDT_SRC_LINE (0x1606)
+; CHECK-NEXT:    UDT: E (0x1001)
+; CHECK-NEXT:    SourceFile: \<stdin> (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 b0263b5270db8566ca88b6628b6ea14a8b323cf1..cd3ee3fa5559e942973c165316a80a0353f36473 100644 (file)
@@ -134,7 +134,7 @@ target triple = "x86_64-pc-windows-msvc19.0.24215"
 ; CHECK-NEXT:   }
 ; CHECK-NEXT: }
 ;
-; CHECK:      Struct (0x1007) {
+; CHECK:      Struct (0x{{.*}}) {
 ; CHECK-NEXT:   TypeLeafKind: LF_STRUCTURE (0x1505)
 ; CHECK-NEXT:   MemberCount: 4
 ; CHECK-NEXT:   Properties [ (0x210)