1 //===-- GoASTContext.cpp ----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
14 #include "lldb/Core/DumpDataExtractor.h"
15 #include "lldb/Core/Module.h"
16 #include "lldb/Core/PluginManager.h"
17 #include "lldb/Core/StreamFile.h"
18 #include "lldb/Core/UniqueCStringMap.h"
19 #include "lldb/Core/ValueObject.h"
20 #include "lldb/Symbol/CompilerType.h"
21 #include "lldb/Symbol/GoASTContext.h"
22 #include "lldb/Symbol/ObjectFile.h"
23 #include "lldb/Symbol/SymbolFile.h"
24 #include "lldb/Symbol/Type.h"
25 #include "lldb/Target/ExecutionContext.h"
26 #include "lldb/Target/Target.h"
28 #include "llvm/Support/Threading.h"
30 #include "Plugins/ExpressionParser/Go/GoUserExpression.h"
31 #include "Plugins/SymbolFile/DWARF/DWARFASTParserGo.h"
35 namespace lldb_private {
68 KIND_UNSAFEPOINTER = 26,
69 KIND_LLDB_VOID, // Extension for LLDB, not used by go runtime.
70 KIND_MASK = (1 << 5) - 1,
71 KIND_DIRECT_IFACE = 1 << 5
73 GoType(int kind, const ConstString &name)
74 : m_kind(kind & KIND_MASK), m_name(name) {
75 if (m_kind == KIND_FUNC)
80 int GetGoKind() const { return m_kind; }
81 const ConstString &GetName() const { return m_name; }
82 virtual CompilerType GetElementType() const { return CompilerType(); }
84 bool IsTypedef() const {
96 GoFunction *GetFunction();
97 GoStruct *GetStruct();
102 GoType(const GoType &) = delete;
103 const GoType &operator=(const GoType &) = delete;
106 class GoElem : public GoType {
108 GoElem(int kind, const ConstString &name, const CompilerType &elem)
109 : GoType(kind, name), m_elem(elem) {}
110 virtual CompilerType GetElementType() const { return m_elem; }
113 // TODO: should we store this differently?
116 GoElem(const GoElem &) = delete;
117 const GoElem &operator=(const GoElem &) = delete;
120 class GoArray : public GoElem {
122 GoArray(const ConstString &name, uint64_t length, const CompilerType &elem)
123 : GoElem(KIND_ARRAY, name, elem), m_length(length) {}
125 uint64_t GetLength() const { return m_length; }
129 GoArray(const GoArray &) = delete;
130 const GoArray &operator=(const GoArray &) = delete;
133 class GoFunction : public GoType {
135 GoFunction(const ConstString &name, bool is_variadic)
136 : GoType(KIND_FUNC, name), m_is_variadic(is_variadic) {}
138 bool IsVariadic() const { return m_is_variadic; }
142 GoFunction(const GoFunction &) = delete;
143 const GoFunction &operator=(const GoFunction &) = delete;
146 class GoStruct : public GoType {
149 Field(const ConstString &name, const CompilerType &type, uint64_t offset)
150 : m_name(name), m_type(type), m_byte_offset(offset) {}
153 uint64_t m_byte_offset;
156 GoStruct(int kind, const ConstString &name, int64_t byte_size)
157 : GoType(kind == 0 ? KIND_STRUCT : kind, name), m_is_complete(false),
158 m_byte_size(byte_size) {}
160 uint32_t GetNumFields() const { return m_fields.size(); }
162 const Field *GetField(uint32_t i) const {
163 if (i < m_fields.size())
168 void AddField(const ConstString &name, const CompilerType &type,
170 m_fields.push_back(Field(name, type, offset));
173 bool IsComplete() const { return m_is_complete; }
175 void SetComplete() { m_is_complete = true; }
177 int64_t GetByteSize() const { return m_byte_size; }
182 std::vector<Field> m_fields;
184 GoStruct(const GoStruct &) = delete;
185 const GoStruct &operator=(const GoStruct &) = delete;
188 GoArray *GoType::GetArray() {
189 if (m_kind == KIND_ARRAY) {
190 return static_cast<GoArray *>(this);
195 GoFunction *GoType::GetFunction() {
196 if (m_kind == KIND_FUNC) {
197 return static_cast<GoFunction *>(this);
202 GoStruct *GoType::GetStruct() {
207 return static_cast<GoStruct *>(this);
211 } // namespace lldb_private
212 using namespace lldb_private;
214 GoASTContext::GoASTContext()
215 : TypeSystem(eKindGo), m_pointer_byte_size(0), m_int_byte_size(0),
216 m_types(new TypeMap) {}
217 GoASTContext::~GoASTContext() {}
219 //------------------------------------------------------------------
220 // PluginInterface functions
221 //------------------------------------------------------------------
223 ConstString GoASTContext::GetPluginNameStatic() { return ConstString("go"); }
225 ConstString GoASTContext::GetPluginName() {
226 return GoASTContext::GetPluginNameStatic();
229 uint32_t GoASTContext::GetPluginVersion() { return 1; }
231 lldb::TypeSystemSP GoASTContext::CreateInstance(lldb::LanguageType language,
234 if (language == eLanguageTypeGo) {
236 std::shared_ptr<GoASTContext> go_ast_sp;
238 arch = module->GetArchitecture();
239 go_ast_sp = std::shared_ptr<GoASTContext>(new GoASTContext);
241 arch = target->GetArchitecture();
242 go_ast_sp = std::shared_ptr<GoASTContextForExpr>(
243 new GoASTContextForExpr(target->shared_from_this()));
246 if (arch.IsValid()) {
247 go_ast_sp->SetAddressByteSize(arch.GetAddressByteSize());
251 return lldb::TypeSystemSP();
254 void GoASTContext::EnumerateSupportedLanguages(
255 std::set<lldb::LanguageType> &languages_for_types,
256 std::set<lldb::LanguageType> &languages_for_expressions) {
257 static std::vector<lldb::LanguageType> s_supported_languages_for_types(
258 {lldb::eLanguageTypeGo});
260 static std::vector<lldb::LanguageType> s_supported_languages_for_expressions(
263 languages_for_types.insert(s_supported_languages_for_types.begin(),
264 s_supported_languages_for_types.end());
265 languages_for_expressions.insert(
266 s_supported_languages_for_expressions.begin(),
267 s_supported_languages_for_expressions.end());
270 void GoASTContext::Initialize() {
271 PluginManager::RegisterPlugin(GetPluginNameStatic(), "AST context plug-in",
272 CreateInstance, EnumerateSupportedLanguages);
275 void GoASTContext::Terminate() {
276 PluginManager::UnregisterPlugin(CreateInstance);
279 //----------------------------------------------------------------------
281 //----------------------------------------------------------------------
283 bool GoASTContext::IsArrayType(lldb::opaque_compiler_type_t type,
284 CompilerType *element_type, uint64_t *size,
285 bool *is_incomplete) {
287 element_type->Clear();
291 *is_incomplete = false;
292 GoArray *array = static_cast<GoType *>(type)->GetArray();
295 *size = array->GetLength();
297 *element_type = array->GetElementType();
303 bool GoASTContext::IsVectorType(lldb::opaque_compiler_type_t type,
304 CompilerType *element_type, uint64_t *size) {
306 element_type->Clear();
312 bool GoASTContext::IsAggregateType(lldb::opaque_compiler_type_t type) {
313 int kind = static_cast<GoType *>(type)->GetGoKind();
314 if (kind < GoType::KIND_ARRAY)
316 if (kind == GoType::KIND_PTR)
318 if (kind == GoType::KIND_CHAN)
320 if (kind == GoType::KIND_MAP)
322 if (kind == GoType::KIND_STRING)
324 if (kind == GoType::KIND_UNSAFEPOINTER)
329 bool GoASTContext::IsBeingDefined(lldb::opaque_compiler_type_t type) {
333 bool GoASTContext::IsCharType(lldb::opaque_compiler_type_t type) {
334 // Go's DWARF doesn't distinguish between rune and int32.
338 bool GoASTContext::IsCompleteType(lldb::opaque_compiler_type_t type) {
341 GoType *t = static_cast<GoType *>(type);
342 if (GoStruct *s = t->GetStruct())
343 return s->IsComplete();
344 if (t->IsTypedef() || t->GetGoKind() == GoType::KIND_PTR)
345 return t->GetElementType().IsCompleteType();
349 bool GoASTContext::IsConst(lldb::opaque_compiler_type_t type) { return false; }
351 bool GoASTContext::IsCStringType(lldb::opaque_compiler_type_t type,
356 bool GoASTContext::IsDefined(lldb::opaque_compiler_type_t type) {
357 return type != nullptr;
360 bool GoASTContext::IsFloatingPointType(lldb::opaque_compiler_type_t type,
361 uint32_t &count, bool &is_complex) {
362 int kind = static_cast<GoType *>(type)->GetGoKind();
363 if (kind >= GoType::KIND_FLOAT32 && kind <= GoType::KIND_COMPLEX128) {
364 if (kind >= GoType::KIND_COMPLEX64) {
378 bool GoASTContext::IsFunctionType(lldb::opaque_compiler_type_t type,
379 bool *is_variadic_ptr) {
380 GoFunction *func = static_cast<GoType *>(type)->GetFunction();
383 *is_variadic_ptr = func->IsVariadic();
387 *is_variadic_ptr = false;
391 uint32_t GoASTContext::IsHomogeneousAggregate(lldb::opaque_compiler_type_t type,
392 CompilerType *base_type_ptr) {
397 GoASTContext::GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) {
402 GoASTContext::GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type,
403 const size_t index) {
404 return CompilerType();
407 bool GoASTContext::IsFunctionPointerType(lldb::opaque_compiler_type_t type) {
408 return IsFunctionType(type);
411 bool GoASTContext::IsBlockPointerType(lldb::opaque_compiler_type_t type,
412 CompilerType *function_pointer_type_ptr) {
416 bool GoASTContext::IsIntegerType(lldb::opaque_compiler_type_t type,
419 // TODO: Is bool an integer?
421 int kind = static_cast<GoType *>(type)->GetGoKind();
422 if (kind <= GoType::KIND_UINTPTR) {
423 is_signed = (kind != GoType::KIND_BOOL) & (kind <= GoType::KIND_INT64);
430 bool GoASTContext::IsPolymorphicClass(lldb::opaque_compiler_type_t type) {
434 bool GoASTContext::IsPossibleDynamicType(
435 lldb::opaque_compiler_type_t type,
436 CompilerType *target_type, // Can pass NULL
437 bool check_cplusplus, bool check_objc) {
439 target_type->Clear();
441 return static_cast<GoType *>(type)->GetGoKind() == GoType::KIND_INTERFACE;
445 bool GoASTContext::IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) {
449 bool GoASTContext::IsPointerType(lldb::opaque_compiler_type_t type,
450 CompilerType *pointee_type) {
453 GoType *t = static_cast<GoType *>(type);
455 *pointee_type = t->GetElementType();
457 switch (t->GetGoKind()) {
458 case GoType::KIND_PTR:
459 case GoType::KIND_UNSAFEPOINTER:
460 case GoType::KIND_CHAN:
461 case GoType::KIND_MAP:
462 // TODO: is function a pointer?
469 bool GoASTContext::IsPointerOrReferenceType(lldb::opaque_compiler_type_t type,
470 CompilerType *pointee_type) {
471 return IsPointerType(type, pointee_type);
474 bool GoASTContext::IsReferenceType(lldb::opaque_compiler_type_t type,
475 CompilerType *pointee_type,
480 bool GoASTContext::IsScalarType(lldb::opaque_compiler_type_t type) {
481 return !IsAggregateType(type);
484 bool GoASTContext::IsTypedefType(lldb::opaque_compiler_type_t type) {
486 return static_cast<GoType *>(type)->IsTypedef();
490 bool GoASTContext::IsVoidType(lldb::opaque_compiler_type_t type) {
493 return static_cast<GoType *>(type)->GetGoKind() == GoType::KIND_LLDB_VOID;
496 bool GoASTContext::SupportsLanguage(lldb::LanguageType language) {
497 return language == eLanguageTypeGo;
500 //----------------------------------------------------------------------
502 //----------------------------------------------------------------------
504 bool GoASTContext::GetCompleteType(lldb::opaque_compiler_type_t type) {
507 GoType *t = static_cast<GoType *>(type);
508 if (t->IsTypedef() || t->GetGoKind() == GoType::KIND_PTR || t->GetArray())
509 return t->GetElementType().GetCompleteType();
510 if (GoStruct *s = t->GetStruct()) {
513 CompilerType compiler_type(this, s);
514 SymbolFile *symbols = GetSymbolFile();
515 return symbols && symbols->CompleteType(compiler_type);
520 //----------------------------------------------------------------------
521 // AST related queries
522 //----------------------------------------------------------------------
524 uint32_t GoASTContext::GetPointerByteSize() { return m_pointer_byte_size; }
526 //----------------------------------------------------------------------
528 //----------------------------------------------------------------------
530 ConstString GoASTContext::GetTypeName(lldb::opaque_compiler_type_t type) {
532 return static_cast<GoType *>(type)->GetName();
533 return ConstString();
537 GoASTContext::GetTypeInfo(lldb::opaque_compiler_type_t type,
538 CompilerType *pointee_or_element_compiler_type) {
539 if (pointee_or_element_compiler_type)
540 pointee_or_element_compiler_type->Clear();
543 GoType *t = static_cast<GoType *>(type);
544 if (pointee_or_element_compiler_type)
545 *pointee_or_element_compiler_type = t->GetElementType();
546 int kind = t->GetGoKind();
547 if (kind == GoType::KIND_ARRAY)
548 return eTypeHasChildren | eTypeIsArray;
549 if (kind < GoType::KIND_ARRAY) {
550 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
551 if (kind < GoType::KIND_FLOAT32) {
552 builtin_type_flags |= eTypeIsInteger | eTypeIsScalar;
553 if (kind >= GoType::KIND_INT && kind <= GoType::KIND_INT64)
554 builtin_type_flags |= eTypeIsSigned;
556 builtin_type_flags |= eTypeIsFloat;
557 if (kind < GoType::KIND_COMPLEX64)
558 builtin_type_flags |= eTypeIsComplex;
560 builtin_type_flags |= eTypeIsScalar;
562 return builtin_type_flags;
564 if (kind == GoType::KIND_STRING)
565 return eTypeHasValue | eTypeIsBuiltIn;
566 if (kind == GoType::KIND_FUNC)
567 return eTypeIsFuncPrototype | eTypeHasValue;
568 if (IsPointerType(type))
569 return eTypeIsPointer | eTypeHasValue | eTypeHasChildren;
570 if (kind == GoType::KIND_LLDB_VOID)
572 return eTypeHasChildren | eTypeIsStructUnion;
575 lldb::TypeClass GoASTContext::GetTypeClass(lldb::opaque_compiler_type_t type) {
577 return eTypeClassInvalid;
578 int kind = static_cast<GoType *>(type)->GetGoKind();
579 if (kind == GoType::KIND_FUNC)
580 return eTypeClassFunction;
581 if (IsPointerType(type))
582 return eTypeClassPointer;
583 if (kind < GoType::KIND_COMPLEX64)
584 return eTypeClassBuiltin;
585 if (kind <= GoType::KIND_COMPLEX128)
586 return eTypeClassComplexFloat;
587 if (kind == GoType::KIND_LLDB_VOID)
588 return eTypeClassInvalid;
589 return eTypeClassStruct;
593 GoASTContext::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) {
594 ConstString name = GetTypeName(type);
596 typedef UniqueCStringMap<lldb::BasicType> TypeNameToBasicTypeMap;
597 static TypeNameToBasicTypeMap g_type_map;
598 static llvm::once_flag g_once_flag;
599 llvm::call_once(g_once_flag, []() {
601 g_type_map.Append(ConstString("void"), eBasicTypeVoid);
603 g_type_map.Append(ConstString("int"), eBasicTypeInt);
604 g_type_map.Append(ConstString("uint"), eBasicTypeUnsignedInt);
607 g_type_map.Append(ConstString("bool"), eBasicTypeBool);
609 // Others. Should these map to C types?
610 g_type_map.Append(ConstString("byte"), eBasicTypeOther);
611 g_type_map.Append(ConstString("uint8"), eBasicTypeOther);
612 g_type_map.Append(ConstString("uint16"), eBasicTypeOther);
613 g_type_map.Append(ConstString("uint32"), eBasicTypeOther);
614 g_type_map.Append(ConstString("uint64"), eBasicTypeOther);
615 g_type_map.Append(ConstString("int8"), eBasicTypeOther);
616 g_type_map.Append(ConstString("int16"), eBasicTypeOther);
617 g_type_map.Append(ConstString("int32"), eBasicTypeOther);
618 g_type_map.Append(ConstString("int64"), eBasicTypeOther);
619 g_type_map.Append(ConstString("float32"), eBasicTypeOther);
620 g_type_map.Append(ConstString("float64"), eBasicTypeOther);
621 g_type_map.Append(ConstString("uintptr"), eBasicTypeOther);
626 return g_type_map.Find(name, eBasicTypeInvalid);
628 return eBasicTypeInvalid;
632 GoASTContext::GetMinimumLanguage(lldb::opaque_compiler_type_t type) {
633 return lldb::eLanguageTypeGo;
636 unsigned GoASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type) {
640 //----------------------------------------------------------------------
641 // Creating related types
642 //----------------------------------------------------------------------
645 GoASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type,
647 GoArray *array = static_cast<GoType *>(type)->GetArray();
650 *stride = array->GetElementType().GetByteSize(nullptr);
652 return array->GetElementType();
654 return CompilerType();
657 CompilerType GoASTContext::GetCanonicalType(lldb::opaque_compiler_type_t type) {
658 GoType *t = static_cast<GoType *>(type);
660 return t->GetElementType();
661 return CompilerType(this, type);
665 GoASTContext::GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) {
666 return CompilerType(this, type);
669 // Returns -1 if this isn't a function of if the function doesn't have a
670 // prototype Returns a value >= 0 if there is a prototype.
671 int GoASTContext::GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) {
672 return GetNumberOfFunctionArguments(type);
676 GoASTContext::GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type,
678 return GetFunctionArgumentAtIndex(type, idx);
682 GoASTContext::GetFunctionReturnType(lldb::opaque_compiler_type_t type) {
685 GoType *t = static_cast<GoType *>(type);
686 if (t->GetGoKind() == GoType::KIND_FUNC)
687 result = t->GetElementType();
692 size_t GoASTContext::GetNumMemberFunctions(lldb::opaque_compiler_type_t type) {
696 TypeMemberFunctionImpl
697 GoASTContext::GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type,
699 return TypeMemberFunctionImpl();
703 GoASTContext::GetNonReferenceType(lldb::opaque_compiler_type_t type) {
704 return CompilerType(this, type);
707 CompilerType GoASTContext::GetPointeeType(lldb::opaque_compiler_type_t type) {
709 return CompilerType();
710 return static_cast<GoType *>(type)->GetElementType();
713 CompilerType GoASTContext::GetPointerType(lldb::opaque_compiler_type_t type) {
715 return CompilerType();
716 ConstString type_name = GetTypeName(type);
717 ConstString pointer_name(std::string("*") + type_name.GetCString());
718 GoType *pointer = (*m_types)[pointer_name].get();
719 if (pointer == nullptr) {
721 new GoElem(GoType::KIND_PTR, pointer_name, CompilerType(this, type));
722 (*m_types)[pointer_name].reset(pointer);
724 return CompilerType(this, pointer);
727 // If the current object represents a typedef type, get the underlying type
728 CompilerType GoASTContext::GetTypedefedType(lldb::opaque_compiler_type_t type) {
729 if (IsTypedefType(type))
730 return static_cast<GoType *>(type)->GetElementType();
731 return CompilerType();
734 //----------------------------------------------------------------------
735 // Create related types using the current type's AST
736 //----------------------------------------------------------------------
737 CompilerType GoASTContext::GetBasicTypeFromAST(lldb::BasicType basic_type) {
738 return CompilerType();
742 GoASTContext::GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding,
744 return CompilerType();
747 //----------------------------------------------------------------------
748 // Exploring the type
749 //----------------------------------------------------------------------
751 uint64_t GoASTContext::GetBitSize(lldb::opaque_compiler_type_t type,
752 ExecutionContextScope *exe_scope) {
755 if (!GetCompleteType(type))
757 GoType *t = static_cast<GoType *>(type);
758 GoArray *array = nullptr;
759 switch (t->GetGoKind()) {
760 case GoType::KIND_BOOL:
761 case GoType::KIND_INT8:
762 case GoType::KIND_UINT8:
764 case GoType::KIND_INT16:
765 case GoType::KIND_UINT16:
767 case GoType::KIND_INT32:
768 case GoType::KIND_UINT32:
769 case GoType::KIND_FLOAT32:
771 case GoType::KIND_INT64:
772 case GoType::KIND_UINT64:
773 case GoType::KIND_FLOAT64:
774 case GoType::KIND_COMPLEX64:
776 case GoType::KIND_COMPLEX128:
778 case GoType::KIND_INT:
779 case GoType::KIND_UINT:
780 return m_int_byte_size * 8;
781 case GoType::KIND_UINTPTR:
782 case GoType::KIND_FUNC: // I assume this is a pointer?
783 case GoType::KIND_CHAN:
784 case GoType::KIND_PTR:
785 case GoType::KIND_UNSAFEPOINTER:
786 case GoType::KIND_MAP:
787 return m_pointer_byte_size * 8;
788 case GoType::KIND_ARRAY:
789 array = t->GetArray();
790 return array->GetLength() * array->GetElementType().GetBitSize(exe_scope);
791 case GoType::KIND_INTERFACE:
792 return t->GetElementType().GetBitSize(exe_scope);
793 case GoType::KIND_SLICE:
794 case GoType::KIND_STRING:
795 case GoType::KIND_STRUCT:
796 return t->GetStruct()->GetByteSize() * 8;
803 lldb::Encoding GoASTContext::GetEncoding(lldb::opaque_compiler_type_t type,
807 if (IsIntegerType(type, is_signed))
808 return is_signed ? lldb::eEncodingSint : eEncodingUint;
810 uint32_t complex_count;
811 if (IsFloatingPointType(type, complex_count, is_complex)) {
812 count = complex_count;
813 return eEncodingIEEE754;
815 if (IsPointerType(type))
816 return eEncodingUint;
817 return eEncodingInvalid;
820 lldb::Format GoASTContext::GetFormat(lldb::opaque_compiler_type_t type) {
822 return eFormatDefault;
823 switch (static_cast<GoType *>(type)->GetGoKind()) {
824 case GoType::KIND_BOOL:
825 return eFormatBoolean;
826 case GoType::KIND_INT:
827 case GoType::KIND_INT8:
828 case GoType::KIND_INT16:
829 case GoType::KIND_INT32:
830 case GoType::KIND_INT64:
831 return eFormatDecimal;
832 case GoType::KIND_UINT:
833 case GoType::KIND_UINT8:
834 case GoType::KIND_UINT16:
835 case GoType::KIND_UINT32:
836 case GoType::KIND_UINT64:
837 return eFormatUnsigned;
838 case GoType::KIND_FLOAT32:
839 case GoType::KIND_FLOAT64:
841 case GoType::KIND_COMPLEX64:
842 case GoType::KIND_COMPLEX128:
843 return eFormatComplexFloat;
844 case GoType::KIND_UINTPTR:
845 case GoType::KIND_CHAN:
846 case GoType::KIND_PTR:
847 case GoType::KIND_MAP:
848 case GoType::KIND_UNSAFEPOINTER:
850 case GoType::KIND_STRING:
851 return eFormatCString;
852 case GoType::KIND_ARRAY:
853 case GoType::KIND_INTERFACE:
854 case GoType::KIND_SLICE:
855 case GoType::KIND_STRUCT:
857 // Don't know how to display this.
862 size_t GoASTContext::GetTypeBitAlign(lldb::opaque_compiler_type_t type) {
866 uint32_t GoASTContext::GetNumChildren(lldb::opaque_compiler_type_t type,
867 bool omit_empty_base_classes) {
868 if (!type || !GetCompleteType(type))
870 GoType *t = static_cast<GoType *>(type);
871 if (t->GetGoKind() == GoType::KIND_PTR) {
872 CompilerType elem = t->GetElementType();
873 if (elem.IsAggregateType())
874 return elem.GetNumChildren(omit_empty_base_classes);
876 } else if (GoArray *array = t->GetArray()) {
877 return array->GetLength();
878 } else if (t->IsTypedef()) {
879 return t->GetElementType().GetNumChildren(omit_empty_base_classes);
882 return GetNumFields(type);
885 uint32_t GoASTContext::GetNumFields(lldb::opaque_compiler_type_t type) {
886 if (!type || !GetCompleteType(type))
888 GoType *t = static_cast<GoType *>(type);
890 return t->GetElementType().GetNumFields();
891 GoStruct *s = t->GetStruct();
893 return s->GetNumFields();
897 CompilerType GoASTContext::GetFieldAtIndex(lldb::opaque_compiler_type_t type,
898 size_t idx, std::string &name,
899 uint64_t *bit_offset_ptr,
900 uint32_t *bitfield_bit_size_ptr,
901 bool *is_bitfield_ptr) {
904 if (bitfield_bit_size_ptr)
905 *bitfield_bit_size_ptr = 0;
907 *is_bitfield_ptr = false;
909 if (!type || !GetCompleteType(type))
910 return CompilerType();
912 GoType *t = static_cast<GoType *>(type);
914 return t->GetElementType().GetFieldAtIndex(
915 idx, name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr);
917 GoStruct *s = t->GetStruct();
919 const auto *field = s->GetField(idx);
921 name = field->m_name.GetStringRef();
923 *bit_offset_ptr = field->m_byte_offset * 8;
924 return field->m_type;
927 return CompilerType();
930 CompilerType GoASTContext::GetChildCompilerTypeAtIndex(
931 lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx,
932 bool transparent_pointers, bool omit_empty_base_classes,
933 bool ignore_array_bounds, std::string &child_name,
934 uint32_t &child_byte_size, int32_t &child_byte_offset,
935 uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset,
936 bool &child_is_base_class, bool &child_is_deref_of_parent,
937 ValueObject *valobj, uint64_t &language_flags) {
940 child_byte_offset = 0;
941 child_bitfield_bit_size = 0;
942 child_bitfield_bit_offset = 0;
943 child_is_base_class = false;
944 child_is_deref_of_parent = false;
947 if (!type || !GetCompleteType(type))
948 return CompilerType();
950 GoType *t = static_cast<GoType *>(type);
951 if (t->GetStruct()) {
954 GetFieldAtIndex(type, idx, child_name, &bit_offset, nullptr, nullptr);
955 child_byte_size = ret.GetByteSize(
956 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr);
957 child_byte_offset = bit_offset / 8;
959 } else if (t->GetGoKind() == GoType::KIND_PTR) {
960 CompilerType pointee = t->GetElementType();
961 if (!pointee.IsValid() || pointee.IsVoidType())
962 return CompilerType();
963 if (transparent_pointers && pointee.IsAggregateType()) {
964 bool tmp_child_is_deref_of_parent = false;
965 return pointee.GetChildCompilerTypeAtIndex(
966 exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
967 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
968 child_bitfield_bit_size, child_bitfield_bit_offset,
969 child_is_base_class, tmp_child_is_deref_of_parent, valobj,
972 child_is_deref_of_parent = true;
973 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
975 child_name.assign(1, '*');
976 child_name += parent_name;
979 // We have a pointer to an simple type
980 if (idx == 0 && pointee.GetCompleteType()) {
981 child_byte_size = pointee.GetByteSize(
982 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
983 child_byte_offset = 0;
987 } else if (GoArray *a = t->GetArray()) {
988 if (ignore_array_bounds || idx < a->GetLength()) {
989 CompilerType element_type = a->GetElementType();
990 if (element_type.GetCompleteType()) {
991 char element_name[64];
992 ::snprintf(element_name, sizeof(element_name), "[%zu]", idx);
993 child_name.assign(element_name);
994 child_byte_size = element_type.GetByteSize(
995 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
996 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
1000 } else if (t->IsTypedef()) {
1001 return t->GetElementType().GetChildCompilerTypeAtIndex(
1002 exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
1003 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
1004 child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
1005 child_is_deref_of_parent, valobj, language_flags);
1007 return CompilerType();
1010 // Lookup a child given a name. This function will match base class names and
1011 // member member names in "clang_type" only, not descendants.
1013 GoASTContext::GetIndexOfChildWithName(lldb::opaque_compiler_type_t type,
1015 bool omit_empty_base_classes) {
1016 if (!type || !GetCompleteType(type))
1019 GoType *t = static_cast<GoType *>(type);
1020 GoStruct *s = t->GetStruct();
1022 for (uint32_t i = 0; i < s->GetNumFields(); ++i) {
1023 const GoStruct::Field *f = s->GetField(i);
1024 if (f->m_name.GetStringRef() == name)
1027 } else if (t->GetGoKind() == GoType::KIND_PTR || t->IsTypedef()) {
1028 return t->GetElementType().GetIndexOfChildWithName(name,
1029 omit_empty_base_classes);
1034 // Lookup a child member given a name. This function will match member names
1035 // only and will descend into "clang_type" children in search for the first
1036 // member in this class, or any base class that matches "name".
1037 // TODO: Return all matches for a given name by returning a
1038 // vector<vector<uint32_t>>
1039 // so we catch all names that match a given child name, not just the first.
1040 size_t GoASTContext::GetIndexOfChildMemberWithName(
1041 lldb::opaque_compiler_type_t type, const char *name,
1042 bool omit_empty_base_classes, std::vector<uint32_t> &child_indexes) {
1043 uint32_t index = GetIndexOfChildWithName(type, name, omit_empty_base_classes);
1044 if (index == UINT_MAX)
1046 child_indexes.push_back(index);
1050 // Converts "s" to a floating point value and place resulting floating point
1051 // bytes in the "dst" buffer.
1053 GoASTContext::ConvertStringToFloatValue(lldb::opaque_compiler_type_t type,
1054 const char *s, uint8_t *dst,
1059 //----------------------------------------------------------------------
1061 //----------------------------------------------------------------------
1062 #define DEPTH_INCREMENT 2
1064 void GoASTContext::DumpValue(lldb::opaque_compiler_type_t type,
1065 ExecutionContext *exe_ctx, Stream *s,
1066 lldb::Format format, const DataExtractor &data,
1067 lldb::offset_t data_byte_offset,
1068 size_t data_byte_size, uint32_t bitfield_bit_size,
1069 uint32_t bitfield_bit_offset, bool show_types,
1070 bool show_summary, bool verbose, uint32_t depth) {
1071 if (IsTypedefType(type))
1072 type = GetTypedefedType(type).GetOpaqueQualType();
1075 GoType *t = static_cast<GoType *>(type);
1077 if (GoStruct *st = t->GetStruct()) {
1078 if (GetCompleteType(type)) {
1079 uint32_t field_idx = 0;
1080 for (auto *field = st->GetField(field_idx); field != nullptr;
1082 // Print the starting squiggly bracket (if this is the first member) or
1083 // comma (for member 2 and beyond) for the struct/union/class member.
1090 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
1092 // Print the member type if requested
1094 ConstString field_type_name = field->m_type.GetTypeName();
1095 s->Printf("(%s) ", field_type_name.AsCString());
1097 // Print the member name and equal sign
1098 s->Printf("%s = ", field->m_name.AsCString());
1100 // Dump the value of the member
1101 CompilerType field_type = field->m_type;
1102 field_type.DumpValue(
1104 s, // Stream to dump to
1106 .GetFormat(), // The format with which to display the member
1107 data, // Data buffer containing all bytes for this type
1108 data_byte_offset + field->m_byte_offset, // Offset into "data" where
1109 // to grab value from
1110 field->m_type.GetByteSize(
1111 exe_ctx->GetBestExecutionContextScope()), // Size of this type
1113 0, // Bitfield bit size
1114 0, // Bitfield bit offset
1115 show_types, // Boolean indicating if we should show the variable
1117 show_summary, // Boolean indicating if we should show a summary for
1119 verbose, // Verbose output?
1120 depth + DEPTH_INCREMENT); // Scope depth for any types that have
1124 // Indent the trailing squiggly bracket
1126 s->Printf("\n%*s}", depth, "");
1130 if (GoArray *a = t->GetArray()) {
1131 CompilerType element_clang_type = a->GetElementType();
1132 lldb::Format element_format = element_clang_type.GetFormat();
1133 uint32_t element_byte_size =
1134 element_clang_type.GetByteSize(exe_ctx->GetBestExecutionContextScope());
1136 uint64_t element_idx;
1137 for (element_idx = 0; element_idx < a->GetLength(); ++element_idx) {
1138 // Print the starting squiggly bracket (if this is the first member) or
1139 // comman (for member 2 and beyong) for the struct/union/class member.
1140 if (element_idx == 0)
1145 // Indent and print the index
1146 s->Printf("\n%*s[%" PRIu64 "] ", depth + DEPTH_INCREMENT, "",
1149 // Figure out the field offset within the current struct/union/class type
1150 uint64_t element_offset = element_idx * element_byte_size;
1152 // Dump the value of the member
1153 element_clang_type.DumpValue(
1155 s, // Stream to dump to
1156 element_format, // The format with which to display the element
1157 data, // Data buffer containing all bytes for this type
1159 element_offset, // Offset into "data" where to grab value from
1160 element_byte_size, // Size of this type in bytes
1161 0, // Bitfield bit size
1162 0, // Bitfield bit offset
1163 show_types, // Boolean indicating if we should show the variable types
1164 show_summary, // Boolean indicating if we should show a summary for
1166 verbose, // Verbose output?
1168 DEPTH_INCREMENT); // Scope depth for any types that have children
1171 // Indent the trailing squiggly bracket
1172 if (element_idx > 0)
1173 s->Printf("\n%*s}", depth, "");
1177 DumpSummary(type, exe_ctx, s, data, data_byte_offset, data_byte_size);
1180 bool GoASTContext::DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s,
1181 lldb::Format format, const DataExtractor &data,
1182 lldb::offset_t byte_offset, size_t byte_size,
1183 uint32_t bitfield_bit_size,
1184 uint32_t bitfield_bit_offset,
1185 ExecutionContextScope *exe_scope) {
1188 if (IsAggregateType(type)) {
1191 GoType *t = static_cast<GoType *>(type);
1192 if (t->IsTypedef()) {
1193 CompilerType typedef_compiler_type = t->GetElementType();
1194 if (format == eFormatDefault)
1195 format = typedef_compiler_type.GetFormat();
1196 uint64_t typedef_byte_size = typedef_compiler_type.GetByteSize(exe_scope);
1198 return typedef_compiler_type.DumpTypeValue(
1200 format, // The format with which to display the element
1201 data, // Data buffer containing all bytes for this type
1202 byte_offset, // Offset into "data" where to grab value from
1203 typedef_byte_size, // Size of this type in bytes
1204 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't
1205 // treat as a bitfield
1206 bitfield_bit_offset, // Offset in bits of a bitfield value if
1207 // bitfield_bit_size != 0
1211 uint32_t item_count = 1;
1212 // A few formats, we might need to modify our size and count for depending
1213 // on how we are trying to display the value...
1216 case eFormatBoolean:
1218 case eFormatComplex:
1219 case eFormatCString: // NULL terminated C strings
1220 case eFormatDecimal:
1223 case eFormatHexUppercase:
1227 case eFormatUnsigned:
1228 case eFormatPointer:
1229 case eFormatVectorOfChar:
1230 case eFormatVectorOfSInt8:
1231 case eFormatVectorOfUInt8:
1232 case eFormatVectorOfSInt16:
1233 case eFormatVectorOfUInt16:
1234 case eFormatVectorOfSInt32:
1235 case eFormatVectorOfUInt32:
1236 case eFormatVectorOfSInt64:
1237 case eFormatVectorOfUInt64:
1238 case eFormatVectorOfFloat32:
1239 case eFormatVectorOfFloat64:
1240 case eFormatVectorOfUInt128:
1244 case eFormatCharPrintable:
1245 case eFormatCharArray:
1247 case eFormatBytesWithASCII:
1248 item_count = byte_size;
1252 case eFormatUnicode16:
1253 item_count = byte_size / 2;
1257 case eFormatUnicode32:
1258 item_count = byte_size / 4;
1262 return DumpDataExtractor(data, s, byte_offset, format, byte_size,
1263 item_count, UINT32_MAX, LLDB_INVALID_ADDRESS,
1264 bitfield_bit_size, bitfield_bit_offset, exe_scope);
1269 void GoASTContext::DumpSummary(lldb::opaque_compiler_type_t type,
1270 ExecutionContext *exe_ctx, Stream *s,
1271 const DataExtractor &data,
1272 lldb::offset_t data_offset,
1273 size_t data_byte_size) {
1274 if (type && GoType::KIND_STRING == static_cast<GoType *>(type)->GetGoKind()) {
1275 // TODO(ribrdb): read length and data
1279 void GoASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type) {
1281 StreamFile s(stdout, false);
1282 DumpTypeDescription(type, &s);
1285 void GoASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type,
1289 ConstString name = GetTypeName(type);
1290 GoType *t = static_cast<GoType *>(type);
1292 if (GoStruct *st = t->GetStruct()) {
1293 if (GetCompleteType(type)) {
1294 if (NULL == strchr(name.AsCString(), '{'))
1295 s->Printf("type %s ", name.AsCString());
1296 s->PutCString("struct {");
1297 if (st->GetNumFields() == 0) {
1302 uint32_t field_idx = 0;
1303 for (auto *field = st->GetField(field_idx); field != nullptr;
1307 s->Printf("%s %s", field->m_name.AsCString(),
1308 field->m_type.GetTypeName().AsCString());
1317 s->PutCString(name.AsCString());
1320 CompilerType GoASTContext::CreateArrayType(const ConstString &name,
1321 const CompilerType &element_type,
1323 GoType *type = new GoArray(name, length, element_type);
1324 (*m_types)[name].reset(type);
1325 return CompilerType(this, type);
1328 CompilerType GoASTContext::CreateBaseType(int go_kind,
1329 const lldb_private::ConstString &name,
1330 uint64_t byte_size) {
1331 if (go_kind == GoType::KIND_UINT || go_kind == GoType::KIND_INT)
1332 m_int_byte_size = byte_size;
1333 GoType *type = new GoType(go_kind, name);
1334 (*m_types)[name].reset(type);
1335 return CompilerType(this, type);
1338 CompilerType GoASTContext::CreateTypedefType(int kind, const ConstString &name,
1339 CompilerType impl) {
1340 GoType *type = new GoElem(kind, name, impl);
1341 (*m_types)[name].reset(type);
1342 return CompilerType(this, type);
1346 GoASTContext::CreateVoidType(const lldb_private::ConstString &name) {
1347 GoType *type = new GoType(GoType::KIND_LLDB_VOID, name);
1348 (*m_types)[name].reset(type);
1349 return CompilerType(this, type);
1353 GoASTContext::CreateStructType(int kind, const lldb_private::ConstString &name,
1354 uint32_t byte_size) {
1355 GoType *type = new GoStruct(kind, name, byte_size);
1356 (*m_types)[name].reset(type);
1357 return CompilerType(this, type);
1360 void GoASTContext::AddFieldToStruct(
1361 const lldb_private::CompilerType &struct_type,
1362 const lldb_private::ConstString &name,
1363 const lldb_private::CompilerType &field_type, uint32_t byte_offset) {
1367 llvm::dyn_cast_or_null<GoASTContext>(struct_type.GetTypeSystem());
1370 GoType *type = static_cast<GoType *>(struct_type.GetOpaqueQualType());
1371 if (GoStruct *s = type->GetStruct())
1372 s->AddField(name, field_type, byte_offset);
1375 void GoASTContext::CompleteStructType(
1376 const lldb_private::CompilerType &struct_type) {
1380 llvm::dyn_cast_or_null<GoASTContext>(struct_type.GetTypeSystem());
1383 GoType *type = static_cast<GoType *>(struct_type.GetOpaqueQualType());
1384 if (GoStruct *s = type->GetStruct())
1389 GoASTContext::CreateFunctionType(const lldb_private::ConstString &name,
1390 CompilerType *params, size_t params_count,
1392 GoType *type = new GoFunction(name, is_variadic);
1393 (*m_types)[name].reset(type);
1394 return CompilerType(this, type);
1397 bool GoASTContext::IsGoString(const lldb_private::CompilerType &type) {
1398 if (!type.IsValid() ||
1399 !llvm::dyn_cast_or_null<GoASTContext>(type.GetTypeSystem()))
1401 return GoType::KIND_STRING ==
1402 static_cast<GoType *>(type.GetOpaqueQualType())->GetGoKind();
1405 bool GoASTContext::IsGoSlice(const lldb_private::CompilerType &type) {
1406 if (!type.IsValid() ||
1407 !llvm::dyn_cast_or_null<GoASTContext>(type.GetTypeSystem()))
1409 return GoType::KIND_SLICE ==
1410 static_cast<GoType *>(type.GetOpaqueQualType())->GetGoKind();
1413 bool GoASTContext::IsGoInterface(const lldb_private::CompilerType &type) {
1414 if (!type.IsValid() ||
1415 !llvm::dyn_cast_or_null<GoASTContext>(type.GetTypeSystem()))
1417 return GoType::KIND_INTERFACE ==
1418 static_cast<GoType *>(type.GetOpaqueQualType())->GetGoKind();
1421 bool GoASTContext::IsPointerKind(uint8_t kind) {
1422 return (kind & GoType::KIND_MASK) == GoType::KIND_PTR;
1425 bool GoASTContext::IsDirectIface(uint8_t kind) {
1426 return (kind & GoType::KIND_DIRECT_IFACE) == GoType::KIND_DIRECT_IFACE;
1429 DWARFASTParser *GoASTContext::GetDWARFParser() {
1430 if (!m_dwarf_ast_parser_ap)
1431 m_dwarf_ast_parser_ap.reset(new DWARFASTParserGo(*this));
1432 return m_dwarf_ast_parser_ap.get();
1435 UserExpression *GoASTContextForExpr::GetUserExpression(
1436 llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language,
1437 Expression::ResultType desired_type,
1438 const EvaluateExpressionOptions &options) {
1439 TargetSP target = m_target_wp.lock();
1441 return new GoUserExpression(*target, expr, prefix, language, desired_type,