[Lldb-commits] [lldb] r157956 - in /lldb/trunk/source/Plugins/SymbolFile/DWARF: SymbolFileDWARF.cpp SymbolFileDWARF.h

Sean Callanan scallanan at apple.com
Mon Jun 4 15:28:05 PDT 2012


Author: spyffe
Date: Mon Jun  4 17:28:05 2012
New Revision: 157956

URL: http://llvm.org/viewvc/llvm-project?rev=157956&view=rev
Log:
Fixed handling of Objective-C properties to ensure
that automatically generated setters/getters only
get added to a class after explicitly declared (or
synthesized) getters/setters had the chance to be
added.  This eliminates conflicts creating errors
of the form:

error: instance method '...' has incompatible result
types in different translation units ('X *' vs. 'id')

Modified:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=157956&r1=157955&r2=157956&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Mon Jun  4 17:28:05 2012
@@ -1457,6 +1457,57 @@
     return NULL;
 }
 
+class SymbolFileDWARF::DelayedAddObjCClassProperty
+{
+public:
+    DelayedAddObjCClassProperty
+    (
+        clang::ASTContext      *ast,
+        lldb::clang_type_t      class_opaque_type, 
+        const char             *property_name,
+        lldb::clang_type_t      property_opaque_type,  // The property type is only required if you don't have an ivar decl
+        clang::ObjCIvarDecl    *ivar_decl,   
+        const char             *property_setter_name,
+        const char             *property_getter_name,
+        uint32_t                property_attributes,
+        uint64_t                metadata = 0
+    ) :
+        m_ast                   (ast),
+        m_class_opaque_type     (class_opaque_type),
+        m_property_name         (property_name),
+        m_property_opaque_type  (property_opaque_type),
+        m_ivar_decl             (ivar_decl),
+        m_property_setter_name  (property_setter_name),
+        m_property_getter_name  (property_getter_name),
+        m_property_attributes   (property_attributes),
+        m_metadata              (metadata)
+    {
+    }
+    
+    bool Finalize() const
+    {
+        return ClangASTContext::AddObjCClassProperty(m_ast,
+                                                     m_class_opaque_type,
+                                                     m_property_name,
+                                                     m_property_opaque_type,
+                                                     m_ivar_decl,
+                                                     m_property_setter_name,
+                                                     m_property_getter_name,
+                                                     m_property_attributes,
+                                                     m_metadata);
+    }
+private:
+    clang::ASTContext      *m_ast;
+    lldb::clang_type_t      m_class_opaque_type;
+    const char             *m_property_name;
+    lldb::clang_type_t      m_property_opaque_type;
+    clang::ObjCIvarDecl    *m_ivar_decl;
+    const char             *m_property_setter_name;
+    const char             *m_property_getter_name;
+    uint32_t                m_property_attributes;
+    uint64_t                m_metadata;
+};
+
 size_t
 SymbolFileDWARF::ParseChildMembers
 (
@@ -1468,6 +1519,7 @@
     std::vector<clang::CXXBaseSpecifier *>& base_classes,
     std::vector<int>& member_accessibilities,
     DWARFDIECollection& member_function_dies,
+    DelayedPropertyList& delayed_properties,
     AccessType& default_accessibility,
     bool &is_a_class,
     LayoutInfo &layout_info
@@ -1739,14 +1791,15 @@
                                 assert (ivar_decl != NULL);
                             }
                             
-                            GetClangASTContext().AddObjCClassProperty (class_clang_type,
-                                                                       prop_name,
-                                                                       member_type->GetClangLayoutType(),
-                                                                       ivar_decl,
-                                                                       prop_setter_name,
-                                                                       prop_getter_name,
-                                                                       prop_attributes,
-                                                                       MakeUserID(die->GetOffset()));
+                            delayed_properties.push_back(DelayedAddObjCClassProperty(GetClangASTContext().getASTContext(),
+                                                                                     class_clang_type,
+                                                                                     prop_name,
+                                                                                     member_type->GetClangLayoutType(),
+                                                                                     ivar_decl,
+                                                                                     prop_setter_name,
+                                                                                     prop_getter_name,
+                                                                                     prop_attributes,
+                                                                                     MakeUserID(die->GetOffset())));
                             
                             if (ivar_decl)
                                 GetClangASTContext().SetMetadata((uintptr_t)ivar_decl, MakeUserID(die->GetOffset()));
@@ -1857,6 +1910,7 @@
             break;
         }
     }
+    
     return count;
 }
 
@@ -2061,6 +2115,8 @@
                     bool is_a_class = false;
                     // Parse members and base classes first
                     DWARFDIECollection member_function_dies;
+                                        
+                    DelayedPropertyList delayed_properties;
                     
                     ParseChildMembers (sc, 
                                        dwarf_cu,
@@ -2070,6 +2126,7 @@
                                        base_classes, 
                                        member_accessibilities,
                                        member_function_dies,
+                                       delayed_properties,
                                        default_accessibility, 
                                        is_a_class,
                                        layout_info);
@@ -2128,6 +2185,11 @@
                                     }            
                                 }
                             }
+                            
+                            for (DelayedPropertyList::const_iterator pi = delayed_properties.begin(), pe = delayed_properties.end();
+                                 pi != pe;
+                                 ++pi)
+                                pi->Finalize();
                         }
                     }
                     

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=157956&r1=157955&r2=157956&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Mon Jun  4 17:28:05 2012
@@ -331,6 +331,9 @@
                                 bool parse_children,
                                 lldb_private::VariableList* cc_variable_list = NULL);
 
+    class DelayedAddObjCClassProperty;
+    typedef std::vector <DelayedAddObjCClassProperty> DelayedPropertyList;
+    
     size_t                  ParseChildMembers(
                                 const lldb_private::SymbolContext& sc,
                                 DWARFCompileUnit* dwarf_cu,
@@ -340,6 +343,7 @@
                                 std::vector<clang::CXXBaseSpecifier *>& base_classes,
                                 std::vector<int>& member_accessibilities,
                                 DWARFDIECollection& member_function_dies,
+                                DelayedPropertyList& delayed_properties,
                                 lldb::AccessType &default_accessibility,
                                 bool &is_a_class,
                                 LayoutInfo &layout_info);





More information about the lldb-commits mailing list