void CVTypeDumperImpl::visitPointer(TypeLeafKind Leaf, PointerRecord &Ptr) { printTypeIndex("PointeeType", Ptr.getReferentType()); W.printHex("PointerAttributes", uint32_t(Ptr.getOptions())); W.printEnum("PtrType", unsigned(Ptr.getPointerKind()), makeArrayRef(PtrKindNames)); W.printEnum("PtrMode", unsigned(Ptr.getMode()), makeArrayRef(PtrModeNames)); W.printNumber("IsFlat", Ptr.isFlat()); W.printNumber("IsConst", Ptr.isConst()); W.printNumber("IsVolatile", Ptr.isVolatile()); W.printNumber("IsUnaligned", Ptr.isUnaligned()); if (Ptr.isPointerToMember()) { const MemberPointerInfo &MI = Ptr.getMemberInfo(); printTypeIndex("ClassType", MI.getContainingType()); W.printEnum("Representation", uint16_t(MI.getRepresentation()), makeArrayRef(PtrMemberRepNames)); StringRef PointeeName = getTypeName(Ptr.getReferentType()); StringRef ClassName = getTypeName(MI.getContainingType()); SmallString<256> TypeName(PointeeName); TypeName.push_back(' '); TypeName.append(ClassName); TypeName.append("::*"); Name = CVTD.saveName(TypeName); } else { SmallString<256> TypeName; if (Ptr.isConst()) TypeName.append("const "); if (Ptr.isVolatile()) TypeName.append("volatile "); if (Ptr.isUnaligned()) TypeName.append("__unaligned "); TypeName.append(getTypeName(Ptr.getReferentType())); if (Ptr.getMode() == PointerMode::LValueReference) TypeName.append("&"); else if (Ptr.getMode() == PointerMode::RValueReference) TypeName.append("&&"); else if (Ptr.getMode() == PointerMode::Pointer) TypeName.append("*"); if (!TypeName.empty()) Name = CVTD.saveName(TypeName); } }
Error TypeNameComputer::visitKnownRecord(CVType &CVR, PointerRecord &Ptr) { if (Ptr.isPointerToMember()) { const MemberPointerInfo &MI = Ptr.getMemberInfo(); StringRef Pointee = Types.getTypeName(Ptr.getReferentType()); StringRef Class = Types.getTypeName(MI.getContainingType()); Name = formatv("{0} {1}::*", Pointee, Class); } else { Name.append(Types.getTypeName(Ptr.getReferentType())); if (Ptr.getMode() == PointerMode::LValueReference) Name.append("&"); else if (Ptr.getMode() == PointerMode::RValueReference) Name.append("&&"); else if (Ptr.getMode() == PointerMode::Pointer) Name.append("*"); // Qualifiers in pointer records apply to the pointer, not the pointee, so // they go on the right. if (Ptr.isConst()) Name.append(" const"); if (Ptr.isVolatile()) Name.append(" volatile"); if (Ptr.isUnaligned()) Name.append(" __unaligned"); if (Ptr.isRestrict()) Name.append(" __restrict"); } return Error::success(); }
Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, PointerRecord &Ptr) { printTypeIndex("PointeeType", Ptr.getReferentType()); W->printEnum("PtrType", unsigned(Ptr.getPointerKind()), makeArrayRef(PtrKindNames)); W->printEnum("PtrMode", unsigned(Ptr.getMode()), makeArrayRef(PtrModeNames)); W->printNumber("IsFlat", Ptr.isFlat()); W->printNumber("IsConst", Ptr.isConst()); W->printNumber("IsVolatile", Ptr.isVolatile()); W->printNumber("IsUnaligned", Ptr.isUnaligned()); W->printNumber("IsRestrict", Ptr.isRestrict()); W->printNumber("IsThisPtr&", Ptr.isLValueReferenceThisPtr()); W->printNumber("IsThisPtr&&", Ptr.isRValueReferenceThisPtr()); W->printNumber("SizeOf", Ptr.getSize()); if (Ptr.isPointerToMember()) { const MemberPointerInfo &MI = Ptr.getMemberInfo(); printTypeIndex("ClassType", MI.getContainingType()); W->printEnum("Representation", uint16_t(MI.getRepresentation()), makeArrayRef(PtrMemberRepNames)); } return Error::success(); }