summaryrefslogtreecommitdiff
path: root/lib/IR
diff options
context:
space:
mode:
authorManman Ren <mren@apple.com>2013-07-19 00:31:03 +0000
committerManman Ren <mren@apple.com>2013-07-19 00:31:03 +0000
commitcd26257c85ba52d83b3febcef5c40c5153836062 (patch)
tree5dbd1c12a02dafa666fa40681fd1ca14598929c6 /lib/IR
parent4e3898056e1aaa8eaaf829cda578651667878843 (diff)
downloadllvm-cd26257c85ba52d83b3febcef5c40c5153836062.tar.gz
llvm-cd26257c85ba52d83b3febcef5c40c5153836062.tar.bz2
llvm-cd26257c85ba52d83b3febcef5c40c5153836062.tar.xz
Debug Info: enable verifying by default and disable testing cases that fail.
1> Use DebugInfoFinder to find debug info MDNodes. 2> Add disable-debug-info-verifier to disable verifying debug info. 3> Disable verifying for testing cases that fail (will update the testing cases later on). 4> MDNodes generated by clang can have empty filename for TAG_inheritance and TAG_friend, so DIType::Verify is modified accordingly. Note that DebugInfoFinder does not list all debug info MDNode. For example, clang can generate: metadata !{i32 786468}, which will fail to verify. This MDNode is used by debug info but not included in DebugInfoFinder. This MDNode is generated as a temporary node in DIBuilder::createFunction Value *TElts[] = { GetTagConstant(VMContext, DW_TAG_base_type) }; MDNode::getTemporary(VMContext, TElts) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186634 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/IR')
-rw-r--r--lib/IR/DebugInfo.cpp2
-rw-r--r--lib/IR/Verifier.cpp32
2 files changed, 34 insertions, 0 deletions
diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp
index 25d4ea4fc2..19de781177 100644
--- a/lib/IR/DebugInfo.cpp
+++ b/lib/IR/DebugInfo.cpp
@@ -459,6 +459,8 @@ bool DIType::Verify() const {
Tag != dwarf::DW_TAG_array_type &&
Tag != dwarf::DW_TAG_enumeration_type &&
Tag != dwarf::DW_TAG_subroutine_type &&
+ Tag != dwarf::DW_TAG_inheritance &&
+ Tag != dwarf::DW_TAG_friend &&
getFilename().empty())
return false;
return true;
diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp
index 420bc1507e..6a7f45f628 100644
--- a/lib/IR/Verifier.cpp
+++ b/lib/IR/Verifier.cpp
@@ -53,6 +53,7 @@
#include "llvm/ADT/StringExtras.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Assembly/Writer.h"
+#include "llvm/DebugInfo.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
@@ -66,6 +67,7 @@
#include "llvm/PassManager.h"
#include "llvm/Support/CFG.h"
#include "llvm/Support/CallSite.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ConstantRange.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
@@ -74,6 +76,9 @@
#include <cstdarg>
using namespace llvm;
+static cl::opt<bool> DisableDebugInfoVerifier("disable-debug-info-verifier",
+ cl::init(false));
+
namespace { // Anonymous namespace for class
struct PreVerifier : public FunctionPass {
static char ID; // Pass ID, replacement for typeid
@@ -202,6 +207,9 @@ namespace {
visitModuleFlags(M);
+ // Verify Debug Info.
+ verifyDebugInfo(M);
+
// If the module is broken, abort at this time.
return abortIfBroken();
}
@@ -309,6 +317,8 @@ namespace {
void VerifyFunctionAttrs(FunctionType *FT, AttributeSet Attrs,
const Value *V);
+ void verifyDebugInfo(Module &M);
+
void WriteValue(const Value *V) {
if (!V) return;
if (isa<Instruction>(V)) {
@@ -2185,6 +2195,28 @@ 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(),
+ E = Finder.compile_unit_end(); I != E; ++I)
+ Assert1(DICompileUnit(*I).Verify(), "DICompileUnit does not Verify!", *I);
+ for (DebugInfoFinder::iterator I = Finder.subprogram_begin(),
+ E = Finder.subprogram_end(); I != E; ++I)
+ Assert1(DISubprogram(*I).Verify(), "DISubprogram does not Verify!", *I);
+ for (DebugInfoFinder::iterator I = Finder.global_variable_begin(),
+ E = Finder.global_variable_end(); I != E; ++I)
+ Assert1(DIGlobalVariable(*I).Verify(),
+ "DIGlobalVariable does not Verify!", *I);
+ for (DebugInfoFinder::iterator I = Finder.type_begin(),
+ E = Finder.type_end(); I != E; ++I)
+ Assert1(DIType(*I).Verify(), "DIType does not Verify!", *I);
+ }
+}
+
//===----------------------------------------------------------------------===//
// Implement the public interfaces to this file...
//===----------------------------------------------------------------------===//