mirror of
https://github.com/intel/llvm.git
synced 2026-01-22 07:01:03 +08:00
403 lines
16 KiB
C++
403 lines
16 KiB
C++
//===-- 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 <map>
|
|
#include <memory>
|
|
#include <set>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
// Other libraries and framework includes
|
|
// Project includes
|
|
#include "lldb/Core/ConstString.h"
|
|
#include "lldb/Symbol/TypeSystem.h"
|
|
#include "lldb/Symbol/CompilerType.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<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &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();
|
|
}
|
|
|
|
lldb::VariableSP
|
|
DeclGetVariable (void *opaque_decl) override
|
|
{
|
|
return lldb::VariableSP();
|
|
}
|
|
|
|
void
|
|
DeclLinkToObject (void *opaque_decl, std::shared_ptr<void> object) override
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// CompilerDeclContext functions
|
|
//----------------------------------------------------------------------
|
|
|
|
bool
|
|
DeclContextIsStructUnionOrClass(void *opaque_decl_ctx) override
|
|
{
|
|
return false;
|
|
}
|
|
|
|
ConstString
|
|
DeclContextGetName(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 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<vector<uint32_t>>
|
|
// 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<uint32_t> &child_indexes) override;
|
|
|
|
size_t
|
|
GetNumTemplateArguments(lldb::opaque_compiler_type_t type) override
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
CompilerType
|
|
GetTemplateArgument(lldb::opaque_compiler_type_t type, size_t idx, lldb::TemplateArgumentKind &kind) override
|
|
{
|
|
return CompilerType();
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// 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<ConstString, std::unique_ptr<GoType>> TypeMap;
|
|
int m_pointer_byte_size;
|
|
int m_int_byte_size;
|
|
std::unique_ptr<TypeMap> m_types;
|
|
std::unique_ptr<DWARFASTParser> 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(const char *expr, const char *expr_prefix, lldb::LanguageType language,
|
|
Expression::ResultType desired_type,
|
|
const EvaluateExpressionOptions &options) override;
|
|
|
|
private:
|
|
lldb::TargetWP m_target_wp;
|
|
};
|
|
}
|
|
#endif // liblldb_GoASTContext_h_
|