diff options
| author | Reid Kleckner <rnk@google.com> | 2016-06-17 22:14:39 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2016-06-17 22:14:39 +0000 |
| commit | 6fa1546ad9f07263c384e0ba5a6f92e197934711 (patch) | |
| tree | 14d1faa72699e761809964caf7ead9405df56bd3 /llvm/lib/CodeGen/AsmPrinter | |
| parent | aecc0267e2baed5c1fbf1cdd346481a0a20d1e71 (diff) | |
| download | bcm5719-llvm-6fa1546ad9f07263c384e0ba5a6f92e197934711.tar.gz bcm5719-llvm-6fa1546ad9f07263c384e0ba5a6f92e197934711.zip | |
[codeview] Emit incomplete member pointer types with the unknown model
An incomplete member pointer type will always have a size of zero, so we
don't need an extra flag. Credit to David Majnemer for the idea.
llvm-svn: 273057
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index b673a4bba46..a182afd81b9 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -979,12 +979,16 @@ TypeIndex CodeViewDebug::lowerTypePointer(const DIDerivedType *Ty) { return TypeTable.writePointer(PR); } -static PointerToMemberRepresentation translatePtrToMemberRep(bool IsPMF, - unsigned Flags) { +static PointerToMemberRepresentation +translatePtrToMemberRep(unsigned SizeInBytes, bool IsPMF, unsigned Flags) { + // SizeInBytes being zero generally implies that the member pointer type was + // incomplete, which can happen if it is part of a function prototype. In this + // case, use the unknown model instead of the general model. if (IsPMF) { switch (Flags & DINode::FlagPtrToMemberRep) { case 0: - return PointerToMemberRepresentation::GeneralFunction; + return SizeInBytes == 0 ? PointerToMemberRepresentation::Unknown + : PointerToMemberRepresentation::GeneralFunction; case DINode::FlagSingleInheritance: return PointerToMemberRepresentation::SingleInheritanceFunction; case DINode::FlagMultipleInheritance: @@ -995,7 +999,8 @@ static PointerToMemberRepresentation translatePtrToMemberRep(bool IsPMF, } else { switch (Flags & DINode::FlagPtrToMemberRep) { case 0: - return PointerToMemberRepresentation::GeneralData; + return SizeInBytes == 0 ? PointerToMemberRepresentation::Unknown + : PointerToMemberRepresentation::GeneralData; case DINode::FlagSingleInheritance: return PointerToMemberRepresentation::SingleInheritanceData; case DINode::FlagMultipleInheritance: @@ -1017,9 +1022,10 @@ TypeIndex CodeViewDebug::lowerTypeMemberPointer(const DIDerivedType *Ty) { PointerMode PM = IsPMF ? PointerMode::PointerToMemberFunction : PointerMode::PointerToDataMember; PointerOptions PO = PointerOptions::None; // FIXME - MemberPointerInfo MPI(ClassTI, - translatePtrToMemberRep(IsPMF, Ty->getFlags())); - uint64_t SizeInBytes = Ty->getSizeInBits() / 8; + assert(Ty->getSizeInBits() / 8 <= 0xff && "pointer size too big"); + uint8_t SizeInBytes = Ty->getSizeInBits() / 8; + MemberPointerInfo MPI( + ClassTI, translatePtrToMemberRep(SizeInBytes, IsPMF, Ty->getFlags())); PointerRecord PR(PointeeTI, PK, PM, PO, SizeInBytes, MPI); return TypeTable.writePointer(PR); } |

