<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">That depends - some of the language plugin stuff is being used in C/C++/ObjC, and then there either are new test cases, or existing test cases cover the fact that refactoring has not broken functionality</div><div class=""><br class=""></div><div class="">Some of the new functionality is not (yet) used, and is just infrastructural plumbing - in those cases, the best we can do to test is using existing test coverage to ensure our plumbing through does not break existing behavior</div><div class="">This change falls in this latter category - i.e. since it is just infrastructure work, there is no change in functionality, and the lack of regressions is the best testing coverage we can get in the current world</div><div class="">When I start using this, I will add tests (or rework existing tests) as needed</div><br class=""><div><blockquote type="cite" class=""><div class="">On Nov 18, 2015, at 5:19 PM, Zachary Turner <<a href="mailto:zturner@google.com" class="">zturner@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hi Enrico, have there been any tests exercising any of the language plugin stuff yet? Hard to follow every CL that goes in, so just trying to catch up.</div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Wed, Nov 18, 2015 at 5:14 PM Enrico Granata via lldb-commits <<a href="mailto:lldb-commits@lists.llvm.org" class="">lldb-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: enrico<br class="">
Date: Wed Nov 18 19:11:53 2015<br class="">
New Revision: 253531<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=253531&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=253531&view=rev</a><br class="">
Log:<br class="">
Allow the language plugins a say in how the function name is rendered as part of frame formatting<br class="">
<br class="">
Modified:<br class="">
lldb/trunk/include/lldb/Target/Language.h<br class="">
lldb/trunk/source/Core/FormatEntity.cpp<br class="">
lldb/trunk/source/Target/Language.cpp<br class="">
<br class="">
Modified: lldb/trunk/include/lldb/Target/Language.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Language.h?rev=253531&r1=253530&r2=253531&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Language.h?rev=253531&r1=253530&r2=253531&view=diff</a><br class="">
==============================================================================<br class="">
--- lldb/trunk/include/lldb/Target/Language.h (original)<br class="">
+++ lldb/trunk/include/lldb/Target/Language.h Wed Nov 18 19:11:53 2015<br class="">
@@ -32,7 +32,6 @@ class Language :<br class="">
public PluginInterface<br class="">
{<br class="">
public:<br class="">
-<br class="">
class TypeScavenger<br class="">
{<br class="">
public:<br class="">
@@ -67,6 +66,13 @@ public:<br class="">
const char *key,<br class="">
ResultSet &results) = 0;<br class="">
};<br class="">
+<br class="">
+ enum class FunctionNameRepresentation<br class="">
+ {<br class="">
+ eName,<br class="">
+ eNameWithArgs,<br class="">
+ eNameWithNoArgs<br class="">
+ };<br class="">
<br class="">
~Language() override;<br class="">
<br class="">
@@ -134,6 +140,11 @@ public:<br class="">
virtual bool<br class="">
IsUninitializedReference (ValueObject& valobj);<br class="">
<br class="">
+ virtual bool<br class="">
+ GetFunctionDisplayName (const SymbolContext *sc,<br class="">
+ FunctionNameRepresentation representation,<br class="">
+ Stream& s);<br class="">
+<br class="">
// These are accessors for general information about the Languages lldb knows about:<br class="">
<br class="">
static lldb::LanguageType<br class="">
<br class="">
Modified: lldb/trunk/source/Core/FormatEntity.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatEntity.cpp?rev=253531&r1=253530&r2=253531&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatEntity.cpp?rev=253531&r1=253530&r2=253531&view=diff</a><br class="">
==============================================================================<br class="">
--- lldb/trunk/source/Core/FormatEntity.cpp (original)<br class="">
+++ lldb/trunk/source/Core/FormatEntity.cpp Wed Nov 18 19:11:53 2015<br class="">
@@ -1653,201 +1653,264 @@ FormatEntity::Format (const Entry &entry<br class="">
<br class="">
case Entry::Type::FunctionName:<br class="">
{<br class="">
- const char *name = NULL;<br class="">
+ Language *language_plugin = nullptr;<br class="">
+ bool language_plugin_handled = false;<br class="">
+ StreamString ss;<br class="">
if (sc->function)<br class="">
- name = sc->function->GetName().AsCString (NULL);<br class="">
+ language_plugin = Language::FindPlugin(sc->function->GetLanguage());<br class="">
else if (sc->symbol)<br class="">
- name = sc->symbol->GetName().AsCString (NULL);<br class="">
- if (name)<br class="">
+ language_plugin = Language::FindPlugin(sc->symbol->GetLanguage());<br class="">
+ if (language_plugin)<br class="">
{<br class="">
- s.PutCString(name);<br class="">
-<br class="">
- if (sc->block)<br class="">
+ language_plugin_handled = language_plugin->GetFunctionDisplayName(sc,<br class="">
+ Language::FunctionNameRepresentation::eName,<br class="">
+ ss);<br class="">
+ }<br class="">
+ if (language_plugin_handled)<br class="">
+ {<br class="">
+ s.PutCString(ss.GetData());<br class="">
+ return true;<br class="">
+ }<br class="">
+ else<br class="">
+ {<br class="">
+ const char *name = NULL;<br class="">
+ if (sc->function)<br class="">
+ name = sc->function->GetName().AsCString (NULL);<br class="">
+ else if (sc->symbol)<br class="">
+ name = sc->symbol->GetName().AsCString (NULL);<br class="">
+ if (name)<br class="">
{<br class="">
- Block *inline_block = sc->block->GetContainingInlinedBlock ();<br class="">
- if (inline_block)<br class="">
+ s.PutCString(name);<br class="">
+<br class="">
+ if (sc->block)<br class="">
{<br class="">
- const InlineFunctionInfo *inline_info = sc->block->GetInlinedFunctionInfo();<br class="">
- if (inline_info)<br class="">
+ Block *inline_block = sc->block->GetContainingInlinedBlock ();<br class="">
+ if (inline_block)<br class="">
{<br class="">
- s.PutCString(" [inlined] ");<br class="">
- inline_info->GetName(sc->function->GetLanguage()).Dump(&s);<br class="">
+ const InlineFunctionInfo *inline_info = sc->block->GetInlinedFunctionInfo();<br class="">
+ if (inline_info)<br class="">
+ {<br class="">
+ s.PutCString(" [inlined] ");<br class="">
+ inline_info->GetName(sc->function->GetLanguage()).Dump(&s);<br class="">
+ }<br class="">
}<br class="">
}<br class="">
+ return true;<br class="">
}<br class="">
- return true;<br class="">
}<br class="">
}<br class="">
return false;<br class="">
<br class="">
case Entry::Type::FunctionNameNoArgs:<br class="">
{<br class="">
- ConstString name;<br class="">
+ Language *language_plugin = nullptr;<br class="">
+ bool language_plugin_handled = false;<br class="">
+ StreamString ss;<br class="">
if (sc->function)<br class="">
- name = sc->function->GetNameNoArguments();<br class="">
+ language_plugin = Language::FindPlugin(sc->function->GetLanguage());<br class="">
else if (sc->symbol)<br class="">
- name = sc->symbol->GetNameNoArguments();<br class="">
- if (name)<br class="">
+ language_plugin = Language::FindPlugin(sc->symbol->GetLanguage());<br class="">
+ if (language_plugin)<br class="">
{<br class="">
- s.PutCString(name.GetCString());<br class="">
+ language_plugin_handled = language_plugin->GetFunctionDisplayName(sc,<br class="">
+ Language::FunctionNameRepresentation::eNameWithNoArgs,<br class="">
+ ss);<br class="">
+ }<br class="">
+ if (language_plugin_handled)<br class="">
+ {<br class="">
+ s.PutCString(ss.GetData());<br class="">
return true;<br class="">
}<br class="">
+ else<br class="">
+ {<br class="">
+ ConstString name;<br class="">
+ if (sc->function)<br class="">
+ name = sc->function->GetNameNoArguments();<br class="">
+ else if (sc->symbol)<br class="">
+ name = sc->symbol->GetNameNoArguments();<br class="">
+ if (name)<br class="">
+ {<br class="">
+ s.PutCString(name.GetCString());<br class="">
+ return true;<br class="">
+ }<br class="">
+ }<br class="">
}<br class="">
return false;<br class="">
<br class="">
case Entry::Type::FunctionNameWithArgs:<br class="">
{<br class="">
- // Print the function name with arguments in it<br class="">
+ Language *language_plugin = nullptr;<br class="">
+ bool language_plugin_handled = false;<br class="">
+ StreamString ss;<br class="">
if (sc->function)<br class="">
+ language_plugin = Language::FindPlugin(sc->function->GetLanguage());<br class="">
+ else if (sc->symbol)<br class="">
+ language_plugin = Language::FindPlugin(sc->symbol->GetLanguage());<br class="">
+ if (language_plugin)<br class="">
{<br class="">
- ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL;<br class="">
- const char *cstr = sc->function->GetName().AsCString (NULL);<br class="">
- if (cstr)<br class="">
+ language_plugin_handled = language_plugin->GetFunctionDisplayName(sc,<br class="">
+ Language::FunctionNameRepresentation::eNameWithArgs,<br class="">
+ ss);<br class="">
+ }<br class="">
+ if (language_plugin_handled)<br class="">
+ {<br class="">
+ s.PutCString(ss.GetData());<br class="">
+ return true;<br class="">
+ }<br class="">
+ else<br class="">
+ {<br class="">
+ // Print the function name with arguments in it<br class="">
+ if (sc->function)<br class="">
{<br class="">
- const InlineFunctionInfo *inline_info = NULL;<br class="">
- VariableListSP variable_list_sp;<br class="">
- bool get_function_vars = true;<br class="">
- if (sc->block)<br class="">
+ ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL;<br class="">
+ const char *cstr = sc->function->GetName().AsCString (NULL);<br class="">
+ if (cstr)<br class="">
{<br class="">
- Block *inline_block = sc->block->GetContainingInlinedBlock ();<br class="">
-<br class="">
- if (inline_block)<br class="">
+ const InlineFunctionInfo *inline_info = NULL;<br class="">
+ VariableListSP variable_list_sp;<br class="">
+ bool get_function_vars = true;<br class="">
+ if (sc->block)<br class="">
{<br class="">
- get_function_vars = false;<br class="">
- inline_info = sc->block->GetInlinedFunctionInfo();<br class="">
- if (inline_info)<br class="">
- variable_list_sp = inline_block->GetBlockVariableList (true);<br class="">
- }<br class="">
- }<br class="">
-<br class="">
- if (get_function_vars)<br class="">
- {<br class="">
- variable_list_sp = sc->function->GetBlock(true).GetBlockVariableList (true);<br class="">
- }<br class="">
-<br class="">
- if (inline_info)<br class="">
- {<br class="">
- s.PutCString (cstr);<br class="">
- s.PutCString (" [inlined] ");<br class="">
- cstr = inline_info->GetName(sc->function->GetLanguage()).GetCString();<br class="">
- }<br class="">
-<br class="">
- VariableList args;<br class="">
- if (variable_list_sp)<br class="">
- variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument, args);<br class="">
- if (args.GetSize() > 0)<br class="">
- {<br class="">
- const char *open_paren = strchr (cstr, '(');<br class="">
- const char *close_paren = nullptr;<br class="">
- const char *generic = strchr(cstr, '<');<br class="">
- // if before the arguments list begins there is a template sign<br class="">
- // then scan to the end of the generic args before you try to find<br class="">
- // the arguments list<br class="">
- if (generic && open_paren && generic < open_paren)<br class="">
- {<br class="">
- int generic_depth = 1;<br class="">
- ++generic;<br class="">
- for (;<br class="">
- *generic && generic_depth > 0;<br class="">
- generic++)<br class="">
- {<br class="">
- if (*generic == '<')<br class="">
- generic_depth++;<br class="">
- if (*generic == '>')<br class="">
- generic_depth--;<br class="">
+ Block *inline_block = sc->block->GetContainingInlinedBlock ();<br class="">
+<br class="">
+ if (inline_block)<br class="">
+ {<br class="">
+ get_function_vars = false;<br class="">
+ inline_info = sc->block->GetInlinedFunctionInfo();<br class="">
+ if (inline_info)<br class="">
+ variable_list_sp = inline_block->GetBlockVariableList (true);<br class="">
}<br class="">
- if (*generic)<br class="">
- open_paren = strchr(generic, '(');<br class="">
- else<br class="">
- open_paren = nullptr;<br class="">
}<br class="">
- if (open_paren)<br class="">
+<br class="">
+ if (get_function_vars)<br class="">
{<br class="">
- if (IsToken (open_paren, "(anonymous namespace)"))<br class="">
- {<br class="">
- open_paren = strchr (open_paren + strlen("(anonymous namespace)"), '(');<br class="">
- if (open_paren)<br class="">
- close_paren = strchr (open_paren, ')');<br class="">
- }<br class="">
- else<br class="">
- close_paren = strchr (open_paren, ')');<br class="">
+ variable_list_sp = sc->function->GetBlock(true).GetBlockVariableList (true);<br class="">
}<br class="">
-<br class="">
- if (open_paren)<br class="">
- s.Write(cstr, open_paren - cstr + 1);<br class="">
- else<br class="">
+<br class="">
+ if (inline_info)<br class="">
{<br class="">
s.PutCString (cstr);<br class="">
- s.PutChar ('(');<br class="">
+ s.PutCString (" [inlined] ");<br class="">
+ cstr = inline_info->GetName(sc->function->GetLanguage()).GetCString();<br class="">
}<br class="">
- const size_t num_args = args.GetSize();<br class="">
- for (size_t arg_idx = 0; arg_idx < num_args; ++arg_idx)<br class="">
+<br class="">
+ VariableList args;<br class="">
+ if (variable_list_sp)<br class="">
+ variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument, args);<br class="">
+ if (args.GetSize() > 0)<br class="">
{<br class="">
- std::string buffer;<br class="">
-<br class="">
- VariableSP var_sp (args.GetVariableAtIndex (arg_idx));<br class="">
- ValueObjectSP var_value_sp (ValueObjectVariable::Create (exe_scope, var_sp));<br class="">
- StreamString ss;<br class="">
- const char *var_representation = nullptr;<br class="">
- const char *var_name = var_value_sp->GetName().GetCString();<br class="">
- if (var_value_sp->GetCompilerType().IsValid())<br class="">
- {<br class="">
- if (var_value_sp && exe_scope->CalculateTarget())<br class="">
- var_value_sp = var_value_sp->GetQualifiedRepresentationIfAvailable(exe_scope->CalculateTarget()->TargetProperties::GetPreferDynamicValue(),<br class="">
- exe_scope->CalculateTarget()->TargetProperties::GetEnableSyntheticValue());<br class="">
- if (var_value_sp->GetCompilerType().IsAggregateType() &&<br class="">
- DataVisualization::ShouldPrintAsOneLiner(*var_value_sp.get()))<br class="">
+ const char *open_paren = strchr (cstr, '(');<br class="">
+ const char *close_paren = nullptr;<br class="">
+ const char *generic = strchr(cstr, '<');<br class="">
+ // if before the arguments list begins there is a template sign<br class="">
+ // then scan to the end of the generic args before you try to find<br class="">
+ // the arguments list<br class="">
+ if (generic && open_paren && generic < open_paren)<br class="">
+ {<br class="">
+ int generic_depth = 1;<br class="">
+ ++generic;<br class="">
+ for (;<br class="">
+ *generic && generic_depth > 0;<br class="">
+ generic++)<br class="">
+ {<br class="">
+ if (*generic == '<')<br class="">
+ generic_depth++;<br class="">
+ if (*generic == '>')<br class="">
+ generic_depth--;<br class="">
+ }<br class="">
+ if (*generic)<br class="">
+ open_paren = strchr(generic, '(');<br class="">
+ else<br class="">
+ open_paren = nullptr;<br class="">
+ }<br class="">
+ if (open_paren)<br class="">
+ {<br class="">
+ if (IsToken (open_paren, "(anonymous namespace)"))<br class="">
{<br class="">
- static StringSummaryFormat format(TypeSummaryImpl::Flags()<br class="">
- .SetHideItemNames(false)<br class="">
- .SetShowMembersOneLiner(true),<br class="">
- "");<br class="">
- format.FormatObject(var_value_sp.get(), buffer, TypeSummaryOptions());<br class="">
- var_representation = buffer.c_str();<br class="">
+ open_paren = strchr (open_paren + strlen("(anonymous namespace)"), '(');<br class="">
+ if (open_paren)<br class="">
+ close_paren = strchr (open_paren, ')');<br class="">
}<br class="">
else<br class="">
- var_value_sp->DumpPrintableRepresentation(ss,<br class="">
- ValueObject::ValueObjectRepresentationStyle::eValueObjectRepresentationStyleSummary,<br class="">
- eFormatDefault,<br class="">
- ValueObject::PrintableRepresentationSpecialCases::ePrintableRepresentationSpecialCasesAllow,<br class="">
- false);<br class="">
+ close_paren = strchr (open_paren, ')');<br class="">
}<br class="">
<br class="">
- if (ss.GetData() && ss.GetSize())<br class="">
- var_representation = ss.GetData();<br class="">
- if (arg_idx > 0)<br class="">
- s.PutCString (", ");<br class="">
- if (var_value_sp->GetError().Success())<br class="">
+ if (open_paren)<br class="">
+ s.Write(cstr, open_paren - cstr + 1);<br class="">
+ else<br class="">
{<br class="">
- if (var_representation)<br class="">
- s.Printf ("%s=%s", var_name, var_representation);<br class="">
+ s.PutCString (cstr);<br class="">
+ s.PutChar ('(');<br class="">
+ }<br class="">
+ const size_t num_args = args.GetSize();<br class="">
+ for (size_t arg_idx = 0; arg_idx < num_args; ++arg_idx)<br class="">
+ {<br class="">
+ std::string buffer;<br class="">
+<br class="">
+ VariableSP var_sp (args.GetVariableAtIndex (arg_idx));<br class="">
+ ValueObjectSP var_value_sp (ValueObjectVariable::Create (exe_scope, var_sp));<br class="">
+ StreamString ss;<br class="">
+ const char *var_representation = nullptr;<br class="">
+ const char *var_name = var_value_sp->GetName().GetCString();<br class="">
+ if (var_value_sp->GetCompilerType().IsValid())<br class="">
+ {<br class="">
+ if (var_value_sp && exe_scope->CalculateTarget())<br class="">
+ var_value_sp = var_value_sp->GetQualifiedRepresentationIfAvailable(exe_scope->CalculateTarget()->TargetProperties::GetPreferDynamicValue(),<br class="">
+ exe_scope->CalculateTarget()->TargetProperties::GetEnableSyntheticValue());<br class="">
+ if (var_value_sp->GetCompilerType().IsAggregateType() &&<br class="">
+ DataVisualization::ShouldPrintAsOneLiner(*var_value_sp.get()))<br class="">
+ {<br class="">
+ static StringSummaryFormat format(TypeSummaryImpl::Flags()<br class="">
+ .SetHideItemNames(false)<br class="">
+ .SetShowMembersOneLiner(true),<br class="">
+ "");<br class="">
+ format.FormatObject(var_value_sp.get(), buffer, TypeSummaryOptions());<br class="">
+ var_representation = buffer.c_str();<br class="">
+ }<br class="">
+ else<br class="">
+ var_value_sp->DumpPrintableRepresentation(ss,<br class="">
+ ValueObject::ValueObjectRepresentationStyle::eValueObjectRepresentationStyleSummary,<br class="">
+ eFormatDefault,<br class="">
+ ValueObject::PrintableRepresentationSpecialCases::ePrintableRepresentationSpecialCasesAllow,<br class="">
+ false);<br class="">
+ }<br class="">
+<br class="">
+ if (ss.GetData() && ss.GetSize())<br class="">
+ var_representation = ss.GetData();<br class="">
+ if (arg_idx > 0)<br class="">
+ s.PutCString (", ");<br class="">
+ if (var_value_sp->GetError().Success())<br class="">
+ {<br class="">
+ if (var_representation)<br class="">
+ s.Printf ("%s=%s", var_name, var_representation);<br class="">
+ else<br class="">
+ s.Printf ("%s=%s at %s", var_name, var_value_sp->GetTypeName().GetCString(), var_value_sp->GetLocationAsCString());<br class="">
+ }<br class="">
else<br class="">
- s.Printf ("%s=%s at %s", var_name, var_value_sp->GetTypeName().GetCString(), var_value_sp->GetLocationAsCString());<br class="">
+ s.Printf ("%s=<unavailable>", var_name);<br class="">
}<br class="">
+<br class="">
+ if (close_paren)<br class="">
+ s.PutCString (close_paren);<br class="">
else<br class="">
- s.Printf ("%s=<unavailable>", var_name);<br class="">
+ s.PutChar(')');<br class="">
+<br class="">
}<br class="">
-<br class="">
- if (close_paren)<br class="">
- s.PutCString (close_paren);<br class="">
else<br class="">
- s.PutChar(')');<br class="">
-<br class="">
+ {<br class="">
+ s.PutCString(cstr);<br class="">
+ }<br class="">
+ return true;<br class="">
}<br class="">
- else<br class="">
+ }<br class="">
+ else if (sc->symbol)<br class="">
+ {<br class="">
+ const char *cstr = sc->symbol->GetName().AsCString (NULL);<br class="">
+ if (cstr)<br class="">
{<br class="">
s.PutCString(cstr);<br class="">
+ return true;<br class="">
}<br class="">
- return true;<br class="">
- }<br class="">
- }<br class="">
- else if (sc->symbol)<br class="">
- {<br class="">
- const char *cstr = sc->symbol->GetName().AsCString (NULL);<br class="">
- if (cstr)<br class="">
- {<br class="">
- s.PutCString(cstr);<br class="">
- return true;<br class="">
}<br class="">
}<br class="">
}<br class="">
<br class="">
Modified: lldb/trunk/source/Target/Language.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Language.cpp?rev=253531&r1=253530&r2=253531&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Language.cpp?rev=253531&r1=253530&r2=253531&view=diff</a><br class="">
==============================================================================<br class="">
--- lldb/trunk/source/Target/Language.cpp (original)<br class="">
+++ lldb/trunk/source/Target/Language.cpp Wed Nov 18 19:11:53 2015<br class="">
@@ -370,6 +370,14 @@ Language::IsUninitializedReference (Valu<br class="">
return false;<br class="">
}<br class="">
<br class="">
+bool<br class="">
+Language::GetFunctionDisplayName (const SymbolContext *sc,<br class="">
+ FunctionNameRepresentation representation,<br class="">
+ Stream& s)<br class="">
+{<br class="">
+ return false;<br class="">
+}<br class="">
+<br class="">
//----------------------------------------------------------------------<br class="">
// Constructor<br class="">
//----------------------------------------------------------------------<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
lldb-commits mailing list<br class="">
<a href="mailto:lldb-commits@lists.llvm.org" target="_blank" class="">lldb-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits</a><br class="">
</blockquote></div>
</div></blockquote></div><br class=""><div class="">
<div class="" style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br class="Apple-interchange-newline">Thanks,</div><div class="" style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><i class="">- Enrico</i><br class="">📩 egranata@<font color="#ff2600" class=""></font>.com ☎️ 27683</div>
</div>
<br class=""></body></html>