[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