//===-- GoASTContext.h ------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_GoASTContext_h_ #define liblldb_GoASTContext_h_ // C Includes // C++ Includes #include #include #include #include #include // Other libraries and framework includes // Project includes #include "lldb/Symbol/CompilerType.h" #include "lldb/Symbol/TypeSystem.h" #include "lldb/Utility/ConstString.h" namespace lldb_private { class Declaration; class GoType; class GoASTContext : public TypeSystem { public: GoASTContext(); ~GoASTContext() override; //------------------------------------------------------------------ // PluginInterface functions //------------------------------------------------------------------ ConstString GetPluginName() override; uint32_t GetPluginVersion() override; static ConstString GetPluginNameStatic(); static lldb::TypeSystemSP CreateInstance(lldb::LanguageType language, Module *module, Target *target); static void EnumerateSupportedLanguages( std::set &languages_for_types, std::set &languages_for_expressions); static void Initialize(); static void Terminate(); DWARFASTParser *GetDWARFParser() override; void SetAddressByteSize(int byte_size) { m_pointer_byte_size = byte_size; } //------------------------------------------------------------------ // llvm casting support //------------------------------------------------------------------ static bool classof(const TypeSystem *ts) { return ts->getKind() == TypeSystem::eKindGo; } //---------------------------------------------------------------------- // CompilerDecl functions //---------------------------------------------------------------------- ConstString DeclGetName(void *opaque_decl) override { return ConstString(); } //---------------------------------------------------------------------- // CompilerDeclContext functions //---------------------------------------------------------------------- bool DeclContextIsStructUnionOrClass(void *opaque_decl_ctx) override { return false; } ConstString DeclContextGetName(void *opaque_decl_ctx) override { return ConstString(); } ConstString DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override { return ConstString(); } bool DeclContextIsClassMethod(void *opaque_decl_ctx, lldb::LanguageType *language_ptr, bool *is_instance_method_ptr, ConstString *language_object_name_ptr) override { return false; } //---------------------------------------------------------------------- // Creating Types //---------------------------------------------------------------------- CompilerType CreateArrayType(const ConstString &name, const CompilerType &element_type, uint64_t length); CompilerType CreateBaseType(int go_kind, const ConstString &type_name_const_str, uint64_t byte_size); // For interface, map, chan. CompilerType CreateTypedefType(int kind, const ConstString &name, CompilerType impl); CompilerType CreateVoidType(const ConstString &name); CompilerType CreateFunctionType(const lldb_private::ConstString &name, CompilerType *params, size_t params_count, bool is_variadic); CompilerType CreateStructType(int kind, const ConstString &name, uint32_t byte_size); void CompleteStructType(const CompilerType &type); void AddFieldToStruct(const CompilerType &struct_type, const ConstString &name, const CompilerType &field_type, uint32_t byte_offset); //---------------------------------------------------------------------- // Tests //---------------------------------------------------------------------- static bool IsGoString(const CompilerType &type); static bool IsGoSlice(const CompilerType &type); static bool IsGoInterface(const CompilerType &type); static bool IsDirectIface(uint8_t kind); static bool IsPointerKind(uint8_t kind); bool IsArrayType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size, bool *is_incomplete) override; bool IsAggregateType(lldb::opaque_compiler_type_t type) override; bool IsCharType(lldb::opaque_compiler_type_t type) override; bool IsCompleteType(lldb::opaque_compiler_type_t type) override; bool IsDefined(lldb::opaque_compiler_type_t type) override; bool IsFloatingPointType(lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex) override; bool IsFunctionType(lldb::opaque_compiler_type_t type, bool *is_variadic_ptr = nullptr) override; size_t GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) override; CompilerType GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, const size_t index) override; bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override; bool IsBlockPointerType(lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) override; bool IsIntegerType(lldb::opaque_compiler_type_t type, bool &is_signed) override; bool IsPossibleDynamicType(lldb::opaque_compiler_type_t type, CompilerType *target_type, // Can pass nullptr bool check_cplusplus, bool check_objc) override; bool IsPointerType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type = nullptr) override; bool IsScalarType(lldb::opaque_compiler_type_t type) override; bool IsVoidType(lldb::opaque_compiler_type_t type) override; bool SupportsLanguage(lldb::LanguageType language) override; //---------------------------------------------------------------------- // Type Completion //---------------------------------------------------------------------- bool GetCompleteType(lldb::opaque_compiler_type_t type) override; //---------------------------------------------------------------------- // AST related queries //---------------------------------------------------------------------- uint32_t GetPointerByteSize() override; //---------------------------------------------------------------------- // Accessors //---------------------------------------------------------------------- ConstString GetTypeName(lldb::opaque_compiler_type_t type) override; uint32_t GetTypeInfo( lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_compiler_type = nullptr) override; lldb::LanguageType GetMinimumLanguage(lldb::opaque_compiler_type_t type) override; lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override; //---------------------------------------------------------------------- // Creating related types //---------------------------------------------------------------------- CompilerType GetArrayElementType(lldb::opaque_compiler_type_t type, uint64_t *stride = nullptr) override; CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) override; // Returns -1 if this isn't a function of if the function doesn't have a // prototype // Returns a value >= 0 if there is a prototype. int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override; CompilerType GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override; CompilerType GetFunctionReturnType(lldb::opaque_compiler_type_t type) override; size_t GetNumMemberFunctions(lldb::opaque_compiler_type_t type) override; TypeMemberFunctionImpl GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type, size_t idx) override; CompilerType GetPointeeType(lldb::opaque_compiler_type_t type) override; CompilerType GetPointerType(lldb::opaque_compiler_type_t type) override; //---------------------------------------------------------------------- // Exploring the type //---------------------------------------------------------------------- uint64_t GetBitSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) override; lldb::Encoding GetEncoding(lldb::opaque_compiler_type_t type, uint64_t &count) override; lldb::Format GetFormat(lldb::opaque_compiler_type_t type) override; uint32_t GetNumChildren(lldb::opaque_compiler_type_t type, bool omit_empty_base_classes) override; lldb::BasicType GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) override; CompilerType GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, size_t bit_size) override; uint32_t GetNumFields(lldb::opaque_compiler_type_t type) override; CompilerType GetFieldAtIndex(lldb::opaque_compiler_type_t type, size_t idx, std::string &name, uint64_t *bit_offset_ptr, uint32_t *bitfield_bit_size_ptr, bool *is_bitfield_ptr) override; uint32_t GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) override { return 0; } uint32_t GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) override { return 0; } CompilerType GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override { return CompilerType(); } CompilerType GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr) override { return CompilerType(); } CompilerType GetChildCompilerTypeAtIndex( lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx, bool transparent_pointers, bool omit_empty_base_classes, bool ignore_array_bounds, std::string &child_name, uint32_t &child_byte_size, int32_t &child_byte_offset, uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, bool &child_is_base_class, bool &child_is_deref_of_parent, ValueObject *valobj, uint64_t &language_flags) override; // Lookup a child given a name. This function will match base class names // and member member names in "clang_type" only, not descendants. uint32_t GetIndexOfChildWithName(lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes) override; // Lookup a child member given a name. This function will match member names // only and will descend into "clang_type" children in search for the first // member in this class, or any base class that matches "name". // TODO: Return all matches for a given name by returning a // vector> // so we catch all names that match a given child name, not just the first. size_t GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes, std::vector &child_indexes) override; size_t GetNumTemplateArguments(lldb::opaque_compiler_type_t type) override { return 0; } //---------------------------------------------------------------------- // Dumping types //---------------------------------------------------------------------- void 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, uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, bool show_types, bool show_summary, bool verbose, uint32_t depth) override; bool DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s, lldb::Format format, const DataExtractor &data, lldb::offset_t data_offset, size_t data_byte_size, uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, ExecutionContextScope *exe_scope) override; void DumpTypeDescription( lldb::opaque_compiler_type_t type) override; // Dump to stdout void DumpTypeDescription(lldb::opaque_compiler_type_t type, Stream *s) override; //---------------------------------------------------------------------- // TODO: These methods appear unused. Should they be removed? //---------------------------------------------------------------------- bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) override; void 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) override; // Converts "s" to a floating point value and place resulting floating // point bytes in the "dst" buffer. size_t ConvertStringToFloatValue(lldb::opaque_compiler_type_t type, const char *s, uint8_t *dst, size_t dst_size) override; //---------------------------------------------------------------------- // TODO: Determine if these methods should move to ClangASTContext. //---------------------------------------------------------------------- bool IsPointerOrReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type = nullptr) override; unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override; bool IsCStringType(lldb::opaque_compiler_type_t type, uint32_t &length) override; size_t GetTypeBitAlign(lldb::opaque_compiler_type_t type) override; CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) override; bool IsBeingDefined(lldb::opaque_compiler_type_t type) override; bool IsConst(lldb::opaque_compiler_type_t type) override; uint32_t IsHomogeneousAggregate(lldb::opaque_compiler_type_t type, CompilerType *base_type_ptr) override; bool IsPolymorphicClass(lldb::opaque_compiler_type_t type) override; bool IsTypedefType(lldb::opaque_compiler_type_t type) override; // If the current object represents a typedef type, get the underlying type CompilerType GetTypedefedType(lldb::opaque_compiler_type_t type) override; bool IsVectorType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size) override; CompilerType GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override; CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override; bool IsReferenceType(lldb::opaque_compiler_type_t type, CompilerType *pointee_type = nullptr, bool *is_rvalue = nullptr) override; private: typedef std::map> TypeMap; int m_pointer_byte_size; int m_int_byte_size; std::unique_ptr m_types; std::unique_ptr m_dwarf_ast_parser_ap; GoASTContext(const GoASTContext &) = delete; const GoASTContext &operator=(const GoASTContext &) = delete; }; class GoASTContextForExpr : public GoASTContext { public: GoASTContextForExpr(lldb::TargetSP target) : m_target_wp(target) {} UserExpression * GetUserExpression(llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language, Expression::ResultType desired_type, const EvaluateExpressionOptions &options) override; private: lldb::TargetWP m_target_wp; }; } #endif // liblldb_GoASTContext_h_