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