diff options
author | Aaron Smith <aaron.smith@microsoft.com> | 2018-03-06 18:20:22 +0000 |
---|---|---|
committer | Aaron Smith <aaron.smith@microsoft.com> | 2018-03-06 18:20:22 +0000 |
commit | 122d9e79ae0fcc41be6066c3928dd59e5cc59ca6 (patch) | |
tree | df65145069f986316bff30cf0ec601cc96de3705 | |
parent | ed2211d50fec431b40d77f4573434fecf3923660 (diff) | |
download | bcm5719-llvm-122d9e79ae0fcc41be6066c3928dd59e5cc59ca6.tar.gz bcm5719-llvm-122d9e79ae0fcc41be6066c3928dd59e5cc59ca6.zip |
[CodeView] Emit UdtSourceLine information for enums
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
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 40 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h | 2 | ||||
-rw-r--r-- | llvm/test/DebugInfo/COFF/enum.ll | 11 | ||||
-rw-r--r-- | llvm/test/DebugInfo/COFF/nested-types.ll | 2 |
4 files changed, 41 insertions, 14 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 058a0e89c5f..3fac7220727 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -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); diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h index 62fc4eaba7e..fdc8dd4a1e8 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h @@ -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); diff --git a/llvm/test/DebugInfo/COFF/enum.ll b/llvm/test/DebugInfo/COFF/enum.ll index 04e4e934ca2..108fd4d1b71 100644 --- a/llvm/test/DebugInfo/COFF/enum.ll +++ b/llvm/test/DebugInfo/COFF/enum.ll @@ -23,6 +23,17 @@ ; 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" diff --git a/llvm/test/DebugInfo/COFF/nested-types.ll b/llvm/test/DebugInfo/COFF/nested-types.ll index b0263b5270d..cd3ee3fa555 100644 --- a/llvm/test/DebugInfo/COFF/nested-types.ll +++ b/llvm/test/DebugInfo/COFF/nested-types.ll @@ -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) |