671 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			671 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- OCamlASTContext.cpp ----------------------------------------*- C++
 | |
| //-*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "lldb/Symbol/OCamlASTContext.h"
 | |
| #include "lldb/Core/DumpDataExtractor.h"
 | |
| #include "lldb/Core/Module.h"
 | |
| #include "lldb/Core/PluginManager.h"
 | |
| #include "lldb/Core/StreamFile.h"
 | |
| #include "lldb/Core/ValueObject.h"
 | |
| #include "lldb/Symbol/ObjectFile.h"
 | |
| #include "lldb/Symbol/SymbolFile.h"
 | |
| #include "lldb/Symbol/Type.h"
 | |
| #include "lldb/Target/ExecutionContext.h"
 | |
| #include "lldb/Target/Target.h"
 | |
| #include "lldb/Utility/Log.h"
 | |
| 
 | |
| #include "Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h"
 | |
| 
 | |
| using namespace lldb;
 | |
| using namespace lldb_private;
 | |
| 
 | |
| namespace lldb_private {
 | |
| class OCamlASTContext::OCamlType {
 | |
| public:
 | |
|   enum LLVMCastKind {
 | |
|     eKindPrimitive,
 | |
|     eKindObject,
 | |
|     eKindReference,
 | |
|     eKindArray,
 | |
|     kNumKinds
 | |
|   };
 | |
| 
 | |
|   OCamlType(LLVMCastKind kind) : m_kind(kind) {}
 | |
| 
 | |
|   virtual ~OCamlType() = default;
 | |
| 
 | |
|   virtual ConstString GetName() = 0;
 | |
| 
 | |
|   virtual void Dump(Stream *s) = 0;
 | |
| 
 | |
|   virtual bool IsCompleteType() = 0;
 | |
| 
 | |
|   LLVMCastKind getKind() const { return m_kind; }
 | |
| 
 | |
| private:
 | |
|   LLVMCastKind m_kind;
 | |
| };
 | |
| 
 | |
| } // end of namespace lldb_private
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| class OCamlPrimitiveType : public OCamlASTContext::OCamlType {
 | |
| public:
 | |
|   enum TypeKind {
 | |
|     eTypeInt,
 | |
|   };
 | |
| 
 | |
|   OCamlPrimitiveType(TypeKind type_kind, uint32_t byte_size)
 | |
|       : OCamlType(OCamlType::eKindPrimitive), m_type_kind(type_kind),
 | |
|         m_type(ConstString()), m_byte_size(byte_size) {}
 | |
| 
 | |
|   OCamlPrimitiveType(TypeKind type_kind, ConstString s, uint32_t byte_size)
 | |
|       : OCamlType(OCamlType::eKindPrimitive), m_type_kind(type_kind), m_type(s),
 | |
|         m_byte_size(byte_size) {}
 | |
| 
 | |
|   ConstString GetName() override {
 | |
|     switch (m_type_kind) {
 | |
|     case eTypeInt:
 | |
|       return m_type;
 | |
|     }
 | |
|     return ConstString();
 | |
|   }
 | |
| 
 | |
|   TypeKind GetTypeKind() { return m_type_kind; }
 | |
| 
 | |
|   void Dump(Stream *s) override { s->Printf("%s\n", GetName().GetCString()); }
 | |
| 
 | |
|   bool IsCompleteType() override { return true; }
 | |
| 
 | |
|   static bool classof(const OCamlType *ot) {
 | |
|     return ot->getKind() == OCamlType::eKindPrimitive;
 | |
|   }
 | |
| 
 | |
|   uint64_t GetByteSize() const { return m_byte_size; }
 | |
| 
 | |
| private:
 | |
|   const TypeKind m_type_kind;
 | |
|   const ConstString m_type;
 | |
|   uint64_t m_byte_size;
 | |
| };
 | |
| }
 | |
| 
 | |
| OCamlASTContext::OCamlASTContext()
 | |
|     : TypeSystem(eKindOCaml), m_pointer_byte_size(0) {}
 | |
| 
 | |
| OCamlASTContext::~OCamlASTContext() {}
 | |
| 
 | |
| ConstString OCamlASTContext::GetPluginNameStatic() {
 | |
|   return ConstString("ocaml");
 | |
| }
 | |
| 
 | |
| ConstString OCamlASTContext::GetPluginName() {
 | |
|   return OCamlASTContext::GetPluginNameStatic();
 | |
| }
 | |
| 
 | |
| uint32_t OCamlASTContext::GetPluginVersion() { return 1; }
 | |
| 
 | |
| lldb::TypeSystemSP OCamlASTContext::CreateInstance(lldb::LanguageType language,
 | |
|                                                    Module *module,
 | |
|                                                    Target *target) {
 | |
|   Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_LANGUAGE));
 | |
| 
 | |
|   if (language == lldb::eLanguageTypeOCaml) {
 | |
|     std::shared_ptr<OCamlASTContext> ocaml_ast_sp;
 | |
|     ArchSpec arch;
 | |
| 
 | |
|     if (module) {
 | |
|       arch = module->GetArchitecture();
 | |
| 
 | |
|       ObjectFile *objfile = module->GetObjectFile();
 | |
|       ArchSpec object_arch;
 | |
| 
 | |
|       if (!objfile || !objfile->GetArchitecture(object_arch))
 | |
|         return lldb::TypeSystemSP();
 | |
| 
 | |
|       ocaml_ast_sp = std::shared_ptr<OCamlASTContext>(new OCamlASTContext);
 | |
| 
 | |
|       if (log) {
 | |
|         log->Printf(
 | |
|             "((Module*)%p) [%s]->GetOCamlASTContext() = %p", (void *)module,
 | |
|             module->GetFileSpec().GetFilename().AsCString("<anonymous>"),
 | |
|             (void *)ocaml_ast_sp.get());
 | |
|       }
 | |
| 
 | |
|     } else if (target) {
 | |
|       arch = target->GetArchitecture();
 | |
|       ocaml_ast_sp = std::shared_ptr<OCamlASTContextForExpr>(
 | |
|           new OCamlASTContextForExpr(target->shared_from_this()));
 | |
| 
 | |
|       if (log) {
 | |
|         log->Printf("((Target*)%p)->GetOCamlASTContext() = %p", (void *)target,
 | |
|                     (void *)ocaml_ast_sp.get());
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (arch.IsValid()) {
 | |
|       ocaml_ast_sp->SetAddressByteSize(arch.GetAddressByteSize());
 | |
|       return ocaml_ast_sp;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return lldb::TypeSystemSP();
 | |
| }
 | |
| 
 | |
| void OCamlASTContext::EnumerateSupportedLanguages(
 | |
|     std::set<lldb::LanguageType> &languages_for_types,
 | |
|     std::set<lldb::LanguageType> &languages_for_expressions) {
 | |
|   static std::vector<lldb::LanguageType> s_supported_languages_for_types(
 | |
|       {lldb::eLanguageTypeOCaml});
 | |
|   static std::vector<lldb::LanguageType> s_supported_languages_for_expressions(
 | |
|       {});
 | |
| 
 | |
|   languages_for_types.insert(s_supported_languages_for_types.begin(),
 | |
|                              s_supported_languages_for_types.end());
 | |
|   languages_for_expressions.insert(
 | |
|       s_supported_languages_for_expressions.begin(),
 | |
|       s_supported_languages_for_expressions.end());
 | |
| }
 | |
| 
 | |
| void OCamlASTContext::Initialize() {
 | |
|   PluginManager::RegisterPlugin(GetPluginNameStatic(),
 | |
|                                 "OCaml AST context plug-in", CreateInstance,
 | |
|                                 EnumerateSupportedLanguages);
 | |
| }
 | |
| 
 | |
| void OCamlASTContext::Terminate() {
 | |
|   PluginManager::UnregisterPlugin(CreateInstance);
 | |
| }
 | |
| 
 | |
| DWARFASTParser *OCamlASTContext::GetDWARFParser() {
 | |
|   if (!m_dwarf_ast_parser_ap) {
 | |
|     m_dwarf_ast_parser_ap.reset(new DWARFASTParserOCaml(*this));
 | |
|   }
 | |
| 
 | |
|   return m_dwarf_ast_parser_ap.get();
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsArrayType(lldb::opaque_compiler_type_t type,
 | |
|                                   CompilerType *element_type, uint64_t *size,
 | |
|                                   bool *is_incomplete) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsVectorType(lldb::opaque_compiler_type_t type,
 | |
|                                    CompilerType *element_type, uint64_t *size) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsAggregateType(lldb::opaque_compiler_type_t type) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsBeingDefined(lldb::opaque_compiler_type_t type) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsCharType(lldb::opaque_compiler_type_t type) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsCompleteType(lldb::opaque_compiler_type_t type) {
 | |
|   return static_cast<OCamlPrimitiveType *>(type)->IsCompleteType();
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsConst(lldb::opaque_compiler_type_t type) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsCStringType(lldb::opaque_compiler_type_t type,
 | |
|                                     uint32_t &length) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsDefined(lldb::opaque_compiler_type_t type) {
 | |
|   return type != nullptr;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsFloatingPointType(lldb::opaque_compiler_type_t type,
 | |
|                                           uint32_t &count, bool &is_complex) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsFunctionType(lldb::opaque_compiler_type_t type,
 | |
|                                      bool *is_variadic_ptr) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| uint32_t
 | |
| OCamlASTContext::IsHomogeneousAggregate(lldb::opaque_compiler_type_t type,
 | |
|                                         CompilerType *base_type_ptr) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| size_t OCamlASTContext::GetNumberOfFunctionArguments(
 | |
|     lldb::opaque_compiler_type_t type) {
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type,
 | |
|                                             const size_t index) {
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsFunctionPointerType(lldb::opaque_compiler_type_t type) {
 | |
|   return IsFunctionType(type);
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsBlockPointerType(
 | |
|     lldb::opaque_compiler_type_t type,
 | |
|     CompilerType *function_pointer_type_ptr) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsIntegerType(lldb::opaque_compiler_type_t type,
 | |
|                                     bool &is_signed) {
 | |
|   if (OCamlPrimitiveType *ptype =
 | |
|           llvm::dyn_cast<OCamlPrimitiveType>(static_cast<OCamlType *>(type))) {
 | |
|     switch (ptype->GetTypeKind()) {
 | |
|     case OCamlPrimitiveType::eTypeInt:
 | |
|       is_signed = true;
 | |
|       return true;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   is_signed = false;
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsPolymorphicClass(lldb::opaque_compiler_type_t type) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
 | |
|                                             CompilerType *target_type,
 | |
|                                             bool check_cplusplus,
 | |
|                                             bool check_objc) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsRuntimeGeneratedType(
 | |
|     lldb::opaque_compiler_type_t type) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsPointerType(lldb::opaque_compiler_type_t type,
 | |
|                                     CompilerType *pointee_type) {
 | |
|   if (pointee_type)
 | |
|     pointee_type->Clear();
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsPointerOrReferenceType(
 | |
|     lldb::opaque_compiler_type_t type, CompilerType *pointee_type) {
 | |
|   return IsPointerType(type, pointee_type);
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsReferenceType(lldb::opaque_compiler_type_t type,
 | |
|                                       CompilerType *pointee_type,
 | |
|                                       bool *is_rvalue) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsScalarType(lldb::opaque_compiler_type_t type) {
 | |
|   return llvm::isa<OCamlPrimitiveType>(static_cast<OCamlType *>(type));
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsTypedefType(lldb::opaque_compiler_type_t type) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::IsVoidType(lldb::opaque_compiler_type_t type) {
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::SupportsLanguage(lldb::LanguageType language) {
 | |
|   return language == lldb::eLanguageTypeOCaml;
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::GetCompleteType(lldb::opaque_compiler_type_t type) {
 | |
|   if (IsCompleteType(type))
 | |
|     return true;
 | |
| 
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| uint32_t OCamlASTContext::GetPointerByteSize() { return m_pointer_byte_size; }
 | |
| 
 | |
| ConstString OCamlASTContext::GetTypeName(lldb::opaque_compiler_type_t type) {
 | |
|   if (type)
 | |
|     return static_cast<OCamlPrimitiveType *>(type)->GetName();
 | |
| 
 | |
|   return ConstString();
 | |
| }
 | |
| 
 | |
| uint32_t
 | |
| OCamlASTContext::GetTypeInfo(lldb::opaque_compiler_type_t type,
 | |
|                              CompilerType *pointee_or_element_compiler_type) {
 | |
|   if (pointee_or_element_compiler_type)
 | |
|     pointee_or_element_compiler_type->Clear();
 | |
|   if (!type)
 | |
|     return 0;
 | |
| 
 | |
|   if (OCamlPrimitiveType *ptype =
 | |
|           llvm::dyn_cast<OCamlPrimitiveType>(static_cast<OCamlType *>(type))) {
 | |
|     switch (ptype->GetTypeKind()) {
 | |
|     case OCamlPrimitiveType::eTypeInt:
 | |
|       return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar | eTypeIsInteger |
 | |
|              eTypeIsSigned;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| lldb::TypeClass
 | |
| OCamlASTContext::GetTypeClass(lldb::opaque_compiler_type_t type) {
 | |
|   if (llvm::isa<OCamlPrimitiveType>(static_cast<OCamlType *>(type)))
 | |
|     return eTypeClassBuiltin;
 | |
| 
 | |
|   return lldb::eTypeClassInvalid;
 | |
| }
 | |
| 
 | |
| lldb::BasicType
 | |
| OCamlASTContext::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) {
 | |
|   return lldb::eBasicTypeInvalid;
 | |
| }
 | |
| 
 | |
| lldb::LanguageType
 | |
| OCamlASTContext::GetMinimumLanguage(lldb::opaque_compiler_type_t type) {
 | |
|   return lldb::eLanguageTypeOCaml;
 | |
| }
 | |
| 
 | |
| unsigned OCamlASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type) {
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------
 | |
| // Creating related types
 | |
| //----------------------------------------------------------------------
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type,
 | |
|                                      uint64_t *stride) {
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetCanonicalType(lldb::opaque_compiler_type_t type) {
 | |
|   return CompilerType(this, type);
 | |
| }
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) {
 | |
|   return CompilerType(this, type);
 | |
| }
 | |
| 
 | |
| int OCamlASTContext::GetFunctionArgumentCount(
 | |
|     lldb::opaque_compiler_type_t type) {
 | |
|   return GetNumberOfFunctionArguments(type);
 | |
| }
 | |
| 
 | |
| CompilerType OCamlASTContext::GetFunctionArgumentTypeAtIndex(
 | |
|     lldb::opaque_compiler_type_t type, size_t idx) {
 | |
|   return GetFunctionArgumentAtIndex(type, idx);
 | |
| }
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetFunctionReturnType(lldb::opaque_compiler_type_t type) {
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| size_t
 | |
| OCamlASTContext::GetNumMemberFunctions(lldb::opaque_compiler_type_t type) {
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| TypeMemberFunctionImpl
 | |
| OCamlASTContext::GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type,
 | |
|                                           size_t idx) {
 | |
|   return TypeMemberFunctionImpl();
 | |
| }
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetNonReferenceType(lldb::opaque_compiler_type_t type) {
 | |
|   return CompilerType(this, type);
 | |
| }
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetPointeeType(lldb::opaque_compiler_type_t type) {
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetPointerType(lldb::opaque_compiler_type_t type) {
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetTypedefedType(lldb::opaque_compiler_type_t type) {
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| CompilerType OCamlASTContext::GetBasicTypeFromAST(lldb::BasicType basic_type) {
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| CompilerType
 | |
| OCamlASTContext::GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding,
 | |
|                                                      size_t bit_size) {
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| uint64_t OCamlASTContext::GetBitSize(lldb::opaque_compiler_type_t type,
 | |
|                                      ExecutionContextScope *exe_scope) {
 | |
|   if (OCamlPrimitiveType *ptype =
 | |
|           llvm::dyn_cast<OCamlPrimitiveType>(static_cast<OCamlType *>(type))) {
 | |
|     switch (ptype->GetTypeKind()) {
 | |
|     case OCamlPrimitiveType::eTypeInt:
 | |
|       return ptype->GetByteSize() * 8;
 | |
|     }
 | |
|   }
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| lldb::Encoding OCamlASTContext::GetEncoding(lldb::opaque_compiler_type_t type,
 | |
|                                             uint64_t &count) {
 | |
|   count = 1;
 | |
|   bool is_signed;
 | |
|   if (IsIntegerType(type, is_signed))
 | |
|     return is_signed ? lldb::eEncodingSint : lldb::eEncodingUint;
 | |
|   bool is_complex;
 | |
|   uint32_t complex_count;
 | |
|   if (IsFloatingPointType(type, complex_count, is_complex)) {
 | |
|     count = complex_count;
 | |
|     return lldb::eEncodingIEEE754;
 | |
|   }
 | |
|   if (IsPointerType(type))
 | |
|     return lldb::eEncodingUint;
 | |
|   return lldb::eEncodingInvalid;
 | |
| }
 | |
| 
 | |
| lldb::Format OCamlASTContext::GetFormat(lldb::opaque_compiler_type_t type) {
 | |
|   if (!type)
 | |
|     return lldb::eFormatDefault;
 | |
|   return lldb::eFormatBytes;
 | |
| }
 | |
| 
 | |
| size_t OCamlASTContext::GetTypeBitAlign(lldb::opaque_compiler_type_t type) {
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| uint32_t OCamlASTContext::GetNumChildren(lldb::opaque_compiler_type_t type,
 | |
|                                          bool omit_empty_base_classes) {
 | |
|   if (!type || !GetCompleteType(type))
 | |
|     return 0;
 | |
| 
 | |
|   return GetNumFields(type);
 | |
| }
 | |
| 
 | |
| uint32_t OCamlASTContext::GetNumFields(lldb::opaque_compiler_type_t type) {
 | |
|   if (!type || !GetCompleteType(type))
 | |
|     return 0;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| CompilerType OCamlASTContext::GetFieldAtIndex(lldb::opaque_compiler_type_t type,
 | |
|                                               size_t idx, std::string &name,
 | |
|                                               uint64_t *bit_offset_ptr,
 | |
|                                               uint32_t *bitfield_bit_size_ptr,
 | |
|                                               bool *is_bitfield_ptr) {
 | |
|   if (bit_offset_ptr)
 | |
|     *bit_offset_ptr = 0;
 | |
|   if (bitfield_bit_size_ptr)
 | |
|     *bitfield_bit_size_ptr = 0;
 | |
|   if (is_bitfield_ptr)
 | |
|     *is_bitfield_ptr = false;
 | |
| 
 | |
|   if (!type || !GetCompleteType(type))
 | |
|     return CompilerType();
 | |
| 
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| CompilerType OCamlASTContext::GetChildCompilerTypeAtIndex(
 | |
|     lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx,
 | |
|     bool transparent_pointers, bool omit_empty_base_classes,
 | |
|     bool ignore_array_bounds, std::string &child_name,
 | |
|     uint32_t &child_byte_size, int32_t &child_byte_offset,
 | |
|     uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset,
 | |
|     bool &child_is_base_class, bool &child_is_deref_of_parent,
 | |
|     ValueObject *valobj, uint64_t &language_flags) {
 | |
|   child_name.clear();
 | |
|   child_byte_size = 0;
 | |
|   child_byte_offset = 0;
 | |
|   child_bitfield_bit_size = 0;
 | |
|   child_bitfield_bit_offset = 0;
 | |
|   child_is_base_class = false;
 | |
|   child_is_deref_of_parent = false;
 | |
|   language_flags = 0;
 | |
| 
 | |
|   if (!type || !GetCompleteType(type))
 | |
|     return CompilerType();
 | |
| 
 | |
|   return CompilerType();
 | |
| }
 | |
| 
 | |
| uint32_t
 | |
| OCamlASTContext::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type,
 | |
|                                          const char *name,
 | |
|                                          bool omit_empty_base_classes) {
 | |
|   if (!type || !GetCompleteType(type))
 | |
|     return UINT_MAX;
 | |
| 
 | |
|   return UINT_MAX;
 | |
| }
 | |
| 
 | |
| size_t OCamlASTContext::GetIndexOfChildMemberWithName(
 | |
|     lldb::opaque_compiler_type_t type, const char *name,
 | |
|     bool omit_empty_base_classes, std::vector<uint32_t> &child_indexes) {
 | |
|   uint32_t index = GetIndexOfChildWithName(type, name, omit_empty_base_classes);
 | |
|   if (index == UINT_MAX)
 | |
|     return 0;
 | |
|   child_indexes.push_back(index);
 | |
|   return 1;
 | |
| }
 | |
| 
 | |
| size_t
 | |
| OCamlASTContext::ConvertStringToFloatValue(lldb::opaque_compiler_type_t type,
 | |
|                                            const char *s, uint8_t *dst,
 | |
|                                            size_t dst_size) {
 | |
|   assert(false);
 | |
|   return 0;
 | |
| }
 | |
| //----------------------------------------------------------------------
 | |
| // Dumping types
 | |
| //----------------------------------------------------------------------
 | |
| 
 | |
| void OCamlASTContext::DumpValue(
 | |
|     lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, Stream *s,
 | |
|     lldb::Format format, const DataExtractor &data,
 | |
|     lldb::offset_t data_byte_offset, size_t data_byte_size,
 | |
|     uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, bool show_types,
 | |
|     bool show_summary, bool verbose, uint32_t depth) {
 | |
|   if (!type) {
 | |
|     s->Printf("no type\n");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   s->Printf("no value\n");
 | |
| 
 | |
|   if (show_summary)
 | |
|     DumpSummary(type, exe_ctx, s, data, data_byte_offset, data_byte_size);
 | |
| }
 | |
| 
 | |
| bool OCamlASTContext::DumpTypeValue(
 | |
|     lldb::opaque_compiler_type_t type, Stream *s, lldb::Format format,
 | |
|     const DataExtractor &data, lldb::offset_t byte_offset, size_t byte_size,
 | |
|     uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,
 | |
|     ExecutionContextScope *exe_scope) {
 | |
|   if (!type) {
 | |
|     s->Printf("no type value\n");
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   if (IsScalarType(type)) {
 | |
|     return DumpDataExtractor(data, s, byte_offset, format, byte_size, 1,
 | |
|                              SIZE_MAX, LLDB_INVALID_ADDRESS, bitfield_bit_size,
 | |
|                              bitfield_bit_offset, exe_scope);
 | |
|   }
 | |
| 
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| void OCamlASTContext::DumpSummary(lldb::opaque_compiler_type_t type,
 | |
|                                   ExecutionContext *exe_ctx, Stream *s,
 | |
|                                   const DataExtractor &data,
 | |
|                                   lldb::offset_t data_offset,
 | |
|                                   size_t data_byte_size) {
 | |
|   s->Printf("no summary\n");
 | |
| }
 | |
| 
 | |
| void OCamlASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type) {
 | |
|   StreamFile s(stdout, false);
 | |
|   DumpTypeDescription(type, &s);
 | |
| }
 | |
| 
 | |
| void OCamlASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type,
 | |
|                                           Stream *s) {
 | |
|   static_cast<OCamlType *>(type)->Dump(s);
 | |
| }
 | |
| 
 | |
| CompilerType OCamlASTContext::CreateBaseType(const ConstString &name,
 | |
|                                              uint64_t byte_size) {
 | |
|   if (m_base_type_map.empty()) {
 | |
|     OCamlPrimitiveType *type = new OCamlPrimitiveType(
 | |
|         OCamlPrimitiveType::eTypeInt, ConstString("ocaml_int"), byte_size);
 | |
|     m_base_type_map.emplace(type->GetName(),
 | |
|                             std::unique_ptr<OCamlASTContext::OCamlType>(type));
 | |
|   }
 | |
| 
 | |
|   auto it = m_base_type_map.find(name);
 | |
|   if (it == m_base_type_map.end()) {
 | |
|     OCamlPrimitiveType *type =
 | |
|         new OCamlPrimitiveType(OCamlPrimitiveType::eTypeInt, name, byte_size);
 | |
|     it = m_base_type_map
 | |
|              .emplace(name, std::unique_ptr<OCamlASTContext::OCamlType>(type))
 | |
|              .first;
 | |
|   }
 | |
| 
 | |
|   return CompilerType(this, it->second.get());
 | |
| }
 |