forked from OSchip/llvm-project
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
This commit is contained in:
parent
9179764710
commit
79f46a30c2
|
@ -338,18 +338,13 @@ bool llvm::stripDebugInfo(Function &F) {
|
||||||
Changed = true;
|
Changed = true;
|
||||||
I.setDebugLoc(DebugLoc());
|
I.setDebugLoc(DebugLoc());
|
||||||
}
|
}
|
||||||
}
|
if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) {
|
||||||
|
auto *NewLoopID = LoopIDsMap.lookup(LoopID);
|
||||||
auto *TermInst = BB.getTerminator();
|
if (!NewLoopID)
|
||||||
if (!TermInst)
|
NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
|
||||||
// This is invalid IR, but we may not have run the verifier yet
|
if (NewLoopID != LoopID)
|
||||||
continue;
|
I.setMetadata(LLVMContext::MD_loop, NewLoopID);
|
||||||
if (auto *LoopID = TermInst->getMetadata(LLVMContext::MD_loop)) {
|
}
|
||||||
auto *NewLoopID = LoopIDsMap.lookup(LoopID);
|
|
||||||
if (!NewLoopID)
|
|
||||||
NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
|
|
||||||
if (NewLoopID != LoopID)
|
|
||||||
TermInst->setMetadata(LLVMContext::MD_loop, NewLoopID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Changed;
|
return Changed;
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
; RUN: llvm-as -disable-output < %s -o /dev/null 2>&1 | FileCheck %s
|
||||||
|
; RUN: llvm-as < %s -o - | llvm-dis - | FileCheck %s --check-prefix=CHECK-STRIP
|
||||||
|
; CHECK: DICompileUnit not listed in llvm.dbg.cu
|
||||||
|
; CHECK: ignoring invalid debug info in
|
||||||
|
; CHECK-NOT: DICompileUnit not listed in llvm.dbg.cu
|
||||||
|
declare hidden void @g() local_unnamed_addr #1 align 2
|
||||||
|
define hidden void @f() {
|
||||||
|
tail call void @g() #2, !llvm.loop !5
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
!llvm.module.flags = !{!0, !1}
|
||||||
|
!0 = !{i32 2, !"Dwarf Version", i32 4}
|
||||||
|
!1 = !{i32 2, !"Debug Info Version", i32 3}
|
||||||
|
; CHECK-STRIP: ![[MD:.*]] = distinct !{![[MD]], !"fake loop metadata"}
|
||||||
|
!5 = distinct !{!5, !6, !6, !"fake loop metadata"}
|
||||||
|
!6 = !DILocation(line: 1325, column: 3, scope: !7)
|
||||||
|
!7 = distinct !DISubprogram(name: "f", scope: !8, file: !8, line: 1324, type: !9, scopeLine: 1324, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !11)
|
||||||
|
!8 = !DIFile(filename: "/", directory: "f.cpp")
|
||||||
|
!9 = !DISubroutineType(types: !10)
|
||||||
|
!10 = !{}
|
||||||
|
!11 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !8)
|
Loading…
Reference in New Issue