mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 06:00:28 +00:00
Refactor stripDebugInfo(Function) to handle intrinsic
This moves the code that handles stripping debug info intrinsic from StripDebugInfo(Module) to StripDebugInfo(Function). The latter is already walking every instructions so it makes sense to do it at the same time. This makes also stripDebugInfo(Function) as an API more useful: it is really dropping every debug info in the Function. Finally the existing code is trigerring an assertion when the Module is not fully materialized. From: Mehdi Amini <mehdi.amini@apple.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268832 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4c690f3954
commit
7be47c324a
@ -247,8 +247,20 @@ bool llvm::stripDebugInfo(Function &F) {
|
|||||||
Changed = true;
|
Changed = true;
|
||||||
F.setSubprogram(nullptr);
|
F.setSubprogram(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Function *Declare = F.getParent()->getFunction("llvm.dbg.declare");
|
||||||
|
Function *DbgVal = F.getParent()->getFunction("llvm.dbg.value");
|
||||||
for (BasicBlock &BB : F) {
|
for (BasicBlock &BB : F) {
|
||||||
for (Instruction &I : BB) {
|
for (auto II = BB.begin(), End = BB.end(); II != End;) {
|
||||||
|
Instruction &I = *II++; // We may delete the instruction, increment now.
|
||||||
|
// Remove all of the calls to the debugger intrinsics, and remove them
|
||||||
|
// from the module.
|
||||||
|
CallInst *CI = dyn_cast<CallInst>(&I);
|
||||||
|
if (CI && (CI->getCalledFunction() == Declare ||
|
||||||
|
CI->getCalledFunction() == DbgVal)) {
|
||||||
|
CI->eraseFromParent();
|
||||||
|
Changed = true;
|
||||||
|
}
|
||||||
if (I.getDebugLoc()) {
|
if (I.getDebugLoc()) {
|
||||||
Changed = true;
|
Changed = true;
|
||||||
I.setDebugLoc(DebugLoc());
|
I.setDebugLoc(DebugLoc());
|
||||||
@ -261,26 +273,6 @@ bool llvm::stripDebugInfo(Function &F) {
|
|||||||
bool llvm::StripDebugInfo(Module &M) {
|
bool llvm::StripDebugInfo(Module &M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
|
||||||
// Remove all of the calls to the debugger intrinsics, and remove them from
|
|
||||||
// the module.
|
|
||||||
if (Function *Declare = M.getFunction("llvm.dbg.declare")) {
|
|
||||||
while (!Declare->use_empty()) {
|
|
||||||
CallInst *CI = cast<CallInst>(Declare->user_back());
|
|
||||||
CI->eraseFromParent();
|
|
||||||
}
|
|
||||||
Declare->eraseFromParent();
|
|
||||||
Changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Function *DbgVal = M.getFunction("llvm.dbg.value")) {
|
|
||||||
while (!DbgVal->use_empty()) {
|
|
||||||
CallInst *CI = cast<CallInst>(DbgVal->user_back());
|
|
||||||
CI->eraseFromParent();
|
|
||||||
}
|
|
||||||
DbgVal->eraseFromParent();
|
|
||||||
Changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Module::named_metadata_iterator NMI = M.named_metadata_begin(),
|
for (Module::named_metadata_iterator NMI = M.named_metadata_begin(),
|
||||||
NME = M.named_metadata_end(); NMI != NME;) {
|
NME = M.named_metadata_end(); NMI != NME;) {
|
||||||
NamedMDNode *NMD = &*NMI;
|
NamedMDNode *NMD = &*NMI;
|
||||||
|
BIN
test/ThinLTO/X86/Inputs/drop-debug-info.bc
Normal file
BIN
test/ThinLTO/X86/Inputs/drop-debug-info.bc
Normal file
Binary file not shown.
47
test/ThinLTO/X86/Inputs/drop-debug-info.ll
Normal file
47
test/ThinLTO/X86/Inputs/drop-debug-info.ll
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
; This file is checked-in as a .bc file, because the debug info version is
|
||||||
|
; intentionally out-of-date and llvm-as will drop it before writing the bitcode
|
||||||
|
|
||||||
|
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
|
target triple = "x86_64-apple-macosx10.11.0"
|
||||||
|
|
||||||
|
|
||||||
|
@argc = global i8 0, align 1
|
||||||
|
|
||||||
|
define void @globalfunc() {
|
||||||
|
entry:
|
||||||
|
%0 = load i8, i8* @argc, align 1
|
||||||
|
tail call void @llvm.dbg.value(metadata i8 %0, i64 0, metadata !19, metadata !29), !dbg !DILocation(scope: !13)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
declare void @llvm.dbg.value(metadata, i64, metadata, metadata)
|
||||||
|
|
||||||
|
!llvm.dbg.cu = !{!0}
|
||||||
|
!llvm.module.flags = !{!22, !23}
|
||||||
|
|
||||||
|
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, enums: !2, retainedTypes: !3, globals: !20, imports: !2, emissionKind: FullDebug)
|
||||||
|
!1 = !DIFile(filename: "test.cpp", directory: "")
|
||||||
|
!2 = !{}
|
||||||
|
!3 = !{!4}
|
||||||
|
!4 = !DICompositeType(tag: DW_TAG_class_type, name: "C", line: 2, size: 8, align: 8, file: !1, elements: !5, identifier: "_ZTS1C")
|
||||||
|
!5 = !{!6}
|
||||||
|
!6 = !DISubprogram(name: "test", file: !1, scope: !4, type: !7, isDefinition: false)
|
||||||
|
!7 = !DISubroutineType(types: !8)
|
||||||
|
!8 = !{!9, !10, !11, !11, !11, null}
|
||||||
|
!9 = !DIBasicType(encoding: DW_ATE_signed, size: 32, align: 32, name: "int")
|
||||||
|
!10 = !DIDerivedType(baseType: !4, tag: DW_TAG_pointer_type, size: 64, align: 64, flags: DIFlagArtificial)
|
||||||
|
!11 = !DIBasicType(tag: DW_TAG_base_type, name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char)
|
||||||
|
!13 = distinct !DISubprogram(name: "test_with_debug", linkageName: "test_with_debug", line: 6, isLocal: false, isDefinition: true, flags: DIFlagPrototyped, isOptimized: true, unit: !0, scopeLine: 6, file: !1, scope: !14, type: !15, variables: !17)
|
||||||
|
!14 = !DIFile(filename: "test.cpp", directory: "")
|
||||||
|
!15 = !DISubroutineType(types: !16)
|
||||||
|
!16 = !{null}
|
||||||
|
!17 = !{!18, !19}
|
||||||
|
!18 = !DILocalVariable(name: "c", line: 7, scope: !13, file: !14, type: !4)
|
||||||
|
!19 = !DILocalVariable(name: "lc", line: 8, scope: !13, file: !14, type: !11)
|
||||||
|
!20 = !{!21}
|
||||||
|
!21 = !DIGlobalVariable(name: "argc", line: 1, isLocal: false, isDefinition: true, scope: null, file: !14, type: !11, variable: i8* @argc)
|
||||||
|
!22 = !{i32 2, !"Dwarf Version", i32 4}
|
||||||
|
!23 = !{i32 2, !"Debug Info Version", i32 0}
|
||||||
|
!25 = !DILocation(line: 8, column: 3, scope: !13)
|
||||||
|
!29 = !DIExpression()
|
20
test/ThinLTO/X86/drop-debug-info.ll
Normal file
20
test/ThinLTO/X86/drop-debug-info.ll
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
; RUN: opt -module-summary %s -o %t.bc
|
||||||
|
; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t.bc %p/Inputs/drop-debug-info.bc
|
||||||
|
|
||||||
|
; The imported module has out-of-date debug information, let's make sure we can
|
||||||
|
; drop them without crashing when materializing later.
|
||||||
|
; RUN: llvm-lto -thinlto-action=import %t.bc -thinlto-index=%t.index.bc -o - | llvm-dis -o - | FileCheck %s
|
||||||
|
; CHECK: define available_externally void @globalfunc
|
||||||
|
; CHECK-NOT: llvm.dbg.value
|
||||||
|
|
||||||
|
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
|
target triple = "x86_64-apple-macosx10.11.0"
|
||||||
|
|
||||||
|
|
||||||
|
define i32 @main() #0 {
|
||||||
|
entry:
|
||||||
|
call void (...) @globalfunc()
|
||||||
|
ret i32 0
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @globalfunc(...)
|
Loading…
Reference in New Issue
Block a user