Skip to content

Commit 79f46a3

Browse files
committed
Have stripDebugInfo() also strip !llvm.loop annotations from all
instructions. The !llvm.loop annotations consist of pointers into the debug info, so when stripping the debug info (particularly important when it is malformed!) !llvm.loop annotations need to be stripped as well, or else the malformed debug info stays around. This patch applies the stripping to all instructions, not just terminator instructions. rdar://73687049 Differential Revision: https://reviews.llvm.org/D96181
1 parent 9179764 commit 79f46a3

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

llvm/lib/IR/DebugInfo.cpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -338,18 +338,13 @@ bool llvm::stripDebugInfo(Function &F) {
338338
Changed = true;
339339
I.setDebugLoc(DebugLoc());
340340
}
341-
}
342-
343-
auto *TermInst = BB.getTerminator();
344-
if (!TermInst)
345-
// This is invalid IR, but we may not have run the verifier yet
346-
continue;
347-
if (auto *LoopID = TermInst->getMetadata(LLVMContext::MD_loop)) {
348-
auto *NewLoopID = LoopIDsMap.lookup(LoopID);
349-
if (!NewLoopID)
350-
NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
351-
if (NewLoopID != LoopID)
352-
TermInst->setMetadata(LLVMContext::MD_loop, NewLoopID);
341+
if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) {
342+
auto *NewLoopID = LoopIDsMap.lookup(LoopID);
343+
if (!NewLoopID)
344+
NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
345+
if (NewLoopID != LoopID)
346+
I.setMetadata(LLVMContext::MD_loop, NewLoopID);
347+
}
353348
}
354349
}
355350
return Changed;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
; RUN: llvm-as -disable-output < %s -o /dev/null 2>&1 | FileCheck %s
2+
; RUN: llvm-as < %s -o - | llvm-dis - | FileCheck %s --check-prefix=CHECK-STRIP
3+
; CHECK: DICompileUnit not listed in llvm.dbg.cu
4+
; CHECK: ignoring invalid debug info in
5+
; CHECK-NOT: DICompileUnit not listed in llvm.dbg.cu
6+
declare hidden void @g() local_unnamed_addr #1 align 2
7+
define hidden void @f() {
8+
tail call void @g() #2, !llvm.loop !5
9+
ret void
10+
}
11+
!llvm.module.flags = !{!0, !1}
12+
!0 = !{i32 2, !"Dwarf Version", i32 4}
13+
!1 = !{i32 2, !"Debug Info Version", i32 3}
14+
; CHECK-STRIP: ![[MD:.*]] = distinct !{![[MD]], !"fake loop metadata"}
15+
!5 = distinct !{!5, !6, !6, !"fake loop metadata"}
16+
!6 = !DILocation(line: 1325, column: 3, scope: !7)
17+
!7 = distinct !DISubprogram(name: "f", scope: !8, file: !8, line: 1324, type: !9, scopeLine: 1324, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !11)
18+
!8 = !DIFile(filename: "/", directory: "f.cpp")
19+
!9 = !DISubroutineType(types: !10)
20+
!10 = !{}
21+
!11 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !8)

0 commit comments

Comments
 (0)