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@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits >
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits