JDevlieghere updated this revision to Diff 151580.
JDevlieghere marked 5 inline comments as done.
JDevlieghere added a comment.
CR feedback
https://reviews.llvm.org/D48241
Files:
clang/lib/CodeGen/CGDebugInfo.cpp
clang/lib/CodeGen/CGDebugInfo.h
clang/test/CodeGenObjC/debug-info-synthesis.m
Index: clang/test/CodeGenObjC/debug-info-synthesis.m
===================================================================
--- clang/test/CodeGenObjC/debug-info-synthesis.m
+++ clang/test/CodeGenObjC/debug-info-synthesis.m
@@ -1,4 +1,7 @@
// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited -w -triple x86_64-apple-darwin10 %s -o - | FileCheck %s
+// RUN: %clang_cc1 -dwarf-version=5 -emit-llvm -debug-info-kind=limited -w -triple x86_64-apple-darwin10 %s -o - | FileCheck %s --check-prefix CHECK --check-prefix DWARF5
+// RUN: %clang_cc1 -dwarf-version=4 -emit-llvm -debug-info-kind=limited -w -triple x86_64-apple-darwin10 %s -o - | FileCheck %s --check-prefix CHECK --check-prefix DWARF4
+
# 1 "foo.m" 1
# 1 "foo.m" 2
# 1 "./foo.h" 1
@@ -30,8 +33,14 @@
}
}
+// CHECK: ![[STRUCT:.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Foo"
// CHECK: ![[FILE:.*]] = !DIFile(filename: "{{[^"]+}}foo.h"
-// CHECK: !DISubprogram(name: "-[Foo setDict:]"
+// DWARF5: !DISubprogram(name: "-[Foo setDict:]"
+// DWARF5-SAME: scope: ![[STRUCT]],
+// DWARF5-SAME: line: 8,
+// DWARF5-SAME: isLocal: true, isDefinition: false
+// DWARF4-NOT: !DISubprogram(name: "-[Foo setDict:]"{{.*}}isDefinition: false
+// CHECK: distinct !DISubprogram(name: "-[Foo setDict:]"
// CHECK-SAME: file: ![[FILE]],
// CHECK-SAME: line: 8,
// CHECK-SAME: isLocal: true, isDefinition: true
Index: clang/lib/CodeGen/CGDebugInfo.h
===================================================================
--- clang/lib/CodeGen/CGDebugInfo.h
+++ clang/lib/CodeGen/CGDebugInfo.h
@@ -98,6 +98,25 @@
/// Cache of previously constructed interfaces which may change.
llvm::SmallVector<ObjCInterfaceCacheEntry, 32> ObjCInterfaceCache;
+ struct ObjCMethodCacheEntry {
+ struct MethodData {
+ const ObjCMethodDecl *MD;
+ llvm::DISubprogram *DIMethodDecl;
+ };
+
+ // Keep track of the interface so we can update its elements with its
+ // methods.
+ llvm::DICompositeType *DIInterfaceDecl;
+ std::vector<MethodData> Methods;
+
+ ObjCMethodCacheEntry(llvm::DICompositeType *DIInterfaceDecl = nullptr)
+ : DIInterfaceDecl(DIInterfaceDecl) {}
+ };
+
+ /// Cache of forward declarations for method
+ llvm::DenseMap<const ObjCInterfaceDecl *, ObjCMethodCacheEntry>
+ ObjCMethodCache;
+
/// Cache of references to clang modules and precompiled headers.
llvm::DenseMap<const Module *, llvm::TrackingMDRef> ModuleCache;
Index: clang/lib/CodeGen/CGDebugInfo.cpp
===================================================================
--- clang/lib/CodeGen/CGDebugInfo.cpp
+++ clang/lib/CodeGen/CGDebugInfo.cpp
@@ -2231,6 +2231,13 @@
Mod ? Mod : Unit, ID->getName(), DefUnit, Line, Size, Align, Flags,
nullptr, llvm::DINodeArray(), RuntimeLang);
+ if (CGM.getCodeGenOpts().DwarfVersion >= 5) {
+ // Remember the DICompositeType in the ObjCMethodCache.
+ assert(ObjCMethodCache[ID].DIInterfaceDecl == nullptr ||
+ ObjCMethodCache[ID].DIInterfaceDecl == RealDecl);
+ ObjCMethodCache[ID].DIInterfaceDecl = RealDecl;
+ }
+
QualType QTy(Ty, 0);
TypeCache[QTy.getAsOpaquePtr()].reset(RealDecl);
@@ -3346,6 +3353,21 @@
if (HasDecl && isa<FunctionDecl>(D))
DeclCache[D->getCanonicalDecl()].reset(SP);
+ if (CGM.getCodeGenOpts().DwarfVersion >= 5) {
+ // Starting with DWARF V5 method declarations are emitted as children of
+ // the interface type.
+ if (const auto *OMD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
+ const ObjCInterfaceDecl *ID = OMD->getClassInterface();
+ llvm::DISubprogram *FD = DBuilder.createFunction(
+ ObjCMethodCache[ID].DIInterfaceDecl, Name, LinkageName, Unit, LineNo,
+ getOrCreateFunctionType(D, FnType, Unit), Fn->hasLocalLinkage(),
+ false /*definition*/, ScopeLine, Flags, CGM.getLangOpts().Optimize,
+ TParamsArray.get());
+ DBuilder.finalizeSubprogram(FD);
+ ObjCMethodCache[ID].Methods.push_back({OMD, FD});
+ }
+ }
+
// Push the function onto the lexical block stack.
LexicalBlockStack.emplace_back(SP);
@@ -4213,6 +4235,26 @@
DBuilder.replaceTemporary(llvm::TempDIType(E.Decl), Ty);
}
+ if (CGM.getCodeGenOpts().DwarfVersion >= 5) {
+ // Add methods to interface.
+ for (auto p : ObjCMethodCache) {
+ llvm::DICompositeType *RealDecl = p.second.DIInterfaceDecl;
+ if (!RealDecl)
+ continue;
+ if (p.second.Methods.empty())
+ continue;
+
+ SmallVector<llvm::Metadata *, 16> EltTys;
+ EltTys.append(RealDecl->getElements().begin(),
+ RealDecl->getElements().end());
+ for (auto &M : p.second.Methods) {
+ EltTys.push_back(M.DIMethodDecl);
+ }
+ llvm::DINodeArray Elements = DBuilder.getOrCreateArray(EltTys);
+ DBuilder.replaceArrays(RealDecl, Elements);
+ }
+ }
+
for (auto p : ReplaceMap) {
assert(p.second);
auto *Ty = cast<llvm::DIType>(p.second);
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits