summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2016-06-17 21:31:33 +0000
committerReid Kleckner <rnk@google.com>2016-06-17 21:31:33 +0000
commit604105bb905692b66b07683a73df7ad7786626dc (patch)
treeb3c6c250360612deca57453ab9ce380558a5b394 /llvm/lib/CodeGen/AsmPrinter
parent3739b95d4dd9e565ddaaff77d613a9269175e55e (diff)
downloadbcm5719-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.cpp42
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);
}
OpenPOWER on IntegriCloud