summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp26
-rw-r--r--llvm/test/DebugInfo/COFF/enum.ll2
2 files changed, 18 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
index 47adfc731fd..ce0f7ae3903 100644
--- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
@@ -1095,14 +1095,26 @@ static ClassOptions getRecordUniqueNameOption(const DICompositeType *Ty) {
TypeIndex CodeViewDebug::lowerTypeEnum(const DICompositeType *Ty) {
ClassOptions CO = ClassOptions::None | getRecordUniqueNameOption(Ty);
TypeIndex FTI;
- unsigned FieldCount = 0;
+ unsigned EnumeratorCount = 0;
- if (Ty->isForwardDecl())
+ if (Ty->isForwardDecl()) {
CO |= ClassOptions::ForwardReference;
- else
- std::tie(FTI, FieldCount) = lowerRecordFieldList(Ty);
+ } else {
+ FieldListRecordBuilder Fields;
+ for (const DINode *Element : Ty->getElements()) {
+ // We assume that the frontend provides all members in source declaration
+ // order, which is what MSVC does.
+ if (auto *Enumerator = dyn_cast_or_null<DIEnumerator>(Element)) {
+ Fields.writeEnumerator(EnumeratorRecord(
+ MemberAccess::Public, APSInt::getUnsigned(Enumerator->getValue()),
+ Enumerator->getName()));
+ EnumeratorCount++;
+ }
+ }
+ FTI = TypeTable.writeFieldList(Fields);
+ }
- return TypeTable.writeEnum(EnumRecord(FieldCount, CO, FTI, Ty->getName(),
+ return TypeTable.writeEnum(EnumRecord(EnumeratorCount, CO, FTI, Ty->getName(),
Ty->getIdentifier(),
getTypeIndex(Ty->getBaseType())));
}
@@ -1198,10 +1210,6 @@ CodeViewDebug::lowerRecordFieldList(const DICompositeType *Ty) {
}
// FIXME: Get clang to emit nested types here and do something with
// them.
- } else if (auto *Enumerator = dyn_cast<DIEnumerator>(Element)) {
- Fields.writeEnumerator(EnumeratorRecord(
- MemberAccess::Public, APSInt::getUnsigned(Enumerator->getValue()),
- Enumerator->getName()));
}
// Skip other unrecognized kinds of elements.
}
diff --git a/llvm/test/DebugInfo/COFF/enum.ll b/llvm/test/DebugInfo/COFF/enum.ll
index 6e511663f1d..ca177deb64d 100644
--- a/llvm/test/DebugInfo/COFF/enum.ll
+++ b/llvm/test/DebugInfo/COFF/enum.ll
@@ -15,7 +15,7 @@
; CHECK-NEXT: }
; CHECK-NEXT: Enum (0x1001) {
; CHECK-NEXT: TypeLeafKind: LF_ENUM (0x1507)
-; CHECK-NEXT: NumEnumerators: 0
+; CHECK-NEXT: NumEnumerators: 1
; CHECK-NEXT: Properties [ (0x0)
; CHECK-NEXT: ]
; CHECK-NEXT: UnderlyingType: int (0x74)
OpenPOWER on IntegriCloud