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. +@interface I1 +// CHECK: !DIObjCProperty(name: "p1" +// CHECK-SAME: line: [[@LINE+1]] +@property int p1; +// CHECK: !DIObjCProperty(name: "p1" +// CHECK-SAME: line: [[@LINE+1]] +@property(class) int p1; +@end + +@implementation I1 +@synthesize p1; +@end + +void foo(I1 *iptr) {} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits