diff options
-rw-r--r-- | lldb/include/lldb/API/SBType.h | 9 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/ClangASTContext.h | 24 | ||||
-rw-r--r-- | lldb/include/lldb/lldb-enumerations.h | 13 | ||||
-rw-r--r-- | lldb/scripts/Python/interface/SBType.i | 9 | ||||
-rw-r--r-- | lldb/source/API/SBType.cpp | 45 | ||||
-rw-r--r-- | lldb/source/Interpreter/ScriptInterpreterPython.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Symbol/ClangASTContext.cpp | 105 |
7 files changed, 205 insertions, 2 deletions
diff --git a/lldb/include/lldb/API/SBType.h b/lldb/include/lldb/API/SBType.h index b668fa39192..b4ee97b2ca4 100644 --- a/lldb/include/lldb/API/SBType.h +++ b/lldb/include/lldb/API/SBType.h @@ -124,6 +124,15 @@ public: lldb::SBTypeMember GetVirtualBaseClassAtIndex (uint32_t idx); + uint32_t + GetNumberOfTemplateArguments (); + + lldb::SBType + GetTemplateArgumentType (uint32_t idx); + + lldb::TemplateArgumentKind + GetTemplateArgumentKind (uint32_t idx); + const char* GetName(); diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h index 53cdb591bec..01740f0c79b 100644 --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -593,6 +593,30 @@ public: bool omit_empty_base_classes, std::vector<uint32_t>& child_indexes); + size_t + GetNumTemplateArguments (lldb::clang_type_t clang_type) + { + return GetNumTemplateArguments(getASTContext(), clang_type); + } + + lldb::clang_type_t + GetTemplateArgument (lldb::clang_type_t clang_type, + size_t idx, + lldb::TemplateArgumentKind &kind) + { + return GetTemplateArgument(getASTContext(), clang_type, idx, kind); + } + + static size_t + GetNumTemplateArguments (clang::ASTContext *ast, + lldb::clang_type_t clang_type); + + static lldb::clang_type_t + GetTemplateArgument (clang::ASTContext *ast, + lldb::clang_type_t clang_type, + size_t idx, + lldb::TemplateArgumentKind &kind); + //------------------------------------------------------------------ // clang::TagType //------------------------------------------------------------------ diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h index 67eb770e994..4f3cf6a9937 100644 --- a/lldb/include/lldb/lldb-enumerations.h +++ b/lldb/include/lldb/lldb-enumerations.h @@ -577,6 +577,19 @@ namespace lldb { eTypeClassAny = (0xffffffffu) }TypeClass; + typedef enum TemplateArgumentKind + { + eTemplateArgumentKindNull = 0, + eTemplateArgumentKindType, + eTemplateArgumentKindDeclaration, + eTemplateArgumentKindIntegral, + eTemplateArgumentKindTemplate, + eTemplateArgumentKindTemplateExpansion, + eTemplateArgumentKindExpression, + eTemplateArgumentKindPack + + } TemplateArgumentKind; + } // namespace lldb diff --git a/lldb/scripts/Python/interface/SBType.i b/lldb/scripts/Python/interface/SBType.i index 64a957486c5..1b0f63b2ca9 100644 --- a/lldb/scripts/Python/interface/SBType.i +++ b/lldb/scripts/Python/interface/SBType.i @@ -191,6 +191,15 @@ public: lldb::TypeClass GetTypeClass (); + uint32_t + GetNumberOfTemplateArguments (); + + lldb::SBType + GetTemplateArgumentType (uint32_t idx); + + lldb::TemplateArgumentKind + GetTemplateArgumentKind (uint32_t idx); + %pythoncode %{ __swig_getmethods__["name"] = GetName if _newclass: x = property(GetName, None) diff --git a/lldb/source/API/SBType.cpp b/lldb/source/API/SBType.cpp index 63c6c0a46cf..e4343fd2cce 100644 --- a/lldb/source/API/SBType.cpp +++ b/lldb/source/API/SBType.cpp @@ -437,6 +437,50 @@ SBType::GetTypeClass () return lldb::eTypeClassInvalid; } +uint32_t +SBType::GetNumberOfTemplateArguments () +{ + if (IsValid()) + { + return ClangASTContext::GetNumTemplateArguments (m_opaque_sp->GetASTContext(), + m_opaque_sp->GetOpaqueQualType()); + } + return 0; +} + +lldb::SBType +SBType::GetTemplateArgumentType (uint32_t idx) +{ + if (IsValid()) + { + TemplateArgumentKind kind = eTemplateArgumentKindNull; + return SBType(ClangASTType(m_opaque_sp->GetASTContext(), + ClangASTContext::GetTemplateArgument(m_opaque_sp->GetASTContext(), + m_opaque_sp->GetOpaqueQualType(), + idx, + kind))); + } + return SBType(); +} + + +lldb::TemplateArgumentKind +SBType::GetTemplateArgumentKind (uint32_t idx) +{ + TemplateArgumentKind kind = eTemplateArgumentKindNull; + if (IsValid()) + { + ClangASTContext::GetTemplateArgument(m_opaque_sp->GetASTContext(), + m_opaque_sp->GetOpaqueQualType(), + idx, + kind); + } + return kind; +} + + + + SBTypeList::SBTypeList() : m_opaque_ap(new TypeListImpl()) { @@ -622,4 +666,3 @@ SBTypeMember::ref () const { return *m_opaque_ap.get(); } - diff --git a/lldb/source/Interpreter/ScriptInterpreterPython.cpp b/lldb/source/Interpreter/ScriptInterpreterPython.cpp index 15e66610ef1..d2d355cac41 100644 --- a/lldb/source/Interpreter/ScriptInterpreterPython.cpp +++ b/lldb/source/Interpreter/ScriptInterpreterPython.cpp @@ -326,7 +326,7 @@ ScriptInterpreterPython::EnterSession () // embedded we don't know we should be feeding input to the embedded // interpreter or to the python sys.stdin. We also don't want to let python // play with the real stdin from this process, so we need to close it... - run_string.PutCString ("; sys.stdin.close()"); + //run_string.PutCString ("; sys.stdin.close()"); run_string.PutCString ("')"); PyRun_SimpleString (run_string.GetData()); diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index d07df717992..0449902a193 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -2499,6 +2499,111 @@ ClangASTContext::AddMethodToObjCObjectType return objc_method_decl; } +size_t +ClangASTContext::GetNumTemplateArguments (clang::ASTContext *ast, clang_type_t clang_type) +{ + if (clang_type) + { + QualType qual_type (QualType::getFromOpaquePtr(clang_type)); + + const clang::Type::TypeClass type_class = qual_type->getTypeClass(); + switch (type_class) + { + case clang::Type::Record: + if (GetCompleteQualType (ast, qual_type)) + { + const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); + if (cxx_record_decl) + { + const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl); + if (template_decl) + return template_decl->getTemplateArgs().size(); + } + } + break; + + case clang::Type::Typedef: + return ClangASTContext::GetNumTemplateArguments (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); + default: + break; + } + } + return 0; +} + +clang_type_t +ClangASTContext::GetTemplateArgument (clang::ASTContext *ast, clang_type_t clang_type, size_t arg_idx, lldb::TemplateArgumentKind &kind) +{ + if (clang_type) + { + QualType qual_type (QualType::getFromOpaquePtr(clang_type)); + + const clang::Type::TypeClass type_class = qual_type->getTypeClass(); + switch (type_class) + { + case clang::Type::Record: + if (GetCompleteQualType (ast, qual_type)) + { + const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); + if (cxx_record_decl) + { + const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl); + if (template_decl && arg_idx < template_decl->getTemplateArgs().size()) + { + const TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx]; + switch (template_arg.getKind()) + { + case clang::TemplateArgument::Null: + kind = eTemplateArgumentKindNull; + return NULL; + + case clang::TemplateArgument::Type: + kind = eTemplateArgumentKindType; + return template_arg.getAsType().getAsOpaquePtr(); + + case clang::TemplateArgument::Declaration: + kind = eTemplateArgumentKindDeclaration; + return NULL; + + case clang::TemplateArgument::Integral: + kind = eTemplateArgumentKindIntegral; + return template_arg.getIntegralType().getAsOpaquePtr(); + + case clang::TemplateArgument::Template: + kind = eTemplateArgumentKindTemplate; + return NULL; + + case clang::TemplateArgument::TemplateExpansion: + kind = eTemplateArgumentKindTemplateExpansion; + return NULL; + + case clang::TemplateArgument::Expression: + kind = eTemplateArgumentKindExpression; + return NULL; + + case clang::TemplateArgument::Pack: + kind = eTemplateArgumentKindPack; + return NULL; + + default: + assert (!"Unhandled TemplateArgument::ArgKind"); + kind = eTemplateArgumentKindNull; + return NULL; + } + } + } + } + break; + + case clang::Type::Typedef: + return ClangASTContext::GetTemplateArgument (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), arg_idx, kind); + default: + break; + } + } + kind = eTemplateArgumentKindNull; + return NULL; +} uint32_t ClangASTContext::GetTypeInfo |