r277660 should do it. Jim
> On Aug 3, 2016, at 3:04 PM, Jim Ingham <jing...@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@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, <pen...@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@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@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits >> >> >> >> -- >> Tim <pen...@gmail.com> >> _______________________________________________ >> lldb-commits mailing list >> lldb-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits > _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits