mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-05 10:17:37 +00:00
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:
parent
bd6be6f52d
commit
98e0410f07
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
Loading…
Reference in New Issue
Block a user