[llvm] r268832 - Refactor stripDebugInfo(Function) to handle intrinsic

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Fri May 6 18:42:36 PDT 2016


Author: mehdi_amini
Date: Fri May  6 20:42:36 2016
New Revision: 268832

URL: http://llvm.org/viewvc/llvm-project?rev=268832&view=rev
Log:
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 at apple.com>

Added:
    llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.bc
    llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.ll
    llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll
Modified:
    llvm/trunk/lib/IR/DebugInfo.cpp

Modified: llvm/trunk/lib/IR/DebugInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=268832&r1=268831&r2=268832&view=diff
==============================================================================
--- llvm/trunk/lib/IR/DebugInfo.cpp (original)
+++ llvm/trunk/lib/IR/DebugInfo.cpp Fri May  6 20:42:36 2016
@@ -247,8 +247,20 @@ 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() == Declare ||
+                 CI->getCalledFunction() == DbgVal)) {
+        CI->eraseFromParent();
+        Changed = true;
+      }
       if (I.getDebugLoc()) {
         Changed = true;
         I.setDebugLoc(DebugLoc());
@@ -261,26 +273,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;

Added: llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.bc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.bc?rev=268832&view=auto
==============================================================================
Binary files llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.bc (added) and llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.bc Fri May  6 20:42:36 2016 differ

Added: llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.ll?rev=268832&view=auto
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.ll (added)
+++ llvm/trunk/test/ThinLTO/X86/Inputs/drop-debug-info.ll Fri May  6 20:42:36 2016
@@ -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"
+
+
+ at 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()

Added: llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll?rev=268832&view=auto
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll (added)
+++ llvm/trunk/test/ThinLTO/X86/drop-debug-info.ll Fri May  6 20:42:36 2016
@@ -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




More information about the llvm-commits mailing list