[Lldb-commits] [lldb] r277443 - Support for OCaml native debugging
Jim Ingham via lldb-commits
lldb-commits at lists.llvm.org
Wed Aug 3 15:19:08 PDT 2016
r277660 should do it.
Jim
> On Aug 3, 2016, at 3:04 PM, Jim Ingham <jingham at apple.com> wrote:
>
> Just finishing off a test build. Give me a minute and I'll check it in.
>
> Jim
>
>> On Aug 3, 2016, at 2:22 PM, Tamas Berghammer via lldb-commits <lldb-commits at lists.llvm.org> wrote:
>>
>> 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.
>>
>> Tamás
>>
>> On Wed, 3 Aug 2016, 21:17 Tim Hammerquist, <penryu at gmail.com> wrote:
>> Hi Tamas,
>>
>> 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:
>>
>> http://lab.llvm.org:8080/green/job/lldb_build_test/19751/consoleFull#-1586822805dd1929ea-7054-4089-b7ef-4624c3781fa4
>>
>> Could you take a look?
>>
>> Thanks,
>> -Tim
>>
>>
>> On Tue, Aug 2, 2016 at 4:15 AM, Tamas Berghammer via lldb-commits <lldb-commits at lists.llvm.org> wrote:
>> Author: tberghammer
>> Date: Tue Aug 2 06:15:55 2016
>> New Revision: 277443
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=277443&view=rev
>> Log:
>> Support for OCaml native debugging
>>
>> This introduces basic support for debugging OCaml binaries.
>> Use of the native compiler with DWARF emission support (see
>> https://github.com/ocaml/ocaml/pull/574) is required.
>>
>> Available variables are considered as 64 bits unsigned integers,
>> their interpretation will be left to a OCaml-made debugging layer.
>>
>> Differential revision: https://reviews.llvm.org/D22132
>>
>> Added:
>> lldb/trunk/include/lldb/Symbol/OCamlASTContext.h
>> lldb/trunk/source/Plugins/Language/OCaml/
>> lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt
>> lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp
>> lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h
>> lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp
>> lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h
>> lldb/trunk/source/Symbol/OCamlASTContext.cpp
>> Modified:
>> lldb/trunk/cmake/LLDBDependencies.cmake
>> lldb/trunk/include/lldb/Symbol/TypeSystem.h
>> lldb/trunk/source/API/SystemInitializerFull.cpp
>> lldb/trunk/source/Plugins/Language/CMakeLists.txt
>> lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt
>> lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
>> lldb/trunk/source/Symbol/CMakeLists.txt
>>
>> Modified: lldb/trunk/cmake/LLDBDependencies.cmake
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/LLDBDependencies.cmake?rev=277443&r1=277442&r2=277443&view=diff
>> ==============================================================================
>> --- lldb/trunk/cmake/LLDBDependencies.cmake (original)
>> +++ lldb/trunk/cmake/LLDBDependencies.cmake Tue Aug 2 06:15:55 2016
>> @@ -27,6 +27,7 @@ set( LLDB_USED_LIBS
>> lldbPluginJavaLanguage
>> lldbPluginObjCLanguage
>> lldbPluginObjCPlusPlusLanguage
>> + lldbPluginOCamlLanguage
>>
>> lldbPluginObjectFileELF
>> lldbPluginObjectFileJIT
>>
>> Added: lldb/trunk/include/lldb/Symbol/OCamlASTContext.h
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/OCamlASTContext.h?rev=277443&view=auto
>> ==============================================================================
>> --- lldb/trunk/include/lldb/Symbol/OCamlASTContext.h (added)
>> +++ lldb/trunk/include/lldb/Symbol/OCamlASTContext.h Tue Aug 2 06:15:55 2016
>> @@ -0,0 +1,355 @@
>> +//===-- OCamlASTContext.h ------------------------------------------*- C++ -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef liblldb_OCamlASTContext_h_
>> +#define liblldb_OCamlASTContext_h_
>> +
>> +// C Includes
>> +// C++ Includes
>> +#include <map>
>> +#include <memory>
>> +#include <set>
>> +#include <string>
>> +#include <vector>
>> +
>> +// Other libraries and framework includes
>> +// Project includes
>> +#include "lldb/Core/ConstString.h"
>> +#include "lldb/Symbol/TypeSystem.h"
>> +#include "lldb/Symbol/CompilerType.h"
>> +
>> +namespace lldb_private
>> +{
>> +
>> +class OCamlASTContext : public TypeSystem
>> +{
>> + public:
>> + class OCamlType;
>> + typedef std::map<ConstString, std::unique_ptr<OCamlType>> OCamlTypeMap;
>> +
>> + OCamlASTContext();
>> + ~OCamlASTContext() override;
>> +
>> + ConstString
>> + GetPluginName() override;
>> +
>> + uint32_t
>> + GetPluginVersion() override;
>> +
>> + static ConstString
>> + GetPluginNameStatic ();
>> +
>> + static lldb::TypeSystemSP
>> + CreateInstance (lldb::LanguageType language, Module *module, Target *target);
>> +
>> + static void
>> + EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types,
>> + std::set<lldb::LanguageType> &languages_for_expressions);
>> +
>> + static void
>> + Initialize ();
>> +
>> + static void
>> + Terminate ();
>> +
>> + DWARFASTParser *GetDWARFParser() override;
>> +
>> + void
>> + SetAddressByteSize(int byte_size)
>> + {
>> + m_pointer_byte_size = byte_size;
>> + }
>> +
>> + static bool classof(const TypeSystem *ts)
>> + {
>> + return ts->getKind() == TypeSystem::eKindOCaml;
>> + }
>> +
>> + ConstString
>> + DeclGetName (void *opaque_decl) override
>> + {
>> + return ConstString();
>> + }
>> +
>> + bool
>> + DeclContextIsStructUnionOrClass(void *opaque_decl_ctx) override
>> + {
>> + return false;
>> + }
>> +
>> + ConstString
>> + DeclContextGetName(void *opaque_decl_ctx) override
>> + {
>> + return ConstString();
>> + }
>> +
>> + ConstString
>> + DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override
>> + {
>> + return ConstString();
>> + }
>> +
>> + bool
>> + DeclContextIsClassMethod(void *opaque_decl_ctx, lldb::LanguageType *language_ptr,
>> + bool *is_instance_method_ptr,
>> + ConstString *language_object_name_ptr) override
>> + {
>> + return false;
>> + }
>> +
>> + bool SupportsLanguage (lldb::LanguageType language) override;
>> + uint32_t GetPointerByteSize() override;
>> +
>> + bool
>> + IsArrayType(lldb::opaque_compiler_type_t type, CompilerType *element_type,
>> + uint64_t *size, bool *is_incomplete) override;
>> +
>> + bool IsAggregateType(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool IsCharType(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool IsCompleteType(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool IsDefined(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool IsFloatingPointType(lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex) override;
>> +
>> + bool IsFunctionType(lldb::opaque_compiler_type_t type, bool *is_variadic_ptr = nullptr) override;
>> +
>> + size_t GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) override;
>> +
>> + CompilerType GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, const size_t index) override;
>> +
>> + bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool IsBlockPointerType (lldb::opaque_compiler_type_t type,
>> + CompilerType *function_pointer_type_ptr) override;
>> +
>> + bool
>> + IsIntegerType(lldb::opaque_compiler_type_t type, bool &is_signed) override;
>> +
>> + bool
>> + IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
>> + CompilerType *target_type,
>> + bool check_cplusplus, bool check_objc) override;
>> +
>> + bool IsPointerType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type = nullptr) override;
>> +
>> + bool IsScalarType(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool IsVoidType(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool GetCompleteType(lldb::opaque_compiler_type_t type) override;
>> +
>> + ConstString GetTypeName(lldb::opaque_compiler_type_t type) override;
>> +
>> + uint32_t
>> + GetTypeInfo(lldb::opaque_compiler_type_t type,
>> + CompilerType *pointee_or_element_compiler_type = nullptr) override;
>> +
>> + lldb::LanguageType GetMinimumLanguage(lldb::opaque_compiler_type_t type) override;
>> +
>> + lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override;
>> +
>> + CompilerType
>> + GetArrayElementType(lldb::opaque_compiler_type_t type, uint64_t *stride = nullptr) override;
>> +
>> + CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) override;
>> +
>> + int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override;
>> +
>> + CompilerType
>> + GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override;
>> +
>> + CompilerType
>> + GetFunctionReturnType(lldb::opaque_compiler_type_t type) override;
>> +
>> + size_t
>> + GetNumMemberFunctions(lldb::opaque_compiler_type_t type) override;
>> +
>> + TypeMemberFunctionImpl
>> + GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override;
>> +
>> + CompilerType
>> + GetPointeeType(lldb::opaque_compiler_type_t type) override;
>> +
>> + CompilerType
>> + GetPointerType(lldb::opaque_compiler_type_t type) override;
>> +
>> + uint64_t
>> + GetBitSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override;
>> +
>> + lldb::Encoding
>> + GetEncoding(lldb::opaque_compiler_type_t type, uint64_t &count) override;
>> +
>> + lldb::Format
>> + GetFormat(lldb::opaque_compiler_type_t type) override;
>> +
>> + uint32_t
>> + GetNumChildren(lldb::opaque_compiler_type_t type, bool omit_empty_base_classes) override;
>> +
>> + lldb::BasicType
>> + GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) override;
>> +
>> + CompilerType
>> + GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, size_t bit_size) override;
>> +
>> + uint32_t
>> + GetNumFields(lldb::opaque_compiler_type_t type) override;
>> +
>> + CompilerType
>> + 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) override;
>> +
>> + uint32_t
>> + GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) override
>> + {
>> + return 0;
>> + }
>> +
>> + uint32_t
>> + GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) override
>> + {
>> + return 0;
>> + }
>> +
>> + CompilerType
>> + GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override
>> + {
>> + return CompilerType();
>> + }
>> +
>> + CompilerType
>> + GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override
>> + {
>> + return CompilerType();
>> + }
>> +
>> + CompilerType
>> + 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) override;
>> +
>> + uint32_t
>> + GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes) override;
>> +
>> + size_t
>> + GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type,
>> + const char *name, bool omit_empty_base_classes,
>> + std::vector<uint32_t> &child_indexes) override;
>> +
>> + size_t
>> + GetNumTemplateArguments(lldb::opaque_compiler_type_t type) override
>> + {
>> + return 0;
>> + }
>> +
>> + CompilerType
>> + GetTemplateArgument(lldb::opaque_compiler_type_t type,
>> + size_t idx, lldb::TemplateArgumentKind &kind) override
>> + {
>> + return CompilerType();
>> + }
>> +
>> + void DumpValue(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
>> + Stream *s, lldb::Format format, const DataExtractor &data,
>> + lldb::offset_t data_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) override;
>> +
>> + bool DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s,
>> + lldb::Format format, const DataExtractor &data,
>> + lldb::offset_t data_offset, size_t data_byte_size,
>> + uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,
>> + ExecutionContextScope *exe_scope) override;
>> +
>> + void
>> + DumpTypeDescription(lldb::opaque_compiler_type_t type) override;
>> +
>> + void
>> + DumpTypeDescription(lldb::opaque_compiler_type_t type, Stream *s) override;
>> +
>> + bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) override;
>> +
>> + void
>> + 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) override;
>> +
>> + size_t
>> + ConvertStringToFloatValue(lldb::opaque_compiler_type_t type, const char *s,
>> + uint8_t *dst, size_t dst_size) override;
>> +
>> + bool IsPointerOrReferenceType(lldb::opaque_compiler_type_t type,
>> + CompilerType *pointee_type = nullptr) override;
>> +
>> + unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool IsCStringType(lldb::opaque_compiler_type_t type, uint32_t &length) override;
>> +
>> + size_t GetTypeBitAlign(lldb::opaque_compiler_type_t type) override;
>> +
>> + CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) override;
>> +
>> + bool IsBeingDefined(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool IsConst(lldb::opaque_compiler_type_t type) override;
>> +
>> + uint32_t
>> + IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, CompilerType *base_type_ptr) override;
>> +
>> + bool IsPolymorphicClass(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool IsTypedefType(lldb::opaque_compiler_type_t type) override;
>> +
>> + CompilerType GetTypedefedType(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool
>> + IsVectorType(lldb::opaque_compiler_type_t type, CompilerType *element_type,
>> + uint64_t *size) override;
>> +
>> + CompilerType GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override;
>> +
>> + CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override;
>> +
>> + bool
>> + IsReferenceType(lldb::opaque_compiler_type_t type,
>> + CompilerType *pointee_type = nullptr,
>> + bool *is_rvalue = nullptr) override;
>> +
>> + CompilerType CreateBaseType(const ConstString &name, uint64_t);
>> +
>> + private:
>> + int m_pointer_byte_size;
>> + int m_int_byte_size;
>> + std::unique_ptr<DWARFASTParser> m_dwarf_ast_parser_ap;
>> + OCamlTypeMap m_base_type_map;
>> +
>> + OCamlASTContext(const OCamlASTContext &) = delete;
>> + const OCamlASTContext &operator=(const OCamlASTContext &) = delete;
>> +};
>> +
>> +class OCamlASTContextForExpr : public OCamlASTContext
>> +{
>> + public:
>> + OCamlASTContextForExpr(lldb::TargetSP target) : m_target_wp(target) {}
>> +
>> + private:
>> + lldb::TargetWP m_target_wp;
>> +};
>> +
>> +}
>> +#endif // liblldb_OCamlASTContext_h_
>>
>> Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=277443&r1=277442&r2=277443&view=diff
>> ==============================================================================
>> --- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original)
>> +++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Tue Aug 2 06:15:55 2016
>> @@ -75,6 +75,7 @@ public:
>> eKindSwift,
>> eKindGo,
>> eKindJava,
>> + eKindOCaml,
>> kNumKinds
>> };
>>
>>
>> Modified: lldb/trunk/source/API/SystemInitializerFull.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SystemInitializerFull.cpp?rev=277443&r1=277442&r2=277443&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/API/SystemInitializerFull.cpp (original)
>> +++ lldb/trunk/source/API/SystemInitializerFull.cpp Tue Aug 2 06:15:55 2016
>> @@ -27,6 +27,7 @@
>> #include "lldb/Symbol/ClangASTContext.h"
>> #include "lldb/Symbol/GoASTContext.h"
>> #include "lldb/Symbol/JavaASTContext.h"
>> +#include "lldb/Symbol/OCamlASTContext.h"
>>
>> #include "Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h"
>> #include "Plugins/ABI/MacOSX-arm64/ABIMacOSX_arm64.h"
>> @@ -56,6 +57,7 @@
>> #include "Plugins/Language/Java/JavaLanguage.h"
>> #include "Plugins/Language/ObjC/ObjCLanguage.h"
>> #include "Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h"
>> +#include "Plugins/Language/OCaml/OCamlLanguage.h"
>> #include "Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h"
>> #include "Plugins/LanguageRuntime/Go/GoLanguageRuntime.h"
>> #include "Plugins/LanguageRuntime/Java/JavaLanguageRuntime.h"
>> @@ -314,6 +316,7 @@ SystemInitializerFull::Initialize()
>> ClangASTContext::Initialize();
>> GoASTContext::Initialize();
>> JavaASTContext::Initialize();
>> + OCamlASTContext::Initialize();
>>
>> ABIMacOSX_i386::Initialize();
>> ABIMacOSX_arm::Initialize();
>> @@ -360,6 +363,7 @@ SystemInitializerFull::Initialize()
>> JavaLanguage::Initialize();
>> ObjCLanguage::Initialize();
>> ObjCPlusPlusLanguage::Initialize();
>> + OCamlLanguage::Initialize();
>>
>> #if defined(_MSC_VER)
>> ProcessWindowsLive::Initialize();
>> @@ -444,6 +448,7 @@ SystemInitializerFull::Terminate()
>> ClangASTContext::Terminate();
>> GoASTContext::Terminate();
>> JavaASTContext::Terminate();
>> + OCamlASTContext::Terminate();
>>
>> ABIMacOSX_i386::Terminate();
>> ABIMacOSX_arm::Terminate();
>> @@ -488,6 +493,7 @@ SystemInitializerFull::Terminate()
>> JavaLanguage::Terminate();
>> ObjCLanguage::Terminate();
>> ObjCPlusPlusLanguage::Terminate();
>> + OCamlLanguage::Terminate();
>>
>> #if defined(__APPLE__)
>> DynamicLoaderDarwinKernel::Terminate();
>>
>> Modified: lldb/trunk/source/Plugins/Language/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CMakeLists.txt?rev=277443&r1=277442&r2=277443&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Language/CMakeLists.txt (original)
>> +++ lldb/trunk/source/Plugins/Language/CMakeLists.txt Tue Aug 2 06:15:55 2016
>> @@ -3,3 +3,4 @@ add_subdirectory(Go)
>> add_subdirectory(Java)
>> add_subdirectory(ObjC)
>> add_subdirectory(ObjCPlusPlus)
>> +add_subdirectory(OCaml)
>>
>> Added: lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt?rev=277443&view=auto
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt (added)
>> +++ lldb/trunk/source/Plugins/Language/OCaml/CMakeLists.txt Tue Aug 2 06:15:55 2016
>> @@ -0,0 +1,4 @@
>> +add_lldb_library(lldbPluginOCamlLanguage
>> + OCamlLanguage.cpp
>> +)
>> +
>>
>> Added: lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp?rev=277443&view=auto
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp (added)
>> +++ lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.cpp Tue Aug 2 06:15:55 2016
>> @@ -0,0 +1,78 @@
>> +//===-- OCamlLanguage.cpp ----------------------------------------*- C++ -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// C Includes
>> +#include <string.h>
>> +// C++ Includes
>> +#include <functional>
>> +#include <mutex>
>> +
>> +// Other libraries and framework includes
>> +#include "llvm/ADT/StringRef.h"
>> +
>> +// Project includes
>> +#include "OCamlLanguage.h"
>> +#include "lldb/Core/ConstString.h"
>> +#include "lldb/Core/PluginManager.h"
>> +#include "lldb/DataFormatters/DataVisualization.h"
>> +#include "lldb/DataFormatters/FormattersHelpers.h"
>> +#include "lldb/Symbol/OCamlASTContext.h"
>> +
>> +using namespace lldb;
>> +using namespace lldb_private;
>> +
>> +void
>> +OCamlLanguage::Initialize()
>> +{
>> + PluginManager::RegisterPlugin(GetPluginNameStatic(), "OCaml Language", CreateInstance);
>> +}
>> +
>> +void
>> +OCamlLanguage::Terminate()
>> +{
>> + PluginManager::UnregisterPlugin(CreateInstance);
>> +}
>> +
>> +lldb_private::ConstString
>> +OCamlLanguage::GetPluginNameStatic()
>> +{
>> + static ConstString g_name("OCaml");
>> + return g_name;
>> +}
>> +
>> +lldb_private::ConstString
>> +OCamlLanguage::GetPluginName()
>> +{
>> + return GetPluginNameStatic();
>> +}
>> +
>> +uint32_t
>> +OCamlLanguage::GetPluginVersion()
>> +{
>> + return 1;
>> +}
>> +
>> +Language *
>> +OCamlLanguage::CreateInstance(lldb::LanguageType language)
>> +{
>> + if (language == eLanguageTypeOCaml)
>> + return new OCamlLanguage();
>> + return nullptr;
>> +}
>> +
>> +bool
>> +OCamlLanguage::IsNilReference(ValueObject &valobj)
>> +{
>> + if (!valobj.GetCompilerType().IsReferenceType())
>> + return false;
>> +
>> + // If we failed to read the value then it is not a nil reference.
>> + return valobj.GetValueAsUnsigned(UINT64_MAX) == 0;
>> +}
>> +
>>
>> Added: lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h?rev=277443&view=auto
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h (added)
>> +++ lldb/trunk/source/Plugins/Language/OCaml/OCamlLanguage.h Tue Aug 2 06:15:55 2016
>> @@ -0,0 +1,61 @@
>> +//===-- OCamlLanguage.h ------------------------------------------*- C++ -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef liblldb_OCamlLanguage_h_
>> +#define liblldb_OCamlLanguage_h_
>> +
>> +// C Includes
>> +// C++ Includes
>> +#include <vector>
>> +
>> +// Other libraries and framework includes
>> +#include "llvm/ADT/StringRef.h"
>> +
>> +// Project includes
>> +#include "lldb/Core/ConstString.h"
>> +#include "lldb/Target/Language.h"
>> +#include "lldb/lldb-private.h"
>> +
>> +namespace lldb_private
>> +{
>> +
>> +class OCamlLanguage : public Language
>> +{
>> +public:
>> + lldb::LanguageType
>> + GetLanguageType() const override
>> + {
>> + return lldb::eLanguageTypeOCaml;
>> + }
>> +
>> + static void
>> + Initialize();
>> +
>> + static void
>> + Terminate();
>> +
>> + static lldb_private::Language *
>> + CreateInstance(lldb::LanguageType language);
>> +
>> + static lldb_private::ConstString
>> + GetPluginNameStatic();
>> +
>> + ConstString
>> + GetPluginName() override;
>> +
>> + uint32_t
>> + GetPluginVersion() override;
>> +
>> + bool
>> + IsNilReference(ValueObject &valobj) override;
>> +};
>> +
>> +} // namespace lldb_private
>> +
>> +#endif // liblldb_OCamlLanguage_h_
>>
>> Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt?rev=277443&r1=277442&r2=277443&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt (original)
>> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/CMakeLists.txt Tue Aug 2 06:15:55 2016
>> @@ -4,6 +4,7 @@ add_lldb_library(lldbPluginSymbolFileDWA
>> DWARFASTParserClang.cpp
>> DWARFASTParserGo.cpp
>> DWARFASTParserJava.cpp
>> + DWARFASTParserOCaml.cpp
>> DWARFAttribute.cpp
>> DWARFCompileUnit.cpp
>> DWARFDataExtractor.cpp
>>
>> Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp?rev=277443&view=auto
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp (added)
>> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.cpp Tue Aug 2 06:15:55 2016
>> @@ -0,0 +1,232 @@
>> +//===-- DWARFASTParserOCaml.cpp ---------------------------------*- C++ -*-===//
>> +
>> +#include "DWARFASTParserOCaml.h"
>> +
>> +#include "lldb/Core/Error.h"
>> +#include "lldb/Core/Log.h"
>> +#include "lldb/Core/Module.h"
>> +#include "lldb/Symbol/CompileUnit.h"
>> +#include "lldb/Symbol/Function.h"
>> +#include "lldb/Symbol/ObjectFile.h"
>> +#include "lldb/Symbol/Type.h"
>> +#include "lldb/Symbol/TypeList.h"
>> +
>> +using namespace lldb;
>> +using namespace lldb_private;
>> +
>> +DWARFASTParserOCaml::DWARFASTParserOCaml (OCamlASTContext &ast) :
>> + m_ast (ast)
>> +{}
>> +
>> +DWARFASTParserOCaml::~DWARFASTParserOCaml () {}
>> +
>> +TypeSP
>> +DWARFASTParserOCaml::ParseBaseTypeFromDIE(const DWARFDIE &die)
>> +{
>> + SymbolFileDWARF *dwarf = die.GetDWARF();
>> + dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
>> +
>> + ConstString type_name;
>> + uint64_t byte_size = 0;
>> +
>> + DWARFAttributes attributes;
>> + const size_t num_attributes = die.GetAttributes(attributes);
>> + for (uint32_t i = 0; i < num_attributes; ++i)
>> + {
>> + DWARFFormValue form_value;
>> + dw_attr_t attr = attributes.AttributeAtIndex(i);
>> + if (attributes.ExtractFormValueAtIndex(i, form_value))
>> + {
>> + switch (attr)
>> + {
>> + case DW_AT_name:
>> + type_name.SetCString(form_value.AsCString());
>> + break;
>> + case DW_AT_byte_size:
>> + byte_size = form_value.Unsigned();
>> + break;
>> + case DW_AT_encoding:
>> + break;
>> + default:
>> + assert(false && "Unsupported attribute for DW_TAG_base_type");
>> + }
>> + }
>> + }
>> +
>> + Declaration decl;
>> + CompilerType compiler_type = m_ast.CreateBaseType(type_name, byte_size);
>> + return std::make_shared<Type>(die.GetID(), dwarf, type_name, byte_size, nullptr, LLDB_INVALID_UID,
>> + Type::eEncodingIsUID, decl, compiler_type, Type::eResolveStateFull);
>> +}
>> +
>> +lldb::TypeSP
>> +DWARFASTParserOCaml::ParseTypeFromDWARF (const SymbolContext& sc,
>> + const DWARFDIE &die,
>> + Log *log,
>> + bool *type_is_new_ptr)
>> +{
>> + if (type_is_new_ptr)
>> + *type_is_new_ptr = false;
>> +
>> + if (!die)
>> + return nullptr;
>> +
>> + SymbolFileDWARF *dwarf = die.GetDWARF();
>> +
>> + Type *type_ptr = dwarf->m_die_to_type.lookup(die.GetDIE());
>> + if (type_ptr == DIE_IS_BEING_PARSED)
>> + return nullptr;
>> + if (type_ptr != nullptr)
>> + return type_ptr->shared_from_this();
>> +
>> + TypeSP type_sp;
>> + if (type_is_new_ptr)
>> + *type_is_new_ptr = true;
>> +
>> + switch (die.Tag())
>> + {
>> + case DW_TAG_base_type:
>> + {
>> + type_sp = ParseBaseTypeFromDIE(die);
>> + break;
>> + }
>> + case DW_TAG_array_type:
>> + {
>> + break;
>> + }
>> + case DW_TAG_class_type:
>> + {
>> + break;
>> + }
>> + case DW_TAG_reference_type:
>> + {
>> + break;
>> + }
>> + }
>> +
>> + if (!type_sp)
>> + return nullptr;
>> +
>> + DWARFDIE sc_parent_die = SymbolFileDWARF::GetParentSymbolContextDIE(die);
>> + dw_tag_t sc_parent_tag = sc_parent_die.Tag();
>> +
>> + SymbolContextScope *symbol_context_scope = nullptr;
>> + if (sc_parent_tag == DW_TAG_compile_unit)
>> + {
>> + symbol_context_scope = sc.comp_unit;
>> + }
>> + else if (sc.function != nullptr && sc_parent_die)
>> + {
>> + symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die.GetID());
>> + if (symbol_context_scope == nullptr)
>> + symbol_context_scope = sc.function;
>> + }
>> +
>> + if (symbol_context_scope != nullptr)
>> + type_sp->SetSymbolContextScope(symbol_context_scope);
>> +
>> + dwarf->GetTypeList()->Insert(type_sp);
>> + dwarf->m_die_to_type[die.GetDIE()] = type_sp.get();
>> +
>> + return type_sp;
>> +}
>> +
>> +Function *
>> +DWARFASTParserOCaml::ParseFunctionFromDWARF (const SymbolContext& sc,
>> + const DWARFDIE &die)
>> +{
>> + DWARFRangeList func_ranges;
>> + const char *name = NULL;
>> + const char *mangled = NULL;
>> + int decl_file = 0;
>> + int decl_line = 0;
>> + int decl_column = 0;
>> + int call_file = 0;
>> + int call_line = 0;
>> + int call_column = 0;
>> + DWARFExpression frame_base(die.GetCU());
>> +
>> + Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_LANGUAGE));
>> +
>> + if (die)
>> + {
>> + SymbolFileDWARF *dwarf = die.GetDWARF();
>> + if (log)
>> + {
>> + dwarf->GetObjectFile()->GetModule()->LogMessage(
>> + log, "DWARFASTParserOCaml::ParseFunctionFromDWARF (die = 0x%8.8x) %s name = '%s')", die.GetOffset(),
>> + DW_TAG_value_to_name(die.Tag()), die.GetName());
>> + }
>> + }
>> +
>> + assert(die.Tag() == DW_TAG_subprogram);
>> +
>> + if (die.Tag() != DW_TAG_subprogram)
>> + return NULL;
>> +
>> + if (die.GetDIENamesAndRanges(name, mangled, func_ranges, decl_file, decl_line, decl_column, call_file, call_line,
>> + call_column, &frame_base))
>> + {
>> + AddressRange func_range;
>> + lldb::addr_t lowest_func_addr = func_ranges.GetMinRangeBase(0);
>> + lldb::addr_t highest_func_addr = func_ranges.GetMaxRangeEnd(0);
>> + if (lowest_func_addr != LLDB_INVALID_ADDRESS && lowest_func_addr <= highest_func_addr)
>> + {
>> + ModuleSP module_sp(die.GetModule());
>> + func_range.GetBaseAddress().ResolveAddressUsingFileSections(lowest_func_addr, module_sp->GetSectionList());
>> + if (func_range.GetBaseAddress().IsValid())
>> + func_range.SetByteSize(highest_func_addr - lowest_func_addr);
>> + }
>> +
>> + if (func_range.GetBaseAddress().IsValid())
>> + {
>> + Mangled func_name;
>> +
>> + func_name.SetValue(ConstString(name), true);
>> +
>> + FunctionSP func_sp;
>> + std::unique_ptr<Declaration> decl_ap;
>> + if (decl_file != 0 || decl_line != 0 || decl_column != 0)
>> + decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), decl_line,
>> + decl_column));
>> +
>> + SymbolFileDWARF *dwarf = die.GetDWARF();
>> + Type *func_type = dwarf->m_die_to_type.lookup(die.GetDIE());
>> +
>> + assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);
>> +
>> + if (dwarf->FixupAddress(func_range.GetBaseAddress()))
>> + {
>> + const user_id_t func_user_id = die.GetID();
>> + func_sp.reset(new Function(sc.comp_unit,
>> + func_user_id, // UserID is the DIE offset
>> + func_user_id,
>> + func_name,
>> + func_type,
>> + func_range)); // first address range
>> +
>> + if (func_sp.get() != NULL)
>> + {
>> + if (frame_base.IsValid())
>> + func_sp->GetFrameBaseExpression() = frame_base;
>> + sc.comp_unit->AddFunction(func_sp);
>> + return func_sp.get();
>> + }
>> + }
>> + }
>> + }
>> +
>> + return NULL;
>> +}
>> +
>> +lldb_private::CompilerDeclContext
>> +DWARFASTParserOCaml::GetDeclContextForUIDFromDWARF (const DWARFDIE &die)
>> +{
>> + return CompilerDeclContext();
>> +}
>> +
>> +lldb_private::CompilerDeclContext
>> +DWARFASTParserOCaml::GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die)
>> +{
>> + return CompilerDeclContext();
>> +}
>>
>> Added: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h?rev=277443&view=auto
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h (added)
>> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserOCaml.h Tue Aug 2 06:15:55 2016
>> @@ -0,0 +1,60 @@
>> +//===-- DWARFASTParserOCaml.h -----------------------------------*- C++ -*-===//
>> +
>> +#ifndef SymbolFileDWARF_DWARFASTParserOCaml_h_
>> +#define SymbolFileDWARF_DWARFASTParserOCaml_h_
>> +
>> +#include "DWARFASTParser.h"
>> +#include "DWARFCompileUnit.h"
>> +#include "DWARFDebugInfo.h"
>> +#include "DWARFDIE.h"
>> +#include "DWARFDefines.h"
>> +#include "SymbolFileDWARF.h"
>> +
>> +#include "lldb/Symbol/OCamlASTContext.h"
>> +
>> +class DWARFDebugInfoEntry;
>> +class DWARFDIECollection;
>> +
>> +class DWARFASTParserOCaml : public DWARFASTParser
>> +{
>> +public:
>> + DWARFASTParserOCaml (lldb_private::OCamlASTContext &ast);
>> +
>> + virtual ~DWARFASTParserOCaml ();
>> +
>> + lldb::TypeSP
>> + ParseBaseTypeFromDIE(const DWARFDIE &die);
>> +
>> + lldb::TypeSP
>> + ParseTypeFromDWARF (const lldb_private::SymbolContext& sc,
>> + const DWARFDIE &die,
>> + lldb_private::Log *log,
>> + bool *type_is_new_ptr) override;
>> +
>> + lldb_private::Function *
>> + ParseFunctionFromDWARF (const lldb_private::SymbolContext& sc,
>> + const DWARFDIE &die) override;
>> +
>> + bool
>> + CompleteTypeFromDWARF (const DWARFDIE &die,
>> + lldb_private::Type *type,
>> + lldb_private::CompilerType &compiler_type) override { return false; }
>> +
>> + lldb_private::CompilerDecl
>> + GetDeclForUIDFromDWARF (const DWARFDIE &die) override { return lldb_private::CompilerDecl(); }
>> +
>> + lldb_private::CompilerDeclContext
>> + GetDeclContextForUIDFromDWARF (const DWARFDIE &die) override;
>> +
>> + lldb_private::CompilerDeclContext
>> + GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die) override;
>> +
>> + std::vector<DWARFDIE>
>> + GetDIEForDeclContext (lldb_private::CompilerDeclContext decl_context) override { return {}; }
>> +
>> +protected:
>> +
>> + lldb_private::OCamlASTContext &m_ast;
>> +};
>> +
>> +#endif // SymbolFileDWARF_DWARFASTParserOCaml_h_
>>
>> Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=277443&r1=277442&r2=277443&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
>> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Tue Aug 2 06:15:55 2016
>> @@ -74,6 +74,7 @@ public:
>> friend class DWARFASTParserClang;
>> friend class DWARFASTParserGo;
>> friend class DWARFASTParserJava;
>> + friend class DWARFASTParserOCaml;
>>
>> //------------------------------------------------------------------
>> // Static Functions
>>
>> Modified: lldb/trunk/source/Symbol/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CMakeLists.txt?rev=277443&r1=277442&r2=277443&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Symbol/CMakeLists.txt (original)
>> +++ lldb/trunk/source/Symbol/CMakeLists.txt Tue Aug 2 06:15:55 2016
>> @@ -21,6 +21,7 @@ add_lldb_library(lldbSymbol
>> LineEntry.cpp
>> LineTable.cpp
>> ObjectFile.cpp
>> + OCamlASTContext.cpp
>> Symbol.cpp
>> SymbolContext.cpp
>> SymbolFile.cpp
>>
>> Added: lldb/trunk/source/Symbol/OCamlASTContext.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/OCamlASTContext.cpp?rev=277443&view=auto
>> ==============================================================================
>> --- lldb/trunk/source/Symbol/OCamlASTContext.cpp (added)
>> +++ lldb/trunk/source/Symbol/OCamlASTContext.cpp Tue Aug 2 06:15:55 2016
>> @@ -0,0 +1,798 @@
>> +//===-- 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/Core/Log.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/OCamlASTContext.h"
>> +#include "lldb/Symbol/Type.h"
>> +#include "lldb/Target/ExecutionContext.h"
>> +#include "lldb/Target/Target.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),
>> + m_int_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;
>> + default:
>> + break;
>> + }
>> + }
>> +
>> + 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
>> + data.Dump(s, byte_offset, format, byte_size, 1, UINT64_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());
>> +}
>> +
>>
>>
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>>
>>
>>
>> --
>> Tim <penryu at gmail.com>
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
More information about the lldb-commits
mailing list