diff options
author | Reid Kleckner <rnk@google.com> | 2016-06-17 21:31:33 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2016-06-17 21:31:33 +0000 |
commit | 604105bb905692b66b07683a73df7ad7786626dc (patch) | |
tree | b3c6c250360612deca57453ab9ce380558a5b394 /llvm/lib/CodeGen/AsmPrinter | |
parent | 3739b95d4dd9e565ddaaff77d613a9269175e55e (diff) | |
download | bcm5719-llvm-604105bb905692b66b07683a73df7ad7786626dc.tar.gz bcm5719-llvm-604105bb905692b66b07683a73df7ad7786626dc.zip |
[codeview] Add DIFlags for pointer to member representations
Summary:
This seems like the least intrusive way to pass this information
through.
Fixes PR28151
Reviewers: majnemer, aprantl, dblaikie
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D21444
llvm-svn: 273053
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index ce0f7ae3903..b673a4bba46 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -979,20 +979,48 @@ TypeIndex CodeViewDebug::lowerTypePointer(const DIDerivedType *Ty) { return TypeTable.writePointer(PR); } +static PointerToMemberRepresentation translatePtrToMemberRep(bool IsPMF, + unsigned Flags) { + if (IsPMF) { + switch (Flags & DINode::FlagPtrToMemberRep) { + case 0: + return PointerToMemberRepresentation::GeneralFunction; + case DINode::FlagSingleInheritance: + return PointerToMemberRepresentation::SingleInheritanceFunction; + case DINode::FlagMultipleInheritance: + return PointerToMemberRepresentation::MultipleInheritanceFunction; + case DINode::FlagVirtualInheritance: + return PointerToMemberRepresentation::VirtualInheritanceFunction; + } + } else { + switch (Flags & DINode::FlagPtrToMemberRep) { + case 0: + return PointerToMemberRepresentation::GeneralData; + case DINode::FlagSingleInheritance: + return PointerToMemberRepresentation::SingleInheritanceData; + case DINode::FlagMultipleInheritance: + return PointerToMemberRepresentation::MultipleInheritanceData; + case DINode::FlagVirtualInheritance: + return PointerToMemberRepresentation::VirtualInheritanceData; + } + } + llvm_unreachable("invalid ptr to member representation"); +} + TypeIndex CodeViewDebug::lowerTypeMemberPointer(const DIDerivedType *Ty) { assert(Ty->getTag() == dwarf::DW_TAG_ptr_to_member_type); TypeIndex ClassTI = getTypeIndex(Ty->getClassType()); TypeIndex PointeeTI = getTypeIndex(Ty->getBaseType()); PointerKind PK = Asm->MAI->getPointerSize() == 8 ? PointerKind::Near64 : PointerKind::Near32; - PointerMode PM = isa<DISubroutineType>(Ty->getBaseType()) - ? PointerMode::PointerToMemberFunction - : PointerMode::PointerToDataMember; + bool IsPMF = isa<DISubroutineType>(Ty->getBaseType()); + PointerMode PM = IsPMF ? PointerMode::PointerToMemberFunction + : PointerMode::PointerToDataMember; PointerOptions PO = PointerOptions::None; // FIXME - // FIXME: Thread this ABI info through metadata. - PointerToMemberRepresentation PMR = PointerToMemberRepresentation::Unknown; - MemberPointerInfo MPI(ClassTI, PMR); - PointerRecord PR(PointeeTI, PK, PM, PO, Ty->getSizeInBits() / 8, MPI); + MemberPointerInfo MPI(ClassTI, + translatePtrToMemberRep(IsPMF, Ty->getFlags())); + uint64_t SizeInBytes = Ty->getSizeInBits() / 8; + PointerRecord PR(PointeeTI, PK, PM, PO, SizeInBytes, MPI); return TypeTable.writePointer(PR); } |