1 //===-- JavaASTContext.cpp --------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
12 #include "lldb/Core/ArchSpec.h"
13 #include "lldb/Core/DataExtractor.h"
14 #include "lldb/Core/Module.h"
15 #include "lldb/Core/PluginManager.h"
16 #include "lldb/Core/Stream.h"
17 #include "lldb/Core/StreamFile.h"
18 #include "lldb/Core/ValueObject.h"
19 #include "lldb/Expression/DWARFExpression.h"
20 #include "lldb/Symbol/CompilerType.h"
21 #include "lldb/Symbol/JavaASTContext.h"
22 #include "lldb/Symbol/SymbolFile.h"
23 #include "lldb/Symbol/Type.h"
24 #include "lldb/Target/Target.h"
26 #include "Plugins/SymbolFile/DWARF/DWARFASTParserJava.h"
29 using namespace lldb_private;
31 namespace lldb_private
34 class JavaASTContext::JavaType
46 JavaType(LLVMCastKind kind) : m_kind(kind) {}
48 virtual ~JavaType() = default;
69 } // end of namespace lldb_private
74 class JavaPrimitiveType : public JavaASTContext::JavaType
89 JavaPrimitiveType(TypeKind type_kind) : JavaType(JavaType::eKindPrimitive), m_type_kind(type_kind) {}
97 return ConstString("byte");
99 return ConstString("short");
101 return ConstString("int");
103 return ConstString("long");
105 return ConstString("float");
107 return ConstString("double");
109 return ConstString("boolean");
111 return ConstString("char");
113 return ConstString();
123 Dump(Stream *s) override
125 s->Printf("%s\n", GetName().GetCString());
129 IsCompleteType() override
135 classof(const JavaType *jt)
137 return jt->getKind() == JavaType::eKindPrimitive;
141 const TypeKind m_type_kind;
144 class JavaDynamicType : public JavaASTContext::JavaType
147 JavaDynamicType(LLVMCastKind kind, const ConstString &linkage_name) :
149 m_linkage_name(linkage_name),
150 m_dynamic_type_id(nullptr)
155 GetLinkageName() const
157 return m_linkage_name;
161 SetDynamicTypeId(const DWARFExpression &type_id)
163 m_dynamic_type_id = type_id;
167 CalculateDynamicTypeId(ExecutionContext *exe_ctx, ValueObject &value_obj)
169 if (!m_dynamic_type_id.IsValid())
172 Value obj_load_address = value_obj.GetValue();
173 obj_load_address.ResolveValue(exe_ctx);
174 obj_load_address.SetValueType(Value::eValueTypeLoadAddress);
177 if (m_dynamic_type_id.Evaluate(exe_ctx->GetBestExecutionContextScope(), nullptr, nullptr, 0, &obj_load_address,
178 nullptr, result, nullptr))
182 lldb::addr_t type_id_addr = result.GetScalar().UInt();
183 lldb::ProcessSP process_sp = exe_ctx->GetProcessSP();
185 return process_sp->ReadUnsignedIntegerFromMemory(type_id_addr, process_sp->GetAddressByteSize(),
193 ConstString m_linkage_name;
194 DWARFExpression m_dynamic_type_id;
197 class JavaObjectType : public JavaDynamicType
207 JavaObjectType(const ConstString &name, const ConstString &linkage_name, uint32_t byte_size)
208 : JavaDynamicType(JavaType::eKindObject, linkage_name),
210 m_byte_size(byte_size),
211 m_base_class_offset(0),
231 return m_fields.size();
235 Dump(Stream *s) override
237 if (m_base_class.IsValid())
238 s->Printf("%s : %s\n", GetName().GetCString(), m_base_class.GetTypeName().GetCString());
240 s->Printf("%s\n", GetName().GetCString());
243 for (const Field &f : m_fields)
244 s->Printf("%s %s\n", f.m_type.GetTypeName().GetCString(), f.m_name.GetCString());
249 GetFieldAtIndex(size_t idx)
251 if (idx < m_fields.size())
252 return &m_fields[idx];
265 return m_base_class_offset;
271 return m_interfaces.size();
275 GetInterfaceAtIndex(uint32_t idx)
277 if (m_interfaces.size() < idx)
278 return m_interfaces[idx];
279 return CompilerType();
283 IsCompleteType() override
285 return m_is_complete;
289 SetCompleteType(bool is_complete)
291 m_is_complete = is_complete;
292 if (m_byte_size == 0)
294 // Try to calcualte the size of the object based on it's values
295 for (const Field &field : m_fields)
297 uint32_t field_end = field.m_offset + field.m_type.GetByteSize(nullptr);
298 if (field_end > m_byte_size)
299 m_byte_size = field_end;
305 AddBaseClass(const CompilerType &type, uint32_t offset)
307 // TODO: Check if type is an interface and add it to the interface list in that case
309 m_base_class_offset = offset;
313 AddField(const ConstString &name, const CompilerType &type, uint32_t offset)
315 m_fields.push_back({name, type, offset});
319 classof(const JavaType *jt)
321 return jt->getKind() == JavaType::eKindObject;
326 uint32_t m_byte_size;
327 CompilerType m_base_class;
328 uint32_t m_base_class_offset;
329 std::vector<CompilerType> m_interfaces;
330 std::vector<Field> m_fields;
334 class JavaReferenceType : public JavaASTContext::JavaType
337 JavaReferenceType(CompilerType pointee_type) : JavaType(JavaType::eKindReference), m_pointee_type(pointee_type) {}
340 classof(const JavaType *jt)
342 return jt->getKind() == JavaType::eKindReference;
348 return m_pointee_type;
354 ConstString pointee_type_name = static_cast<JavaType *>(GetPointeeType().GetOpaqueQualType())->GetName();
355 return ConstString(std::string(pointee_type_name.AsCString()) + "&");
359 Dump(Stream *s) override
361 static_cast<JavaType *>(m_pointee_type.GetOpaqueQualType())->Dump(s);
365 IsCompleteType() override
367 return m_pointee_type.IsCompleteType();
371 CompilerType m_pointee_type;
374 class JavaArrayType : public JavaDynamicType
377 JavaArrayType(const ConstString& linkage_name, CompilerType element_type, const DWARFExpression &length_expression,
378 lldb::addr_t data_offset)
379 : JavaDynamicType(JavaType::eKindArray, linkage_name),
380 m_element_type(element_type),
381 m_length_expression(length_expression),
382 m_data_offset(data_offset)
387 classof(const JavaType *jt)
389 return jt->getKind() == JavaType::eKindArray;
395 return m_element_type;
401 ConstString element_type_name = static_cast<JavaType *>(GetElementType().GetOpaqueQualType())->GetName();
402 return ConstString(std::string(element_type_name.AsCString()) + "[]");
406 Dump(Stream *s) override
408 s->Printf("%s\n", GetName().GetCString());
412 IsCompleteType() override
414 return m_length_expression.IsValid();
418 GetNumElements(ValueObject *value_obj)
420 if (!m_length_expression.IsValid())
424 ValueObjectSP address_obj = value_obj->AddressOf(error);
428 Value obj_load_address = address_obj->GetValue();
429 obj_load_address.SetValueType(Value::eValueTypeLoadAddress);
432 ExecutionContextScope* exec_ctx_scope = value_obj->GetExecutionContextRef().Lock(true).GetBestExecutionContextScope();
433 if (m_length_expression.Evaluate(exec_ctx_scope, nullptr, nullptr, 0, nullptr, &obj_load_address, result, nullptr))
434 return result.GetScalar().UInt();
440 GetElementOffset(size_t idx)
442 return m_data_offset + idx * m_element_type.GetByteSize(nullptr);
446 CompilerType m_element_type;
447 DWARFExpression m_length_expression;
448 lldb::addr_t m_data_offset;
451 } // end of anonymous namespace
454 JavaASTContext::GetPluginNameStatic()
456 return ConstString("java");
460 JavaASTContext::GetPluginName()
462 return JavaASTContext::GetPluginNameStatic();
466 JavaASTContext::GetPluginVersion()
472 JavaASTContext::CreateInstance(lldb::LanguageType language, Module *module, Target *target)
474 if (language == eLanguageTypeJava)
477 return std::make_shared<JavaASTContext>(module->GetArchitecture());
479 return std::make_shared<JavaASTContext>(target->GetArchitecture());
480 assert(false && "Either a module or a target has to be specifed to create a JavaASTContext");
482 return lldb::TypeSystemSP();
486 JavaASTContext::EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types,
487 std::set<lldb::LanguageType> &languages_for_expressions)
489 static std::vector<lldb::LanguageType> s_languages_for_types({lldb::eLanguageTypeJava});
490 static std::vector<lldb::LanguageType> s_languages_for_expressions({});
492 languages_for_types.insert(s_languages_for_types.begin(), s_languages_for_types.end());
493 languages_for_expressions.insert(s_languages_for_expressions.begin(), s_languages_for_expressions.end());
497 JavaASTContext::Initialize()
499 PluginManager::RegisterPlugin(GetPluginNameStatic(), "AST context plug-in", CreateInstance,
500 EnumerateSupportedLanguages);
504 JavaASTContext::Terminate()
506 PluginManager::UnregisterPlugin(CreateInstance);
509 JavaASTContext::JavaASTContext(const ArchSpec &arch)
510 : TypeSystem(eKindJava), m_pointer_byte_size(arch.GetAddressByteSize())
514 JavaASTContext::~JavaASTContext()
519 JavaASTContext::GetPointerByteSize()
521 return m_pointer_byte_size;
525 JavaASTContext::GetDWARFParser()
527 if (!m_dwarf_ast_parser_ap)
528 m_dwarf_ast_parser_ap.reset(new DWARFASTParserJava(*this));
529 return m_dwarf_ast_parser_ap.get();
533 JavaASTContext::DeclGetName(void *opaque_decl)
535 return ConstString();
538 std::vector<CompilerDecl>
539 JavaASTContext::DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name, const bool ignore_imported_decls)
541 return std::vector<CompilerDecl>();
545 JavaASTContext::DeclContextIsStructUnionOrClass(void *opaque_decl_ctx)
551 JavaASTContext::DeclContextGetName(void *opaque_decl_ctx)
553 return ConstString();
557 JavaASTContext::DeclContextIsClassMethod(void *opaque_decl_ctx, lldb::LanguageType *language_ptr,
558 bool *is_instance_method_ptr, ConstString *language_object_name_ptr)
564 JavaASTContext::IsArrayType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size,
568 element_type->Clear();
572 *is_incomplete = false;
574 if (JavaArrayType *array = llvm::dyn_cast<JavaArrayType>(static_cast<JavaType *>(type)))
577 *element_type = array->GetElementType();
584 JavaASTContext::IsAggregateType(lldb::opaque_compiler_type_t type)
586 return llvm::isa<JavaObjectType>(static_cast<JavaType *>(type));
590 JavaASTContext::IsCharType(lldb::opaque_compiler_type_t type)
592 if (JavaPrimitiveType *ptype = llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type)))
593 return ptype->GetTypeKind() == JavaPrimitiveType::eTypeChar;
598 JavaASTContext::IsFloatingPointType(lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex)
602 if (JavaPrimitiveType *ptype = llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type)))
604 switch (ptype->GetTypeKind())
606 case JavaPrimitiveType::eTypeFloat:
607 case JavaPrimitiveType::eTypeDouble:
620 JavaASTContext::IsFunctionType(lldb::opaque_compiler_type_t type, bool *is_variadic_ptr)
623 *is_variadic_ptr = false;
628 JavaASTContext::GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type)
634 JavaASTContext::GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, const size_t index)
636 return CompilerType();
640 JavaASTContext::IsFunctionPointerType(lldb::opaque_compiler_type_t type)
646 JavaASTContext::IsBlockPointerType (lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr)
652 JavaASTContext::IsIntegerType(lldb::opaque_compiler_type_t type, bool &is_signed)
654 if (JavaPrimitiveType *ptype = llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type)))
656 switch (ptype->GetTypeKind())
658 case JavaPrimitiveType::eTypeByte:
659 case JavaPrimitiveType::eTypeShort:
660 case JavaPrimitiveType::eTypeInt:
661 case JavaPrimitiveType::eTypeLong:
674 JavaASTContext::IsPossibleDynamicType(lldb::opaque_compiler_type_t type, CompilerType *target_type,
675 bool check_cplusplus, bool check_objc)
677 return llvm::isa<JavaReferenceType>(static_cast<JavaType *>(type));
681 JavaASTContext::IsPointerType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
684 pointee_type->Clear();
689 JavaASTContext::IsReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool *is_rvalue)
694 if (JavaReferenceType *ref = llvm::dyn_cast<JavaReferenceType>(static_cast<JavaType *>(type)))
697 *pointee_type = ref->GetPointeeType();
702 pointee_type->Clear();
707 JavaASTContext::IsScalarType(lldb::opaque_compiler_type_t type)
709 return llvm::isa<JavaReferenceType>(static_cast<JavaType *>(type)) ||
710 llvm::isa<JavaPrimitiveType>(static_cast<JavaType *>(type));
714 JavaASTContext::IsVoidType(lldb::opaque_compiler_type_t type)
716 return false; // TODO: Implement if we introduce the void type
720 JavaASTContext::SupportsLanguage(lldb::LanguageType language)
722 return language == lldb::eLanguageTypeJava;
726 JavaASTContext::IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type)
732 JavaASTContext::IsPointerOrReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
734 return IsPointerType(type, pointee_type) || IsReferenceType(type, pointee_type);
738 JavaASTContext::IsCStringType(lldb::opaque_compiler_type_t type, uint32_t &length)
740 return false; // TODO: Implement it if we need it for string literals
744 JavaASTContext::IsTypedefType(lldb::opaque_compiler_type_t type)
750 JavaASTContext::IsVectorType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size)
753 element_type->Clear();
760 JavaASTContext::IsPolymorphicClass(lldb::opaque_compiler_type_t type)
762 return llvm::isa<JavaObjectType>(static_cast<JavaType *>(type));
766 JavaASTContext::IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, CompilerType *base_type_ptr)
772 JavaASTContext::IsCompleteType(lldb::opaque_compiler_type_t type)
774 return static_cast<JavaType *>(type)->IsCompleteType();
778 JavaASTContext::IsConst(lldb::opaque_compiler_type_t type)
784 JavaASTContext::IsBeingDefined(lldb::opaque_compiler_type_t type)
790 JavaASTContext::IsDefined(lldb::opaque_compiler_type_t type)
792 return type != nullptr;
796 JavaASTContext::GetCompleteType(lldb::opaque_compiler_type_t type)
798 if (IsCompleteType(type))
801 if (JavaArrayType *array = llvm::dyn_cast<JavaArrayType>(static_cast<JavaType *>(type)))
802 return GetCompleteType(array->GetElementType().GetOpaqueQualType());
804 if (JavaReferenceType *reference = llvm::dyn_cast<JavaReferenceType>(static_cast<JavaType *>(type)))
805 return GetCompleteType(reference->GetPointeeType().GetOpaqueQualType());
807 if (llvm::isa<JavaObjectType>(static_cast<JavaType *>(type)))
809 SymbolFile *symbol_file = GetSymbolFile();
813 CompilerType object_type(this, type);
814 return symbol_file->CompleteType(object_type);
820 JavaASTContext::GetTypeName(lldb::opaque_compiler_type_t type)
823 return static_cast<JavaType *>(type)->GetName();
824 return ConstString();
828 JavaASTContext::GetTypeInfo(lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_compiler_type)
830 if (pointee_or_element_compiler_type)
831 pointee_or_element_compiler_type->Clear();
835 if (IsReferenceType(type, pointee_or_element_compiler_type))
836 return eTypeHasChildren | eTypeHasValue | eTypeIsReference;
837 if (IsArrayType(type, pointee_or_element_compiler_type, nullptr, nullptr))
838 return eTypeHasChildren | eTypeIsArray;
839 if (llvm::isa<JavaObjectType>(static_cast<JavaType *>(type)))
840 return eTypeHasChildren | eTypeIsClass;
842 if (JavaPrimitiveType *ptype = llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type)))
844 switch (ptype->GetTypeKind())
846 case JavaPrimitiveType::eTypeByte:
847 case JavaPrimitiveType::eTypeShort:
848 case JavaPrimitiveType::eTypeInt:
849 case JavaPrimitiveType::eTypeLong:
850 return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar | eTypeIsInteger | eTypeIsSigned;
851 case JavaPrimitiveType::eTypeFloat:
852 case JavaPrimitiveType::eTypeDouble:
853 return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar | eTypeIsFloat | eTypeIsSigned;
854 case JavaPrimitiveType::eTypeBoolean:
855 return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar;
856 case JavaPrimitiveType::eTypeChar:
857 return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar;
864 JavaASTContext::GetTypeClass(lldb::opaque_compiler_type_t type)
867 return eTypeClassInvalid;
868 if (llvm::isa<JavaReferenceType>(static_cast<JavaType *>(type)))
869 return eTypeClassReference;
870 if (llvm::isa<JavaArrayType>(static_cast<JavaType *>(type)))
871 return eTypeClassArray;
872 if (llvm::isa<JavaObjectType>(static_cast<JavaType *>(type)))
873 return eTypeClassClass;
874 if (llvm::isa<JavaPrimitiveType>(static_cast<JavaType *>(type)))
875 return eTypeClassBuiltin;
876 assert(false && "Java type with unhandled type class");
877 return eTypeClassInvalid;
881 JavaASTContext::GetMinimumLanguage(lldb::opaque_compiler_type_t type)
883 return lldb::eLanguageTypeJava;
887 JavaASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type, uint64_t *stride)
892 CompilerType element_type;
893 if (IsArrayType(type, &element_type, nullptr, nullptr))
895 return CompilerType();
899 JavaASTContext::GetPointeeType(lldb::opaque_compiler_type_t type)
901 CompilerType pointee_type;
902 if (IsPointerType(type, &pointee_type))
904 return CompilerType();
908 JavaASTContext::GetPointerType(lldb::opaque_compiler_type_t type)
910 return CompilerType(); // No pointer types in java
914 JavaASTContext::GetCanonicalType(lldb::opaque_compiler_type_t type)
916 return CompilerType(this, type);
920 JavaASTContext::GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type)
922 return CompilerType(this, type);
926 JavaASTContext::GetNonReferenceType(lldb::opaque_compiler_type_t type)
928 CompilerType pointee_type;
929 if (IsReferenceType(type, &pointee_type))
931 return CompilerType(this, type);
935 JavaASTContext::GetTypedefedType(lldb::opaque_compiler_type_t type)
937 return CompilerType();
941 JavaASTContext::GetBasicTypeFromAST(lldb::BasicType basic_type)
943 return CompilerType();
947 JavaASTContext::GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, size_t bit_size)
949 return CompilerType();
953 JavaASTContext::GetTypeBitAlign(lldb::opaque_compiler_type_t type)
959 JavaASTContext::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type)
961 if (JavaPrimitiveType *ptype = llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type)))
963 switch (ptype->GetTypeKind())
965 case JavaPrimitiveType::eTypeByte:
966 return eBasicTypeOther;
967 case JavaPrimitiveType::eTypeShort:
968 return eBasicTypeShort;
969 case JavaPrimitiveType::eTypeInt:
970 return eBasicTypeInt;
971 case JavaPrimitiveType::eTypeLong:
972 return eBasicTypeLong;
973 case JavaPrimitiveType::eTypeFloat:
974 return eBasicTypeFloat;
975 case JavaPrimitiveType::eTypeDouble:
976 return eBasicTypeDouble;
977 case JavaPrimitiveType::eTypeBoolean:
978 return eBasicTypeBool;
979 case JavaPrimitiveType::eTypeChar:
980 return eBasicTypeChar;
983 return eBasicTypeInvalid;
987 JavaASTContext::GetBitSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope)
989 if (JavaPrimitiveType *ptype = llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type)))
991 switch (ptype->GetTypeKind())
993 case JavaPrimitiveType::eTypeByte:
995 case JavaPrimitiveType::eTypeShort:
997 case JavaPrimitiveType::eTypeInt:
999 case JavaPrimitiveType::eTypeLong:
1001 case JavaPrimitiveType::eTypeFloat:
1003 case JavaPrimitiveType::eTypeDouble:
1005 case JavaPrimitiveType::eTypeBoolean:
1007 case JavaPrimitiveType::eTypeChar:
1011 else if (llvm::isa<JavaReferenceType>(static_cast<JavaType *>(type)))
1013 return 32; // References are always 4 byte long in java
1015 else if (llvm::isa<JavaArrayType>(static_cast<JavaType *>(type)))
1019 else if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1021 return obj->GetByteSize() * 8;
1027 JavaASTContext::GetEncoding(lldb::opaque_compiler_type_t type, uint64_t &count)
1031 if (JavaPrimitiveType *ptype = llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type)))
1033 switch (ptype->GetTypeKind())
1035 case JavaPrimitiveType::eTypeByte:
1036 case JavaPrimitiveType::eTypeShort:
1037 case JavaPrimitiveType::eTypeInt:
1038 case JavaPrimitiveType::eTypeLong:
1039 return eEncodingSint;
1040 case JavaPrimitiveType::eTypeFloat:
1041 case JavaPrimitiveType::eTypeDouble:
1042 return eEncodingIEEE754;
1043 case JavaPrimitiveType::eTypeBoolean:
1044 case JavaPrimitiveType::eTypeChar:
1045 return eEncodingUint;
1048 if (IsReferenceType(type))
1049 return eEncodingUint;
1050 return eEncodingInvalid;
1054 JavaASTContext::GetFormat(lldb::opaque_compiler_type_t type)
1056 if (JavaPrimitiveType *ptype = llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type)))
1058 switch (ptype->GetTypeKind())
1060 case JavaPrimitiveType::eTypeByte:
1061 case JavaPrimitiveType::eTypeShort:
1062 case JavaPrimitiveType::eTypeInt:
1063 case JavaPrimitiveType::eTypeLong:
1064 return eFormatDecimal;
1065 case JavaPrimitiveType::eTypeFloat:
1066 case JavaPrimitiveType::eTypeDouble:
1067 return eFormatFloat;
1068 case JavaPrimitiveType::eTypeBoolean:
1069 return eFormatBoolean;
1070 case JavaPrimitiveType::eTypeChar:
1071 return eFormatUnicode16;
1074 if (IsReferenceType(type))
1076 return eFormatDefault;
1080 JavaASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type)
1086 JavaASTContext::ConvertStringToFloatValue(lldb::opaque_compiler_type_t type, const char *s, uint8_t *dst,
1089 assert(false && "Not implemented");
1094 JavaASTContext::GetNumTemplateArguments(lldb::opaque_compiler_type_t type)
1100 JavaASTContext::GetTemplateArgument(lldb::opaque_compiler_type_t type, size_t idx, lldb::TemplateArgumentKind &kind)
1102 return CompilerType();
1106 JavaASTContext::GetNumFields(lldb::opaque_compiler_type_t type)
1108 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1110 GetCompleteType(type);
1111 return obj->GetNumFields();
1117 JavaASTContext::GetFieldAtIndex(lldb::opaque_compiler_type_t type, size_t idx, std::string &name,
1118 uint64_t *bit_offset_ptr, uint32_t *bitfield_bit_size_ptr, bool *is_bitfield_ptr)
1121 *bit_offset_ptr = 0;
1122 if (bitfield_bit_size_ptr)
1123 *bitfield_bit_size_ptr = 0;
1124 if (is_bitfield_ptr)
1125 *is_bitfield_ptr = false;
1127 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1129 GetCompleteType(type);
1131 JavaObjectType::Field *field = obj->GetFieldAtIndex(idx);
1133 return CompilerType();
1134 name = field->m_name.AsCString();
1136 *bit_offset_ptr = field->m_offset * 8;
1137 return field->m_type;
1139 return CompilerType();
1143 JavaASTContext::GetNumChildren(lldb::opaque_compiler_type_t type, bool omit_empty_base_classes)
1145 GetCompleteType(type);
1147 if (JavaReferenceType *ref = llvm::dyn_cast<JavaReferenceType>(static_cast<JavaType *>(type)))
1148 return ref->GetPointeeType().GetNumChildren(omit_empty_base_classes);
1150 if (llvm::isa<JavaObjectType>(static_cast<JavaType *>(type)))
1151 return GetNumFields(type) + GetNumDirectBaseClasses(type);
1157 JavaASTContext::GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type)
1159 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1161 GetCompleteType(type);
1162 return obj->GetNumInterfaces() + (obj->GetBaseClass() ? 1 : 0);
1168 JavaASTContext::GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type)
1170 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1172 GetCompleteType(type);
1173 return obj->GetNumInterfaces();
1179 JavaASTContext::GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr)
1181 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1183 GetCompleteType(type);
1185 if (CompilerType base_class = obj->GetBaseClass())
1192 return obj->GetInterfaceAtIndex(idx);
1194 return CompilerType();
1198 JavaASTContext::GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr)
1200 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1202 GetCompleteType(type);
1203 return obj->GetInterfaceAtIndex(idx);
1205 return CompilerType();
1209 JavaASTContext::DumpValue(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, Stream *s, lldb::Format format,
1210 const DataExtractor &data, lldb::offset_t data_offset, size_t data_byte_size,
1211 uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, bool show_types, bool show_summary,
1212 bool verbose, uint32_t depth)
1214 assert(false && "Not implemented");
1218 JavaASTContext::DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s, lldb::Format format,
1219 const DataExtractor &data, lldb::offset_t data_offset, size_t data_byte_size,
1220 uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,
1221 ExecutionContextScope *exe_scope)
1223 if (IsScalarType(type))
1225 return data.Dump(s, data_offset, format, data_byte_size,
1227 UINT32_MAX, LLDB_INVALID_ADDRESS, bitfield_bit_size, bitfield_bit_offset, exe_scope);
1233 JavaASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type)
1235 StreamFile s(stdout, false);
1236 DumpTypeDescription(type, &s);
1240 JavaASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type, Stream *s)
1242 static_cast<JavaType *>(type)->Dump(s);
1246 JavaASTContext::DumpSummary(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, Stream *s,
1247 const DataExtractor &data, lldb::offset_t data_offset, size_t data_byte_size)
1249 assert(false && "Not implemented");
1253 JavaASTContext::GetFunctionArgumentCount(lldb::opaque_compiler_type_t type)
1259 JavaASTContext::GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, size_t idx)
1261 return CompilerType();
1265 JavaASTContext::GetFunctionReturnType(lldb::opaque_compiler_type_t type)
1267 return CompilerType();
1271 JavaASTContext::GetNumMemberFunctions(lldb::opaque_compiler_type_t type)
1276 TypeMemberFunctionImpl
1277 JavaASTContext::GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, size_t idx)
1279 return TypeMemberFunctionImpl();
1283 JavaASTContext::GetChildCompilerTypeAtIndex(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx,
1284 bool transparent_pointers, bool omit_empty_base_classes,
1285 bool ignore_array_bounds, std::string &child_name,
1286 uint32_t &child_byte_size, int32_t &child_byte_offset,
1287 uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset,
1288 bool &child_is_base_class, bool &child_is_deref_of_parent,
1289 ValueObject *valobj, uint64_t &language_flags)
1292 child_byte_size = 0;
1293 child_byte_offset = 0;
1294 child_bitfield_bit_size = 0;
1295 child_bitfield_bit_offset = 0;
1296 child_is_base_class = false;
1297 child_is_deref_of_parent = false;
1300 ExecutionContextScope *exec_ctx_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
1302 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1304 GetCompleteType(type);
1306 if (CompilerType base_class = obj->GetBaseClass())
1310 JavaType *base_class_type = static_cast<JavaType *>(base_class.GetOpaqueQualType());
1311 child_name = base_class_type->GetName().GetCString();
1312 child_byte_size = base_class.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr);
1313 child_byte_offset = obj->GetBaseClassOffset();
1314 child_is_base_class = true;
1320 JavaObjectType::Field *field = obj->GetFieldAtIndex(idx);
1322 return CompilerType();
1324 child_name = field->m_name.AsCString();
1325 child_byte_size = field->m_type.GetByteSize(exec_ctx_scope);
1326 child_byte_offset = field->m_offset;
1327 return field->m_type;
1329 else if (JavaReferenceType *ref = llvm::dyn_cast<JavaReferenceType>(static_cast<JavaType *>(type)))
1331 CompilerType pointee_type = ref->GetPointeeType();
1333 if (transparent_pointers)
1334 return pointee_type.GetChildCompilerTypeAtIndex(
1335 exe_ctx, idx, transparent_pointers, omit_empty_base_classes, ignore_array_bounds, child_name,
1336 child_byte_size, child_byte_offset, child_bitfield_bit_size, child_bitfield_bit_offset,
1337 child_is_base_class, child_is_deref_of_parent, valobj, language_flags);
1340 return CompilerType();
1342 if (valobj && valobj->GetName())
1343 child_name = valobj->GetName().GetCString();
1344 child_is_deref_of_parent = true;
1345 child_byte_offset = 0;
1346 child_byte_size = pointee_type.GetByteSize(exec_ctx_scope);
1347 return pointee_type;
1349 return CompilerType();
1353 JavaASTContext::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, const char *name,
1354 bool omit_empty_base_classes)
1356 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1358 GetCompleteType(type);
1360 uint32_t index_offset = 0;
1361 if (CompilerType base_class = obj->GetBaseClass())
1363 if (base_class.GetTypeName() == ConstString(name))
1367 for (uint32_t i = 0; i < obj->GetNumFields(); ++i)
1369 if (obj->GetFieldAtIndex(i)->m_name == ConstString(name))
1370 return i + index_offset;
1373 else if (JavaReferenceType *ref = llvm::dyn_cast<JavaReferenceType>(static_cast<JavaType *>(type)))
1375 return GetIndexOfChildWithName(ref->GetPointeeType().GetOpaqueQualType(), name, omit_empty_base_classes);
1381 JavaASTContext::GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type, const char *name,
1382 bool omit_empty_base_classes, std::vector<uint32_t> &child_indexes)
1384 child_indexes.clear();
1386 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type)))
1388 GetCompleteType(type);
1390 uint32_t index_offset = 0;
1391 if (CompilerType base_class = obj->GetBaseClass())
1393 if (GetIndexOfChildMemberWithName(base_class.GetOpaqueQualType(), name, omit_empty_base_classes,
1394 child_indexes) != 0)
1396 child_indexes.insert(child_indexes.begin(), 0);
1397 return child_indexes.size();
1402 for (uint32_t i = 0; i < obj->GetNumFields(); ++i)
1404 if (obj->GetFieldAtIndex(i)->m_name == ConstString(name))
1406 child_indexes.push_back(i + index_offset);
1407 return child_indexes.size();
1411 else if (JavaReferenceType *ref = llvm::dyn_cast<JavaReferenceType>(static_cast<JavaType *>(type)))
1413 return GetIndexOfChildMemberWithName(ref->GetPointeeType().GetOpaqueQualType(), name, omit_empty_base_classes,
1420 JavaASTContext::GetLValueReferenceType(lldb::opaque_compiler_type_t type)
1422 return CreateReferenceType(CompilerType(this, type));
1426 JavaASTContext::DeclContextGetScopeQualifiedName(lldb::opaque_compiler_type_t opaque_decl_ctx)
1428 return GetTypeName(opaque_decl_ctx);
1432 AddPrimitiveType(JavaASTContext::JavaTypeMap &type_map, JavaPrimitiveType::TypeKind type_kind)
1434 JavaPrimitiveType *type = new JavaPrimitiveType(type_kind);
1435 type_map.emplace(type->GetName(), std::unique_ptr<JavaASTContext::JavaType>(type));
1439 JavaASTContext::CreateBaseType(const ConstString &name)
1441 if (m_base_type_map.empty())
1443 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeByte);
1444 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeShort);
1445 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeInt);
1446 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeLong);
1447 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeFloat);
1448 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeDouble);
1449 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeBoolean);
1450 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeChar);
1452 auto it = m_base_type_map.find(name);
1453 if (it != m_base_type_map.end())
1454 return CompilerType(this, it->second.get());
1455 return CompilerType();
1459 JavaASTContext::CreateObjectType(const ConstString &name, const ConstString &linkage_name, uint32_t byte_size)
1461 auto it = m_object_type_map.find(name);
1462 if (it == m_object_type_map.end())
1464 std::unique_ptr<JavaType> object_type(new JavaObjectType(name, linkage_name, byte_size));
1465 it = m_object_type_map.emplace(name, std::move(object_type)).first;
1467 return CompilerType(this, it->second.get());
1471 JavaASTContext::CreateArrayType(const ConstString &linkage_name, const CompilerType &element_type,
1472 const DWARFExpression &length_expression, const lldb::addr_t data_offset)
1474 ConstString name = element_type.GetTypeName();
1475 auto it = m_array_type_map.find(name);
1476 if (it == m_array_type_map.end())
1478 std::unique_ptr<JavaType> array_type(new JavaArrayType(linkage_name, element_type, length_expression,
1480 it = m_array_type_map.emplace(name, std::move(array_type)).first;
1482 return CompilerType(this, it->second.get());
1486 JavaASTContext::CreateReferenceType(const CompilerType &pointee_type)
1488 ConstString name = pointee_type.GetTypeName();
1489 auto it = m_reference_type_map.find(name);
1490 if (it == m_reference_type_map.end())
1491 it = m_reference_type_map.emplace(name, std::unique_ptr<JavaType>(new JavaReferenceType(pointee_type))).first;
1492 return CompilerType(this, it->second.get());
1496 JavaASTContext::CompleteObjectType(const CompilerType &object_type)
1498 JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(object_type.GetOpaqueQualType()));
1499 assert(obj && "JavaASTContext::CompleteObjectType called with not a JavaObjectType");
1500 obj->SetCompleteType(true);
1504 JavaASTContext::AddBaseClassToObject(const CompilerType &object_type, const CompilerType &member_type,
1505 uint32_t member_offset)
1507 JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(object_type.GetOpaqueQualType()));
1508 assert(obj && "JavaASTContext::AddMemberToObject called with not a JavaObjectType");
1509 obj->AddBaseClass(member_type, member_offset);
1513 JavaASTContext::AddMemberToObject(const CompilerType &object_type, const ConstString &name,
1514 const CompilerType &member_type, uint32_t member_offset)
1516 JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(object_type.GetOpaqueQualType()));
1517 assert(obj && "JavaASTContext::AddMemberToObject called with not a JavaObjectType");
1518 obj->AddField(name, member_type, member_offset);
1522 JavaASTContext::SetDynamicTypeId(const CompilerType &type, const DWARFExpression &type_id)
1524 JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type.GetOpaqueQualType()));
1525 assert(obj && "JavaASTContext::SetDynamicTypeId called with not a JavaObjectType");
1526 obj->SetDynamicTypeId(type_id);
1530 JavaASTContext::CalculateDynamicTypeId(ExecutionContext *exe_ctx, const CompilerType &type, ValueObject &in_value)
1532 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type.GetOpaqueQualType())))
1533 return obj->CalculateDynamicTypeId(exe_ctx, in_value);
1534 if (JavaArrayType *arr = llvm::dyn_cast<JavaArrayType>(static_cast<JavaType *>(type.GetOpaqueQualType())))
1535 return arr->CalculateDynamicTypeId(exe_ctx, in_value);
1540 JavaASTContext::CalculateArraySize(const CompilerType &type, ValueObject &in_value)
1542 if (JavaArrayType *arr = llvm::dyn_cast<JavaArrayType>(static_cast<JavaType *>(type.GetOpaqueQualType())))
1543 return arr->GetNumElements(&in_value);
1548 JavaASTContext::CalculateArrayElementOffset(const CompilerType &type, size_t index)
1550 if (JavaArrayType *arr = llvm::dyn_cast<JavaArrayType>(static_cast<JavaType *>(type.GetOpaqueQualType())))
1551 return arr->GetElementOffset(index);
1556 JavaASTContext::GetLinkageName(const CompilerType &type)
1558 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type.GetOpaqueQualType())))
1559 return obj->GetLinkageName();
1560 return ConstString();