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 {
33 class JavaASTContext::JavaType {
43 JavaType(LLVMCastKind kind) : m_kind(kind) {}
45 virtual ~JavaType() = default;
47 virtual ConstString GetName() = 0;
49 virtual void Dump(Stream *s) = 0;
51 virtual bool IsCompleteType() = 0;
53 LLVMCastKind getKind() const { return m_kind; }
59 } // end of namespace lldb_private
63 class JavaPrimitiveType : public JavaASTContext::JavaType {
76 JavaPrimitiveType(TypeKind type_kind)
77 : JavaType(JavaType::eKindPrimitive), m_type_kind(type_kind) {}
79 ConstString GetName() override {
80 switch (m_type_kind) {
82 return ConstString("byte");
84 return ConstString("short");
86 return ConstString("int");
88 return ConstString("long");
90 return ConstString("float");
92 return ConstString("double");
94 return ConstString("boolean");
96 return ConstString("char");
101 TypeKind GetTypeKind() { return m_type_kind; }
103 void Dump(Stream *s) override { s->Printf("%s\n", GetName().GetCString()); }
105 bool IsCompleteType() override { return true; }
107 static bool classof(const JavaType *jt) {
108 return jt->getKind() == JavaType::eKindPrimitive;
112 const TypeKind m_type_kind;
115 class JavaDynamicType : public JavaASTContext::JavaType {
117 JavaDynamicType(LLVMCastKind kind, const ConstString &linkage_name)
118 : JavaType(kind), m_linkage_name(linkage_name),
119 m_dynamic_type_id(nullptr) {}
121 ConstString GetLinkageName() const { return m_linkage_name; }
123 void SetDynamicTypeId(const DWARFExpression &type_id) {
124 m_dynamic_type_id = type_id;
127 uint64_t CalculateDynamicTypeId(ExecutionContext *exe_ctx,
128 ValueObject &value_obj) {
129 if (!m_dynamic_type_id.IsValid())
132 Value obj_load_address = value_obj.GetValue();
133 obj_load_address.ResolveValue(exe_ctx);
134 obj_load_address.SetValueType(Value::eValueTypeLoadAddress);
137 if (m_dynamic_type_id.Evaluate(exe_ctx->GetBestExecutionContextScope(),
138 nullptr, nullptr, 0, &obj_load_address,
139 nullptr, result, nullptr)) {
142 lldb::addr_t type_id_addr = result.GetScalar().UInt();
143 lldb::ProcessSP process_sp = exe_ctx->GetProcessSP();
145 return process_sp->ReadUnsignedIntegerFromMemory(
146 type_id_addr, process_sp->GetAddressByteSize(), UINT64_MAX, error);
153 ConstString m_linkage_name;
154 DWARFExpression m_dynamic_type_id;
157 class JavaObjectType : public JavaDynamicType {
165 JavaObjectType(const ConstString &name, const ConstString &linkage_name,
167 : JavaDynamicType(JavaType::eKindObject, linkage_name), m_name(name),
168 m_byte_size(byte_size), m_base_class_offset(0), m_is_complete(false) {}
170 ConstString GetName() override { return m_name; }
172 uint32_t GetByteSize() const { return m_byte_size; }
174 uint32_t GetNumFields() { return m_fields.size(); }
176 void Dump(Stream *s) override {
177 if (m_base_class.IsValid())
178 s->Printf("%s : %s\n", GetName().GetCString(),
179 m_base_class.GetTypeName().GetCString());
181 s->Printf("%s\n", GetName().GetCString());
184 for (const Field &f : m_fields)
185 s->Printf("%s %s\n", f.m_type.GetTypeName().GetCString(),
186 f.m_name.GetCString());
190 Field *GetFieldAtIndex(size_t idx) {
191 if (idx < m_fields.size())
192 return &m_fields[idx];
196 CompilerType GetBaseClass() { return m_base_class; }
198 uint32_t GetBaseClassOffset() { return m_base_class_offset; }
200 uint32_t GetNumInterfaces() { return m_interfaces.size(); }
202 CompilerType GetInterfaceAtIndex(uint32_t idx) {
203 if (m_interfaces.size() < idx)
204 return m_interfaces[idx];
205 return CompilerType();
208 bool IsCompleteType() override { return m_is_complete; }
210 void SetCompleteType(bool is_complete) {
211 m_is_complete = is_complete;
212 if (m_byte_size == 0) {
213 // Try to calcualte the size of the object based on it's values
214 for (const Field &field : m_fields) {
215 uint32_t field_end = field.m_offset + field.m_type.GetByteSize(nullptr);
216 if (field_end > m_byte_size)
217 m_byte_size = field_end;
222 void AddBaseClass(const CompilerType &type, uint32_t offset) {
223 // TODO: Check if type is an interface and add it to the interface list in
226 m_base_class_offset = offset;
229 void AddField(const ConstString &name, const CompilerType &type,
231 m_fields.push_back({name, type, offset});
234 static bool classof(const JavaType *jt) {
235 return jt->getKind() == JavaType::eKindObject;
240 uint32_t m_byte_size;
241 CompilerType m_base_class;
242 uint32_t m_base_class_offset;
243 std::vector<CompilerType> m_interfaces;
244 std::vector<Field> m_fields;
248 class JavaReferenceType : public JavaASTContext::JavaType {
250 JavaReferenceType(CompilerType pointee_type)
251 : JavaType(JavaType::eKindReference), m_pointee_type(pointee_type) {}
253 static bool classof(const JavaType *jt) {
254 return jt->getKind() == JavaType::eKindReference;
257 CompilerType GetPointeeType() { return m_pointee_type; }
259 ConstString GetName() override {
260 ConstString pointee_type_name =
261 static_cast<JavaType *>(GetPointeeType().GetOpaqueQualType())
263 return ConstString(std::string(pointee_type_name.AsCString()) + "&");
266 void Dump(Stream *s) override {
267 static_cast<JavaType *>(m_pointee_type.GetOpaqueQualType())->Dump(s);
270 bool IsCompleteType() override { return m_pointee_type.IsCompleteType(); }
273 CompilerType m_pointee_type;
276 class JavaArrayType : public JavaDynamicType {
278 JavaArrayType(const ConstString &linkage_name, CompilerType element_type,
279 const DWARFExpression &length_expression,
280 lldb::addr_t data_offset)
281 : JavaDynamicType(JavaType::eKindArray, linkage_name),
282 m_element_type(element_type), m_length_expression(length_expression),
283 m_data_offset(data_offset) {}
285 static bool classof(const JavaType *jt) {
286 return jt->getKind() == JavaType::eKindArray;
289 CompilerType GetElementType() { return m_element_type; }
291 ConstString GetName() override {
292 ConstString element_type_name =
293 static_cast<JavaType *>(GetElementType().GetOpaqueQualType())
295 return ConstString(std::string(element_type_name.AsCString()) + "[]");
298 void Dump(Stream *s) override { s->Printf("%s\n", GetName().GetCString()); }
300 bool IsCompleteType() override { return m_length_expression.IsValid(); }
302 uint32_t GetNumElements(ValueObject *value_obj) {
303 if (!m_length_expression.IsValid())
307 ValueObjectSP address_obj = value_obj->AddressOf(error);
311 Value obj_load_address = address_obj->GetValue();
312 obj_load_address.SetValueType(Value::eValueTypeLoadAddress);
315 ExecutionContextScope *exec_ctx_scope = value_obj->GetExecutionContextRef()
317 .GetBestExecutionContextScope();
318 if (m_length_expression.Evaluate(exec_ctx_scope, nullptr, nullptr, 0,
319 nullptr, &obj_load_address, result,
321 return result.GetScalar().UInt();
326 uint64_t GetElementOffset(size_t idx) {
327 return m_data_offset + idx * m_element_type.GetByteSize(nullptr);
331 CompilerType m_element_type;
332 DWARFExpression m_length_expression;
333 lldb::addr_t m_data_offset;
336 } // end of anonymous namespace
338 ConstString JavaASTContext::GetPluginNameStatic() {
339 return ConstString("java");
342 ConstString JavaASTContext::GetPluginName() {
343 return JavaASTContext::GetPluginNameStatic();
346 uint32_t JavaASTContext::GetPluginVersion() { return 1; }
348 lldb::TypeSystemSP JavaASTContext::CreateInstance(lldb::LanguageType language,
351 if (language == eLanguageTypeJava) {
353 return std::make_shared<JavaASTContext>(module->GetArchitecture());
355 return std::make_shared<JavaASTContext>(target->GetArchitecture());
356 assert(false && "Either a module or a target has to be specifed to create "
359 return lldb::TypeSystemSP();
362 void JavaASTContext::EnumerateSupportedLanguages(
363 std::set<lldb::LanguageType> &languages_for_types,
364 std::set<lldb::LanguageType> &languages_for_expressions) {
365 static std::vector<lldb::LanguageType> s_languages_for_types(
366 {lldb::eLanguageTypeJava});
367 static std::vector<lldb::LanguageType> s_languages_for_expressions({});
369 languages_for_types.insert(s_languages_for_types.begin(),
370 s_languages_for_types.end());
371 languages_for_expressions.insert(s_languages_for_expressions.begin(),
372 s_languages_for_expressions.end());
375 void JavaASTContext::Initialize() {
376 PluginManager::RegisterPlugin(GetPluginNameStatic(), "AST context plug-in",
377 CreateInstance, EnumerateSupportedLanguages);
380 void JavaASTContext::Terminate() {
381 PluginManager::UnregisterPlugin(CreateInstance);
384 JavaASTContext::JavaASTContext(const ArchSpec &arch)
385 : TypeSystem(eKindJava), m_pointer_byte_size(arch.GetAddressByteSize()) {}
387 JavaASTContext::~JavaASTContext() {}
389 uint32_t JavaASTContext::GetPointerByteSize() { return m_pointer_byte_size; }
391 DWARFASTParser *JavaASTContext::GetDWARFParser() {
392 if (!m_dwarf_ast_parser_ap)
393 m_dwarf_ast_parser_ap.reset(new DWARFASTParserJava(*this));
394 return m_dwarf_ast_parser_ap.get();
397 ConstString JavaASTContext::DeclGetName(void *opaque_decl) {
398 return ConstString();
401 std::vector<CompilerDecl> JavaASTContext::DeclContextFindDeclByName(
402 void *opaque_decl_ctx, ConstString name, const bool ignore_imported_decls) {
403 return std::vector<CompilerDecl>();
406 bool JavaASTContext::DeclContextIsStructUnionOrClass(void *opaque_decl_ctx) {
410 ConstString JavaASTContext::DeclContextGetName(void *opaque_decl_ctx) {
411 return ConstString();
414 bool JavaASTContext::DeclContextIsClassMethod(
415 void *opaque_decl_ctx, lldb::LanguageType *language_ptr,
416 bool *is_instance_method_ptr, ConstString *language_object_name_ptr) {
420 bool JavaASTContext::IsArrayType(lldb::opaque_compiler_type_t type,
421 CompilerType *element_type, uint64_t *size,
422 bool *is_incomplete) {
424 element_type->Clear();
428 *is_incomplete = false;
430 if (JavaArrayType *array =
431 llvm::dyn_cast<JavaArrayType>(static_cast<JavaType *>(type))) {
433 *element_type = array->GetElementType();
439 bool JavaASTContext::IsAggregateType(lldb::opaque_compiler_type_t type) {
440 return llvm::isa<JavaObjectType>(static_cast<JavaType *>(type));
443 bool JavaASTContext::IsCharType(lldb::opaque_compiler_type_t type) {
444 if (JavaPrimitiveType *ptype =
445 llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type)))
446 return ptype->GetTypeKind() == JavaPrimitiveType::eTypeChar;
450 bool JavaASTContext::IsFloatingPointType(lldb::opaque_compiler_type_t type,
451 uint32_t &count, bool &is_complex) {
454 if (JavaPrimitiveType *ptype =
455 llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type))) {
456 switch (ptype->GetTypeKind()) {
457 case JavaPrimitiveType::eTypeFloat:
458 case JavaPrimitiveType::eTypeDouble:
470 bool JavaASTContext::IsFunctionType(lldb::opaque_compiler_type_t type,
471 bool *is_variadic_ptr) {
473 *is_variadic_ptr = false;
477 size_t JavaASTContext::GetNumberOfFunctionArguments(
478 lldb::opaque_compiler_type_t type) {
483 JavaASTContext::GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type,
484 const size_t index) {
485 return CompilerType();
488 bool JavaASTContext::IsFunctionPointerType(lldb::opaque_compiler_type_t type) {
492 bool JavaASTContext::IsBlockPointerType(
493 lldb::opaque_compiler_type_t type,
494 CompilerType *function_pointer_type_ptr) {
498 bool JavaASTContext::IsIntegerType(lldb::opaque_compiler_type_t type,
500 if (JavaPrimitiveType *ptype =
501 llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type))) {
502 switch (ptype->GetTypeKind()) {
503 case JavaPrimitiveType::eTypeByte:
504 case JavaPrimitiveType::eTypeShort:
505 case JavaPrimitiveType::eTypeInt:
506 case JavaPrimitiveType::eTypeLong:
518 bool JavaASTContext::IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
519 CompilerType *target_type,
520 bool check_cplusplus,
522 return llvm::isa<JavaReferenceType>(static_cast<JavaType *>(type));
525 bool JavaASTContext::IsPointerType(lldb::opaque_compiler_type_t type,
526 CompilerType *pointee_type) {
528 pointee_type->Clear();
532 bool JavaASTContext::IsReferenceType(lldb::opaque_compiler_type_t type,
533 CompilerType *pointee_type,
538 if (JavaReferenceType *ref =
539 llvm::dyn_cast<JavaReferenceType>(static_cast<JavaType *>(type))) {
541 *pointee_type = ref->GetPointeeType();
546 pointee_type->Clear();
550 bool JavaASTContext::IsScalarType(lldb::opaque_compiler_type_t type) {
551 return llvm::isa<JavaReferenceType>(static_cast<JavaType *>(type)) ||
552 llvm::isa<JavaPrimitiveType>(static_cast<JavaType *>(type));
555 bool JavaASTContext::IsVoidType(lldb::opaque_compiler_type_t type) {
556 return false; // TODO: Implement if we introduce the void type
559 bool JavaASTContext::SupportsLanguage(lldb::LanguageType language) {
560 return language == lldb::eLanguageTypeJava;
563 bool JavaASTContext::IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) {
567 bool JavaASTContext::IsPointerOrReferenceType(lldb::opaque_compiler_type_t type,
568 CompilerType *pointee_type) {
569 return IsPointerType(type, pointee_type) ||
570 IsReferenceType(type, pointee_type);
573 bool JavaASTContext::IsCStringType(lldb::opaque_compiler_type_t type,
575 return false; // TODO: Implement it if we need it for string literals
578 bool JavaASTContext::IsTypedefType(lldb::opaque_compiler_type_t type) {
582 bool JavaASTContext::IsVectorType(lldb::opaque_compiler_type_t type,
583 CompilerType *element_type, uint64_t *size) {
585 element_type->Clear();
591 bool JavaASTContext::IsPolymorphicClass(lldb::opaque_compiler_type_t type) {
592 return llvm::isa<JavaObjectType>(static_cast<JavaType *>(type));
596 JavaASTContext::IsHomogeneousAggregate(lldb::opaque_compiler_type_t type,
597 CompilerType *base_type_ptr) {
601 bool JavaASTContext::IsCompleteType(lldb::opaque_compiler_type_t type) {
602 return static_cast<JavaType *>(type)->IsCompleteType();
605 bool JavaASTContext::IsConst(lldb::opaque_compiler_type_t type) {
609 bool JavaASTContext::IsBeingDefined(lldb::opaque_compiler_type_t type) {
613 bool JavaASTContext::IsDefined(lldb::opaque_compiler_type_t type) {
614 return type != nullptr;
617 bool JavaASTContext::GetCompleteType(lldb::opaque_compiler_type_t type) {
618 if (IsCompleteType(type))
621 if (JavaArrayType *array =
622 llvm::dyn_cast<JavaArrayType>(static_cast<JavaType *>(type)))
623 return GetCompleteType(array->GetElementType().GetOpaqueQualType());
625 if (JavaReferenceType *reference =
626 llvm::dyn_cast<JavaReferenceType>(static_cast<JavaType *>(type)))
627 return GetCompleteType(reference->GetPointeeType().GetOpaqueQualType());
629 if (llvm::isa<JavaObjectType>(static_cast<JavaType *>(type))) {
630 SymbolFile *symbol_file = GetSymbolFile();
634 CompilerType object_type(this, type);
635 return symbol_file->CompleteType(object_type);
640 ConstString JavaASTContext::GetTypeName(lldb::opaque_compiler_type_t type) {
642 return static_cast<JavaType *>(type)->GetName();
643 return ConstString();
647 JavaASTContext::GetTypeInfo(lldb::opaque_compiler_type_t type,
648 CompilerType *pointee_or_element_compiler_type) {
649 if (pointee_or_element_compiler_type)
650 pointee_or_element_compiler_type->Clear();
654 if (IsReferenceType(type, pointee_or_element_compiler_type))
655 return eTypeHasChildren | eTypeHasValue | eTypeIsReference;
656 if (IsArrayType(type, pointee_or_element_compiler_type, nullptr, nullptr))
657 return eTypeHasChildren | eTypeIsArray;
658 if (llvm::isa<JavaObjectType>(static_cast<JavaType *>(type)))
659 return eTypeHasChildren | eTypeIsClass;
661 if (JavaPrimitiveType *ptype =
662 llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type))) {
663 switch (ptype->GetTypeKind()) {
664 case JavaPrimitiveType::eTypeByte:
665 case JavaPrimitiveType::eTypeShort:
666 case JavaPrimitiveType::eTypeInt:
667 case JavaPrimitiveType::eTypeLong:
668 return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar | eTypeIsInteger |
670 case JavaPrimitiveType::eTypeFloat:
671 case JavaPrimitiveType::eTypeDouble:
672 return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar | eTypeIsFloat |
674 case JavaPrimitiveType::eTypeBoolean:
675 return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar;
676 case JavaPrimitiveType::eTypeChar:
677 return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar;
684 JavaASTContext::GetTypeClass(lldb::opaque_compiler_type_t type) {
686 return eTypeClassInvalid;
687 if (llvm::isa<JavaReferenceType>(static_cast<JavaType *>(type)))
688 return eTypeClassReference;
689 if (llvm::isa<JavaArrayType>(static_cast<JavaType *>(type)))
690 return eTypeClassArray;
691 if (llvm::isa<JavaObjectType>(static_cast<JavaType *>(type)))
692 return eTypeClassClass;
693 if (llvm::isa<JavaPrimitiveType>(static_cast<JavaType *>(type)))
694 return eTypeClassBuiltin;
695 assert(false && "Java type with unhandled type class");
696 return eTypeClassInvalid;
700 JavaASTContext::GetMinimumLanguage(lldb::opaque_compiler_type_t type) {
701 return lldb::eLanguageTypeJava;
705 JavaASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type,
710 CompilerType element_type;
711 if (IsArrayType(type, &element_type, nullptr, nullptr))
713 return CompilerType();
716 CompilerType JavaASTContext::GetPointeeType(lldb::opaque_compiler_type_t type) {
717 CompilerType pointee_type;
718 if (IsPointerType(type, &pointee_type))
720 return CompilerType();
723 CompilerType JavaASTContext::GetPointerType(lldb::opaque_compiler_type_t type) {
724 return CompilerType(); // No pointer types in java
728 JavaASTContext::GetCanonicalType(lldb::opaque_compiler_type_t type) {
729 return CompilerType(this, type);
733 JavaASTContext::GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) {
734 return CompilerType(this, type);
738 JavaASTContext::GetNonReferenceType(lldb::opaque_compiler_type_t type) {
739 CompilerType pointee_type;
740 if (IsReferenceType(type, &pointee_type))
742 return CompilerType(this, type);
746 JavaASTContext::GetTypedefedType(lldb::opaque_compiler_type_t type) {
747 return CompilerType();
750 CompilerType JavaASTContext::GetBasicTypeFromAST(lldb::BasicType basic_type) {
751 return CompilerType();
755 JavaASTContext::GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding,
757 return CompilerType();
760 size_t JavaASTContext::GetTypeBitAlign(lldb::opaque_compiler_type_t type) {
765 JavaASTContext::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) {
766 if (JavaPrimitiveType *ptype =
767 llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type))) {
768 switch (ptype->GetTypeKind()) {
769 case JavaPrimitiveType::eTypeByte:
770 return eBasicTypeOther;
771 case JavaPrimitiveType::eTypeShort:
772 return eBasicTypeShort;
773 case JavaPrimitiveType::eTypeInt:
774 return eBasicTypeInt;
775 case JavaPrimitiveType::eTypeLong:
776 return eBasicTypeLong;
777 case JavaPrimitiveType::eTypeFloat:
778 return eBasicTypeFloat;
779 case JavaPrimitiveType::eTypeDouble:
780 return eBasicTypeDouble;
781 case JavaPrimitiveType::eTypeBoolean:
782 return eBasicTypeBool;
783 case JavaPrimitiveType::eTypeChar:
784 return eBasicTypeChar;
787 return eBasicTypeInvalid;
790 uint64_t JavaASTContext::GetBitSize(lldb::opaque_compiler_type_t type,
791 ExecutionContextScope *exe_scope) {
792 if (JavaPrimitiveType *ptype =
793 llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type))) {
794 switch (ptype->GetTypeKind()) {
795 case JavaPrimitiveType::eTypeByte:
797 case JavaPrimitiveType::eTypeShort:
799 case JavaPrimitiveType::eTypeInt:
801 case JavaPrimitiveType::eTypeLong:
803 case JavaPrimitiveType::eTypeFloat:
805 case JavaPrimitiveType::eTypeDouble:
807 case JavaPrimitiveType::eTypeBoolean:
809 case JavaPrimitiveType::eTypeChar:
812 } else if (llvm::isa<JavaReferenceType>(static_cast<JavaType *>(type))) {
813 return 32; // References are always 4 byte long in java
814 } else if (llvm::isa<JavaArrayType>(static_cast<JavaType *>(type))) {
816 } else if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(
817 static_cast<JavaType *>(type))) {
818 return obj->GetByteSize() * 8;
823 lldb::Encoding JavaASTContext::GetEncoding(lldb::opaque_compiler_type_t type,
827 if (JavaPrimitiveType *ptype =
828 llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type))) {
829 switch (ptype->GetTypeKind()) {
830 case JavaPrimitiveType::eTypeByte:
831 case JavaPrimitiveType::eTypeShort:
832 case JavaPrimitiveType::eTypeInt:
833 case JavaPrimitiveType::eTypeLong:
834 return eEncodingSint;
835 case JavaPrimitiveType::eTypeFloat:
836 case JavaPrimitiveType::eTypeDouble:
837 return eEncodingIEEE754;
838 case JavaPrimitiveType::eTypeBoolean:
839 case JavaPrimitiveType::eTypeChar:
840 return eEncodingUint;
843 if (IsReferenceType(type))
844 return eEncodingUint;
845 return eEncodingInvalid;
848 lldb::Format JavaASTContext::GetFormat(lldb::opaque_compiler_type_t type) {
849 if (JavaPrimitiveType *ptype =
850 llvm::dyn_cast<JavaPrimitiveType>(static_cast<JavaType *>(type))) {
851 switch (ptype->GetTypeKind()) {
852 case JavaPrimitiveType::eTypeByte:
853 case JavaPrimitiveType::eTypeShort:
854 case JavaPrimitiveType::eTypeInt:
855 case JavaPrimitiveType::eTypeLong:
856 return eFormatDecimal;
857 case JavaPrimitiveType::eTypeFloat:
858 case JavaPrimitiveType::eTypeDouble:
860 case JavaPrimitiveType::eTypeBoolean:
861 return eFormatBoolean;
862 case JavaPrimitiveType::eTypeChar:
863 return eFormatUnicode16;
866 if (IsReferenceType(type))
868 return eFormatDefault;
871 unsigned JavaASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type) {
876 JavaASTContext::ConvertStringToFloatValue(lldb::opaque_compiler_type_t type,
877 const char *s, uint8_t *dst,
879 assert(false && "Not implemented");
884 JavaASTContext::GetNumTemplateArguments(lldb::opaque_compiler_type_t type) {
889 JavaASTContext::GetTemplateArgument(lldb::opaque_compiler_type_t type,
891 lldb::TemplateArgumentKind &kind) {
892 return CompilerType();
895 uint32_t JavaASTContext::GetNumFields(lldb::opaque_compiler_type_t type) {
896 if (JavaObjectType *obj =
897 llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type))) {
898 GetCompleteType(type);
899 return obj->GetNumFields();
904 CompilerType JavaASTContext::GetFieldAtIndex(lldb::opaque_compiler_type_t type,
905 size_t idx, std::string &name,
906 uint64_t *bit_offset_ptr,
907 uint32_t *bitfield_bit_size_ptr,
908 bool *is_bitfield_ptr) {
911 if (bitfield_bit_size_ptr)
912 *bitfield_bit_size_ptr = 0;
914 *is_bitfield_ptr = false;
916 if (JavaObjectType *obj =
917 llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type))) {
918 GetCompleteType(type);
920 JavaObjectType::Field *field = obj->GetFieldAtIndex(idx);
922 return CompilerType();
923 name = field->m_name.AsCString();
925 *bit_offset_ptr = field->m_offset * 8;
926 return field->m_type;
928 return CompilerType();
931 uint32_t JavaASTContext::GetNumChildren(lldb::opaque_compiler_type_t type,
932 bool omit_empty_base_classes) {
933 GetCompleteType(type);
935 if (JavaReferenceType *ref =
936 llvm::dyn_cast<JavaReferenceType>(static_cast<JavaType *>(type)))
937 return ref->GetPointeeType().GetNumChildren(omit_empty_base_classes);
939 if (llvm::isa<JavaObjectType>(static_cast<JavaType *>(type)))
940 return GetNumFields(type) + GetNumDirectBaseClasses(type);
946 JavaASTContext::GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) {
947 if (JavaObjectType *obj =
948 llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type))) {
949 GetCompleteType(type);
950 return obj->GetNumInterfaces() + (obj->GetBaseClass() ? 1 : 0);
956 JavaASTContext::GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) {
957 if (JavaObjectType *obj =
958 llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type))) {
959 GetCompleteType(type);
960 return obj->GetNumInterfaces();
965 CompilerType JavaASTContext::GetDirectBaseClassAtIndex(
966 lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) {
967 if (JavaObjectType *obj =
968 llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type))) {
969 GetCompleteType(type);
971 if (CompilerType base_class = obj->GetBaseClass()) {
977 return obj->GetInterfaceAtIndex(idx);
979 return CompilerType();
982 CompilerType JavaASTContext::GetVirtualBaseClassAtIndex(
983 lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) {
984 if (JavaObjectType *obj =
985 llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type))) {
986 GetCompleteType(type);
987 return obj->GetInterfaceAtIndex(idx);
989 return CompilerType();
992 void JavaASTContext::DumpValue(
993 lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, Stream *s,
994 lldb::Format format, const DataExtractor &data, lldb::offset_t data_offset,
995 size_t data_byte_size, uint32_t bitfield_bit_size,
996 uint32_t bitfield_bit_offset, bool show_types, bool show_summary,
997 bool verbose, uint32_t depth) {
998 assert(false && "Not implemented");
1001 bool JavaASTContext::DumpTypeValue(
1002 lldb::opaque_compiler_type_t type, Stream *s, lldb::Format format,
1003 const DataExtractor &data, lldb::offset_t data_offset,
1004 size_t data_byte_size, uint32_t bitfield_bit_size,
1005 uint32_t bitfield_bit_offset, ExecutionContextScope *exe_scope) {
1006 if (IsScalarType(type)) {
1007 return data.Dump(s, data_offset, format, data_byte_size,
1009 UINT32_MAX, LLDB_INVALID_ADDRESS, bitfield_bit_size,
1010 bitfield_bit_offset, exe_scope);
1015 void JavaASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type) {
1016 StreamFile s(stdout, false);
1017 DumpTypeDescription(type, &s);
1020 void JavaASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type,
1022 static_cast<JavaType *>(type)->Dump(s);
1025 void JavaASTContext::DumpSummary(lldb::opaque_compiler_type_t type,
1026 ExecutionContext *exe_ctx, Stream *s,
1027 const DataExtractor &data,
1028 lldb::offset_t data_offset,
1029 size_t data_byte_size) {
1030 assert(false && "Not implemented");
1033 int JavaASTContext::GetFunctionArgumentCount(
1034 lldb::opaque_compiler_type_t type) {
1038 CompilerType JavaASTContext::GetFunctionArgumentTypeAtIndex(
1039 lldb::opaque_compiler_type_t type, size_t idx) {
1040 return CompilerType();
1044 JavaASTContext::GetFunctionReturnType(lldb::opaque_compiler_type_t type) {
1045 return CompilerType();
1049 JavaASTContext::GetNumMemberFunctions(lldb::opaque_compiler_type_t type) {
1053 TypeMemberFunctionImpl
1054 JavaASTContext::GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type,
1056 return TypeMemberFunctionImpl();
1059 CompilerType JavaASTContext::GetChildCompilerTypeAtIndex(
1060 lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx,
1061 bool transparent_pointers, bool omit_empty_base_classes,
1062 bool ignore_array_bounds, std::string &child_name,
1063 uint32_t &child_byte_size, int32_t &child_byte_offset,
1064 uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset,
1065 bool &child_is_base_class, bool &child_is_deref_of_parent,
1066 ValueObject *valobj, uint64_t &language_flags) {
1068 child_byte_size = 0;
1069 child_byte_offset = 0;
1070 child_bitfield_bit_size = 0;
1071 child_bitfield_bit_offset = 0;
1072 child_is_base_class = false;
1073 child_is_deref_of_parent = false;
1076 ExecutionContextScope *exec_ctx_scope =
1077 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
1079 if (JavaObjectType *obj =
1080 llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type))) {
1081 GetCompleteType(type);
1083 if (CompilerType base_class = obj->GetBaseClass()) {
1085 JavaType *base_class_type =
1086 static_cast<JavaType *>(base_class.GetOpaqueQualType());
1087 child_name = base_class_type->GetName().GetCString();
1088 child_byte_size = base_class.GetByteSize(
1089 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr);
1090 child_byte_offset = obj->GetBaseClassOffset();
1091 child_is_base_class = true;
1097 JavaObjectType::Field *field = obj->GetFieldAtIndex(idx);
1099 return CompilerType();
1101 child_name = field->m_name.AsCString();
1102 child_byte_size = field->m_type.GetByteSize(exec_ctx_scope);
1103 child_byte_offset = field->m_offset;
1104 return field->m_type;
1105 } else if (JavaReferenceType *ref = llvm::dyn_cast<JavaReferenceType>(
1106 static_cast<JavaType *>(type))) {
1107 CompilerType pointee_type = ref->GetPointeeType();
1109 if (transparent_pointers)
1110 return pointee_type.GetChildCompilerTypeAtIndex(
1111 exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
1112 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
1113 child_bitfield_bit_size, child_bitfield_bit_offset,
1114 child_is_base_class, child_is_deref_of_parent, valobj,
1118 return CompilerType();
1120 if (valobj && valobj->GetName())
1121 child_name = valobj->GetName().GetCString();
1122 child_is_deref_of_parent = true;
1123 child_byte_offset = 0;
1124 child_byte_size = pointee_type.GetByteSize(exec_ctx_scope);
1125 return pointee_type;
1127 return CompilerType();
1131 JavaASTContext::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type,
1133 bool omit_empty_base_classes) {
1134 if (JavaObjectType *obj =
1135 llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type))) {
1136 GetCompleteType(type);
1138 uint32_t index_offset = 0;
1139 if (CompilerType base_class = obj->GetBaseClass()) {
1140 if (base_class.GetTypeName() == ConstString(name))
1144 for (uint32_t i = 0; i < obj->GetNumFields(); ++i) {
1145 if (obj->GetFieldAtIndex(i)->m_name == ConstString(name))
1146 return i + index_offset;
1148 } else if (JavaReferenceType *ref = llvm::dyn_cast<JavaReferenceType>(
1149 static_cast<JavaType *>(type))) {
1150 return GetIndexOfChildWithName(ref->GetPointeeType().GetOpaqueQualType(),
1151 name, omit_empty_base_classes);
1156 size_t JavaASTContext::GetIndexOfChildMemberWithName(
1157 lldb::opaque_compiler_type_t type, const char *name,
1158 bool omit_empty_base_classes, std::vector<uint32_t> &child_indexes) {
1159 child_indexes.clear();
1161 if (JavaObjectType *obj =
1162 llvm::dyn_cast<JavaObjectType>(static_cast<JavaType *>(type))) {
1163 GetCompleteType(type);
1165 uint32_t index_offset = 0;
1166 if (CompilerType base_class = obj->GetBaseClass()) {
1167 if (GetIndexOfChildMemberWithName(base_class.GetOpaqueQualType(), name,
1168 omit_empty_base_classes,
1169 child_indexes) != 0) {
1170 child_indexes.insert(child_indexes.begin(), 0);
1171 return child_indexes.size();
1176 for (uint32_t i = 0; i < obj->GetNumFields(); ++i) {
1177 if (obj->GetFieldAtIndex(i)->m_name == ConstString(name)) {
1178 child_indexes.push_back(i + index_offset);
1179 return child_indexes.size();
1182 } else if (JavaReferenceType *ref = llvm::dyn_cast<JavaReferenceType>(
1183 static_cast<JavaType *>(type))) {
1184 return GetIndexOfChildMemberWithName(
1185 ref->GetPointeeType().GetOpaqueQualType(), name,
1186 omit_empty_base_classes, child_indexes);
1192 JavaASTContext::GetLValueReferenceType(lldb::opaque_compiler_type_t type) {
1193 return CreateReferenceType(CompilerType(this, type));
1196 ConstString JavaASTContext::DeclContextGetScopeQualifiedName(
1197 lldb::opaque_compiler_type_t opaque_decl_ctx) {
1198 return GetTypeName(opaque_decl_ctx);
1201 static void AddPrimitiveType(JavaASTContext::JavaTypeMap &type_map,
1202 JavaPrimitiveType::TypeKind type_kind) {
1203 JavaPrimitiveType *type = new JavaPrimitiveType(type_kind);
1204 type_map.emplace(type->GetName(),
1205 std::unique_ptr<JavaASTContext::JavaType>(type));
1208 CompilerType JavaASTContext::CreateBaseType(const ConstString &name) {
1209 if (m_base_type_map.empty()) {
1210 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeByte);
1211 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeShort);
1212 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeInt);
1213 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeLong);
1214 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeFloat);
1215 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeDouble);
1216 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeBoolean);
1217 AddPrimitiveType(m_base_type_map, JavaPrimitiveType::eTypeChar);
1219 auto it = m_base_type_map.find(name);
1220 if (it != m_base_type_map.end())
1221 return CompilerType(this, it->second.get());
1222 return CompilerType();
1225 CompilerType JavaASTContext::CreateObjectType(const ConstString &name,
1226 const ConstString &linkage_name,
1227 uint32_t byte_size) {
1228 auto it = m_object_type_map.find(name);
1229 if (it == m_object_type_map.end()) {
1230 std::unique_ptr<JavaType> object_type(
1231 new JavaObjectType(name, linkage_name, byte_size));
1232 it = m_object_type_map.emplace(name, std::move(object_type)).first;
1234 return CompilerType(this, it->second.get());
1237 CompilerType JavaASTContext::CreateArrayType(
1238 const ConstString &linkage_name, const CompilerType &element_type,
1239 const DWARFExpression &length_expression, const lldb::addr_t data_offset) {
1240 ConstString name = element_type.GetTypeName();
1241 auto it = m_array_type_map.find(name);
1242 if (it == m_array_type_map.end()) {
1243 std::unique_ptr<JavaType> array_type(new JavaArrayType(
1244 linkage_name, element_type, length_expression, data_offset));
1245 it = m_array_type_map.emplace(name, std::move(array_type)).first;
1247 return CompilerType(this, it->second.get());
1251 JavaASTContext::CreateReferenceType(const CompilerType &pointee_type) {
1252 ConstString name = pointee_type.GetTypeName();
1253 auto it = m_reference_type_map.find(name);
1254 if (it == m_reference_type_map.end())
1255 it = m_reference_type_map
1256 .emplace(name, std::unique_ptr<JavaType>(
1257 new JavaReferenceType(pointee_type)))
1259 return CompilerType(this, it->second.get());
1262 void JavaASTContext::CompleteObjectType(const CompilerType &object_type) {
1263 JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(
1264 static_cast<JavaType *>(object_type.GetOpaqueQualType()));
1266 "JavaASTContext::CompleteObjectType called with not a JavaObjectType");
1267 obj->SetCompleteType(true);
1270 void JavaASTContext::AddBaseClassToObject(const CompilerType &object_type,
1271 const CompilerType &member_type,
1272 uint32_t member_offset) {
1273 JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(
1274 static_cast<JavaType *>(object_type.GetOpaqueQualType()));
1276 "JavaASTContext::AddMemberToObject called with not a JavaObjectType");
1277 obj->AddBaseClass(member_type, member_offset);
1280 void JavaASTContext::AddMemberToObject(const CompilerType &object_type,
1281 const ConstString &name,
1282 const CompilerType &member_type,
1283 uint32_t member_offset) {
1284 JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(
1285 static_cast<JavaType *>(object_type.GetOpaqueQualType()));
1287 "JavaASTContext::AddMemberToObject called with not a JavaObjectType");
1288 obj->AddField(name, member_type, member_offset);
1291 void JavaASTContext::SetDynamicTypeId(const CompilerType &type,
1292 const DWARFExpression &type_id) {
1293 JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(
1294 static_cast<JavaType *>(type.GetOpaqueQualType()));
1296 "JavaASTContext::SetDynamicTypeId called with not a JavaObjectType");
1297 obj->SetDynamicTypeId(type_id);
1300 uint64_t JavaASTContext::CalculateDynamicTypeId(ExecutionContext *exe_ctx,
1301 const CompilerType &type,
1302 ValueObject &in_value) {
1303 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(
1304 static_cast<JavaType *>(type.GetOpaqueQualType())))
1305 return obj->CalculateDynamicTypeId(exe_ctx, in_value);
1306 if (JavaArrayType *arr = llvm::dyn_cast<JavaArrayType>(
1307 static_cast<JavaType *>(type.GetOpaqueQualType())))
1308 return arr->CalculateDynamicTypeId(exe_ctx, in_value);
1312 uint32_t JavaASTContext::CalculateArraySize(const CompilerType &type,
1313 ValueObject &in_value) {
1314 if (JavaArrayType *arr = llvm::dyn_cast<JavaArrayType>(
1315 static_cast<JavaType *>(type.GetOpaqueQualType())))
1316 return arr->GetNumElements(&in_value);
1320 uint64_t JavaASTContext::CalculateArrayElementOffset(const CompilerType &type,
1322 if (JavaArrayType *arr = llvm::dyn_cast<JavaArrayType>(
1323 static_cast<JavaType *>(type.GetOpaqueQualType())))
1324 return arr->GetElementOffset(index);
1328 ConstString JavaASTContext::GetLinkageName(const CompilerType &type) {
1329 if (JavaObjectType *obj = llvm::dyn_cast<JavaObjectType>(
1330 static_cast<JavaType *>(type.GetOpaqueQualType())))
1331 return obj->GetLinkageName();
1332 return ConstString();