static void StreamArr(llvm::raw_ostream& o, const void* V, clang::QualType Ty, clang::ASTContext& C) { const clang::ArrayType* ArrTy = Ty->getAsArrayTypeUnsafe(); clang::QualType ElementTy = ArrTy->getElementType(); if (ElementTy->isCharType()) StreamCharPtr(o, (const char*)V); else if (Ty->isConstantArrayType()) { // Stream a constant array by streaming up to 5 elements. const clang::ConstantArrayType* CArrTy = C.getAsConstantArrayType(Ty); const llvm::APInt& APSize = CArrTy->getSize(); size_t ElBytes = C.getTypeSize(ElementTy) / C.getCharWidth(); size_t Size = (size_t)APSize.getZExtValue(); o << "{ "; for (size_t i = 0; i < Size; ++i) { StreamValue(o, (const char*) V + i * ElBytes, ElementTy, C); if (i + 1 < Size) { if (i == 4) { o << "..."; break; } else o << ", "; } } o << " }"; } else StreamPtr(o, V); }
static lldb_private::Scalar::Type GetScalarTypeForClangType (clang::ASTContext &ast_context, clang::QualType clang_type, uint32_t &count) { count = 1; switch (clang_type->getTypeClass()) { default: break; case clang::Type::FunctionNoProto: case clang::Type::FunctionProto: break; case clang::Type::IncompleteArray: case clang::Type::VariableArray: break; case clang::Type::ConstantArray: break; case clang::Type::ExtVector: case clang::Type::Vector: // TODO: Set this to more than one??? break; case clang::Type::Builtin: switch (cast<clang::BuiltinType>(clang_type)->getKind()) { default: assert(0 && "Unknown builtin type!"); case clang::BuiltinType::Void: break; case clang::BuiltinType::Bool: case clang::BuiltinType::Char_S: case clang::BuiltinType::SChar: case clang::BuiltinType::WChar: case clang::BuiltinType::Char16: case clang::BuiltinType::Char32: case clang::BuiltinType::Short: case clang::BuiltinType::Int: case clang::BuiltinType::Long: case clang::BuiltinType::LongLong: case clang::BuiltinType::Int128: return lldb_private::Scalar::GetValueTypeForSignedIntegerWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); case clang::BuiltinType::Char_U: case clang::BuiltinType::UChar: case clang::BuiltinType::UShort: case clang::BuiltinType::UInt: case clang::BuiltinType::ULong: case clang::BuiltinType::ULongLong: case clang::BuiltinType::UInt128: case clang::BuiltinType::NullPtr: return lldb_private::Scalar::GetValueTypeForUnsignedIntegerWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); case clang::BuiltinType::Float: case clang::BuiltinType::Double: case clang::BuiltinType::LongDouble: return lldb_private::Scalar::GetValueTypeForFloatWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); } break; // All pointer types are represented as unsigned integer encodings. // We may nee to add a eEncodingPointer if we ever need to know the // difference case clang::Type::ObjCObjectPointer: case clang::Type::BlockPointer: case clang::Type::Pointer: case clang::Type::LValueReference: case clang::Type::RValueReference: case clang::Type::MemberPointer: return lldb_private::Scalar::GetValueTypeForUnsignedIntegerWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); // Complex numbers are made up of floats case clang::Type::Complex: count = 2; return lldb_private::Scalar::GetValueTypeForFloatWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT) / count); case clang::Type::ObjCInterface: break; case clang::Type::Record: break; case clang::Type::Enum: return lldb_private::Scalar::GetValueTypeForSignedIntegerWithByteSize ((ast_context.getTypeSize(clang_type)/CHAR_BIT)/count); case clang::Type::Typedef: return GetScalarTypeForClangType(ast_context, cast<clang::TypedefType>(clang_type)->LookThroughTypedefs(), count); break; case clang::Type::TypeOfExpr: case clang::Type::TypeOf: case clang::Type::Decltype: //case clang::Type::QualifiedName: case clang::Type::TemplateSpecialization: break; } count = 0; return lldb_private::Scalar::e_void; }