[clang] 1cbba53 - [ObjC][CodeGen] Fix missing debug info in situations where an instance and class property have the same identifier

Raphael Isemann via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 30 02:07:40 PDT 2021


Author: Raphael Isemann
Date: 2021-03-30T11:07:16+02:00
New Revision: 1cbba533ec93864caab8ad2f3fd4293a56723307

URL: https://github.com/llvm/llvm-project/commit/1cbba533ec93864caab8ad2f3fd4293a56723307
DIFF: https://github.com/llvm/llvm-project/commit/1cbba533ec93864caab8ad2f3fd4293a56723307.diff

LOG: [ObjC][CodeGen] Fix missing debug info in situations where an instance and class property have the same identifier

Since the introduction of class properties in Objective-C it is possible to declare a class and an instance
property with the same identifier in an interface/protocol.

Right now Clang just generates debug information for whatever property comes first in the source file.
The second property is ignored as it's filtered out by the set of already emitted properties (which is just
using the identifier of the property to check for equivalence).  I don't think generating debug info in this case
was never supported as the identifier filter is in place since 7123bca7fb6e1dde51be8329cfb523d2bb9ffadf
(which precedes the introduction of class properties).

This patch expands the filter to take in account identifier + whether the property is class/instance. This
ensures that both properties are emitted in this special situation.

Reviewed By: aprantl

Differential Revision: https://reviews.llvm.org/D99512

Added: 
    clang/test/CodeGenObjC/debug-info-property-class-instance-same-name.m

Modified: 
    clang/lib/CodeGen/CGDebugInfo.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index c80249a9c9fc..3fe56346088c 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -2740,16 +2740,26 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
     EltTys.push_back(PropertyNode);
   };
   {
-    llvm::SmallPtrSet<const IdentifierInfo *, 16> PropertySet;
+    // Use 'char' for the isClassProperty bit as DenseSet requires space for
+    // empty/tombstone keys in the data type (and bool is too small for that).
+    typedef std::pair<char, const IdentifierInfo *> IsClassAndIdent;
+    /// List of already emitted properties. Two distinct class and instance
+    /// properties can share the same identifier (but not two instance
+    /// properties or two class properties).
+    llvm::DenseSet<IsClassAndIdent> PropertySet;
+    /// Returns the IsClassAndIdent key for the given property.
+    auto GetIsClassAndIdent = [](const ObjCPropertyDecl *PD) {
+      return std::make_pair(PD->isClassProperty(), PD->getIdentifier());
+    };
     for (const ObjCCategoryDecl *ClassExt : ID->known_extensions())
       for (auto *PD : ClassExt->properties()) {
-        PropertySet.insert(PD->getIdentifier());
+        PropertySet.insert(GetIsClassAndIdent(PD));
         AddProperty(PD);
       }
     for (const auto *PD : ID->properties()) {
       // Don't emit duplicate metadata for properties that were already in a
       // class extension.
-      if (!PropertySet.insert(PD->getIdentifier()).second)
+      if (!PropertySet.insert(GetIsClassAndIdent(PD)).second)
         continue;
       AddProperty(PD);
     }

diff  --git a/clang/test/CodeGenObjC/debug-info-property-class-instance-same-name.m b/clang/test/CodeGenObjC/debug-info-property-class-instance-same-name.m
new file mode 100644
index 000000000000..68423fc07f8a
--- /dev/null
+++ b/clang/test/CodeGenObjC/debug-info-property-class-instance-same-name.m
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -S -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
+
+// Both properties should be emitted as having a class and an instance property
+// with the same name is allowed.
+ at interface I1
+// CHECK: !DIObjCProperty(name: "p1"
+// CHECK-SAME:            line: [[@LINE+1]]
+ at property int p1;
+// CHECK: !DIObjCProperty(name: "p1"
+// CHECK-SAME:            line: [[@LINE+1]]
+ at property(class) int p1;
+ at end
+
+ at implementation I1
+ at synthesize p1;
+ at end
+
+void foo(I1 *iptr) {}


        


More information about the cfe-commits mailing list