Change versioning to per debug info descriptor (merged with tag.)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28782 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jim Laskey 2006-06-14 14:45:39 +00:00
parent 014f98c7e5
commit ed4e566dda
2 changed files with 45 additions and 54 deletions

View File

@ -90,23 +90,35 @@ public:
/// ///
class DebugInfoDesc { class DebugInfoDesc {
private: private:
enum {
tag_mask = 0x0000ffff,
version_shift = 16
};
unsigned Tag; // Content indicator. Dwarf values are unsigned Tag; // Content indicator. Dwarf values are
// used but that does not limit use to // used but that does not limit use to
// Dwarf writers. // Dwarf writers.
protected: protected:
DebugInfoDesc(unsigned T) : Tag(T) {} DebugInfoDesc(unsigned T) : Tag(T | (LLVMDebugVersion << version_shift)) {}
public: public:
virtual ~DebugInfoDesc() {} virtual ~DebugInfoDesc() {}
// Accessors // Accessors
unsigned getTag() const { return Tag; } unsigned getTag() const { return Tag & tag_mask; }
unsigned getVersion() const { return Tag >> version_shift; }
/// TagFromGlobal - Returns the Tag number from a debug info descriptor /// TagFromGlobal - Returns the tag number from a debug info descriptor
/// GlobalVariable. Return DIIValid if operand is not an unsigned int. /// GlobalVariable. Return DIIValid if operand is not an unsigned int.
static unsigned TagFromGlobal(GlobalVariable *GV); static unsigned TagFromGlobal(GlobalVariable *GV);
/// VersionFromGlobal - Returns the version number from a debug info
/// descriptor GlobalVariable. Return DIIValid if operand is not an unsigned
/// int.
static unsigned VersionFromGlobal(GlobalVariable *GV);
/// DescFactory - Create an instance of debug info descriptor based on Tag. /// DescFactory - Create an instance of debug info descriptor based on Tag.
/// Return NULL if not a recognized Tag. /// Return NULL if not a recognized Tag.
static DebugInfoDesc *DescFactory(unsigned Tag); static DebugInfoDesc *DescFactory(unsigned Tag);
@ -216,7 +228,6 @@ public:
/// source/header file. /// source/header file.
class CompileUnitDesc : public AnchoredDesc { class CompileUnitDesc : public AnchoredDesc {
private: private:
unsigned DebugVersion; // LLVM debug version when produced.
unsigned Language; // Language number (ex. DW_LANG_C89.) unsigned Language; // Language number (ex. DW_LANG_C89.)
std::string FileName; // Source file name. std::string FileName; // Source file name.
std::string Directory; // Source file directory. std::string Directory; // Source file directory.
@ -227,7 +238,6 @@ public:
// Accessors // Accessors
unsigned getDebugVersion() const { return DebugVersion; }
unsigned getLanguage() const { return Language; } unsigned getLanguage() const { return Language; }
const std::string &getFileName() const { return FileName; } const std::string &getFileName() const { return FileName; }
const std::string &getDirectory() const { return Directory; } const std::string &getDirectory() const { return Directory; }
@ -243,10 +253,6 @@ public:
static bool classof(const CompileUnitDesc *) { return true; } static bool classof(const CompileUnitDesc *) { return true; }
static bool classof(const DebugInfoDesc *D); static bool classof(const DebugInfoDesc *D);
/// DebugVersionFromGlobal - Returns the version number from a compile unit
/// GlobalVariable. Return DIIValid if operand is not an unsigned int.
static unsigned DebugVersionFromGlobal(GlobalVariable *GV);
/// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc. /// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc.
/// ///
virtual void ApplyToFields(DIVisitor *Visitor); virtual void ApplyToFields(DIVisitor *Visitor);
@ -702,17 +708,13 @@ public:
/// into DebugInfoDesc objects. /// into DebugInfoDesc objects.
class DIDeserializer { class DIDeserializer {
private: private:
unsigned DebugVersion; // Version of debug information in use.
std::map<GlobalVariable *, DebugInfoDesc *> GlobalDescs; std::map<GlobalVariable *, DebugInfoDesc *> GlobalDescs;
// Previously defined gloabls. // Previously defined gloabls.
public: public:
DIDeserializer() : DebugVersion(LLVMDebugVersion) {} DIDeserializer() {}
~DIDeserializer() {} ~DIDeserializer() {}
// Accessors
unsigned getDebugVersion() const { return DebugVersion; }
/// Deserialize - Reconstitute a GlobalVariable into it's component /// Deserialize - Reconstitute a GlobalVariable into it's component
/// DebugInfoDesc objects. /// DebugInfoDesc objects.
DebugInfoDesc *Deserialize(Value *V); DebugInfoDesc *Deserialize(Value *V);
@ -780,14 +782,12 @@ private:
Invalid, Invalid,
Valid Valid
}; };
unsigned DebugVersion; // Version of debug information in use.
std::map<GlobalVariable *, unsigned> Validity;// Tracks prior results. std::map<GlobalVariable *, unsigned> Validity;// Tracks prior results.
std::map<unsigned, unsigned> Counts; // Count of fields per Tag type. std::map<unsigned, unsigned> Counts; // Count of fields per Tag type.
public: public:
DIVerifier() DIVerifier()
: DebugVersion(LLVMDebugVersion) : Validity()
, Validity()
, Counts() , Counts()
{} {}
~DIVerifier() {} ~DIVerifier() {}
@ -1039,15 +1039,10 @@ public:
std::vector<T *> AnchoredDescs; std::vector<T *> AnchoredDescs;
for (unsigned i = 0, N = Globals.size(); i < N; ++i) { for (unsigned i = 0, N = Globals.size(); i < N; ++i) {
GlobalVariable *GV = Globals[i]; GlobalVariable *GV = Globals[i];
unsigned Tag = DebugInfoDesc::TagFromGlobal(GV);
if (isa<CompileUnitDesc>(&Desc)) {
unsigned DebugVersion = CompileUnitDesc::DebugVersionFromGlobal(GV);
// FIXME - In the short term, changes are too drastic to continue. // FIXME - In the short term, changes are too drastic to continue.
if (DebugVersion != LLVMDebugVersion) break; if (DebugInfoDesc::TagFromGlobal(GV) == Desc.getTag() &&
} DebugInfoDesc::VersionFromGlobal(GV) == LLVMDebugVersion) {
if (Tag == Desc.getTag()) {
AnchoredDescs.push_back(cast<T>(DR.Deserialize(GV))); AnchoredDescs.push_back(cast<T>(DR.Deserialize(GV)));
} }
} }

View File

@ -455,11 +455,20 @@ public:
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
/// TagFromGlobal - Returns the Tag number from a debug info descriptor /// TagFromGlobal - Returns the tag number from a debug info descriptor
/// GlobalVariable. /// GlobalVariable. Return DIIValid if operand is not an unsigned int.
unsigned DebugInfoDesc::TagFromGlobal(GlobalVariable *GV) { unsigned DebugInfoDesc::TagFromGlobal(GlobalVariable *GV) {
ConstantUInt *C = getUIntOperand(GV, 0); ConstantUInt *C = getUIntOperand(GV, 0);
return C ? (unsigned)C->getValue() : (unsigned)DW_TAG_invalid; return C ? ((unsigned)C->getValue() & tag_mask) : (unsigned)DW_TAG_invalid;
}
/// VersionFromGlobal - Returns the version number from a debug info
/// descriptor GlobalVariable. Return DIIValid if operand is not an unsigned
/// int.
unsigned DebugInfoDesc::VersionFromGlobal(GlobalVariable *GV) {
ConstantUInt *C = getUIntOperand(GV, 0);
return C ? ((unsigned)C->getValue() >> version_shift) :
(unsigned)DW_TAG_invalid;
} }
/// DescFactory - Create an instance of debug info descriptor based on Tag. /// DescFactory - Create an instance of debug info descriptor based on Tag.
@ -563,6 +572,7 @@ const char *AnchorDesc::getTypeString() const {
#ifndef NDEBUG #ifndef NDEBUG
void AnchorDesc::dump() { void AnchorDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "AnchorTag(" << AnchorTag << ")\n"; << "AnchorTag(" << AnchorTag << ")\n";
} }
@ -589,7 +599,6 @@ void AnchoredDesc::ApplyToFields(DIVisitor *Visitor) {
CompileUnitDesc::CompileUnitDesc() CompileUnitDesc::CompileUnitDesc()
: AnchoredDesc(DW_TAG_compile_unit) : AnchoredDesc(DW_TAG_compile_unit)
, DebugVersion(LLVMDebugVersion)
, Language(0) , Language(0)
, FileName("") , FileName("")
, Directory("") , Directory("")
@ -601,19 +610,11 @@ bool CompileUnitDesc::classof(const DebugInfoDesc *D) {
return D->getTag() == DW_TAG_compile_unit; return D->getTag() == DW_TAG_compile_unit;
} }
/// DebugVersionFromGlobal - Returns the version number from a compile unit
/// GlobalVariable.
unsigned CompileUnitDesc::DebugVersionFromGlobal(GlobalVariable *GV) {
ConstantUInt *C = getUIntOperand(GV, 2);
return C ? (unsigned)C->getValue() : (unsigned)DW_TAG_invalid;
}
/// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc. /// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc.
/// ///
void CompileUnitDesc::ApplyToFields(DIVisitor *Visitor) { void CompileUnitDesc::ApplyToFields(DIVisitor *Visitor) {
AnchoredDesc::ApplyToFields(Visitor); AnchoredDesc::ApplyToFields(Visitor);
Visitor->Apply(DebugVersion);
Visitor->Apply(Language); Visitor->Apply(Language);
Visitor->Apply(FileName); Visitor->Apply(FileName);
Visitor->Apply(Directory); Visitor->Apply(Directory);
@ -642,9 +643,9 @@ const char *CompileUnitDesc::getAnchorString() const {
#ifndef NDEBUG #ifndef NDEBUG
void CompileUnitDesc::dump() { void CompileUnitDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Anchor(" << getAnchor() << "), " << "Anchor(" << getAnchor() << "), "
<< "DebugVersion(" << DebugVersion << "), "
<< "Language(" << Language << "), " << "Language(" << Language << "), "
<< "FileName(\"" << FileName << "\"), " << "FileName(\"" << FileName << "\"), "
<< "Directory(\"" << Directory << "\"), " << "Directory(\"" << Directory << "\"), "
@ -696,6 +697,7 @@ const char *TypeDesc::getTypeString() const {
#ifndef NDEBUG #ifndef NDEBUG
void TypeDesc::dump() { void TypeDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Context(" << Context << "), " << "Context(" << Context << "), "
<< "Name(\"" << Name << "\"), " << "Name(\"" << Name << "\"), "
@ -742,6 +744,7 @@ const char *BasicTypeDesc::getTypeString() const {
#ifndef NDEBUG #ifndef NDEBUG
void BasicTypeDesc::dump() { void BasicTypeDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Context(" << getContext() << "), " << "Context(" << getContext() << "), "
<< "Name(\"" << getName() << "\"), " << "Name(\"" << getName() << "\"), "
@ -799,6 +802,7 @@ const char *DerivedTypeDesc::getTypeString() const {
#ifndef NDEBUG #ifndef NDEBUG
void DerivedTypeDesc::dump() { void DerivedTypeDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Context(" << getContext() << "), " << "Context(" << getContext() << "), "
<< "Name(\"" << getName() << "\"), " << "Name(\"" << getName() << "\"), "
@ -853,6 +857,7 @@ const char *CompositeTypeDesc::getTypeString() const {
#ifndef NDEBUG #ifndef NDEBUG
void CompositeTypeDesc::dump() { void CompositeTypeDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Context(" << getContext() << "), " << "Context(" << getContext() << "), "
<< "Name(\"" << getName() << "\"), " << "Name(\"" << getName() << "\"), "
@ -901,6 +906,7 @@ const char *SubrangeDesc::getTypeString() const {
#ifndef NDEBUG #ifndef NDEBUG
void SubrangeDesc::dump() { void SubrangeDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Lo(" << Lo << "), " << "Lo(" << Lo << "), "
<< "Hi(" << Hi << ")\n"; << "Hi(" << Hi << ")\n";
@ -944,6 +950,7 @@ const char *EnumeratorDesc::getTypeString() const {
#ifndef NDEBUG #ifndef NDEBUG
void EnumeratorDesc::dump() { void EnumeratorDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Name(" << Name << "), " << "Name(" << Name << "), "
<< "Value(" << Value << ")\n"; << "Value(" << Value << ")\n";
@ -1005,6 +1012,7 @@ const char *VariableDesc::getTypeString() const {
#ifndef NDEBUG #ifndef NDEBUG
void VariableDesc::dump() { void VariableDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Context(" << Context << "), " << "Context(" << Context << "), "
<< "Name(\"" << Name << "\"), " << "Name(\"" << Name << "\"), "
@ -1087,6 +1095,7 @@ const char *GlobalVariableDesc::getAnchorString() const {
#ifndef NDEBUG #ifndef NDEBUG
void GlobalVariableDesc::dump() { void GlobalVariableDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Anchor(" << getAnchor() << "), " << "Anchor(" << getAnchor() << "), "
<< "Name(\"" << getName() << "\"), " << "Name(\"" << getName() << "\"), "
@ -1138,6 +1147,7 @@ const char *SubprogramDesc::getAnchorString() const {
#ifndef NDEBUG #ifndef NDEBUG
void SubprogramDesc::dump() { void SubprogramDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << "), " << "Tag(" << getTag() << "), "
<< "Anchor(" << getAnchor() << "), " << "Anchor(" << getAnchor() << "), "
<< "Name(\"" << getName() << "\"), " << "Name(\"" << getName() << "\"), "
@ -1184,6 +1194,7 @@ const char *BlockDesc::getTypeString() const {
#ifndef NDEBUG #ifndef NDEBUG
void BlockDesc::dump() { void BlockDesc::dump() {
std::cerr << getDescString() << " " std::cerr << getDescString() << " "
<< "Version(" << getVersion() << "), "
<< "Tag(" << getTag() << ")," << "Tag(" << getTag() << "),"
<< "Context(" << Context << ")\n"; << "Context(" << Context << ")\n";
} }
@ -1205,11 +1216,6 @@ DebugInfoDesc *DIDeserializer::Deserialize(GlobalVariable *GV) {
// Get the Tag from the global. // Get the Tag from the global.
unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); unsigned Tag = DebugInfoDesc::TagFromGlobal(GV);
// Get the debug version if a compile unit.
if (Tag == DW_TAG_compile_unit) {
DebugVersion = CompileUnitDesc::DebugVersionFromGlobal(GV);
}
// Create an empty instance of the correct sort. // Create an empty instance of the correct sort.
Slot = DebugInfoDesc::DescFactory(Tag); Slot = DebugInfoDesc::DescFactory(Tag);
@ -1366,16 +1372,6 @@ bool DIVerifier::Verify(GlobalVariable *GV) {
// Check for user defined descriptors. // Check for user defined descriptors.
if (Tag == DW_TAG_invalid) return true; if (Tag == DW_TAG_invalid) return true;
// If a compile unit we need the debug version.
if (Tag == DW_TAG_compile_unit) {
DebugVersion = CompileUnitDesc::DebugVersionFromGlobal(GV);
// FIXME - In the short term, changes are too drastic to continue.
if (DebugVersion != LLVMDebugVersion) {
ValiditySlot = Invalid;
return false;
}
}
// Construct an empty DebugInfoDesc. // Construct an empty DebugInfoDesc.
DebugInfoDesc *DD = DebugInfoDesc::DescFactory(Tag); DebugInfoDesc *DD = DebugInfoDesc::DescFactory(Tag);