From 98e0410f078185d54195d2594be3cb96e6e8ab5d Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Sun, 26 Mar 2006 22:45:20 +0000 Subject: [PATCH] How to be dumb on $5/day. Need a tri-state to track valid debug descriptors. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27154 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineDebugInfo.h | 17 ++++++--- lib/CodeGen/MachineDebugInfo.cpp | 51 +++++++++++++------------ 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/include/llvm/CodeGen/MachineDebugInfo.h b/include/llvm/CodeGen/MachineDebugInfo.h index e63fae3eea0..2e20e94e78f 100644 --- a/include/llvm/CodeGen/MachineDebugInfo.h +++ b/include/llvm/CodeGen/MachineDebugInfo.h @@ -773,16 +773,21 @@ public: /// GlobalVariables are valid as DebugInfoDesc objects. class DIVerifier { private: + enum { + Unknown = 0, + Invalid, + Valid + }; unsigned DebugVersion; // Version of debug information in use. - std::set Visited; // Tracks visits during recursion. + std::map Validity;// Tracks prior results. std::map Counts; // Count of fields per Tag type. - - /// markVisited - Return true if the GlobalVariable hase been "seen" before. - /// Mark markVisited otherwise. - bool markVisited(GlobalVariable *GV); public: - DIVerifier() : DebugVersion(LLVMDebugVersion) {} + DIVerifier() + : DebugVersion(LLVMDebugVersion) + , Validity() + , Counts() + {} ~DIVerifier() {} /// Verify - Return true if the GlobalVariable appears to be a valid diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp index d2b7f41cf92..83494ecc656 100644 --- a/lib/CodeGen/MachineDebugInfo.cpp +++ b/lib/CodeGen/MachineDebugInfo.cpp @@ -1320,30 +1320,24 @@ GlobalVariable *DISerializer::Serialize(DebugInfoDesc *DD) { //===----------------------------------------------------------------------===// -/// markVisited - Return true if the GlobalVariable hase been "seen" before. -/// Mark visited otherwise. -bool DIVerifier::markVisited(GlobalVariable *GV) { - // Check if the GlobalVariable is already in the Visited set. - std::set::iterator VI = Visited.lower_bound(GV); - - // See if GlobalVariable exists. - bool Exists = VI != Visited.end() && *VI == GV; - - // Insert in set. - if (!Exists) Visited.insert(VI, GV); - - return Exists; -} - /// Verify - Return true if the GlobalVariable appears to be a valid /// serialization of a DebugInfoDesc. bool DIVerifier::Verify(Value *V) { return Verify(getGlobalVariable(V)); } bool DIVerifier::Verify(GlobalVariable *GV) { - // Check if seen before. - if (markVisited(GV)) return true; + // NULLs are valid. + if (!GV) return true; + // Check prior validity. + unsigned &ValiditySlot = Validity[GV]; + + // If visited before then use old state. + if (ValiditySlot) return ValiditySlot == Valid; + + // Assume validity for the time being (recursion.) + ValiditySlot = Valid; + // Get the Tag unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); @@ -1354,7 +1348,10 @@ bool DIVerifier::Verify(GlobalVariable *GV) { if (Tag == DW_TAG_compile_unit) { DebugVersion = CompileUnitDesc::DebugVersionFromGlobal(GV); // FIXME - In the short term, changes are too drastic to continue. - if (DebugVersion != LLVMDebugVersion) return false; + if (DebugVersion != LLVMDebugVersion) { + ValiditySlot = Invalid; + return false; + } } // Construct an empty DebugInfoDesc. @@ -1370,17 +1367,18 @@ bool DIVerifier::Verify(GlobalVariable *GV) { unsigned N = CI->getNumOperands(); // Get the field count. - unsigned &Slot = Counts[Tag]; - if (!Slot) { + unsigned &CountSlot = Counts[Tag]; + if (!CountSlot) { // Check the operand count to the field count DICountVisitor CTAM; CTAM.ApplyToFields(DD); - Slot = CTAM.getCount(); + CountSlot = CTAM.getCount(); } // Field count must be at most equal operand count. - if (Slot > N) { + if (CountSlot > N) { delete DD; + ValiditySlot = Invalid; return false; } @@ -1391,8 +1389,13 @@ bool DIVerifier::Verify(GlobalVariable *GV) { // Release empty DebugInfoDesc. delete DD; - // Return result of field tests. - return VRAM.isValid(); + // If fields are not valid. + if (!VRAM.isValid()) { + ValiditySlot = Invalid; + return false; + } + + return true; } //===----------------------------------------------------------------------===//