[PATCH] D99512: [ObjC][CodeGen] Fix missing debug info in situations where an instance and class property have the same identifier
Raphael Isemann via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 30 02:07:50 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rG1cbba533ec93: [ObjC][CodeGen] Fix missing debug info in situations where an instance and… (authored by teemperor).
Herald added a subscriber: cfe-commits.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99512/new/
https://reviews.llvm.org/D99512
Files:
clang/lib/CodeGen/CGDebugInfo.cpp
clang/test/CodeGenObjC/debug-info-property-class-instance-same-name.m
Index: clang/test/CodeGenObjC/debug-info-property-class-instance-same-name.m
===================================================================
--- /dev/null
+++ 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) {}
Index: clang/lib/CodeGen/CGDebugInfo.cpp
===================================================================
--- clang/lib/CodeGen/CGDebugInfo.cpp
+++ clang/lib/CodeGen/CGDebugInfo.cpp
@@ -2740,16 +2740,26 @@
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);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D99512.334080.patch
Type: text/x-patch
Size: 2338 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210330/55d857a9/attachment.bin>
More information about the cfe-commits
mailing list