From 0e29eeec278d80048de6cf6605e004bbdefaf38c Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Tue, 23 Jul 2013 00:22:51 +0000 Subject: [PATCH] Debug Info Finder: use processDeclare and processValue to list debug info MDNodes used by DbgDeclareInst and DbgValueInst. Another 16 testing cases failed and they are disabled with -disable-debug-info-verifier. A total of 34 cases are disabled with -disable-debug-info-verifier and will be corrected. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186902 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo.h | 15 ++++++++++--- lib/IR/DebugInfo.cpp | 22 +++++++++++++++++++ lib/IR/Verifier.cpp | 15 ++++++++++++- test/Assembler/functionlocal-metadata.ll | 2 +- .../ARM/2010-04-15-ScavengerDebugValue.ll | 2 +- test/CodeGen/ARM/debug-info-blocks.ll | 2 +- test/CodeGen/X86/2010-02-01-DbgValueCrash.ll | 2 +- .../CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll | 4 ++-- test/CodeGen/X86/2010-11-02-DbgParameter.ll | 2 +- test/CodeGen/X86/dbg-declare-arg.ll | 2 +- .../2010-03-30-InvalidDbgInfoCrash.ll | 2 +- test/DebugInfo/2010-05-03-DisableFramePtr.ll | 2 +- test/DebugInfo/2010-05-03-OriginDIE.ll | 2 +- test/DebugInfo/2010-10-01-crash.ll | 2 +- test/DebugInfo/X86/earlydup-crash.ll | 2 +- test/DebugInfo/X86/pr12831.ll | 2 +- test/DebugInfo/inheritance.ll | 2 +- test/Linker/2011-08-18-unique-class-type.ll | 2 +- test/Transforms/LoopRotate/dbgvalue.ll | 2 +- 19 files changed, 65 insertions(+), 21 deletions(-) diff --git a/include/llvm/DebugInfo.h b/include/llvm/DebugInfo.h index d05b3287443..53b1bdd5605 100644 --- a/include/llvm/DebugInfo.h +++ b/include/llvm/DebugInfo.h @@ -31,6 +31,7 @@ namespace llvm { class Type; class Value; class DbgDeclareInst; + class DbgValueInst; class Instruction; class MDNode; class NamedMDNode; @@ -734,12 +735,23 @@ namespace llvm { /// cleanseInlinedVariable - Remove inlined scope from the variable. DIVariable cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext); + /// DebugInfoFinder tries to list all debug info MDNodes in a module. To + /// list debug info MDNodes used by an instruction, DebugInfoFinder uses + /// processDeclare and processValue. processModule will go through + /// all DICompileUnits and list debug info MDNodes used by the CUs. class DebugInfoFinder { public: /// processModule - Process entire module and collect debug info /// anchors. void processModule(const Module &M); + /// processDeclare - Process DbgDeclareInst. + void processDeclare(const DbgDeclareInst *DDI); + /// Process DbgValueInst. + void processValue(const DbgValueInst *DVI); + + /// Clear all lists. + void reset(); private: /// processType - Process DIType. void processType(DIType DT); @@ -750,9 +762,6 @@ namespace llvm { /// processSubprogram - Process DISubprogram. void processSubprogram(DISubprogram SP); - /// processDeclare - Process DbgDeclareInst. - void processDeclare(const DbgDeclareInst *DDI); - /// processLocation - Process DILocation. void processLocation(DILocation Loc); diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index f63fa1a22d0..9d88ce0e50b 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -847,6 +847,15 @@ bool llvm::isSubprogramContext(const MDNode *Context) { // DebugInfoFinder implementations. //===----------------------------------------------------------------------===// +void DebugInfoFinder::reset() { + CUs.clear(); + SPs.clear(); + GVs.clear(); + TYs.clear(); + Scopes.clear(); + NodesSeen.clear(); +} + /// processModule - Process entire module and collect debug info. void DebugInfoFinder::processModule(const Module &M) { if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) { @@ -970,6 +979,19 @@ void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) { processType(DIVariable(N).getType()); } +void DebugInfoFinder::processValue(const DbgValueInst *DVI) { + MDNode *N = dyn_cast(DVI->getVariable()); + if (!N) return; + + DIDescriptor DV(N); + if (!DV.isVariable()) + return; + + if (!NodesSeen.insert(DV)) + return; + processType(DIVariable(N).getType()); +} + /// addType - Add type into Tys. bool DebugInfoFinder::addType(DIType DT) { if (!DT.isValid()) diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index fa53a4ee694..b22d2117722 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -147,6 +147,9 @@ namespace { /// the same personality function. const Value *PersonalityFn; + /// Finder keeps track of all debug info MDNodes in a Module. + DebugInfoFinder Finder; + Verifier() : FunctionPass(ID), Broken(false), action(AbortProcessAction), Mod(0), Context(0), DT(0), @@ -162,6 +165,7 @@ namespace { bool doInitialization(Module &M) { Mod = &M; Context = &M.getContext(); + Finder.reset(); // We must abort before returning back to the pass manager, or else the // pass manager may try to run other passes on the broken module. @@ -2144,7 +2148,17 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) { MDNode *MD = cast(CI.getArgOperand(0)); Assert1(MD->getNumOperands() == 1, "invalid llvm.dbg.declare intrinsic call 2", &CI); + if (!DisableDebugInfoVerifier) + Finder.processDeclare(cast(&CI)); } break; + case Intrinsic::dbg_value: { //llvm.dbg.value + if (!DisableDebugInfoVerifier) { + Assert1(CI.getArgOperand(0) && isa(CI.getArgOperand(0)), + "invalid llvm.dbg.value intrinsic call 1", &CI); + Finder.processValue(cast(&CI)); + } + break; + } case Intrinsic::memcpy: case Intrinsic::memmove: case Intrinsic::memset: @@ -2209,7 +2223,6 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) { void Verifier::verifyDebugInfo(Module &M) { // Verify Debug Info. if (!DisableDebugInfoVerifier) { - DebugInfoFinder Finder; Finder.processModule(M); for (DebugInfoFinder::iterator I = Finder.compile_unit_begin(), diff --git a/test/Assembler/functionlocal-metadata.ll b/test/Assembler/functionlocal-metadata.ll index 216587d98a7..5b815742298 100644 --- a/test/Assembler/functionlocal-metadata.ll +++ b/test/Assembler/functionlocal-metadata.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llvm-dis | FileCheck %s +; RUN: llvm-as -disable-debug-info-verifier < %s | llvm-dis | FileCheck %s define void @Foo(i32 %a, i32 %b) { entry: diff --git a/test/CodeGen/ARM/2010-04-15-ScavengerDebugValue.ll b/test/CodeGen/ARM/2010-04-15-ScavengerDebugValue.ll index 05581c3f16c..016e827f42f 100644 --- a/test/CodeGen/ARM/2010-04-15-ScavengerDebugValue.ll +++ b/test/CodeGen/ARM/2010-04-15-ScavengerDebugValue.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s +; RUN: llc -disable-debug-info-verifier < %s ; PR6847 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:64-n32" target triple = "armv4t-apple-darwin10" diff --git a/test/CodeGen/ARM/debug-info-blocks.ll b/test/CodeGen/ARM/debug-info-blocks.ll index fc21860cd53..9942a6e5d15 100644 --- a/test/CodeGen/ARM/debug-info-blocks.ll +++ b/test/CodeGen/ARM/debug-info-blocks.ll @@ -1,4 +1,4 @@ -; RUN: llc -O0 < %s | FileCheck %s +; RUN: llc -O0 -disable-debug-info-verifier < %s | FileCheck %s ; CHECK: @DEBUG_VALUE: mydata <- [SP+{{[0-9]+}}] ; Radar 9331779 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32" diff --git a/test/CodeGen/X86/2010-02-01-DbgValueCrash.ll b/test/CodeGen/X86/2010-02-01-DbgValueCrash.ll index 2113263c0ac..eda25c10fbc 100644 --- a/test/CodeGen/X86/2010-02-01-DbgValueCrash.ll +++ b/test/CodeGen/X86/2010-02-01-DbgValueCrash.ll @@ -1,4 +1,4 @@ -; RUN: llc -O1 < %s +; RUN: llc -O1 -disable-debug-info-verifier < %s ; ModuleID = 'pr6157.bc' ; formerly crashed in SelectionDAGBuilder diff --git a/test/CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll b/test/CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll index 25223ca1cbd..b85754542fb 100644 --- a/test/CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll +++ b/test/CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll @@ -1,5 +1,5 @@ -; RUN: llc -O2 < %s | FileCheck %s -; RUN: llc -O2 -regalloc=basic < %s | FileCheck %s +; RUN: llc -O2 -disable-debug-info-verifier < %s | FileCheck %s +; RUN: llc -O2 -regalloc=basic -disable-debug-info-verifier < %s | FileCheck %s ; Test to check that unused argument 'this' is not undefined in debug info. target triple = "x86_64-apple-darwin10.2" diff --git a/test/CodeGen/X86/2010-11-02-DbgParameter.ll b/test/CodeGen/X86/2010-11-02-DbgParameter.ll index 8719f738b7c..11775d23f4f 100644 --- a/test/CodeGen/X86/2010-11-02-DbgParameter.ll +++ b/test/CodeGen/X86/2010-11-02-DbgParameter.ll @@ -1,4 +1,4 @@ -; RUN: llc -O2 -asm-verbose < %s | FileCheck %s +; RUN: llc -O2 -disable-debug-info-verifier -asm-verbose < %s | FileCheck %s ; Radar 8616981 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" diff --git a/test/CodeGen/X86/dbg-declare-arg.ll b/test/CodeGen/X86/dbg-declare-arg.ll index f7e0c91cdff..81efe8ea65b 100644 --- a/test/CodeGen/X86/dbg-declare-arg.ll +++ b/test/CodeGen/X86/dbg-declare-arg.ll @@ -1,4 +1,4 @@ -; RUN: llc -O0 -fast-isel=false < %s | FileCheck %s +; RUN: llc -O0 -fast-isel=false -disable-debug-info-verifier < %s | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-macosx10.6.7" ;Radar 9321650 diff --git a/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll b/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll index accdf8a86cb..d31c128013b 100644 --- a/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll +++ b/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -o /dev/null +; RUN: llc -disable-debug-info-verifier < %s -o /dev/null define void @baz(i32 %i) nounwind ssp { entry: diff --git a/test/DebugInfo/2010-05-03-DisableFramePtr.ll b/test/DebugInfo/2010-05-03-DisableFramePtr.ll index 4061bdc834d..27c7e192a77 100644 --- a/test/DebugInfo/2010-05-03-DisableFramePtr.ll +++ b/test/DebugInfo/2010-05-03-DisableFramePtr.ll @@ -1,4 +1,4 @@ -; RUN: llc -o /dev/null -disable-non-leaf-fp-elim < %s +; RUN: llc -disable-debug-info-verifier -o /dev/null -disable-non-leaf-fp-elim < %s ; Radar 7937664 %struct.AppleEvent = type opaque diff --git a/test/DebugInfo/2010-05-03-OriginDIE.ll b/test/DebugInfo/2010-05-03-OriginDIE.ll index 1ade0450463..c9ace896c7c 100644 --- a/test/DebugInfo/2010-05-03-OriginDIE.ll +++ b/test/DebugInfo/2010-05-03-OriginDIE.ll @@ -1,5 +1,5 @@ -;RUN: llc < %s -o /dev/null +;RUN: llc -disable-debug-info-verifier < %s -o /dev/null ;Radar 7937109 %struct.anon = type { i64, i32, i32, i32, [1 x i32] } diff --git a/test/DebugInfo/2010-10-01-crash.ll b/test/DebugInfo/2010-10-01-crash.ll index c4161b49426..ed6ea0480f4 100644 --- a/test/DebugInfo/2010-10-01-crash.ll +++ b/test/DebugInfo/2010-10-01-crash.ll @@ -1,4 +1,4 @@ -; RUN: llc -O0 %s -o /dev/null +; RUN: llc -O0 -disable-debug-info-verifier %s -o /dev/null ; XFAIL: hexagon ; PR 8235 diff --git a/test/DebugInfo/X86/earlydup-crash.ll b/test/DebugInfo/X86/earlydup-crash.ll index 5bd0c7e0bb7..2ac8b2eed17 100644 --- a/test/DebugInfo/X86/earlydup-crash.ll +++ b/test/DebugInfo/X86/earlydup-crash.ll @@ -1,4 +1,4 @@ -; RUN: llc %s -mtriple=i386-apple-macosx10.6.7 -o /dev/null +; RUN: llc -disable-debug-info-verifier %s -mtriple=i386-apple-macosx10.6.7 -o /dev/null ; This used to crash because early dup was not ignoring debug instructions. diff --git a/test/DebugInfo/X86/pr12831.ll b/test/DebugInfo/X86/pr12831.ll index 295c018c5e1..43fd53814ff 100644 --- a/test/DebugInfo/X86/pr12831.ll +++ b/test/DebugInfo/X86/pr12831.ll @@ -1,4 +1,4 @@ -; RUN: llc %s -mtriple=x86_64-unknown-linux-gnu -o /dev/null +; RUN: llc -disable-debug-info-verifier %s -mtriple=x86_64-unknown-linux-gnu -o /dev/null target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/DebugInfo/inheritance.ll b/test/DebugInfo/inheritance.ll index a689cb22818..24eb79ea612 100644 --- a/test/DebugInfo/inheritance.ll +++ b/test/DebugInfo/inheritance.ll @@ -1,4 +1,4 @@ -; RUN: llc %s -o /dev/null +; RUN: llc -disable-debug-info-verifier %s -o /dev/null ; PR 2613. %struct.__class_type_info_pseudo = type { %struct.__type_info_pseudo } diff --git a/test/Linker/2011-08-18-unique-class-type.ll b/test/Linker/2011-08-18-unique-class-type.ll index 328e83bd07b..65b5a0acca5 100644 --- a/test/Linker/2011-08-18-unique-class-type.ll +++ b/test/Linker/2011-08-18-unique-class-type.ll @@ -1,4 +1,4 @@ -; RUN: llvm-link %s %p/2011-08-18-unique-class-type2.ll -S -o - | FileCheck %s +; RUN: llvm-link -disable-debug-info-verifier %s %p/2011-08-18-unique-class-type2.ll -S -o - | FileCheck %s ; CHECK: DW_TAG_class_type ; CHECK-NOT: DW_TAG_class_type ; Test to check there is only one MDNode for class A after linking. diff --git a/test/Transforms/LoopRotate/dbgvalue.ll b/test/Transforms/LoopRotate/dbgvalue.ll index f4b6184604e..8b9e2ba52e2 100644 --- a/test/Transforms/LoopRotate/dbgvalue.ll +++ b/test/Transforms/LoopRotate/dbgvalue.ll @@ -1,4 +1,4 @@ -; RUN: opt -S -loop-rotate < %s | FileCheck %s +; RUN: opt -S -loop-rotate -disable-debug-info-verifier < %s | FileCheck %s declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone