CompilerType ObjCLanguageRuntime::EncodingToType::RealizeType( ClangASTContext &ast_ctx, const char *name, bool for_expression) { clang::ASTContext *clang_ast = ast_ctx.getASTContext(); if (!clang_ast) return CompilerType(); return RealizeType(*clang_ast, name, for_expression); }
CompilerType ClangASTImporter::CopyType(ClangASTContext &dst_ast, const CompilerType &src_type) { clang::ASTContext *dst_clang_ast = dst_ast.getASTContext(); if (dst_clang_ast) { ClangASTContext *src_ast = llvm::dyn_cast_or_null<ClangASTContext>(src_type.GetTypeSystem()); if (src_ast) { clang::ASTContext *src_clang_ast = src_ast->getASTContext(); if (src_clang_ast) { lldb::opaque_compiler_type_t dst_clang_type = CopyType( dst_clang_ast, src_clang_ast, src_type.GetOpaqueQualType()); if (dst_clang_type) return CompilerType(&dst_ast, dst_clang_type); } } } return CompilerType(); }
virtual bool Update() { m_impl.Clear(); TypeSystem* type_system = m_backend.GetCompilerType().GetTypeSystem(); if (!type_system) return false; ClangASTContext *ast = m_backend.GetExecutionContextRef().GetTargetSP()->GetScratchClangASTContext(); if (!ast) return false; m_uint_star_type = ast->GetPointerSizedIntType(false); static ConstString g__indexes("_indexes"); static ConstString g__length("_length"); ProcessSP process_sp = m_backend.GetProcessSP(); if (!process_sp) return false; ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); if (!runtime) return false; ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(m_backend)); if (!descriptor.get() || !descriptor->IsValid()) return false; uint64_t info_bits(0),value_bits(0),payload(0); if (descriptor->GetTaggedPointerInfo(&info_bits, &value_bits, &payload)) { m_impl.m_inlined.SetIndexes(payload, *process_sp); m_impl.m_mode = Mode::Inlined; } else { ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _indexes_id; ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _length_id; bool has_indexes(false),has_length(false); for (size_t x = 0; x < descriptor->GetNumIVars(); x++) { const auto& ivar = descriptor->GetIVarAtIndex(x); if (ivar.m_name == g__indexes) { _indexes_id = ivar; has_indexes = true; } else if (ivar.m_name == g__length) { _length_id = ivar; has_length = true; } if (has_length && has_indexes) break; } if (has_length && has_indexes) { m_impl.m_outsourced.m_indexes = m_backend.GetSyntheticChildAtOffset(_indexes_id.m_offset, m_uint_star_type.GetPointerType(), true).get(); ValueObjectSP length_sp(m_backend.GetSyntheticChildAtOffset(_length_id.m_offset, m_uint_star_type, true)); if (length_sp) { m_impl.m_outsourced.m_count = length_sp->GetValueAsUnsigned(0); if (m_impl.m_outsourced.m_indexes) m_impl.m_mode = Mode::Outsourced; } } } return false; }