diff options
| author | Tamas Berghammer <tberghammer@google.com> | 2016-02-26 14:21:23 +0000 |
|---|---|---|
| committer | Tamas Berghammer <tberghammer@google.com> | 2016-02-26 14:21:23 +0000 |
| commit | 87a9769e9b2106a2b5c94b70ed9fa3671a0f8b73 (patch) | |
| tree | 7efe5a19551ee8f19eee4caab98fea3218e38285 /lldb/source/Plugins/Language/Java | |
| parent | 5b42c7aa25b826747318824340ff229a60670b42 (diff) | |
| download | bcm5719-llvm-87a9769e9b2106a2b5c94b70ed9fa3671a0f8b73.tar.gz bcm5719-llvm-87a9769e9b2106a2b5c94b70ed9fa3671a0f8b73.zip | |
Add a set of new plugins to handle Java debugging
The purpose of these plugins is to make LLDB capable of debugging java
code JIT-ed by the android runtime.
Differential revision: http://reviews.llvm.org/D17616
llvm-svn: 262015
Diffstat (limited to 'lldb/source/Plugins/Language/Java')
5 files changed, 268 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Language/Java/CMakeLists.txt b/lldb/source/Plugins/Language/Java/CMakeLists.txt new file mode 100644 index 00000000000..80f7b08e7b6 --- /dev/null +++ b/lldb/source/Plugins/Language/Java/CMakeLists.txt @@ -0,0 +1,4 @@ +add_lldb_library(lldbPluginJavaLanguage + JavaFormatterFunctions.cpp + JavaLanguage.cpp +) diff --git a/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.cpp b/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.cpp new file mode 100644 index 00000000000..ab368b33fbc --- /dev/null +++ b/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.cpp @@ -0,0 +1,71 @@ +//===-- JavaFormatterFunctions.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 +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "JavaFormatterFunctions.h" +#include "lldb/DataFormatters/FormattersHelpers.h" +#include "lldb/DataFormatters/StringPrinter.h" + +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::formatters; + +bool +lldb_private::formatters::JavaStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &opts) +{ + if (valobj.IsPointerOrReferenceType()) + { + Error error; + ValueObjectSP deref = valobj.Dereference(error); + if (error.Fail()) + return false; + return JavaStringSummaryProvider(*deref, stream, opts); + } + + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ConstString data_name("value"); + ConstString length_name("count"); + + ValueObjectSP length_sp = valobj.GetChildMemberWithName(length_name, true); + ValueObjectSP data_sp = valobj.GetChildMemberWithName(data_name, true); + if (!data_sp || !length_sp) + return false; + + bool success = false; + uint64_t length = length_sp->GetValueAsUnsigned(0, &success); + if (!success) + return false; + + if (length == 0) + { + stream.Printf("\"\""); + return true; + } + lldb::addr_t valobj_addr = data_sp->GetAddressOf(); + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + options.SetLocation(valobj_addr); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetSourceSize(length); + options.SetNeedsZeroTermination(false); + options.SetLanguage(eLanguageTypeJava); + + if (StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF16>(options)) + return true; + + stream.Printf("Summary Unavailable"); + return true; +} diff --git a/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.h b/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.h new file mode 100644 index 00000000000..3fe7cf10141 --- /dev/null +++ b/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.h @@ -0,0 +1,30 @@ +//===-- JavaFormatterFunctions.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_JavaFormatterFunctions_h_ +#define liblldb_JavaFormatterFunctions_h_ + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-forward.h" + +namespace lldb_private +{ +namespace formatters +{ + +bool +JavaStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); + +} // namespace formatters +} // namespace lldb_private + +#endif // liblldb_JavaFormatterFunctions_h_ diff --git a/lldb/source/Plugins/Language/Java/JavaLanguage.cpp b/lldb/source/Plugins/Language/Java/JavaLanguage.cpp new file mode 100644 index 00000000000..eefc2efb718 --- /dev/null +++ b/lldb/source/Plugins/Language/Java/JavaLanguage.cpp @@ -0,0 +1,99 @@ +//===-- JavaLanguage.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 "JavaFormatterFunctions.h" +#include "JavaLanguage.h" +#include "lldb/Core/ConstString.h" +#include "lldb/Core/PluginManager.h" +#include "lldb/DataFormatters/DataVisualization.h" +#include "lldb/DataFormatters/FormattersHelpers.h" +#include "lldb/Symbol/JavaASTContext.h" + +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::formatters; + +void +JavaLanguage::Initialize() +{ + PluginManager::RegisterPlugin(GetPluginNameStatic(), "Java Language", CreateInstance); +} + +void +JavaLanguage::Terminate() +{ + PluginManager::UnregisterPlugin(CreateInstance); +} + +lldb_private::ConstString +JavaLanguage::GetPluginNameStatic() +{ + static ConstString g_name("Java"); + return g_name; +} + +lldb_private::ConstString +JavaLanguage::GetPluginName() +{ + return GetPluginNameStatic(); +} + +uint32_t +JavaLanguage::GetPluginVersion() +{ + return 1; +} + +Language * +JavaLanguage::CreateInstance(lldb::LanguageType language) +{ + if (language == eLanguageTypeJava) + return new JavaLanguage(); + return nullptr; +} + +bool +JavaLanguage::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; +} + +lldb::TypeCategoryImplSP +JavaLanguage::GetFormatters() +{ + static std::once_flag g_initialize; + static TypeCategoryImplSP g_category; + + std::call_once(g_initialize, [this]() -> void { + DataVisualization::Categories::GetCategory(GetPluginName(), g_category); + if (g_category) + { + lldb::TypeSummaryImplSP string_summary_sp(new CXXFunctionSummaryFormat( + TypeSummaryImpl::Flags().SetDontShowChildren(true), lldb_private::formatters::JavaStringSummaryProvider, + "java.lang.String summary provider")); + + g_category->GetTypeSummariesContainer()->Add(ConstString("java::lang::String"), string_summary_sp); + } + }); + return g_category; +} diff --git a/lldb/source/Plugins/Language/Java/JavaLanguage.h b/lldb/source/Plugins/Language/Java/JavaLanguage.h new file mode 100644 index 00000000000..edfa7add048 --- /dev/null +++ b/lldb/source/Plugins/Language/Java/JavaLanguage.h @@ -0,0 +1,64 @@ +//===-- JavaLanguage.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_JavaLanguage_h_ +#define liblldb_JavaLanguage_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 JavaLanguage : public Language +{ +public: + lldb::LanguageType + GetLanguageType() const override + { + return lldb::eLanguageTypeJava; + } + + 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; + + lldb::TypeCategoryImplSP + GetFormatters(); +}; + +} // namespace lldb_private + +#endif // liblldb_JavaLanguage_h_ |

