From: David Majnemer Date: Fri, 17 Jun 2016 16:13:21 +0000 (+0000) Subject: [CodeView] Refactor enumerator emission X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3891af66b31e37ba2e4cddacc09960e928029669;p=llvm [CodeView] Refactor enumerator emission This addresses Amjad's review comments on D21442. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273010 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 47adfc731fd..ce0f7ae3903 100644 --- a/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/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(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(Element)) { - Fields.writeEnumerator(EnumeratorRecord( - MemberAccess::Public, APSInt::getUnsigned(Enumerator->getValue()), - Enumerator->getName())); } // Skip other unrecognized kinds of elements. } diff --git a/test/DebugInfo/COFF/enum.ll b/test/DebugInfo/COFF/enum.ll index 6e511663f1d..ca177deb64d 100644 --- a/test/DebugInfo/COFF/enum.ll +++ b/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)