[Lldb-commits] [lldb] r257926 - Implement missing GoASTContext methods
Hans Wennborg via lldb-commits
lldb-commits at lists.llvm.org
Mon Feb 1 14:21:19 PST 2016
Thanks! r259423.
On Mon, Feb 1, 2016 at 2:19 PM, Greg Clayton <clayborg at gmail.com> wrote:
> Sorry for the delay. This is fine.
>
> In general, feel free to accept any patches that are architecture specific for architectures that aren't x86 or ARM (MIPS, hexagon for example), and for any languages that aren't C/C++/ObjC or Swift (renderscript, go).
>
>
>> On Feb 1, 2016, at 1:49 PM, Hans Wennborg <hans at chromium.org> wrote:
>>
>> Greg: ping?
>>
>> On Tue, Jan 26, 2016 at 11:10 AM, Hans Wennborg <hans at chromium.org> wrote:
>>> Greg: Ping?
>>>
>>> On Tue, Jan 19, 2016 at 1:12 PM, Hans Wennborg <hans at chromium.org> wrote:
>>>> Sure. Greg, are you the code owner for this, or is there a specific
>>>> owner for Go?
>>>>
>>>> Thanks,
>>>> Hans
>>>>
>>>> On Fri, Jan 15, 2016 at 11:43 AM, Ryan Brown via lldb-commits
>>>> <lldb-commits at lists.llvm.org> wrote:
>>>>> It would be nice if we could get this into 3.8 to get rid of these asserts.
>>>>>
>>>>> -- Ryan Brown
>>>>>
>>>>> On Fri, Jan 15, 2016 at 11:35 AM, Ryan Brown via lldb-commits
>>>>> <lldb-commits at lists.llvm.org> wrote:
>>>>>>
>>>>>> Author: ribrdb
>>>>>> Date: Fri Jan 15 13:35:48 2016
>>>>>> New Revision: 257926
>>>>>>
>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=257926&view=rev
>>>>>> Log:
>>>>>> Implement missing GoASTContext methods
>>>>>>
>>>>>> Modified:
>>>>>> lldb/trunk/source/Symbol/GoASTContext.cpp
>>>>>>
>>>>>> Modified: lldb/trunk/source/Symbol/GoASTContext.cpp
>>>>>> URL:
>>>>>> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/GoASTContext.cpp?rev=257926&r1=257925&r2=257926&view=diff
>>>>>>
>>>>>> ==============================================================================
>>>>>> --- lldb/trunk/source/Symbol/GoASTContext.cpp (original)
>>>>>> +++ lldb/trunk/source/Symbol/GoASTContext.cpp Fri Jan 15 13:35:48 2016
>>>>>> @@ -13,6 +13,7 @@
>>>>>>
>>>>>> #include "lldb/Core/Module.h"
>>>>>> #include "lldb/Core/PluginManager.h"
>>>>>> +#include "lldb/Core/StreamFile.h"
>>>>>> #include "lldb/Core/UniqueCStringMap.h"
>>>>>> #include "lldb/Core/ValueObject.h"
>>>>>> #include "lldb/DataFormatters/StringPrinter.h"
>>>>>> @@ -1268,13 +1269,115 @@ GoASTContext::ConvertStringToFloatValue(
>>>>>> //----------------------------------------------------------------------
>>>>>> // Dumping types
>>>>>> //----------------------------------------------------------------------
>>>>>> +#define DEPTH_INCREMENT 2
>>>>>> +
>>>>>> void
>>>>>> GoASTContext::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,
>>>>>> + 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)
>>>>>> {
>>>>>> - assert(false);
>>>>>> + if (IsTypedefType(type))
>>>>>> + type = GetTypedefedType(type).GetOpaqueQualType();
>>>>>> + if (!type)
>>>>>> + return;
>>>>>> + GoType *t = static_cast<GoType *>(type);
>>>>>> +
>>>>>> + if (GoStruct *st = t->GetStruct())
>>>>>> + {
>>>>>> + if (GetCompleteType(type))
>>>>>> + {
>>>>>> + uint32_t field_idx = 0;
>>>>>> + for (auto* field = st->GetField(field_idx); field != nullptr;
>>>>>> field_idx++)
>>>>>> + {
>>>>>> + // Print the starting squiggly bracket (if this is the
>>>>>> + // first member) or comma (for member 2 and beyond) for
>>>>>> + // the struct/union/class member.
>>>>>> + if (field_idx == 0)
>>>>>> + s->PutChar('{');
>>>>>> + else
>>>>>> + s->PutChar(',');
>>>>>> +
>>>>>> + // Indent
>>>>>> + s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
>>>>>> +
>>>>>> + // Print the member type if requested
>>>>>> + if (show_types)
>>>>>> + {
>>>>>> + ConstString field_type_name =
>>>>>> field->m_type.GetTypeName();
>>>>>> + s->Printf("(%s) ", field_type_name.AsCString());
>>>>>> + }
>>>>>> + // Print the member name and equal sign
>>>>>> + s->Printf("%s = ", field->m_name.AsCString());
>>>>>> +
>>>>>> +
>>>>>> + // Dump the value of the member
>>>>>> + CompilerType field_type = field->m_type;
>>>>>> + field_type.DumpValue (exe_ctx,
>>>>>> + s,
>>>>>> // Stream to dump to
>>>>>> + field_type.GetFormat(),
>>>>>> // The format with which to display the member
>>>>>> + data,
>>>>>> // Data buffer containing all bytes for this type
>>>>>> + data_byte_offset +
>>>>>> field->m_byte_offset,// Offset into "data" where to grab value from
>>>>>> +
>>>>>> field->m_type.GetByteSize(exe_ctx->GetBestExecutionContextScope()), //
>>>>>> Size of this type in bytes
>>>>>> + 0,
>>>>>> // Bitfield bit size
>>>>>> + 0,
>>>>>> // Bitfield bit offset
>>>>>> + show_types,
>>>>>> // Boolean indicating if we should show the variable types
>>>>>> + show_summary,
>>>>>> // Boolean indicating if we should show a summary for the current type
>>>>>> + verbose,
>>>>>> // Verbose output?
>>>>>> + depth + DEPTH_INCREMENT);
>>>>>> // Scope depth for any types that have children
>>>>>> + }
>>>>>> +
>>>>>> + // Indent the trailing squiggly bracket
>>>>>> + if (field_idx > 0)
>>>>>> + s->Printf("\n%*s}", depth, "");
>>>>>> +
>>>>>> + }
>>>>>> + }
>>>>>> +
>>>>>> + if (GoArray *a = t->GetArray()) {
>>>>>> + CompilerType element_clang_type = a->GetElementType();
>>>>>> + lldb::Format element_format = element_clang_type.GetFormat();
>>>>>> + uint32_t element_byte_size =
>>>>>> element_clang_type.GetByteSize(exe_ctx->GetBestExecutionContextScope());
>>>>>> +
>>>>>> + uint64_t element_idx;
>>>>>> + for (element_idx = 0; element_idx < a->GetLength();
>>>>>> ++element_idx)
>>>>>> + {
>>>>>> + // Print the starting squiggly bracket (if this is the
>>>>>> + // first member) or comman (for member 2 and beyong) for
>>>>>> + // the struct/union/class member.
>>>>>> + if (element_idx == 0)
>>>>>> + s->PutChar('{');
>>>>>> + else
>>>>>> + s->PutChar(',');
>>>>>> +
>>>>>> + // Indent and print the index
>>>>>> + s->Printf("\n%*s[%" PRIu64 "] ", depth + DEPTH_INCREMENT, "",
>>>>>> element_idx);
>>>>>> +
>>>>>> + // Figure out the field offset within the current
>>>>>> struct/union/class type
>>>>>> + uint64_t element_offset = element_idx * element_byte_size;
>>>>>> +
>>>>>> + // Dump the value of the member
>>>>>> + element_clang_type.DumpValue (exe_ctx,
>>>>>> + s,
>>>>>> // Stream to dump to
>>>>>> + element_format,
>>>>>> // The format with which to display the element
>>>>>> + data,
>>>>>> // Data buffer containing all bytes for this type
>>>>>> + data_byte_offset +
>>>>>> element_offset,// Offset into "data" where to grab value from
>>>>>> + element_byte_size,
>>>>>> // Size of this type in bytes
>>>>>> + 0,
>>>>>> // Bitfield bit size
>>>>>> + 0,
>>>>>> // Bitfield bit offset
>>>>>> + show_types,
>>>>>> // Boolean indicating if we should show the variable types
>>>>>> + show_summary,
>>>>>> // Boolean indicating if we should show a summary for the current type
>>>>>> + verbose,
>>>>>> // Verbose output?
>>>>>> + depth + DEPTH_INCREMENT);
>>>>>> // Scope depth for any types that have children
>>>>>> + }
>>>>>> +
>>>>>> + // Indent the trailing squiggly bracket
>>>>>> + if (element_idx > 0)
>>>>>> + s->Printf("\n%*s}", depth, "");
>>>>>> + }
>>>>>> +
>>>>>> + if (show_summary)
>>>>>> + DumpSummary (type, exe_ctx, s, data, data_byte_offset,
>>>>>> data_byte_size);
>>>>>> }
>>>>>>
>>>>>> bool
>>>>>> @@ -1371,19 +1474,55 @@ void
>>>>>> GoASTContext::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)
>>>>>> {
>>>>>> - assert(false);
>>>>>> + if (type && GoType::KIND_STRING == static_cast<GoType
>>>>>> *>(type)->GetGoKind())
>>>>>> + {
>>>>>> + // TODO(ribrdb): read length and data
>>>>>> + }
>>>>>> }
>>>>>>
>>>>>> void
>>>>>> GoASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type)
>>>>>> {
>>>>>> - assert(false);
>>>>>> -} // Dump to stdout
>>>>>> + // Dump to stdout
>>>>>> + StreamFile s (stdout, false);
>>>>>> + DumpTypeDescription (type, &s);
>>>>>> +}
>>>>>>
>>>>>> void
>>>>>> GoASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type,
>>>>>> Stream *s)
>>>>>> {
>>>>>> - assert(false);
>>>>>> + if (!type)
>>>>>> + return;
>>>>>> + ConstString name = GetTypeName(type);
>>>>>> + GoType *t = static_cast<GoType *>(type);
>>>>>> +
>>>>>> + if (GoStruct *st = t->GetStruct())
>>>>>> + {
>>>>>> + if (GetCompleteType(type))
>>>>>> + {
>>>>>> + if (NULL == strchr(name.AsCString(), '{'))
>>>>>> + s->Printf("type %s ", name.AsCString());
>>>>>> + s->PutCString("struct {");
>>>>>> + if (st->GetNumFields() == 0) {
>>>>>> + s->PutChar('}');
>>>>>> + return;
>>>>>> + }
>>>>>> + s->IndentMore();
>>>>>> + uint32_t field_idx = 0;
>>>>>> + for (auto* field = st->GetField(field_idx); field != nullptr;
>>>>>> field_idx++)
>>>>>> + {
>>>>>> + s->PutChar('\n');
>>>>>> + s->Indent();
>>>>>> + s->Printf("%s %s", field->m_name.AsCString(),
>>>>>> field->m_type.GetTypeName().AsCString());
>>>>>> + }
>>>>>> + s->IndentLess();
>>>>>> + s->PutChar('\n');
>>>>>> + s->Indent("}");
>>>>>> + return;
>>>>>> + }
>>>>>> + }
>>>>>> +
>>>>>> + s->PutCString(name.AsCString());
>>>>>> }
>>>>>>
>>>>>> CompilerType
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> lldb-commits mailing list
>>>>>> lldb-commits at lists.llvm.org
>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> 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