]> granicus.if.org Git - llvm/commitdiff
Refactor stripDebugInfo(Function) to handle intrinsic
authorMehdi Amini <mehdi.amini@apple.com>
Sat, 7 May 2016 04:10:52 +0000 (04:10 +0000)
committerMehdi Amini <mehdi.amini@apple.com>
Sat, 7 May 2016 04:10:52 +0000 (04:10 +0000)
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@268847 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/DebugInfo.cpp
test/ThinLTO/X86/Inputs/drop-debug-info.bc [new file with mode: 0644]
test/ThinLTO/X86/Inputs/drop-debug-info.ll [new file with mode: 0644]
test/ThinLTO/X86/drop-debug-info.ll [new file with mode: 0644]
test/Transforms/StripSymbols/2010-06-30-StripDebug.ll

index e8c62961eba5ef4b5e96d7c1dc62674f28d5fdf1..689cf9070289f5bde41a6cfd0a0080c3aeeee072 100644 (file)
@@ -247,8 +247,21 @@ bool llvm::stripDebugInfo(Function &F) {
     Changed = true;
     F.setSubprogram(nullptr);
   }
+
+  Function *Declare = F.getParent()->getFunction("llvm.dbg.declare");
+  Function *DbgVal = F.getParent()->getFunction("llvm.dbg.value");
   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() &&
+          (CI->getCalledFunction() == Declare ||
+           CI->getCalledFunction() == DbgVal)) {
+        CI->eraseFromParent();
+        Changed = true;
+      }
       if (I.getDebugLoc()) {
         Changed = true;
         I.setDebugLoc(DebugLoc());
@@ -261,26 +274,6 @@ bool llvm::stripDebugInfo(Function &F) {
 bool llvm::StripDebugInfo(Module &M) {
   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(),
          NME = M.named_metadata_end(); NMI != NME;) {
     NamedMDNode *NMD = &*NMI;
diff --git a/test/ThinLTO/X86/Inputs/drop-debug-info.bc b/test/ThinLTO/X86/Inputs/drop-debug-info.bc
new file mode 100644 (file)
index 0000000..fbb1c99
Binary files /dev/null and b/test/ThinLTO/X86/Inputs/drop-debug-info.bc differ
diff --git a/test/ThinLTO/X86/Inputs/drop-debug-info.ll b/test/ThinLTO/X86/Inputs/drop-debug-info.ll
new file mode 100644 (file)
index 0000000..82a728e
--- /dev/null
@@ -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()
diff --git a/test/ThinLTO/X86/drop-debug-info.ll b/test/ThinLTO/X86/drop-debug-info.ll
new file mode 100644 (file)
index 0000000..f8ed8df
--- /dev/null
@@ -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(...)
\ No newline at end of file
index 0470e9ac9bd8c6301951daad0ff42fd63d013834..cb6c26e9aa49ab68387952d10668c5e873a155f6 100644 (file)
@@ -1,6 +1,6 @@
 ; RUN: opt -strip-debug < %s -S | FileCheck %s
 
-; CHECK-NOT: llvm.dbg
+; CHECK-NOT: call void @llvm.dbg.value
 
 @x = common global i32 0                          ; <i32*> [#uses=0]