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
This commit is contained in:
Jim Laskey 2006-03-26 22:45:20 +00:00
parent bd6be6f52d
commit 98e0410f07
2 changed files with 38 additions and 30 deletions

View 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

View 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;
}
//===----------------------------------------------------------------------===//