lldb::Encoding TypeSystemClang::GetEncoding()

in lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp [4749:5132]


lldb::Encoding TypeSystemClang::GetEncoding(lldb::opaque_compiler_type_t type,
                                            uint64_t &count) {
  if (!type)
    return lldb::eEncodingInvalid;

  count = 1;
  clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));

  switch (qual_type->getTypeClass()) {
  case clang::Type::Atomic:
  case clang::Type::Auto:
  case clang::Type::Decltype:
  case clang::Type::Elaborated:
  case clang::Type::Paren:
  case clang::Type::Typedef:
  case clang::Type::TypeOf:
  case clang::Type::TypeOfExpr:
  case clang::Type::Using:
    llvm_unreachable("Handled in RemoveWrappingTypes!");

  case clang::Type::UnaryTransform:
    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::DependentVector:
  case clang::Type::ExtVector:
  case clang::Type::Vector:
    // TODO: Set this to more than one???
    break;

  case clang::Type::BitInt:
  case clang::Type::DependentBitInt:
    return qual_type->isUnsignedIntegerType() ? lldb::eEncodingUint
                                              : lldb::eEncodingSint;

  case clang::Type::Builtin:
    switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
    case clang::BuiltinType::Void:
      break;

    case clang::BuiltinType::Char_S:
    case clang::BuiltinType::SChar:
    case clang::BuiltinType::WChar_S:
    case clang::BuiltinType::Short:
    case clang::BuiltinType::Int:
    case clang::BuiltinType::Long:
    case clang::BuiltinType::LongLong:
    case clang::BuiltinType::Int128:
      return lldb::eEncodingSint;

    case clang::BuiltinType::Bool:
    case clang::BuiltinType::Char_U:
    case clang::BuiltinType::UChar:
    case clang::BuiltinType::WChar_U:
    case clang::BuiltinType::Char8:
    case clang::BuiltinType::Char16:
    case clang::BuiltinType::Char32:
    case clang::BuiltinType::UShort:
    case clang::BuiltinType::UInt:
    case clang::BuiltinType::ULong:
    case clang::BuiltinType::ULongLong:
    case clang::BuiltinType::UInt128:
      return lldb::eEncodingUint;

    // Fixed point types. Note that they are currently ignored.
    case clang::BuiltinType::ShortAccum:
    case clang::BuiltinType::Accum:
    case clang::BuiltinType::LongAccum:
    case clang::BuiltinType::UShortAccum:
    case clang::BuiltinType::UAccum:
    case clang::BuiltinType::ULongAccum:
    case clang::BuiltinType::ShortFract:
    case clang::BuiltinType::Fract:
    case clang::BuiltinType::LongFract:
    case clang::BuiltinType::UShortFract:
    case clang::BuiltinType::UFract:
    case clang::BuiltinType::ULongFract:
    case clang::BuiltinType::SatShortAccum:
    case clang::BuiltinType::SatAccum:
    case clang::BuiltinType::SatLongAccum:
    case clang::BuiltinType::SatUShortAccum:
    case clang::BuiltinType::SatUAccum:
    case clang::BuiltinType::SatULongAccum:
    case clang::BuiltinType::SatShortFract:
    case clang::BuiltinType::SatFract:
    case clang::BuiltinType::SatLongFract:
    case clang::BuiltinType::SatUShortFract:
    case clang::BuiltinType::SatUFract:
    case clang::BuiltinType::SatULongFract:
      break;

    case clang::BuiltinType::Half:
    case clang::BuiltinType::Float:
    case clang::BuiltinType::Float16:
    case clang::BuiltinType::Float128:
    case clang::BuiltinType::Double:
    case clang::BuiltinType::LongDouble:
    case clang::BuiltinType::BFloat16:
    case clang::BuiltinType::Ibm128:
      return lldb::eEncodingIEEE754;

    case clang::BuiltinType::ObjCClass:
    case clang::BuiltinType::ObjCId:
    case clang::BuiltinType::ObjCSel:
      return lldb::eEncodingUint;

    case clang::BuiltinType::NullPtr:
      return lldb::eEncodingUint;

    case clang::BuiltinType::Kind::ARCUnbridgedCast:
    case clang::BuiltinType::Kind::BoundMember:
    case clang::BuiltinType::Kind::BuiltinFn:
    case clang::BuiltinType::Kind::Dependent:
    case clang::BuiltinType::Kind::OCLClkEvent:
    case clang::BuiltinType::Kind::OCLEvent:
    case clang::BuiltinType::Kind::OCLImage1dRO:
    case clang::BuiltinType::Kind::OCLImage1dWO:
    case clang::BuiltinType::Kind::OCLImage1dRW:
    case clang::BuiltinType::Kind::OCLImage1dArrayRO:
    case clang::BuiltinType::Kind::OCLImage1dArrayWO:
    case clang::BuiltinType::Kind::OCLImage1dArrayRW:
    case clang::BuiltinType::Kind::OCLImage1dBufferRO:
    case clang::BuiltinType::Kind::OCLImage1dBufferWO:
    case clang::BuiltinType::Kind::OCLImage1dBufferRW:
    case clang::BuiltinType::Kind::OCLImage2dRO:
    case clang::BuiltinType::Kind::OCLImage2dWO:
    case clang::BuiltinType::Kind::OCLImage2dRW:
    case clang::BuiltinType::Kind::OCLImage2dArrayRO:
    case clang::BuiltinType::Kind::OCLImage2dArrayWO:
    case clang::BuiltinType::Kind::OCLImage2dArrayRW:
    case clang::BuiltinType::Kind::OCLImage2dArrayDepthRO:
    case clang::BuiltinType::Kind::OCLImage2dArrayDepthWO:
    case clang::BuiltinType::Kind::OCLImage2dArrayDepthRW:
    case clang::BuiltinType::Kind::OCLImage2dArrayMSAARO:
    case clang::BuiltinType::Kind::OCLImage2dArrayMSAAWO:
    case clang::BuiltinType::Kind::OCLImage2dArrayMSAARW:
    case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepthRO:
    case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepthWO:
    case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepthRW:
    case clang::BuiltinType::Kind::OCLImage2dDepthRO:
    case clang::BuiltinType::Kind::OCLImage2dDepthWO:
    case clang::BuiltinType::Kind::OCLImage2dDepthRW:
    case clang::BuiltinType::Kind::OCLImage2dMSAARO:
    case clang::BuiltinType::Kind::OCLImage2dMSAAWO:
    case clang::BuiltinType::Kind::OCLImage2dMSAARW:
    case clang::BuiltinType::Kind::OCLImage2dMSAADepthRO:
    case clang::BuiltinType::Kind::OCLImage2dMSAADepthWO:
    case clang::BuiltinType::Kind::OCLImage2dMSAADepthRW:
    case clang::BuiltinType::Kind::OCLImage3dRO:
    case clang::BuiltinType::Kind::OCLImage3dWO:
    case clang::BuiltinType::Kind::OCLImage3dRW:
    case clang::BuiltinType::Kind::OCLQueue:
    case clang::BuiltinType::Kind::OCLReserveID:
    case clang::BuiltinType::Kind::OCLSampler:
    case clang::BuiltinType::Kind::OMPArraySection:
    case clang::BuiltinType::Kind::OMPArrayShaping:
    case clang::BuiltinType::Kind::OMPIterator:
    case clang::BuiltinType::Kind::Overload:
    case clang::BuiltinType::Kind::PseudoObject:
    case clang::BuiltinType::Kind::UnknownAny:
      break;

    case clang::BuiltinType::OCLIntelSubgroupAVCMcePayload:
    case clang::BuiltinType::OCLIntelSubgroupAVCImePayload:
    case clang::BuiltinType::OCLIntelSubgroupAVCRefPayload:
    case clang::BuiltinType::OCLIntelSubgroupAVCSicPayload:
    case clang::BuiltinType::OCLIntelSubgroupAVCMceResult:
    case clang::BuiltinType::OCLIntelSubgroupAVCImeResult:
    case clang::BuiltinType::OCLIntelSubgroupAVCRefResult:
    case clang::BuiltinType::OCLIntelSubgroupAVCSicResult:
    case clang::BuiltinType::OCLIntelSubgroupAVCImeResultSingleRefStreamout:
    case clang::BuiltinType::OCLIntelSubgroupAVCImeResultDualRefStreamout:
    case clang::BuiltinType::OCLIntelSubgroupAVCImeSingleRefStreamin:
    case clang::BuiltinType::OCLIntelSubgroupAVCImeDualRefStreamin:
      break;

    // PowerPC -- Matrix Multiply Assist
    case clang::BuiltinType::VectorPair:
    case clang::BuiltinType::VectorQuad:
      break;

    // ARM -- Scalable Vector Extension
    case clang::BuiltinType::SveBool:
    case clang::BuiltinType::SveInt8:
    case clang::BuiltinType::SveInt8x2:
    case clang::BuiltinType::SveInt8x3:
    case clang::BuiltinType::SveInt8x4:
    case clang::BuiltinType::SveInt16:
    case clang::BuiltinType::SveInt16x2:
    case clang::BuiltinType::SveInt16x3:
    case clang::BuiltinType::SveInt16x4:
    case clang::BuiltinType::SveInt32:
    case clang::BuiltinType::SveInt32x2:
    case clang::BuiltinType::SveInt32x3:
    case clang::BuiltinType::SveInt32x4:
    case clang::BuiltinType::SveInt64:
    case clang::BuiltinType::SveInt64x2:
    case clang::BuiltinType::SveInt64x3:
    case clang::BuiltinType::SveInt64x4:
    case clang::BuiltinType::SveUint8:
    case clang::BuiltinType::SveUint8x2:
    case clang::BuiltinType::SveUint8x3:
    case clang::BuiltinType::SveUint8x4:
    case clang::BuiltinType::SveUint16:
    case clang::BuiltinType::SveUint16x2:
    case clang::BuiltinType::SveUint16x3:
    case clang::BuiltinType::SveUint16x4:
    case clang::BuiltinType::SveUint32:
    case clang::BuiltinType::SveUint32x2:
    case clang::BuiltinType::SveUint32x3:
    case clang::BuiltinType::SveUint32x4:
    case clang::BuiltinType::SveUint64:
    case clang::BuiltinType::SveUint64x2:
    case clang::BuiltinType::SveUint64x3:
    case clang::BuiltinType::SveUint64x4:
    case clang::BuiltinType::SveFloat16:
    case clang::BuiltinType::SveBFloat16:
    case clang::BuiltinType::SveBFloat16x2:
    case clang::BuiltinType::SveBFloat16x3:
    case clang::BuiltinType::SveBFloat16x4:
    case clang::BuiltinType::SveFloat16x2:
    case clang::BuiltinType::SveFloat16x3:
    case clang::BuiltinType::SveFloat16x4:
    case clang::BuiltinType::SveFloat32:
    case clang::BuiltinType::SveFloat32x2:
    case clang::BuiltinType::SveFloat32x3:
    case clang::BuiltinType::SveFloat32x4:
    case clang::BuiltinType::SveFloat64:
    case clang::BuiltinType::SveFloat64x2:
    case clang::BuiltinType::SveFloat64x3:
    case clang::BuiltinType::SveFloat64x4:
      break;

    // RISC-V V builtin types.
    case clang::BuiltinType::RvvInt8mf8:
    case clang::BuiltinType::RvvInt8mf4:
    case clang::BuiltinType::RvvInt8mf2:
    case clang::BuiltinType::RvvInt8m1:
    case clang::BuiltinType::RvvInt8m2:
    case clang::BuiltinType::RvvInt8m4:
    case clang::BuiltinType::RvvInt8m8:
    case clang::BuiltinType::RvvUint8mf8:
    case clang::BuiltinType::RvvUint8mf4:
    case clang::BuiltinType::RvvUint8mf2:
    case clang::BuiltinType::RvvUint8m1:
    case clang::BuiltinType::RvvUint8m2:
    case clang::BuiltinType::RvvUint8m4:
    case clang::BuiltinType::RvvUint8m8:
    case clang::BuiltinType::RvvInt16mf4:
    case clang::BuiltinType::RvvInt16mf2:
    case clang::BuiltinType::RvvInt16m1:
    case clang::BuiltinType::RvvInt16m2:
    case clang::BuiltinType::RvvInt16m4:
    case clang::BuiltinType::RvvInt16m8:
    case clang::BuiltinType::RvvUint16mf4:
    case clang::BuiltinType::RvvUint16mf2:
    case clang::BuiltinType::RvvUint16m1:
    case clang::BuiltinType::RvvUint16m2:
    case clang::BuiltinType::RvvUint16m4:
    case clang::BuiltinType::RvvUint16m8:
    case clang::BuiltinType::RvvInt32mf2:
    case clang::BuiltinType::RvvInt32m1:
    case clang::BuiltinType::RvvInt32m2:
    case clang::BuiltinType::RvvInt32m4:
    case clang::BuiltinType::RvvInt32m8:
    case clang::BuiltinType::RvvUint32mf2:
    case clang::BuiltinType::RvvUint32m1:
    case clang::BuiltinType::RvvUint32m2:
    case clang::BuiltinType::RvvUint32m4:
    case clang::BuiltinType::RvvUint32m8:
    case clang::BuiltinType::RvvInt64m1:
    case clang::BuiltinType::RvvInt64m2:
    case clang::BuiltinType::RvvInt64m4:
    case clang::BuiltinType::RvvInt64m8:
    case clang::BuiltinType::RvvUint64m1:
    case clang::BuiltinType::RvvUint64m2:
    case clang::BuiltinType::RvvUint64m4:
    case clang::BuiltinType::RvvUint64m8:
    case clang::BuiltinType::RvvFloat16mf4:
    case clang::BuiltinType::RvvFloat16mf2:
    case clang::BuiltinType::RvvFloat16m1:
    case clang::BuiltinType::RvvFloat16m2:
    case clang::BuiltinType::RvvFloat16m4:
    case clang::BuiltinType::RvvFloat16m8:
    case clang::BuiltinType::RvvFloat32mf2:
    case clang::BuiltinType::RvvFloat32m1:
    case clang::BuiltinType::RvvFloat32m2:
    case clang::BuiltinType::RvvFloat32m4:
    case clang::BuiltinType::RvvFloat32m8:
    case clang::BuiltinType::RvvFloat64m1:
    case clang::BuiltinType::RvvFloat64m2:
    case clang::BuiltinType::RvvFloat64m4:
    case clang::BuiltinType::RvvFloat64m8:
    case clang::BuiltinType::RvvBool1:
    case clang::BuiltinType::RvvBool2:
    case clang::BuiltinType::RvvBool4:
    case clang::BuiltinType::RvvBool8:
    case clang::BuiltinType::RvvBool16:
    case clang::BuiltinType::RvvBool32:
    case clang::BuiltinType::RvvBool64:
      break;

    case clang::BuiltinType::IncompleteMatrixIdx:
      break;
    }
    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::eEncodingUint;
  case clang::Type::Complex: {
    lldb::Encoding encoding = lldb::eEncodingIEEE754;
    if (qual_type->isComplexType())
      encoding = lldb::eEncodingIEEE754;
    else {
      const clang::ComplexType *complex_type =
          qual_type->getAsComplexIntegerType();
      if (complex_type)
        encoding = GetType(complex_type->getElementType()).GetEncoding(count);
      else
        encoding = lldb::eEncodingSint;
    }
    count = 2;
    return encoding;
  }

  case clang::Type::ObjCInterface:
    break;
  case clang::Type::Record:
    break;
  case clang::Type::Enum:
    return lldb::eEncodingSint;
  case clang::Type::DependentSizedArray:
  case clang::Type::DependentSizedExtVector:
  case clang::Type::UnresolvedUsing:
  case clang::Type::Attributed:
  case clang::Type::TemplateTypeParm:
  case clang::Type::SubstTemplateTypeParm:
  case clang::Type::SubstTemplateTypeParmPack:
  case clang::Type::InjectedClassName:
  case clang::Type::DependentName:
  case clang::Type::DependentTemplateSpecialization:
  case clang::Type::PackExpansion:
  case clang::Type::ObjCObject:

  case clang::Type::TemplateSpecialization:
  case clang::Type::DeducedTemplateSpecialization:
  case clang::Type::Adjusted:
  case clang::Type::Pipe:
    break;

  // pointer type decayed from an array or function type.
  case clang::Type::Decayed:
    break;
  case clang::Type::ObjCTypeParam:
    break;

  case clang::Type::DependentAddressSpace:
    break;
  case clang::Type::MacroQualified:
    break;

  case clang::Type::ConstantMatrix:
  case clang::Type::DependentSizedMatrix:
    break;
  }
  count = 0;
  return lldb::eEncodingInvalid;
}