[Lldb-commits] [lldb] r257926 - Implement missing GoASTContext methods
Ryan Brown via lldb-commits
lldb-commits at lists.llvm.org
Fri Jan 15 11:43:33 PST 2016
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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160115/6f4ff4e1/attachment.html>
More information about the lldb-commits
mailing list