How to be dumb on $5/day. Need a tri-state to track valid debug descriptors.
authorJim Laskey <jlaskey@mac.com>
Sun, 26 Mar 2006 22:45:20 +0000 (22:45 +0000)
committerJim Laskey <jlaskey@mac.com>
Sun, 26 Mar 2006 22:45:20 +0000 (22:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27154 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineDebugInfo.h
lib/CodeGen/MachineDebugInfo.cpp

index e63fae3eea0a3bef5e26bfab29747db520fe6dcd..2e20e94e78fcd64697b7005321c81ca84bfa7464 100644 (file)
@@ -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<GlobalVariable *> Visited;   // Tracks visits during recursion.
+  std::map<GlobalVariable *, unsigned> Validity;// Tracks prior results.
   std::map<unsigned, unsigned> 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
index d2b7f41cf929ae195c9f2ec73f53f9c1440c7df7..83494ecc6560395c6c8e68736d53174560c3d7b8 100644 (file)
@@ -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<GlobalVariable *>::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;
 }
 
 //===----------------------------------------------------------------------===//