It is failing because the new files have to be added to the xcode project. Currently I don't have a Mac around to do it but if nobody fixes it then I will try to find one.<div><br></div><div>Tamás<br><br><div class="gmail_quote"><div dir="ltr">On Wed, 3 Aug 2016, 21:17 Tim Hammerquist, <<a href="mailto:penryu@gmail.com">penryu@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Tamas,<div><br></div><div>It looks like the LLDB Build and Check job started failing around the time of this commit. You can see the error at this link:</div><div><br></div><div><a href="http://lab.llvm.org:8080/green/job/lldb_build_test/19751/consoleFull#-1586822805dd1929ea-7054-4089-b7ef-4624c3781fa4" target="_blank">http://lab.llvm.org:8080/green/job/lldb_build_test/19751/consoleFull#-1586822805dd1929ea-7054-4089-b7ef-4624c3781fa4</a><br></div><div><br></div><div>Could you take a look?</div><div><br></div><div>Thanks,</div><div>-Tim</div><div><br></div></div><div class="gmail_extra"></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 2, 2016 at 4:15 AM, Tamas Berghammer via lldb-commits <span dir="ltr"><<a href="mailto:lldb-commits@lists.llvm.org" target="_blank">lldb-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: tberghammer<br>
Date: Tue Aug  2 06:15:55 2016<br>
New Revision: 277443<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=277443&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=277443&view=rev</a><br>
Log:<br>
Support for OCaml native debugging<br>
<br>
This introduces basic support for debugging OCaml binaries.<br>
Use of the native compiler with DWARF emission support (see<br>
<a href="https://github.com/ocaml/ocaml/pull/574" rel="noreferrer" target="_blank">https://github.com/ocaml/ocaml/pull/574</a>) is required.<br>
<br>
Available variables are considered as 64 bits unsigned integers,<br>
their interpretation will be left to a OCaml-made debugging layer.<br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D22132" rel="noreferrer" target="_blank">https://reviews.llvm.org/D22132</a><br>
<br>
Added:<br>
    lldb/trunk/include/lldb/Symbol/OCamlASTContext.h<br>
    lldb/trunk/source/Plugins/Language/OCaml/<br>
    lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt<br>
    lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp<br>
    lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h<br>
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp<br>
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h<br>
    lldb/trunk/source/Symbol/OCamlASTContext.cpp<br>
Modified:<br>
    lldb/trunk/cmake/LLDBDependencies.cmake<br>
    lldb/trunk/include/lldb/Symbol/TypeSystem.h<br>
    lldb/trunk/source/API/SystemInitializerFull.cpp<br>
    lldb/trunk/source/Plugins/Language/CMakeLists.txt<br>
    lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt<br>
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h<br>
    lldb/trunk/source/Symbol/CMakeLists.txt<br>
<br>
Modified: lldb/trunk/cmake/LLDBDependencies.cmake<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/LLDBDependencies.cmake?rev=277443&r1=277442&r2=277443&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/LLDBDependencies.cmake?rev=277443&r1=277442&r2=277443&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/cmake/LLDBDependencies.cmake (original)<br>
+++ lldb/trunk/cmake/LLDBDependencies.cmake Tue Aug  2 06:15:55 2016<br>
@@ -27,6 +27,7 @@ set( LLDB_USED_LIBS<br>
   lldbPluginJavaLanguage<br>
   lldbPluginObjCLanguage<br>
   lldbPluginObjCPlusPlusLanguage<br>
+  lldbPluginOCamlLanguage<br>
<br>
   lldbPluginObjectFileELF<br>
   lldbPluginObjectFileJIT<br>
<br>
Added: lldb/trunk/include/lldb/Symbol/OCamlASTContext.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/OCamlASTContext.h?rev=277443&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/OCamlASTContext.h?rev=277443&view=auto</a><br>
==============================================================================<br>
--- lldb/trunk/include/lldb/Symbol/OCamlASTContext.h (added)<br>
+++ lldb/trunk/include/lldb/Symbol/OCamlASTContext.h Tue Aug  2 06:15:55 2016<br>
@@ -0,0 +1,355 @@<br>
+//===-- OCamlASTContext.h ------------------------------------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef liblldb_OCamlASTContext_h_<br>
+#define liblldb_OCamlASTContext_h_<br>
+<br>
+// C Includes<br>
+// C++ Includes<br>
+#include <map><br>
+#include <memory><br>
+#include <set><br>
+#include <string><br>
+#include <vector><br>
+<br>
+// Other libraries and framework includes<br>
+// Project includes<br>
+#include "lldb/Core/ConstString.h"<br>
+#include "lldb/Symbol/TypeSystem.h"<br>
+#include "lldb/Symbol/CompilerType.h"<br>
+<br>
+namespace lldb_private<br>
+{<br>
+<br>
+class OCamlASTContext : public TypeSystem<br>
+{<br>
+  public:<br>
+    class OCamlType;<br>
+    typedef std::map<ConstString, std::unique_ptr<OCamlType>> OCamlTypeMap;<br>
+<br>
+    OCamlASTContext();<br>
+    ~OCamlASTContext() override;<br>
+<br>
+    ConstString<br>
+    GetPluginName() override;<br>
+<br>
+    uint32_t<br>
+    GetPluginVersion() override;<br>
+<br>
+    static ConstString<br>
+    GetPluginNameStatic ();<br>
+<br>
+    static lldb::TypeSystemSP<br>
+    CreateInstance (lldb::LanguageType language, Module *module, Target *target);<br>
+<br>
+    static void<br>
+    EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types,<br>
+                                std::set<lldb::LanguageType> &languages_for_expressions);<br>
+<br>
+    static void<br>
+    Initialize ();<br>
+<br>
+    static void<br>
+    Terminate ();<br>
+<br>
+    DWARFASTParser *GetDWARFParser() override;<br>
+<br>
+    void<br>
+    SetAddressByteSize(int byte_size)<br>
+    {<br>
+        m_pointer_byte_size = byte_size;<br>
+    }<br>
+<br>
+    static bool classof(const TypeSystem *ts)<br>
+    {<br>
+        return ts->getKind() == TypeSystem::eKindOCaml;<br>
+    }<br>
+<br>
+    ConstString<br>
+    DeclGetName (void *opaque_decl) override<br>
+    {<br>
+        return ConstString();<br>
+    }<br>
+<br>
+    bool<br>
+    DeclContextIsStructUnionOrClass(void *opaque_decl_ctx) override<br>
+    {<br>
+        return false;<br>
+    }<br>
+<br>
+    ConstString<br>
+    DeclContextGetName(void *opaque_decl_ctx) override<br>
+    {<br>
+        return ConstString();<br>
+    }<br>
+<br>
+    ConstString<br>
+    DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override<br>
+    {<br>
+        return ConstString();<br>
+    }<br>
+<br>
+    bool<br>
+    DeclContextIsClassMethod(void *opaque_decl_ctx, lldb::LanguageType *language_ptr,<br>
+                             bool *is_instance_method_ptr,<br>
+                             ConstString *language_object_name_ptr) override<br>
+    {<br>
+        return false;<br>
+    }<br>
+<br>
+    bool SupportsLanguage (lldb::LanguageType language) override;<br>
+    uint32_t GetPointerByteSize() override;<br>
+<br>
+    bool<br>
+    IsArrayType(lldb::opaque_compiler_type_t type, CompilerType *element_type,<br>
+                uint64_t *size, bool *is_incomplete) override;<br>
+<br>
+    bool IsAggregateType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool IsCharType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool IsCompleteType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool IsDefined(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool IsFloatingPointType(lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex) override;<br>
+<br>
+    bool IsFunctionType(lldb::opaque_compiler_type_t type, bool *is_variadic_ptr = nullptr) override;<br>
+<br>
+    size_t GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    CompilerType GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, const size_t index) override;<br>
+<br>
+    bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool IsBlockPointerType (lldb::opaque_compiler_type_t type,<br>
+                             CompilerType *function_pointer_type_ptr) override;<br>
+<br>
+    bool<br>
+    IsIntegerType(lldb::opaque_compiler_type_t type, bool &is_signed) override;<br>
+<br>
+    bool<br>
+    IsPossibleDynamicType(lldb::opaque_compiler_type_t type,<br>
+                               CompilerType *target_type,<br>
+                               bool check_cplusplus, bool check_objc) override;<br>
+<br>
+    bool IsPointerType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type = nullptr) override;<br>
+<br>
+    bool IsScalarType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool IsVoidType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool GetCompleteType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    ConstString GetTypeName(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    uint32_t<br>
+    GetTypeInfo(lldb::opaque_compiler_type_t type,<br>
+                CompilerType *pointee_or_element_compiler_type = nullptr) override;<br>
+<br>
+    lldb::LanguageType GetMinimumLanguage(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    CompilerType<br>
+    GetArrayElementType(lldb::opaque_compiler_type_t type, uint64_t *stride = nullptr) override;<br>
+<br>
+    CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    CompilerType<br>
+    GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override;<br>
+<br>
+    CompilerType<br>
+    GetFunctionReturnType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    size_t<br>
+    GetNumMemberFunctions(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    TypeMemberFunctionImpl<br>
+    GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override;<br>
+<br>
+    CompilerType<br>
+    GetPointeeType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    CompilerType<br>
+    GetPointerType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    uint64_t<br>
+    GetBitSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override;<br>
+<br>
+    lldb::Encoding<br>
+    GetEncoding(lldb::opaque_compiler_type_t type, uint64_t &count) override;<br>
+<br>
+    lldb::Format<br>
+    GetFormat(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    uint32_t<br>
+    GetNumChildren(lldb::opaque_compiler_type_t type, bool omit_empty_base_classes) override;<br>
+<br>
+    lldb::BasicType<br>
+    GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    CompilerType<br>
+    GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, size_t bit_size) override;<br>
+<br>
+    uint32_t<br>
+    GetNumFields(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    CompilerType<br>
+    GetFieldAtIndex(lldb::opaque_compiler_type_t type, size_t idx, std::string &name, uint64_t *bit_offset_ptr,<br>
+                    uint32_t *bitfield_bit_size_ptr, bool *is_bitfield_ptr) override;<br>
+<br>
+    uint32_t<br>
+    GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) override<br>
+    {<br>
+        return 0;<br>
+    }<br>
+<br>
+    uint32_t<br>
+    GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) override<br>
+    {<br>
+        return 0;<br>
+    }<br>
+<br>
+    CompilerType<br>
+    GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override<br>
+    {<br>
+        return CompilerType();<br>
+    }<br>
+<br>
+    CompilerType<br>
+    GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override<br>
+    {<br>
+        return CompilerType();<br>
+    }<br>
+<br>
+    CompilerType<br>
+    GetChildCompilerTypeAtIndex(lldb::opaque_compiler_type_t type,<br>
+                                ExecutionContext *exe_ctx, size_t idx,<br>
+                                bool transparent_pointers, bool omit_empty_base_classes,<br>
+                                bool ignore_array_bounds, std::string &child_name,<br>
+                                uint32_t &child_byte_size, int32_t &child_byte_offset,<br>
+                                uint32_t &child_bitfield_bit_size,<br>
+                                uint32_t &child_bitfield_bit_offset, bool &child_is_base_class,<br>
+                                bool &child_is_deref_of_parent, ValueObject *valobj,<br>
+                                uint64_t &language_flags) override;<br>
+<br>
+    uint32_t<br>
+    GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes) override;<br>
+<br>
+    size_t<br>
+    GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type,<br>
+                                  const char *name, bool omit_empty_base_classes,<br>
+                                  std::vector<uint32_t> &child_indexes) override;<br>
+<br>
+    size_t<br>
+    GetNumTemplateArguments(lldb::opaque_compiler_type_t type) override<br>
+    {<br>
+        return 0;<br>
+    }<br>
+<br>
+    CompilerType<br>
+    GetTemplateArgument(lldb::opaque_compiler_type_t type,<br>
+                        size_t idx, lldb::TemplateArgumentKind &kind) override<br>
+    {<br>
+        return CompilerType();<br>
+    }<br>
+<br>
+    void DumpValue(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,<br>
+                   Stream *s, lldb::Format format, const DataExtractor &data,<br>
+                   lldb::offset_t data_offset, size_t data_byte_size,<br>
+                   uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,<br>
+                   bool show_types, bool show_summary,<br>
+                   bool verbose, uint32_t depth) override;<br>
+<br>
+    bool DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s,<br>
+                       lldb::Format format, const DataExtractor &data,<br>
+                       lldb::offset_t data_offset, size_t data_byte_size,<br>
+                       uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,<br>
+                       ExecutionContextScope *exe_scope) override;<br>
+<br>
+    void<br>
+    DumpTypeDescription(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    void<br>
+    DumpTypeDescription(lldb::opaque_compiler_type_t type, Stream *s) override;<br>
+<br>
+    bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    void<br>
+    DumpSummary(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,<br>
+                Stream *s, const DataExtractor &data,<br>
+                lldb::offset_t data_offset, size_t data_byte_size) override;<br>
+<br>
+    size_t<br>
+    ConvertStringToFloatValue(lldb::opaque_compiler_type_t type, const char *s,<br>
+                              uint8_t *dst, size_t dst_size) override;<br>
+<br>
+    bool IsPointerOrReferenceType(lldb::opaque_compiler_type_t type,<br>
+                                  CompilerType *pointee_type = nullptr) override;<br>
+<br>
+    unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool IsCStringType(lldb::opaque_compiler_type_t type, uint32_t &length) override;<br>
+<br>
+    size_t GetTypeBitAlign(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) override;<br>
+<br>
+    bool IsBeingDefined(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool IsConst(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    uint32_t<br>
+    IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, CompilerType *base_type_ptr) override;<br>
+<br>
+    bool IsPolymorphicClass(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool IsTypedefType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    CompilerType GetTypedefedType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool<br>
+    IsVectorType(lldb::opaque_compiler_type_t type, CompilerType *element_type,<br>
+                 uint64_t *size) override;<br>
+<br>
+    CompilerType GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override;<br>
+<br>
+    bool<br>
+    IsReferenceType(lldb::opaque_compiler_type_t type,<br>
+                    CompilerType *pointee_type = nullptr,<br>
+                    bool *is_rvalue = nullptr) override;<br>
+<br>
+    CompilerType CreateBaseType(const ConstString &name, uint64_t);<br>
+<br>
+  private:<br>
+    int m_pointer_byte_size;<br>
+    int m_int_byte_size;<br>
+    std::unique_ptr<DWARFASTParser> m_dwarf_ast_parser_ap;<br>
+    OCamlTypeMap m_base_type_map;<br>
+<br>
+    OCamlASTContext(const OCamlASTContext &) = delete;<br>
+    const OCamlASTContext &operator=(const OCamlASTContext &) = delete;<br>
+};<br>
+<br>
+class OCamlASTContextForExpr : public OCamlASTContext<br>
+{<br>
+    public:<br>
+        OCamlASTContextForExpr(lldb::TargetSP target) : m_target_wp(target) {}<br>
+<br>
+    private:<br>
+        lldb::TargetWP m_target_wp;<br>
+};<br>
+<br>
+}<br>
+#endif // liblldb_OCamlASTContext_h_<br>
<br>
Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=277443&r1=277442&r2=277443&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=277443&r1=277442&r2=277443&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original)<br>
+++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Tue Aug  2 06:15:55 2016<br>
@@ -75,6 +75,7 @@ public:<br>
         eKindSwift,<br>
         eKindGo,<br>
         eKindJava,<br>
+        eKindOCaml,<br>
         kNumKinds<br>
     };<br>
<br>
<br>
Modified: lldb/trunk/source/API/SystemInitializerFull.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SystemInitializerFull.cpp?rev=277443&r1=277442&r2=277443&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SystemInitializerFull.cpp?rev=277443&r1=277442&r2=277443&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/API/SystemInitializerFull.cpp (original)<br>
+++ lldb/trunk/source/API/SystemInitializerFull.cpp Tue Aug  2 06:15:55 2016<br>
@@ -27,6 +27,7 @@<br>
 #include "lldb/Symbol/ClangASTContext.h"<br>
 #include "lldb/Symbol/GoASTContext.h"<br>
 #include "lldb/Symbol/JavaASTContext.h"<br>
+#include "lldb/Symbol/OCamlASTContext.h"<br>
<br>
 #include "Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h"<br>
 #include "Plugins/ABI/MacOSX-arm64/ABIMacOSX_arm64.h"<br>
@@ -56,6 +57,7 @@<br>
 #include "Plugins/Language/Java/JavaLanguage.h"<br>
 #include "Plugins/Language/ObjC/ObjCLanguage.h"<br>
 #include "Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h"<br>
+#include "Plugins/Language/OCaml/OCamlLanguage.h"<br>
 #include "Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h"<br>
 #include "Plugins/LanguageRuntime/Go/GoLanguageRuntime.h"<br>
 #include "Plugins/LanguageRuntime/Java/JavaLanguageRuntime.h"<br>
@@ -314,6 +316,7 @@ SystemInitializerFull::Initialize()<br>
     ClangASTContext::Initialize();<br>
     GoASTContext::Initialize();<br>
     JavaASTContext::Initialize();<br>
+    OCamlASTContext::Initialize();<br>
<br>
     ABIMacOSX_i386::Initialize();<br>
     ABIMacOSX_arm::Initialize();<br>
@@ -360,6 +363,7 @@ SystemInitializerFull::Initialize()<br>
     JavaLanguage::Initialize();<br>
     ObjCLanguage::Initialize();<br>
     ObjCPlusPlusLanguage::Initialize();<br>
+    OCamlLanguage::Initialize();<br>
<br>
 #if defined(_MSC_VER)<br>
     ProcessWindowsLive::Initialize();<br>
@@ -444,6 +448,7 @@ SystemInitializerFull::Terminate()<br>
     ClangASTContext::Terminate();<br>
     GoASTContext::Terminate();<br>
     JavaASTContext::Terminate();<br>
+    OCamlASTContext::Terminate();<br>
<br>
     ABIMacOSX_i386::Terminate();<br>
     ABIMacOSX_arm::Terminate();<br>
@@ -488,6 +493,7 @@ SystemInitializerFull::Terminate()<br>
     JavaLanguage::Terminate();<br>
     ObjCLanguage::Terminate();<br>
     ObjCPlusPlusLanguage::Terminate();<br>
+    OCamlLanguage::Terminate();<br>
<br>
 #if defined(__APPLE__)<br>
     DynamicLoaderDarwinKernel::Terminate();<br>
<br>
Modified: lldb/trunk/source/Plugins/Language/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CMakeLists.txt?rev=277443&r1=277442&r2=277443&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CMakeLists.txt?rev=277443&r1=277442&r2=277443&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Plugins/Language/CMakeLists.txt (original)<br>
+++ lldb/trunk/source/Plugins/Language/CMakeLists.txt Tue Aug  2 06:15:55 2016<br>
@@ -3,3 +3,4 @@ add_subdirectory(Go)<br>
 add_subdirectory(Java)<br>
 add_subdirectory(ObjC)<br>
 add_subdirectory(ObjCPlusPlus)<br>
+add_subdirectory(OCaml)<br>
<br>
Added: lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt?rev=277443&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt?rev=277443&view=auto</a><br>
==============================================================================<br>
--- lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt (added)<br>
+++ lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt Tue Aug  2 06:15:55 2016<br>
@@ -0,0 +1,4 @@<br>
+add_lldb_library(lldbPluginOCamlLanguage<br>
+  OCamlLanguage.cpp<br>
+)<br>
+<br>
<br>
Added: lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp?rev=277443&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp?rev=277443&view=auto</a><br>
==============================================================================<br>
--- lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp (added)<br>
+++ lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp Tue Aug  2 06:15:55 2016<br>
@@ -0,0 +1,78 @@<br>
+//===-- OCamlLanguage.cpp ----------------------------------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// C Includes<br>
+#include <string.h><br>
+// C++ Includes<br>
+#include <functional><br>
+#include <mutex><br>
+<br>
+// Other libraries and framework includes<br>
+#include "llvm/ADT/StringRef.h"<br>
+<br>
+// Project includes<br>
+#include "OCamlLanguage.h"<br>
+#include "lldb/Core/ConstString.h"<br>
+#include "lldb/Core/PluginManager.h"<br>
+#include "lldb/DataFormatters/DataVisualization.h"<br>
+#include "lldb/DataFormatters/FormattersHelpers.h"<br>
+#include "lldb/Symbol/OCamlASTContext.h"<br>
+<br>
+using namespace lldb;<br>
+using namespace lldb_private;<br>
+<br>
+void<br>
+OCamlLanguage::Initialize()<br>
+{<br>
+    PluginManager::RegisterPlugin(GetPluginNameStatic(), "OCaml Language", CreateInstance);<br>
+}<br>
+<br>
+void<br>
+OCamlLanguage::Terminate()<br>
+{<br>
+    PluginManager::UnregisterPlugin(CreateInstance);<br>
+}<br>
+<br>
+lldb_private::ConstString<br>
+OCamlLanguage::GetPluginNameStatic()<br>
+{<br>
+    static ConstString g_name("OCaml");<br>
+    return g_name;<br>
+}<br>
+<br>
+lldb_private::ConstString<br>
+OCamlLanguage::GetPluginName()<br>
+{<br>
+    return GetPluginNameStatic();<br>
+}<br>
+<br>
+uint32_t<br>
+OCamlLanguage::GetPluginVersion()<br>
+{<br>
+    return 1;<br>
+}<br>
+<br>
+Language *<br>
+OCamlLanguage::CreateInstance(lldb::LanguageType language)<br>
+{<br>
+    if (language == eLanguageTypeOCaml)<br>
+        return new OCamlLanguage();<br>
+    return nullptr;<br>
+}<br>
+<br>
+bool<br>
+OCamlLanguage::IsNilReference(ValueObject &valobj)<br>
+{<br>
+    if (!valobj.GetCompilerType().IsReferenceType())<br>
+        return false;<br>
+<br>
+    // If we failed to read the value then it is not a nil reference.<br>
+    return valobj.GetValueAsUnsigned(UINT64_MAX) == 0;<br>
+}<br>
+<br>
<br>
Added: lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h?rev=277443&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h?rev=277443&view=auto</a><br>
==============================================================================<br>
--- lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h (added)<br>
+++ lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h Tue Aug  2 06:15:55 2016<br>
@@ -0,0 +1,61 @@<br>
+//===-- OCamlLanguage.h ------------------------------------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef liblldb_OCamlLanguage_h_<br>
+#define liblldb_OCamlLanguage_h_<br>
+<br>
+// C Includes<br>
+// C++ Includes<br>
+#include <vector><br>
+<br>
+// Other libraries and framework includes<br>
+#include "llvm/ADT/StringRef.h"<br>
+<br>
+// Project includes<br>
+#include "lldb/Core/ConstString.h"<br>
+#include "lldb/Target/Language.h"<br>
+#include "lldb/lldb-private.h"<br>
+<br>
+namespace lldb_private<br>
+{<br>
+<br>
+class OCamlLanguage : public Language<br>
+{<br>
+public:<br>
+    lldb::LanguageType<br>
+    GetLanguageType() const override<br>
+    {<br>
+        return lldb::eLanguageTypeOCaml;<br>
+    }<br>
+<br>
+    static void<br>
+    Initialize();<br>
+<br>
+    static void<br>
+    Terminate();<br>
+<br>
+    static lldb_private::Language *<br>
+    CreateInstance(lldb::LanguageType language);<br>
+<br>
+    static lldb_private::ConstString<br>
+    GetPluginNameStatic();<br>
+<br>
+    ConstString<br>
+    GetPluginName() override;<br>
+<br>
+    uint32_t<br>
+    GetPluginVersion() override;<br>
+<br>
+    bool<br>
+    IsNilReference(ValueObject &valobj) override;<br>
+};<br>
+<br>
+} // namespace lldb_private<br>
+<br>
+#endif // liblldb_OCamlLanguage_h_<br>
<br>
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt?rev=277443&r1=277442&r2=277443&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt?rev=277443&r1=277442&r2=277443&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt (original)<br>
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt Tue Aug  2 06:15:55 2016<br>
@@ -4,6 +4,7 @@ add_lldb_library(lldbPluginSymbolFileDWA<br>
   DWARFASTParserClang.cpp<br>
   DWARFASTParserGo.cpp<br>
   DWARFASTParserJava.cpp<br>
+  DWARFASTParserOCaml.cpp<br>
   DWARFAttribute.cpp<br>
   DWARFCompileUnit.cpp<br>
   DWARFDataExtractor.cpp<br>
<br>
Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp?rev=277443&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp?rev=277443&view=auto</a><br>
==============================================================================<br>
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp (added)<br>
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp Tue Aug  2 06:15:55 2016<br>
@@ -0,0 +1,232 @@<br>
+//===-- DWARFASTParserOCaml.cpp ---------------------------------*- C++ -*-===//<br>
+<br>
+#include "DWARFASTParserOCaml.h"<br>
+<br>
+#include "lldb/Core/Error.h"<br>
+#include "lldb/Core/Log.h"<br>
+#include "lldb/Core/Module.h"<br>
+#include "lldb/Symbol/CompileUnit.h"<br>
+#include "lldb/Symbol/Function.h"<br>
+#include "lldb/Symbol/ObjectFile.h"<br>
+#include "lldb/Symbol/Type.h"<br>
+#include "lldb/Symbol/TypeList.h"<br>
+<br>
+using namespace lldb;<br>
+using namespace lldb_private;<br>
+<br>
+DWARFASTParserOCaml::DWARFASTParserOCaml (OCamlASTContext &ast) :<br>
+    m_ast (ast)<br>
+{}<br>
+<br>
+DWARFASTParserOCaml::~DWARFASTParserOCaml () {}<br>
+<br>
+TypeSP<br>
+DWARFASTParserOCaml::ParseBaseTypeFromDIE(const DWARFDIE &die)<br>
+{<br>
+    SymbolFileDWARF *dwarf = die.GetDWARF();<br>
+    dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;<br>
+<br>
+    ConstString type_name;<br>
+    uint64_t byte_size = 0;<br>
+<br>
+    DWARFAttributes attributes;<br>
+    const size_t num_attributes = die.GetAttributes(attributes);<br>
+    for (uint32_t i = 0; i < num_attributes; ++i)<br>
+    {<br>
+        DWARFFormValue form_value;<br>
+        dw_attr_t attr = attributes.AttributeAtIndex(i);<br>
+        if (attributes.ExtractFormValueAtIndex(i, form_value))<br>
+        {<br>
+            switch (attr)<br>
+            {<br>
+                case DW_AT_name:<br>
+                    type_name.SetCString(form_value.AsCString());<br>
+                    break;<br>
+                case DW_AT_byte_size:<br>
+                    byte_size = form_value.Unsigned();<br>
+                    break;<br>
+                case DW_AT_encoding:<br>
+                    break;<br>
+                default:<br>
+                    assert(false && "Unsupported attribute for DW_TAG_base_type");<br>
+            }<br>
+        }<br>
+    }<br>
+<br>
+    Declaration decl;<br>
+    CompilerType compiler_type = m_ast.CreateBaseType(type_name, byte_size);<br>
+    return std::make_shared<Type>(die.GetID(), dwarf, type_name, byte_size, nullptr, LLDB_INVALID_UID,<br>
+            Type::eEncodingIsUID, decl, compiler_type, Type::eResolveStateFull);<br>
+}<br>
+<br>
+lldb::TypeSP<br>
+DWARFASTParserOCaml::ParseTypeFromDWARF (const SymbolContext& sc,<br>
+                                         const DWARFDIE &die,<br>
+                                         Log *log,<br>
+                                         bool *type_is_new_ptr)<br>
+{<br>
+    if (type_is_new_ptr)<br>
+        *type_is_new_ptr = false;<br>
+<br>
+    if (!die)<br>
+        return nullptr;<br>
+<br>
+    SymbolFileDWARF *dwarf = die.GetDWARF();<br>
+<br>
+    Type *type_ptr = dwarf->m_die_to_type.lookup(die.GetDIE());<br>
+    if (type_ptr == DIE_IS_BEING_PARSED)<br>
+        return nullptr;<br>
+    if (type_ptr != nullptr)<br>
+        return type_ptr->shared_from_this();<br>
+<br>
+    TypeSP type_sp;<br>
+    if (type_is_new_ptr)<br>
+        *type_is_new_ptr = true;<br>
+<br>
+    switch (die.Tag())<br>
+    {<br>
+        case DW_TAG_base_type:<br>
+            {<br>
+                type_sp = ParseBaseTypeFromDIE(die);<br>
+                break;<br>
+            }<br>
+        case DW_TAG_array_type:<br>
+            {<br>
+                break;<br>
+            }<br>
+        case DW_TAG_class_type:<br>
+            {<br>
+                break;<br>
+            }<br>
+        case DW_TAG_reference_type:<br>
+            {<br>
+                break;<br>
+            }<br>
+    }<br>
+<br>
+    if (!type_sp)<br>
+        return nullptr;<br>
+<br>
+    DWARFDIE sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);<br>
+    dw_tag_t sc_parent_tag = sc_parent_die.Tag();<br>
+<br>
+    SymbolContextScope *symbol_context_scope = nullptr;<br>
+    if (sc_parent_tag == DW_TAG_compile_unit)<br>
+    {<br>
+        symbol_context_scope = sc.comp_unit;<br>
+    }<br>
+    else if (sc.function != nullptr && sc_parent_die)<br>
+    {<br>
+        symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());<br>
+        if (symbol_context_scope == nullptr)<br>
+            symbol_context_scope = sc.function;<br>
+    }<br>
+<br>
+    if (symbol_context_scope != nullptr)<br>
+        type_sp->SetSymbolContextScope(symbol_context_scope);<br>
+<br>
+    dwarf->GetTypeList()->Insert(type_sp);<br>
+    dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();<br>
+<br>
+    return type_sp;<br>
+}<br>
+<br>
+Function *<br>
+DWARFASTParserOCaml::ParseFunctionFromDWARF (const SymbolContext& sc,<br>
+                                             const DWARFDIE &die)<br>
+{<br>
+    DWARFRangeList func_ranges;<br>
+    const char *name = NULL;<br>
+    const char *mangled = NULL;<br>
+    int decl_file = 0;<br>
+    int decl_line = 0;<br>
+    int decl_column = 0;<br>
+    int call_file = 0;<br>
+    int call_line = 0;<br>
+    int call_column = 0;<br>
+    DWARFExpression frame_base(die.GetCU());<br>
+<br>
+    Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_LANGUAGE));<br>
+<br>
+    if (die)<br>
+    {<br>
+        SymbolFileDWARF *dwarf = die.GetDWARF();<br>
+        if (log)<br>
+        {<br>
+            dwarf->GetObjectFile()->GetModule()->LogMessage(<br>
+                log, "DWARFASTParserOCaml::ParseFunctionFromDWARF (die = 0x%8.8x) %s name = '%s')", die.GetOffset(),<br>
+                DW_TAG_value_to_name(die.Tag()), die.GetName());<br>
+        }<br>
+    }<br>
+<br>
+    assert(die.Tag() == DW_TAG_subprogram);<br>
+<br>
+    if (die.Tag() != DW_TAG_subprogram)<br>
+        return NULL;<br>
+<br>
+    if (die.GetDIENamesAndRanges(name, mangled, func_ranges, decl_file, decl_line, decl_column, call_file, call_line,<br>
+                                 call_column, &frame_base))<br>
+    {<br>
+        AddressRange func_range;<br>
+        lldb::addr_t lowest_func_addr = func_ranges.GetMinRangeBase(0);<br>
+        lldb::addr_t highest_func_addr = func_ranges.GetMaxRangeEnd(0);<br>
+        if (lowest_func_addr != LLDB_INVALID_ADDRESS && lowest_func_addr <= highest_func_addr)<br>
+        {<br>
+            ModuleSP module_sp(die.GetModule());<br>
+            func_range.GetBaseAddress().ResolveAddressUsingFileSections(lowest_func_addr, module_sp->GetSectionList());<br>
+            if (func_range.GetBaseAddress().IsValid())<br>
+                func_range.SetByteSize(highest_func_addr - lowest_func_addr);<br>
+        }<br>
+<br>
+        if (func_range.GetBaseAddress().IsValid())<br>
+        {<br>
+            Mangled func_name;<br>
+<br>
+            func_name.SetValue(ConstString(name), true);<br>
+<br>
+            FunctionSP func_sp;<br>
+            std::unique_ptr<Declaration> decl_ap;<br>
+            if (decl_file != 0 || decl_line != 0 || decl_column != 0)<br>
+                decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), decl_line,<br>
+                                              decl_column));<br>
+<br>
+            SymbolFileDWARF *dwarf = die.GetDWARF();<br>
+            Type *func_type = dwarf->m_die_to_type.lookup(die.GetDIE());<br>
+<br>
+            assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);<br>
+<br>
+            if (dwarf->FixupAddress(func_range.GetBaseAddress()))<br>
+            {<br>
+                const user_id_t func_user_id = die.GetID();<br>
+                func_sp.reset(new Function(sc.comp_unit,<br>
+                                           func_user_id, // UserID is the DIE offset<br>
+                                           func_user_id,<br>
+                                           func_name,<br>
+                                           func_type,<br>
+                                           func_range)); // first address range<br>
+<br>
+                if (func_sp.get() != NULL)<br>
+                {<br>
+                    if (frame_base.IsValid())<br>
+                        func_sp->GetFrameBaseExpression() = frame_base;<br>
+                    sc.comp_unit->AddFunction(func_sp);<br>
+                    return func_sp.get();<br>
+                }<br>
+            }<br>
+        }<br>
+    }<br>
+<br>
+    return NULL;<br>
+}<br>
+<br>
+lldb_private::CompilerDeclContext<br>
+DWARFASTParserOCaml::GetDeclContextForUIDFromDWARF (const DWARFDIE &die)<br>
+{<br>
+    return CompilerDeclContext();<br>
+}<br>
+<br>
+lldb_private::CompilerDeclContext<br>
+DWARFASTParserOCaml::GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die)<br>
+{<br>
+    return CompilerDeclContext();<br>
+}<br>
<br>
Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h?rev=277443&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h?rev=277443&view=auto</a><br>
==============================================================================<br>
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h (added)<br>
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h Tue Aug  2 06:15:55 2016<br>
@@ -0,0 +1,60 @@<br>
+//===-- DWARFASTParserOCaml.h -----------------------------------*- C++ -*-===//<br>
+<br>
+#ifndef SymbolFileDWARF_DWARFASTParserOCaml_h_<br>
+#define SymbolFileDWARF_DWARFASTParserOCaml_h_<br>
+<br>
+#include "DWARFASTParser.h"<br>
+#include "DWARFCompileUnit.h"<br>
+#include "DWARFDebugInfo.h"<br>
+#include "DWARFDIE.h"<br>
+#include "DWARFDefines.h"<br>
+#include "SymbolFileDWARF.h"<br>
+<br>
+#include "lldb/Symbol/OCamlASTContext.h"<br>
+<br>
+class DWARFDebugInfoEntry;<br>
+class DWARFDIECollection;<br>
+<br>
+class DWARFASTParserOCaml : public DWARFASTParser<br>
+{<br>
+public:<br>
+    DWARFASTParserOCaml (lldb_private::OCamlASTContext &ast);<br>
+<br>
+    virtual ~DWARFASTParserOCaml ();<br>
+<br>
+    lldb::TypeSP<br>
+    ParseBaseTypeFromDIE(const DWARFDIE &die);<br>
+<br>
+    lldb::TypeSP<br>
+    ParseTypeFromDWARF (const lldb_private::SymbolContext& sc,<br>
+                        const DWARFDIE &die,<br>
+                        lldb_private::Log *log,<br>
+                        bool *type_is_new_ptr) override;<br>
+<br>
+    lldb_private::Function *<br>
+    ParseFunctionFromDWARF (const lldb_private::SymbolContext& sc,<br>
+                            const DWARFDIE &die) override;<br>
+<br>
+    bool<br>
+    CompleteTypeFromDWARF (const DWARFDIE &die,<br>
+                           lldb_private::Type *type,<br>
+                           lldb_private::CompilerType &compiler_type) override { return false; }<br>
+<br>
+    lldb_private::CompilerDecl<br>
+    GetDeclForUIDFromDWARF (const DWARFDIE &die) override { return lldb_private::CompilerDecl(); }<br>
+<br>
+    lldb_private::CompilerDeclContext<br>
+    GetDeclContextForUIDFromDWARF (const DWARFDIE &die) override;<br>
+<br>
+    lldb_private::CompilerDeclContext<br>
+    GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die) override;<br>
+<br>
+    std::vector<DWARFDIE><br>
+    GetDIEForDeclContext (lldb_private::CompilerDeclContext decl_context) override { return {}; }<br>
+<br>
+protected:<br>
+<br>
+    lldb_private::OCamlASTContext &m_ast;<br>
+};<br>
+<br>
+#endif  // SymbolFileDWARF_DWARFASTParserOCaml_h_<br>
<br>
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=277443&r1=277442&r2=277443&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=277443&r1=277442&r2=277443&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)<br>
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Tue Aug  2 06:15:55 2016<br>
@@ -74,6 +74,7 @@ public:<br>
     friend class DWARFASTParserClang;<br>
     friend class DWARFASTParserGo;<br>
     friend class DWARFASTParserJava;<br>
+    friend class DWARFASTParserOCaml;<br>
<br>
     //------------------------------------------------------------------<br>
     // Static Functions<br>
<br>
Modified: lldb/trunk/source/Symbol/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CMakeLists.txt?rev=277443&r1=277442&r2=277443&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CMakeLists.txt?rev=277443&r1=277442&r2=277443&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Symbol/CMakeLists.txt (original)<br>
+++ lldb/trunk/source/Symbol/CMakeLists.txt Tue Aug  2 06:15:55 2016<br>
@@ -21,6 +21,7 @@ add_lldb_library(lldbSymbol<br>
   LineEntry.cpp<br>
   LineTable.cpp<br>
   ObjectFile.cpp<br>
+  OCamlASTContext.cpp<br>
   Symbol.cpp<br>
   SymbolContext.cpp<br>
   SymbolFile.cpp<br>
<br>
Added: lldb/trunk/source/Symbol/OCamlASTContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/OCamlASTContext.cpp?rev=277443&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/OCamlASTContext.cpp?rev=277443&view=auto</a><br>
==============================================================================<br>
--- lldb/trunk/source/Symbol/OCamlASTContext.cpp (added)<br>
+++ lldb/trunk/source/Symbol/OCamlASTContext.cpp Tue Aug  2 06:15:55 2016<br>
@@ -0,0 +1,798 @@<br>
+//===-- OCamlASTContext.cpp ----------------------------------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "lldb/Core/Log.h"<br>
+#include "lldb/Core/Module.h"<br>
+#include "lldb/Core/PluginManager.h"<br>
+#include "lldb/Core/StreamFile.h"<br>
+#include "lldb/Core/ValueObject.h"<br>
+#include "lldb/Symbol/ObjectFile.h"<br>
+#include "lldb/Symbol/SymbolFile.h"<br>
+#include "lldb/Symbol/OCamlASTContext.h"<br>
+#include "lldb/Symbol/Type.h"<br>
+#include "lldb/Target/ExecutionContext.h"<br>
+#include "lldb/Target/Target.h"<br>
+<br>
+#include "Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h"<br>
+<br>
+using namespace lldb;<br>
+using namespace lldb_private;<br>
+<br>
+namespace lldb_private<br>
+{<br>
+    class OCamlASTContext::OCamlType<br>
+    {<br>
+        public:<br>
+            enum LLVMCastKind<br>
+            {<br>
+                eKindPrimitive,<br>
+                eKindObject,<br>
+                eKindReference,<br>
+                eKindArray,<br>
+                kNumKinds<br>
+            };<br>
+<br>
+            OCamlType(LLVMCastKind kind) : m_kind(kind) {}<br>
+<br>
+            virtual ~OCamlType() = default;<br>
+<br>
+            virtual ConstString<br>
+                GetName() = 0;<br>
+<br>
+            virtual void<br>
+                Dump(Stream *s) = 0;<br>
+<br>
+            virtual bool<br>
+                IsCompleteType() = 0;<br>
+<br>
+            LLVMCastKind<br>
+                getKind() const<br>
+                {<br>
+                    return m_kind;<br>
+                }<br>
+<br>
+        private:<br>
+            LLVMCastKind m_kind;<br>
+    };<br>
+<br>
+} // end of namespace lldb_private<br>
+<br>
+namespace<br>
+{<br>
+<br>
+    class OCamlPrimitiveType : public OCamlASTContext::OCamlType<br>
+    {<br>
+        public:<br>
+            enum TypeKind<br>
+            {<br>
+                eTypeInt,<br>
+            };<br>
+<br>
+            OCamlPrimitiveType(TypeKind type_kind, uint32_t byte_size) : OCamlType(OCamlType::eKindPrimitive), m_type_kind(type_kind), m_type(ConstString()), m_byte_size(byte_size) {}<br>
+<br>
+            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) {}<br>
+<br>
+            ConstString<br>
+            GetName() override<br>
+            {<br>
+                switch (m_type_kind)<br>
+                {<br>
+                    case eTypeInt:<br>
+                        return m_type;<br>
+                }<br>
+                return ConstString();<br>
+            }<br>
+<br>
+            TypeKind<br>
+            GetTypeKind()<br>
+            {<br>
+                return m_type_kind;<br>
+            }<br>
+<br>
+            void<br>
+            Dump(Stream *s) override<br>
+            {<br>
+                s->Printf("%s\n", GetName().GetCString());<br>
+            }<br>
+<br>
+            bool<br>
+            IsCompleteType() override<br>
+            {<br>
+                return true;<br>
+            }<br>
+<br>
+            static bool<br>
+            classof(const OCamlType *ot)<br>
+            {<br>
+                return ot->getKind() == OCamlType::eKindPrimitive;<br>
+            }<br>
+<br>
+            uint64_t<br>
+            GetByteSize() const<br>
+            {<br>
+                return m_byte_size;<br>
+            }<br>
+<br>
+        private:<br>
+            const TypeKind m_type_kind;<br>
+            const ConstString m_type;<br>
+            uint64_t m_byte_size;<br>
+    };<br>
+}<br>
+<br>
+OCamlASTContext::OCamlASTContext()<br>
+    : TypeSystem(eKindOCaml),<br>
+      m_pointer_byte_size(0),<br>
+      m_int_byte_size(0)<br>
+{<br>
+}<br>
+<br>
+OCamlASTContext::~OCamlASTContext()<br>
+{<br>
+}<br>
+<br>
+ConstString<br>
+OCamlASTContext::GetPluginNameStatic()<br>
+{<br>
+    return ConstString("ocaml");<br>
+}<br>
+<br>
+ConstString<br>
+OCamlASTContext::GetPluginName()<br>
+{<br>
+    return OCamlASTContext::GetPluginNameStatic();<br>
+}<br>
+<br>
+uint32_t<br>
+OCamlASTContext::GetPluginVersion()<br>
+{<br>
+    return 1;<br>
+}<br>
+<br>
+lldb::TypeSystemSP<br>
+OCamlASTContext::CreateInstance (lldb::LanguageType language, Module *module, Target *target)<br>
+{<br>
+    Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_LANGUAGE));<br>
+<br>
+    if (language == lldb::eLanguageTypeOCaml)<br>
+    {<br>
+        std::shared_ptr<OCamlASTContext> ocaml_ast_sp;<br>
+        ArchSpec arch;<br>
+<br>
+        if (module)<br>
+        {<br>
+            arch = module->GetArchitecture();<br>
+<br>
+            ObjectFile *objfile = module->GetObjectFile();<br>
+            ArchSpec object_arch;<br>
+<br>
+            if (!objfile || !objfile->GetArchitecture(object_arch))<br>
+                return lldb::TypeSystemSP();<br>
+<br>
+            ocaml_ast_sp = std::shared_ptr<OCamlASTContext>(new OCamlASTContext);<br>
+<br>
+            if (log) {<br>
+                log->Printf ("((Module*)%p) [%s]->GetOCamlASTContext() = %p",<br>
+                            (void *)module,<br>
+                            module->GetFileSpec().GetFilename().AsCString("<anonymous>"),<br>
+                            (void *)ocaml_ast_sp.get());<br>
+            }<br>
+<br>
+        } else if (target) {<br>
+            arch = target->GetArchitecture();<br>
+            ocaml_ast_sp = std::shared_ptr<OCamlASTContextForExpr>(new OCamlASTContextForExpr(target->shared_from_this()));<br>
+<br>
+            if (log)<br>
+            {<br>
+                log->Printf ("((Target*)%p)->GetOCamlASTContext() = %p",<br>
+                            (void *)target,<br>
+                            (void *)ocaml_ast_sp.get());<br>
+            }<br>
+        }<br>
+<br>
+        if (arch.IsValid()) {<br>
+            ocaml_ast_sp->SetAddressByteSize(arch.GetAddressByteSize());<br>
+            return ocaml_ast_sp;<br>
+        }<br>
+    }<br>
+<br>
+    return lldb::TypeSystemSP();<br>
+}<br>
+<br>
+void<br>
+OCamlASTContext::EnumerateSupportedLanguages<br>
+(std::set<lldb::LanguageType> &languages_for_types,<br>
+ std::set<lldb::LanguageType> &languages_for_expressions)<br>
+{<br>
+    static std::vector<lldb::LanguageType> s_supported_languages_for_types({lldb::eLanguageTypeOCaml});<br>
+    static std::vector<lldb::LanguageType> s_supported_languages_for_expressions({});<br>
+<br>
+    languages_for_types.insert(s_supported_languages_for_types.begin(), s_supported_languages_for_types.end());<br>
+    languages_for_expressions.insert(s_supported_languages_for_expressions.begin(), s_supported_languages_for_expressions.end());<br>
+}<br>
+<br>
+void<br>
+OCamlASTContext::Initialize()<br>
+{<br>
+    PluginManager::RegisterPlugin (GetPluginNameStatic(),<br>
+                                   "OCaml AST context plug-in",<br>
+                                   CreateInstance,<br>
+                                   EnumerateSupportedLanguages);<br>
+}<br>
+<br>
+void<br>
+OCamlASTContext::Terminate()<br>
+{<br>
+    PluginManager::UnregisterPlugin (CreateInstance);<br>
+}<br>
+<br>
+DWARFASTParser *<br>
+OCamlASTContext::GetDWARFParser()<br>
+{<br>
+    if (!m_dwarf_ast_parser_ap) {<br>
+        m_dwarf_ast_parser_ap.reset(new DWARFASTParserOCaml(*this));<br>
+    }<br>
+<br>
+    return m_dwarf_ast_parser_ap.get();<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsArrayType(lldb::opaque_compiler_type_t type,<br>
+                             CompilerType *element_type, uint64_t *size,<br>
+                             bool *is_incomplete)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsVectorType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsAggregateType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsBeingDefined(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsCharType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsCompleteType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return static_cast<OCamlPrimitiveType *>(type)->IsCompleteType();<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsConst(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsCStringType(lldb::opaque_compiler_type_t type, uint32_t &length)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsDefined(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return type != nullptr;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsFloatingPointType(lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsFunctionType(lldb::opaque_compiler_type_t type, bool *is_variadic_ptr)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+uint32_t<br>
+OCamlASTContext::IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, CompilerType *base_type_ptr)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+size_t<br>
+OCamlASTContext::GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return 0;<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, const size_t index)<br>
+{<br>
+    return CompilerType();<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsFunctionPointerType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return IsFunctionType(type);<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsBlockPointerType (lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsIntegerType(lldb::opaque_compiler_type_t type, bool &is_signed)<br>
+{<br>
+    if (OCamlPrimitiveType *ptype = llvm::dyn_cast<OCamlPrimitiveType>(static_cast<OCamlType *>(type)))<br>
+    {<br>
+        switch (ptype->GetTypeKind())<br>
+        {<br>
+            case OCamlPrimitiveType::eTypeInt:<br>
+                is_signed = true;<br>
+                return true;<br>
+            default:<br>
+                break;<br>
+        }<br>
+    }<br>
+<br>
+    is_signed = false;<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsPolymorphicClass(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsPossibleDynamicType(lldb::opaque_compiler_type_t type,<br>
+                                    CompilerType *target_type,<br>
+                                    bool check_cplusplus, bool check_objc)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsPointerType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type)<br>
+{<br>
+    if (pointee_type)<br>
+        pointee_type->Clear();<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsPointerOrReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type)<br>
+{<br>
+    return IsPointerType(type, pointee_type);<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool *is_rvalue)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsScalarType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return llvm::isa<OCamlPrimitiveType>(static_cast<OCamlType *>(type));<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsTypedefType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::IsVoidType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::SupportsLanguage (lldb::LanguageType language)<br>
+{<br>
+    return language == lldb::eLanguageTypeOCaml;<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::GetCompleteType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    if (IsCompleteType(type))<br>
+        return true;<br>
+<br>
+    return false;<br>
+}<br>
+<br>
+uint32_t<br>
+OCamlASTContext::GetPointerByteSize()<br>
+{<br>
+    return m_pointer_byte_size;<br>
+}<br>
+<br>
+ConstString<br>
+OCamlASTContext::GetTypeName(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    if (type)<br>
+        return static_cast<OCamlPrimitiveType *>(type)->GetName();<br>
+<br>
+    return ConstString();<br>
+}<br>
+<br>
+uint32_t<br>
+OCamlASTContext::GetTypeInfo(lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_compiler_type)<br>
+{<br>
+    if (pointee_or_element_compiler_type)<br>
+        pointee_or_element_compiler_type->Clear();<br>
+    if (!type)<br>
+        return 0;<br>
+<br>
+    if (OCamlPrimitiveType *ptype = llvm::dyn_cast<OCamlPrimitiveType>(static_cast<OCamlType *>(type)))<br>
+    {<br>
+        switch (ptype->GetTypeKind())<br>
+        {<br>
+            case OCamlPrimitiveType::eTypeInt:<br>
+                return eTypeHasValue | eTypeIsBuiltIn | eTypeIsScalar | eTypeIsInteger | eTypeIsSigned;<br>
+        }<br>
+    }<br>
+<br>
+    return 0;<br>
+}<br>
+<br>
+lldb::TypeClass<br>
+OCamlASTContext::GetTypeClass(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    if (llvm::isa<OCamlPrimitiveType>(static_cast<OCamlType *>(type)))<br>
+        return eTypeClassBuiltin;<br>
+<br>
+    return lldb::eTypeClassInvalid;<br>
+}<br>
+<br>
+lldb::BasicType<br>
+OCamlASTContext::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return lldb::eBasicTypeInvalid;<br>
+}<br>
+<br>
+lldb::LanguageType<br>
+OCamlASTContext::GetMinimumLanguage(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return lldb::eLanguageTypeOCaml;<br>
+}<br>
+<br>
+unsigned<br>
+OCamlASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return 0;<br>
+}<br>
+<br>
+//----------------------------------------------------------------------<br>
+// Creating related types<br>
+//----------------------------------------------------------------------<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type, uint64_t *stride)<br>
+{<br>
+    return CompilerType();<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetCanonicalType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return CompilerType(this, type);<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return CompilerType(this, type);<br>
+}<br>
+<br>
+int<br>
+OCamlASTContext::GetFunctionArgumentCount(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return GetNumberOfFunctionArguments(type);<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, size_t idx)<br>
+{<br>
+    return GetFunctionArgumentAtIndex(type, idx);<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetFunctionReturnType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return CompilerType();<br>
+}<br>
+<br>
+size_t<br>
+OCamlASTContext::GetNumMemberFunctions(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return 0;<br>
+}<br>
+<br>
+TypeMemberFunctionImpl<br>
+OCamlASTContext::GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, size_t idx)<br>
+{<br>
+    return TypeMemberFunctionImpl();<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetNonReferenceType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return CompilerType(this, type);<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetPointeeType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return CompilerType();<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetPointerType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return CompilerType();<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetTypedefedType(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return CompilerType();<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetBasicTypeFromAST(lldb::BasicType basic_type)<br>
+{<br>
+    return CompilerType();<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding,<br>
+                                                      size_t bit_size)<br>
+{<br>
+    return CompilerType();<br>
+}<br>
+<br>
+uint64_t<br>
+OCamlASTContext::GetBitSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope)<br>
+{<br>
+    if (OCamlPrimitiveType *ptype = llvm::dyn_cast<OCamlPrimitiveType>(static_cast<OCamlType *>(type)))<br>
+    {<br>
+        switch (ptype->GetTypeKind())<br>
+        {<br>
+            case OCamlPrimitiveType::eTypeInt:<br>
+                return ptype->GetByteSize() * 8;<br>
+        }<br>
+    }<br>
+    return 0;<br>
+}<br>
+<br>
+lldb::Encoding<br>
+OCamlASTContext::GetEncoding(lldb::opaque_compiler_type_t type, uint64_t &count)<br>
+{<br>
+    count = 1;<br>
+    bool is_signed;<br>
+    if (IsIntegerType(type, is_signed))<br>
+        return is_signed ? lldb::eEncodingSint : lldb::eEncodingUint;<br>
+    bool is_complex;<br>
+    uint32_t complex_count;<br>
+    if (IsFloatingPointType(type, complex_count, is_complex))<br>
+    {<br>
+        count = complex_count;<br>
+        return lldb::eEncodingIEEE754;<br>
+    }<br>
+    if (IsPointerType(type))<br>
+        return lldb::eEncodingUint;<br>
+    return lldb::eEncodingInvalid;<br>
+}<br>
+<br>
+lldb::Format<br>
+OCamlASTContext::GetFormat(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    if (!type)<br>
+        return lldb::eFormatDefault;<br>
+    return lldb::eFormatBytes;<br>
+}<br>
+<br>
+size_t<br>
+OCamlASTContext::GetTypeBitAlign(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    return 0;<br>
+}<br>
+<br>
+uint32_t<br>
+OCamlASTContext::GetNumChildren(lldb::opaque_compiler_type_t type, bool omit_empty_base_classes)<br>
+{<br>
+    if (!type || !GetCompleteType(type))<br>
+        return 0;<br>
+<br>
+    return GetNumFields(type);<br>
+}<br>
+<br>
+uint32_t<br>
+OCamlASTContext::GetNumFields(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    if (!type || !GetCompleteType(type))<br>
+        return 0;<br>
+    return 0;<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetFieldAtIndex(lldb::opaque_compiler_type_t type, size_t idx,<br>
+                                 std::string &name, uint64_t *bit_offset_ptr,<br>
+                                 uint32_t *bitfield_bit_size_ptr, bool *is_bitfield_ptr)<br>
+{<br>
+    if (bit_offset_ptr)<br>
+        *bit_offset_ptr = 0;<br>
+    if (bitfield_bit_size_ptr)<br>
+        *bitfield_bit_size_ptr = 0;<br>
+    if (is_bitfield_ptr)<br>
+        *is_bitfield_ptr = false;<br>
+<br>
+    if (!type || !GetCompleteType(type))<br>
+        return CompilerType();<br>
+<br>
+    return CompilerType();<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::GetChildCompilerTypeAtIndex(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx,<br>
+                                             bool transparent_pointers, bool omit_empty_base_classes,<br>
+                                             bool ignore_array_bounds, std::string &child_name,<br>
+                                             uint32_t &child_byte_size, int32_t &child_byte_offset,<br>
+                                             uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset,<br>
+                                             bool &child_is_base_class, bool &child_is_deref_of_parent, ValueObject *valobj,<br>
+                                             uint64_t &language_flags)<br>
+{<br>
+    child_name.clear();<br>
+    child_byte_size = 0;<br>
+    child_byte_offset = 0;<br>
+    child_bitfield_bit_size = 0;<br>
+    child_bitfield_bit_offset = 0;<br>
+    child_is_base_class = false;<br>
+    child_is_deref_of_parent = false;<br>
+    language_flags = 0;<br>
+<br>
+    if (!type || !GetCompleteType(type))<br>
+        return CompilerType();<br>
+<br>
+    return CompilerType();<br>
+}<br>
+<br>
+uint32_t<br>
+OCamlASTContext::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes)<br>
+{<br>
+    if (!type || !GetCompleteType(type))<br>
+        return UINT_MAX;<br>
+<br>
+    return UINT_MAX;<br>
+}<br>
+<br>
+size_t<br>
+OCamlASTContext::GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type, const char *name,<br>
+                                               bool omit_empty_base_classes, std::vector<uint32_t> &child_indexes)<br>
+{<br>
+    uint32_t index = GetIndexOfChildWithName(type, name, omit_empty_base_classes);<br>
+    if (index == UINT_MAX)<br>
+        return 0;<br>
+    child_indexes.push_back(index);<br>
+    return 1;<br>
+}<br>
+<br>
+size_t<br>
+OCamlASTContext::ConvertStringToFloatValue(lldb::opaque_compiler_type_t type, const char *s, uint8_t *dst, size_t dst_size)<br>
+{<br>
+    assert(false);<br>
+    return 0;<br>
+}<br>
+//----------------------------------------------------------------------<br>
+// Dumping types<br>
+//----------------------------------------------------------------------<br>
+<br>
+void<br>
+OCamlASTContext::DumpValue(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, Stream *s, lldb::Format format,<br>
+                           const DataExtractor &data, lldb::offset_t data_byte_offset, size_t data_byte_size,<br>
+                           uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, bool show_types, bool show_summary,<br>
+                           bool verbose, uint32_t depth)<br>
+{<br>
+    if (!type) {<br>
+        s->Printf("no type\n");<br>
+        return;<br>
+    }<br>
+<br>
+    s->Printf("no value\n");<br>
+<br>
+    if (show_summary)<br>
+        DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);<br>
+}<br>
+<br>
+bool<br>
+OCamlASTContext::DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s,<br>
+                               lldb::Format format, const DataExtractor &data,<br>
+                               lldb::offset_t byte_offset, size_t byte_size, uint32_t bitfield_bit_size,<br>
+                               uint32_t bitfield_bit_offset, ExecutionContextScope *exe_scope)<br>
+{<br>
+    if (!type) {<br>
+        s->Printf("no type value\n");<br>
+        return false;<br>
+    }<br>
+<br>
+    if (IsScalarType(type))<br>
+    {<br>
+        return<br>
+        data.Dump(s, byte_offset, format, byte_size, 1, UINT64_MAX,<br>
+                  LLDB_INVALID_ADDRESS, bitfield_bit_size, bitfield_bit_offset, exe_scope);<br>
+    }<br>
+<br>
+    return false;<br>
+}<br>
+<br>
+void<br>
+OCamlASTContext::DumpSummary(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, Stream *s,<br>
+                             const DataExtractor &data, lldb::offset_t data_offset, size_t data_byte_size)<br>
+{<br>
+    s->Printf("no summary\n");<br>
+}<br>
+<br>
+void<br>
+OCamlASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type)<br>
+{<br>
+    StreamFile s(stdout, false);<br>
+    DumpTypeDescription(type, &s);<br>
+}<br>
+<br>
+void<br>
+OCamlASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type, Stream *s)<br>
+{<br>
+    static_cast<OCamlType *>(type)->Dump(s);<br>
+}<br>
+<br>
+CompilerType<br>
+OCamlASTContext::CreateBaseType(const ConstString &name, uint64_t byte_size)<br>
+{<br>
+    if (m_base_type_map.empty())<br>
+    {<br>
+        OCamlPrimitiveType *type = new OCamlPrimitiveType(OCamlPrimitiveType::eTypeInt, ConstString("ocaml_int"), byte_size);<br>
+        m_base_type_map.emplace(type->GetName(), std::unique_ptr<OCamlASTContext::OCamlType>(type));<br>
+    }<br>
+<br>
+    auto it = m_base_type_map.find(name);<br>
+    if (it == m_base_type_map.end())<br>
+    {<br>
+        OCamlPrimitiveType *type = new OCamlPrimitiveType(OCamlPrimitiveType::eTypeInt, name, byte_size);<br>
+        it = m_base_type_map.emplace(name, std::unique_ptr<OCamlASTContext::OCamlType>(type)).first;<br>
+    }<br>
+<br>
+    return CompilerType(this, it->second.get());<br>
+}<br>
+<br>
<br>
<br>
_______________________________________________<br>
lldb-commits mailing list<br>
<a href="mailto:lldb-commits@lists.llvm.org" target="_blank">lldb-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div></div><div class="gmail_extra">-- <br><div class="m_-7398942602147760848gmail_signature" data-smartmail="gmail_signature">Tim <<a href="mailto:penryu@gmail.com" target="_blank">penryu@gmail.com</a>></div>
</div></blockquote></div></div>