1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

More principled implementation of DISubprogram::describes()

Previously we would also accept DISubprograms that matched in name
only, but this doesn't appear to be necessary any more.

I did a Full and Thin LTO build of Clang and it completed without a warning.

Differential Revision: https://reviews.llvm.org/D75213
This commit is contained in:
Adrian Prantl 2020-03-02 09:39:27 -08:00
parent 9863c4062d
commit ae0ba63fe4
3 changed files with 28 additions and 10 deletions

View File

@ -660,12 +660,7 @@ DISubprogram *DISubprogram::getImpl(
bool DISubprogram::describes(const Function *F) const {
assert(F && "Invalid function");
if (F->getSubprogram() == this)
return true;
StringRef Name = getLinkageName();
if (Name.empty())
Name = getName();
return F->getName() == Name;
return F->getSubprogram() == this;
}
DILexicalBlock *DILexicalBlock::getImpl(LLVMContext &Context, Metadata *Scope,

View File

@ -2364,8 +2364,7 @@ void Verifier::visitFunction(const Function &F) {
if (!HasDebugInfo)
return;
// Check that all !dbg attachments lead to back to N (or, at least, another
// subprogram that describes the same function).
// Check that all !dbg attachments lead to back to N.
//
// FIXME: Check this incrementally while visiting !dbg attachments.
// FIXME: Only check when N is the canonical subprogram for F.
@ -2394,11 +2393,9 @@ void Verifier::visitFunction(const Function &F) {
if (SP && ((Scope != SP) && !Seen.insert(SP).second))
return;
// FIXME: Once N is canonical, check "SP == &N".
AssertDI(SP->describes(&F),
"!dbg attachment points at wrong subprogram for function", N, &F,
&I, DL, Scope, SP);
visitMDNode(*SP);
};
for (auto &BB : F)
for (auto &I : BB) {

View File

@ -0,0 +1,26 @@
; RUN: llvm-as -disable-output <%s 2>&1| FileCheck %s
define void @f() !dbg !14 {
ret void, !dbg !5
}
!llvm.module.flags = !{!15}
!llvm.dbg.cu = !{!4}
!0 = !{null}
!1 = distinct !DICompositeType(tag: DW_TAG_structure_type)
!2 = !DIFile(filename: "f.c", directory: "/")
!3 = !DISubroutineType(types: !0)
!4 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)
; CHECK: !dbg attachment points at wrong subprogram for function
; CHECK: warning: ignoring invalid debug info
!5 = !DILocation(line: 1, scope: !9)
!9 = distinct !DISubprogram(name: "f", scope: !1,
file: !2, line: 1, type: !3, isLocal: true,
isDefinition: true, scopeLine: 2,
unit: !4)
!14 = distinct !DISubprogram(name: "f", scope: !1,
file: !2, line: 1, type: !3, isLocal: true,
isDefinition: true, scopeLine: 2,
unit: !4)
!15 = !{i32 1, !"Debug Info Version", i32 3}