[Lldb-commits] [lldb] r252622 - Fixed TypeMemberFunctionImpl to not use clang types directly but use the new CompilerDecl class to do the job in an abstract way.

Greg Clayton via lldb-commits lldb-commits at lists.llvm.org
Tue Nov 10 09:47:05 PST 2015


Author: gclayton
Date: Tue Nov 10 11:47:04 2015
New Revision: 252622

URL: http://llvm.org/viewvc/llvm-project?rev=252622&view=rev
Log:
Fixed TypeMemberFunctionImpl to not use clang types directly but use the new CompilerDecl class to do the job in an abstract way.
Fixed a crash that would happen if you tried to get the name of a constructor or destructor by calling "getDeclName()" instead of calling getName() (which would assert and crash).

Added the ability to get function arguments names from SBFunction.


Modified:
    lldb/trunk/include/lldb/API/SBFunction.h
    lldb/trunk/include/lldb/API/SBType.h
    lldb/trunk/include/lldb/Symbol/ClangASTContext.h
    lldb/trunk/include/lldb/Symbol/CompilerDecl.h
    lldb/trunk/include/lldb/Symbol/Type.h
    lldb/trunk/include/lldb/Symbol/TypeSystem.h
    lldb/trunk/scripts/Python/python-extensions.swig
    lldb/trunk/scripts/interface/SBFunction.i
    lldb/trunk/scripts/interface/SBType.i
    lldb/trunk/source/API/SBFunction.cpp
    lldb/trunk/source/API/SBType.cpp
    lldb/trunk/source/Symbol/ClangASTContext.cpp
    lldb/trunk/source/Symbol/CompilerDecl.cpp
    lldb/trunk/source/Symbol/Type.cpp
    lldb/trunk/source/Symbol/TypeSystem.cpp

Modified: lldb/trunk/include/lldb/API/SBFunction.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBFunction.h?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBFunction.h (original)
+++ lldb/trunk/include/lldb/API/SBFunction.h Tue Nov 10 11:47:04 2015
@@ -53,6 +53,9 @@ public:
     lldb::SBAddress
     GetEndAddress ();
 
+    const char *
+    GetArgumentName (uint32_t arg_idx);
+
     uint32_t
     GetPrologueByteSize ();
 

Modified: lldb/trunk/include/lldb/API/SBType.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBType.h?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBType.h (original)
+++ lldb/trunk/include/lldb/API/SBType.h Tue Nov 10 11:47:04 2015
@@ -85,7 +85,13 @@ public:
     
     const char *
     GetName ();
-    
+
+    const char *
+    GetDemangledName ();
+
+    const char *
+    GetMangledName ();
+
     lldb::SBType
     GetType ();
     

Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original)
+++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Tue Nov 10 11:47:04 2015
@@ -117,6 +117,9 @@ public:
     clang::DiagnosticConsumer *
     getDiagnosticConsumer();
 
+    clang::MangleContext *
+    getMangleContext();
+
     std::shared_ptr<clang::TargetOptions> &getTargetOptions();
 
     clang::TargetInfo *
@@ -533,6 +536,21 @@ public:
     ConstString
     DeclGetName (void *opaque_decl) override;
 
+    ConstString
+    DeclGetMangledName (void *opaque_decl) override;
+
+    CompilerDeclContext
+    DeclGetDeclContext (void *opaque_decl) override;
+
+    CompilerType
+    DeclGetFunctionReturnType(void *opaque_decl) override;
+
+    size_t
+    DeclGetFunctionNumArguments(void *opaque_decl) override;
+
+    CompilerType
+    DeclGetFunctionArgumentType (void *opaque_decl, size_t arg_idx) override;
+
     //----------------------------------------------------------------------
     // CompilerDeclContext override functions
     //----------------------------------------------------------------------
@@ -1161,6 +1179,7 @@ protected:
     std::unique_ptr<clang::Builtin::Context>        m_builtins_ap;
     std::unique_ptr<DWARFASTParser>                 m_dwarf_ast_parser_ap;
     std::unique_ptr<ClangASTSource>                 m_scratch_ast_source_ap;
+    std::unique_ptr<clang::MangleContext>           m_mangle_ctx_ap;
     CompleteTagDeclCallback                         m_callback_tag_decl;
     CompleteObjCInterfaceDeclCallback               m_callback_objc_decl;
     void *                                          m_callback_baton;

Modified: lldb/trunk/include/lldb/Symbol/CompilerDecl.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/CompilerDecl.h?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/CompilerDecl.h (original)
+++ lldb/trunk/include/lldb/Symbol/CompilerDecl.h Tue Nov 10 11:47:04 2015
@@ -12,6 +12,7 @@
 
 #include "lldb/lldb-private.h"
 #include "lldb/Core/ConstString.h"
+#include "lldb/Symbol/CompilerType.h"
 
 namespace lldb_private {
 
@@ -102,6 +103,24 @@ public:
     ConstString
     GetName () const;
 
+    ConstString
+    GetMangledName () const;
+
+    CompilerDeclContext
+    GetDeclContext() const;
+
+    // If this decl represents a function, return the return type
+    CompilerType
+    GetFunctionReturnType() const;
+
+    // If this decl represents a function, return the number of arguments for the function
+    size_t
+    GetNumFunctionArguments() const;
+
+    // If this decl represents a function, return the argument type given a zero based argument index
+    CompilerType
+    GetFunctionArgumentType (size_t arg_idx) const;
+
 private:
     TypeSystem *m_type_system;
     void *m_opaque_decl;

Modified: lldb/trunk/include/lldb/Symbol/Type.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Type.h?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/Type.h (original)
+++ lldb/trunk/include/lldb/Symbol/Type.h Tue Nov 10 11:47:04 2015
@@ -14,6 +14,7 @@
 #include "lldb/Core/ClangForward.h"
 #include "lldb/Core/ConstString.h"
 #include "lldb/Core/UserID.h"
+#include "lldb/Symbol/CompilerDecl.h"
 #include "lldb/Symbol/CompilerType.h"
 #include "lldb/Symbol/Declaration.h"
 
@@ -823,50 +824,33 @@ class TypeMemberFunctionImpl
 {
 public:
     TypeMemberFunctionImpl() :
-        m_type(),
-        m_objc_method_decl(nullptr),
+        m_type (),
+        m_decl (),
         m_name(),
-        m_kind(lldb::eMemberFunctionKindUnknown)
+        m_kind (lldb::eMemberFunctionKindUnknown)
     {
     }
     
     TypeMemberFunctionImpl (const CompilerType& type,
+                            const CompilerDecl& decl,
                             const std::string& name,
                             const lldb::MemberFunctionKind& kind) :
-        m_type(type),
-        m_objc_method_decl(nullptr),
+        m_type (type),
+        m_decl (decl),
         m_name(name),
-        m_kind(kind)
+        m_kind (kind)
     {
     }
     
-    TypeMemberFunctionImpl (clang::ObjCMethodDecl *method,
-                            const std::string& name,
-                            const lldb::MemberFunctionKind& kind) :
-    m_type(),
-    m_objc_method_decl(method),
-    m_name(name),
-    m_kind(kind)
-    {
-    }
-    
-    TypeMemberFunctionImpl (const TypeMemberFunctionImpl& rhs) :
-        m_type(rhs.m_type),
-        m_objc_method_decl(rhs.m_objc_method_decl),
-        m_name(rhs.m_name),
-        m_kind(rhs.m_kind)
-    {
-    }
-    
-    TypeMemberFunctionImpl&
-    operator = (const TypeMemberFunctionImpl& rhs);
-    
     bool
     IsValid ();
     
     ConstString
     GetName () const;
-    
+
+    ConstString
+    GetMangledName () const;
+
     CompilerType
     GetType () const;
     
@@ -891,7 +875,7 @@ protected:
 
 private:
     CompilerType m_type;
-    clang::ObjCMethodDecl *m_objc_method_decl;
+    CompilerDecl m_decl;
     ConstString m_name;
     lldb::MemberFunctionKind m_kind;
 };

Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original)
+++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Tue Nov 10 11:47:04 2015
@@ -116,12 +116,27 @@ public:
     virtual ConstString
     DeclGetName (void *opaque_decl) = 0;
 
+    virtual ConstString
+    DeclGetMangledName (void *opaque_decl);
+
     virtual lldb::VariableSP
     DeclGetVariable (void *opaque_decl) = 0;
 
     virtual void
     DeclLinkToObject (void *opaque_decl, std::shared_ptr<void> object) = 0;
 
+    virtual CompilerDeclContext
+    DeclGetDeclContext (void *opaque_decl);
+
+    virtual CompilerType
+    DeclGetFunctionReturnType(void *opaque_decl);
+
+    virtual size_t
+    DeclGetFunctionNumArguments(void *opaque_decl);
+
+    virtual CompilerType
+    DeclGetFunctionArgumentType (void *opaque_decl, size_t arg_idx);
+
     //----------------------------------------------------------------------
     // CompilerDeclContext functions
     //----------------------------------------------------------------------

Modified: lldb/trunk/scripts/Python/python-extensions.swig
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/python-extensions.swig?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/python-extensions.swig (original)
+++ lldb/trunk/scripts/Python/python-extensions.swig Tue Nov 10 11:47:04 2015
@@ -608,6 +608,20 @@
                     return lldb_private::PythonString("").release();
         }
 }
+%extend lldb::SBTypeMemberFunction {
+        PyObject *lldb::SBTypeMemberFunction::__str__ (){
+                lldb::SBStream description;
+                $self->GetDescription (description, lldb::eDescriptionLevelBrief);
+                const char *desc = description.GetData();
+                size_t desc_len = description.GetSize();
+                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+                    --desc_len;
+                if (desc_len > 0)
+                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release();
+                else
+                    return lldb_private::PythonString("").release();
+        }
+}
 %extend lldb::SBTypeEnumMember {
         PyObject *lldb::SBTypeEnumMember::__str__ (){
                 lldb::SBStream description;

Modified: lldb/trunk/scripts/interface/SBFunction.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBFunction.i?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/scripts/interface/SBFunction.i (original)
+++ lldb/trunk/scripts/interface/SBFunction.i Tue Nov 10 11:47:04 2015
@@ -77,6 +77,9 @@ public:
     lldb::SBAddress
     GetEndAddress ();
 
+    const char *
+    GetArgumentName (uint32_t arg_idx);
+
     uint32_t
     GetPrologueByteSize ();
 

Modified: lldb/trunk/scripts/interface/SBType.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBType.i?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/scripts/interface/SBType.i (original)
+++ lldb/trunk/scripts/interface/SBType.i Tue Nov 10 11:47:04 2015
@@ -83,6 +83,12 @@ public:
     const char *
     GetName ();
     
+    const char *
+    GetDemangledName ();
+
+    const char *
+    GetMangledName ();
+
     lldb::SBType
     GetType ();
     

Modified: lldb/trunk/source/API/SBFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBFunction.cpp?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/source/API/SBFunction.cpp (original)
+++ lldb/trunk/source/API/SBFunction.cpp Tue Nov 10 11:47:04 2015
@@ -16,6 +16,7 @@
 #include "lldb/Symbol/CompileUnit.h"
 #include "lldb/Symbol/Function.h"
 #include "lldb/Symbol/Type.h"
+#include "lldb/Symbol/VariableList.h"
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Target.h"
 
@@ -216,6 +217,24 @@ SBFunction::GetEndAddress ()
     return addr;
 }
 
+const char *
+SBFunction::GetArgumentName (uint32_t arg_idx)
+{
+    if (m_opaque_ptr)
+    {
+        Block &block = m_opaque_ptr->GetBlock(true);
+        VariableListSP variable_list_sp = block.GetBlockVariableList(true);
+        if (variable_list_sp)
+        {
+            VariableList arguments;
+            variable_list_sp->AppendVariablesWithScope (eValueTypeVariableArgument, arguments, true);
+            lldb::VariableSP variable_sp = arguments.GetVariableAtIndex(arg_idx);
+            if (variable_sp)
+                return variable_sp->GetName().GetCString();
+        }
+    }
+    return nullptr;
+}
 
 uint32_t
 SBFunction::GetPrologueByteSize ()

Modified: lldb/trunk/source/API/SBType.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBType.cpp?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/source/API/SBType.cpp (original)
+++ lldb/trunk/source/API/SBType.cpp Tue Nov 10 11:47:04 2015
@@ -13,6 +13,7 @@
 #include "lldb/API/SBStream.h"
 #include "lldb/Core/ConstString.h"
 #include "lldb/Core/Log.h"
+#include "lldb/Core/Mangled.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Symbol/CompilerType.h"
 #include "lldb/Symbol/Type.h"
@@ -784,6 +785,30 @@ SBTypeMemberFunction::GetName ()
     return NULL;
 }
 
+const char *
+SBTypeMemberFunction::GetDemangledName ()
+{
+    if (m_opaque_sp)
+    {
+        ConstString mangled_str = m_opaque_sp->GetMangledName();
+        if (mangled_str)
+        {
+            Mangled mangled(mangled_str, true);
+            return mangled.GetDemangledName(mangled.GuessLanguage()).GetCString();
+        }
+    }
+    return NULL;
+}
+
+const char *
+SBTypeMemberFunction::GetMangledName()
+{
+    if (m_opaque_sp)
+        return m_opaque_sp->GetMangledName().GetCString();
+    return NULL;
+}
+
+
 SBType
 SBTypeMemberFunction::GetType ()
 {

Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp Tue Nov 10 11:47:04 2015
@@ -40,6 +40,7 @@
 #include "clang/AST/CXXInheritance.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/DeclTemplate.h"
+#include "clang/AST/Mangle.h"
 #include "clang/AST/RecordLayout.h"
 #include "clang/AST/Type.h"
 #include "clang/AST/VTableBuilder.h"
@@ -662,6 +663,14 @@ ClangASTContext::getDiagnosticsEngine()
     return m_diagnostics_engine_ap.get();
 }
 
+clang::MangleContext *
+ClangASTContext::getMangleContext()
+{
+    if (m_mangle_ctx_ap.get() == nullptr)
+        m_mangle_ctx_ap.reset (getASTContext()->createMangleContext());
+    return m_mangle_ctx_ap.get();
+}
+
 class NullDiagnosticConsumer : public DiagnosticConsumer
 {
 public:
@@ -4114,10 +4123,10 @@ ClangASTContext::GetNumMemberFunctions (
 TypeMemberFunctionImpl
 ClangASTContext::GetMemberFunctionAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
 {
-    std::string name("");
+    std::string name;
     MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
-    CompilerType clang_type{};
-    clang::ObjCMethodDecl *method_decl(nullptr);
+    CompilerType clang_type;
+    CompilerDecl clang_decl;
     if (type)
     {
         clang::QualType qual_type(GetCanonicalQualType(type));
@@ -4136,22 +4145,20 @@ ClangASTContext::GetMemberFunctionAtInde
                         if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
                         {
                             std::advance(method_iter, idx);
-                            auto method_decl = method_iter->getCanonicalDecl();
-                            if (method_decl)
+                            clang::CXXMethodDecl *cxx_method_decl = method_iter->getCanonicalDecl();
+                            if (cxx_method_decl)
                             {
-                                if (!method_decl->getName().empty())
-                                    name.assign(method_decl->getName().data());
-                                else
-                                    name.clear();
-                                if (method_decl->isStatic())
+                                name = cxx_method_decl->getDeclName().getAsString();
+                                if (cxx_method_decl->isStatic())
                                     kind = lldb::eMemberFunctionKindStaticMethod;
-                                else if (llvm::isa<clang::CXXConstructorDecl>(method_decl))
+                                else if (llvm::isa<clang::CXXConstructorDecl>(cxx_method_decl))
                                     kind = lldb::eMemberFunctionKindConstructor;
-                                else if (llvm::isa<clang::CXXDestructorDecl>(method_decl))
+                                else if (llvm::isa<clang::CXXDestructorDecl>(cxx_method_decl))
                                     kind = lldb::eMemberFunctionKindDestructor;
                                 else
                                     kind = lldb::eMemberFunctionKindInstanceMethod;
-                                clang_type = CompilerType(getASTContext(),method_decl->getType());
+                                clang_type = CompilerType(this, cxx_method_decl->getType().getAsOpaquePtr());
+                                clang_decl = CompilerDecl(this, cxx_method_decl);
                             }
                         }
                     }
@@ -4172,11 +4179,12 @@ ClangASTContext::GetMemberFunctionAtInde
                             if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
                             {
                                 std::advance(method_iter, idx);
-                                method_decl = method_iter->getCanonicalDecl();
-                                if (method_decl)
+                                clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
+                                if (objc_method_decl)
                                 {
-                                    name = method_decl->getSelector().getAsString();
-                                    if (method_decl->isClassMethod())
+                                    clang_decl = CompilerDecl(this, objc_method_decl);
+                                    name = objc_method_decl->getSelector().getAsString();
+                                    if (objc_method_decl->isClassMethod())
                                         kind = lldb::eMemberFunctionKindStaticMethod;
                                     else
                                         kind = lldb::eMemberFunctionKindInstanceMethod;
@@ -4202,11 +4210,12 @@ ClangASTContext::GetMemberFunctionAtInde
                             if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
                             {
                                 std::advance(method_iter, idx);
-                                method_decl = method_iter->getCanonicalDecl();
-                                if (method_decl)
+                                clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
+                                if (objc_method_decl)
                                 {
-                                    name = method_decl->getSelector().getAsString();
-                                    if (method_decl->isClassMethod())
+                                    clang_decl = CompilerDecl(this, objc_method_decl);
+                                    name = objc_method_decl->getSelector().getAsString();
+                                    if (objc_method_decl->isClassMethod())
                                         kind = lldb::eMemberFunctionKindStaticMethod;
                                     else
                                         kind = lldb::eMemberFunctionKindInstanceMethod;
@@ -4233,12 +4242,8 @@ ClangASTContext::GetMemberFunctionAtInde
     
     if (kind == eMemberFunctionKindUnknown)
         return TypeMemberFunctionImpl();
-    if (method_decl)
-        return TypeMemberFunctionImpl(method_decl, name, kind);
-    if (type)
-        return TypeMemberFunctionImpl(clang_type, name, kind);
-    
-    return TypeMemberFunctionImpl();
+    else
+        return TypeMemberFunctionImpl(clang_type, clang_decl, name, kind);
 }
 
 CompilerType
@@ -9071,11 +9076,95 @@ ClangASTContext::DeclGetName (void *opaq
     {
         clang::NamedDecl *nd = llvm::dyn_cast<NamedDecl>((clang::Decl*)opaque_decl);
         if (nd != nullptr)
-            return ConstString(nd->getName());
+            return ConstString(nd->getDeclName().getAsString());
     }
     return ConstString();
 }
 
+ConstString
+ClangASTContext::DeclGetMangledName (void *opaque_decl)
+{
+    if (opaque_decl)
+    {
+        clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>((clang::Decl*)opaque_decl);
+        if (nd != nullptr && !llvm::isa<clang::ObjCMethodDecl>(nd))
+        {
+            clang::MangleContext *mc = getMangleContext();
+            if (mc && mc->shouldMangleCXXName(nd))
+            {
+                llvm::SmallVector<char, 1024> buf;
+                llvm::raw_svector_ostream llvm_ostrm (buf);
+                if (llvm::isa<clang::CXXConstructorDecl>(nd))
+                {
+                    mc->mangleCXXCtor(llvm::dyn_cast<clang::CXXConstructorDecl>(nd), Ctor_Complete, llvm_ostrm);
+                }
+                else if (llvm::isa<clang::CXXDestructorDecl>(nd))
+                {
+                    mc->mangleCXXDtor(llvm::dyn_cast<clang::CXXDestructorDecl>(nd), Dtor_Complete, llvm_ostrm);
+                }
+                else
+                {
+                    mc->mangleName(nd, llvm_ostrm);
+                }
+                if (buf.size() > 0)
+                    return ConstString(buf.data(), buf.size());
+            }
+        }
+    }
+    return ConstString();
+}
+
+CompilerDeclContext
+ClangASTContext::DeclGetDeclContext (void *opaque_decl)
+{
+    if (opaque_decl)
+        return CompilerDeclContext(this, ((clang::Decl*)opaque_decl)->getDeclContext());
+    else
+        return CompilerDeclContext();
+}
+
+CompilerType
+ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl)
+{
+    if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
+        return CompilerType(this, func_decl->getReturnType().getAsOpaquePtr());
+    if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
+        return CompilerType(this, objc_method->getReturnType().getAsOpaquePtr());
+    else
+        return CompilerType();
+}
+
+size_t
+ClangASTContext::DeclGetFunctionNumArguments(void *opaque_decl)
+{
+    if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
+        return func_decl->param_size();
+    if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
+        return  objc_method->param_size();
+    else
+        return 0;
+}
+
+CompilerType
+ClangASTContext::DeclGetFunctionArgumentType (void *opaque_decl, size_t idx)
+{
+    if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
+    {
+        if (idx < func_decl->param_size())
+        {
+            ParmVarDecl *var_decl = func_decl->getParamDecl(idx);
+            if (var_decl)
+                return  CompilerType(this, var_decl->getOriginalType().getAsOpaquePtr());
+        }
+    }
+    else if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
+    {
+        if (idx < objc_method->param_size())
+            return CompilerType(this, objc_method->parameters()[idx]->getOriginalType().getAsOpaquePtr());
+    }
+    return CompilerType();
+}
+
 //----------------------------------------------------------------------
 // CompilerDeclContext functions
 //----------------------------------------------------------------------

Modified: lldb/trunk/source/Symbol/CompilerDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CompilerDecl.cpp?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/CompilerDecl.cpp (original)
+++ lldb/trunk/source/Symbol/CompilerDecl.cpp Tue Nov 10 11:47:04 2015
@@ -25,12 +25,42 @@ CompilerDecl::GetName() const
     return m_type_system->DeclGetName(m_opaque_decl);
 }
 
+ConstString
+CompilerDecl::GetMangledName () const
+{
+    return m_type_system->DeclGetMangledName(m_opaque_decl);
+}
+
 lldb::VariableSP
 CompilerDecl::GetAsVariable ()
 {
     return m_type_system->DeclGetVariable(m_opaque_decl);
 }
 
+CompilerDeclContext
+CompilerDecl::GetDeclContext() const
+{
+    return m_type_system->DeclGetDeclContext(m_opaque_decl);
+}
+
+CompilerType
+CompilerDecl::GetFunctionReturnType() const
+{
+    return m_type_system->DeclGetFunctionReturnType(m_opaque_decl);
+}
+
+size_t
+CompilerDecl::GetNumFunctionArguments() const
+{
+    return m_type_system->DeclGetFunctionNumArguments(m_opaque_decl);
+}
+
+CompilerType
+CompilerDecl::GetFunctionArgumentType (size_t arg_idx) const
+{
+    return m_type_system->DeclGetFunctionArgumentType(m_opaque_decl, arg_idx);
+}
+
 bool
 lldb_private::operator == (const lldb_private::CompilerDecl &lhs, const lldb_private::CompilerDecl &rhs)
 {

Modified: lldb/trunk/source/Symbol/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Type.cpp?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Type.cpp (original)
+++ lldb/trunk/source/Symbol/Type.cpp Tue Nov 10 11:47:04 2015
@@ -1253,19 +1253,6 @@ TypeImpl::GetDescription (lldb_private::
     return true;
 }
 
-TypeMemberFunctionImpl&
-TypeMemberFunctionImpl::operator = (const TypeMemberFunctionImpl& rhs)
-{
-    if (this != &rhs)
-    {
-        m_type = rhs.m_type;
-        m_objc_method_decl = rhs.m_objc_method_decl;
-        m_name = rhs.m_name;
-        m_kind = rhs.m_kind;
-    }
-    return *this;
-}
-
 bool
 TypeMemberFunctionImpl::IsValid ()
 {
@@ -1278,6 +1265,12 @@ TypeMemberFunctionImpl::GetName () const
     return m_name;
 }
 
+ConstString
+TypeMemberFunctionImpl::GetMangledName () const
+{
+    return m_decl.GetMangledName();
+}
+
 CompilerType
 TypeMemberFunctionImpl::GetType () const
 {
@@ -1290,21 +1283,6 @@ TypeMemberFunctionImpl::GetKind () const
     return m_kind;
 }
 
-std::string
-TypeMemberFunctionImpl::GetPrintableTypeName ()
-{
-    if (m_type)
-        return m_type.GetTypeName().AsCString("<unknown>");
-    if (m_objc_method_decl)
-    {
-        if (m_objc_method_decl->getClassInterface())
-        {
-            return m_objc_method_decl->getClassInterface()->getName();
-        }
-    }
-    return "<unknown>";
-}
-
 bool
 TypeMemberFunctionImpl::GetDescription (Stream& stream)
 {
@@ -1312,20 +1290,20 @@ TypeMemberFunctionImpl::GetDescription (
         case lldb::eMemberFunctionKindUnknown:
             return false;
         case lldb::eMemberFunctionKindConstructor:
-            stream.Printf("constructor for %s", GetPrintableTypeName().c_str());
+            stream.Printf("constructor for %s", m_type.GetTypeName().AsCString("<unknown>"));
             break;
         case lldb::eMemberFunctionKindDestructor:
-            stream.Printf("destructor for %s",  GetPrintableTypeName().c_str());
+            stream.Printf("destructor for %s",  m_type.GetTypeName().AsCString("<unknown>"));
             break;
         case lldb::eMemberFunctionKindInstanceMethod:
             stream.Printf("instance method %s of type %s",
                           m_name.AsCString(),
-                          GetPrintableTypeName().c_str());
+                          m_decl.GetDeclContext().GetName().AsCString());
             break;
         case lldb::eMemberFunctionKindStaticMethod:
             stream.Printf("static method %s of type %s",
                           m_name.AsCString(),
-                          GetPrintableTypeName().c_str());
+                          m_decl.GetDeclContext().GetName().AsCString());
             break;
     }
     return true;
@@ -1336,9 +1314,7 @@ TypeMemberFunctionImpl::GetReturnType ()
 {
     if (m_type)
         return m_type.GetFunctionReturnType();
-    if (m_objc_method_decl)
-        return CompilerType(&m_objc_method_decl->getASTContext(), m_objc_method_decl->getReturnType());
-    return CompilerType();
+    return m_decl.GetFunctionReturnType();
 }
 
 size_t
@@ -1346,9 +1322,8 @@ TypeMemberFunctionImpl::GetNumArguments
 {
     if (m_type)
         return m_type.GetNumberOfFunctionArguments();
-    if (m_objc_method_decl)
-        return m_objc_method_decl->param_size();
-    return 0;
+    else
+        return m_decl.GetNumFunctionArguments();
 }
 
 CompilerType
@@ -1356,12 +1331,8 @@ TypeMemberFunctionImpl::GetArgumentAtInd
 {
     if (m_type)
         return m_type.GetFunctionArgumentAtIndex (idx);
-    if (m_objc_method_decl)
-    {
-        if (idx < m_objc_method_decl->param_size())
-            return CompilerType(&m_objc_method_decl->getASTContext(), m_objc_method_decl->parameters()[idx]->getOriginalType());
-    }
-    return CompilerType();
+    else
+        return m_decl.GetFunctionArgumentType(idx);
 }
 
 TypeEnumMemberImpl::TypeEnumMemberImpl (const lldb::TypeImplSP &integer_type_sp,

Modified: lldb/trunk/source/Symbol/TypeSystem.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/TypeSystem.cpp?rev=252622&r1=252621&r2=252622&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/TypeSystem.cpp (original)
+++ lldb/trunk/source/Symbol/TypeSystem.cpp Tue Nov 10 11:47:04 2015
@@ -121,6 +121,36 @@ TypeSystem::IsMeaninglessWithoutDynamicR
     return false;
 }
 
+ConstString
+TypeSystem::DeclGetMangledName (void *opaque_decl)
+{
+    return ConstString();
+}
+
+CompilerDeclContext
+TypeSystem::DeclGetDeclContext (void *opaque_decl)
+{
+    return CompilerDeclContext();
+}
+
+CompilerType
+TypeSystem::DeclGetFunctionReturnType(void *opaque_decl)
+{
+    return CompilerType();
+}
+
+size_t
+TypeSystem::DeclGetFunctionNumArguments(void *opaque_decl)
+{
+    return 0;
+}
+
+CompilerType
+TypeSystem::DeclGetFunctionArgumentType (void *opaque_decl, size_t arg_idx)
+{
+    return CompilerType();
+}
+
 #pragma mark TypeSystemMap
 
 TypeSystemMap::TypeSystemMap() :




More information about the lldb-commits mailing list