From f0a7a1a1171744e2882a68cc40cf1c62dfc2a8b9 Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Wed, 14 Jun 2006 14:45:39 +0000 Subject: [PATCH] Change versioning to per debug info descriptor (merged with tag.) llvm-svn: 28782 --- llvm/include/llvm/CodeGen/MachineDebugInfo.h | 47 ++++++++---------- llvm/lib/CodeGen/MachineDebugInfo.cpp | 52 +++++++++----------- 2 files changed, 45 insertions(+), 54 deletions(-) diff --git a/llvm/include/llvm/CodeGen/MachineDebugInfo.h b/llvm/include/llvm/CodeGen/MachineDebugInfo.h index 0a95f4b235ba..8a7160caca24 100644 --- a/llvm/include/llvm/CodeGen/MachineDebugInfo.h +++ b/llvm/include/llvm/CodeGen/MachineDebugInfo.h @@ -90,23 +90,35 @@ public: /// class DebugInfoDesc { private: + enum { + tag_mask = 0x0000ffff, + version_shift = 16 + }; + + unsigned Tag; // Content indicator. Dwarf values are // used but that does not limit use to // Dwarf writers. protected: - DebugInfoDesc(unsigned T) : Tag(T) {} + DebugInfoDesc(unsigned T) : Tag(T | (LLVMDebugVersion << version_shift)) {} public: virtual ~DebugInfoDesc() {} // 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 - /// GlobalVariable. Return DIIValid if operand is not an unsigned int. + /// TagFromGlobal - Returns the tag number from a debug info descriptor + /// GlobalVariable. Return DIIValid if operand is not an unsigned int. 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. /// Return NULL if not a recognized Tag. static DebugInfoDesc *DescFactory(unsigned Tag); @@ -216,7 +228,6 @@ public: /// source/header file. class CompileUnitDesc : public AnchoredDesc { private: - unsigned DebugVersion; // LLVM debug version when produced. unsigned Language; // Language number (ex. DW_LANG_C89.) std::string FileName; // Source file name. std::string Directory; // Source file directory. @@ -227,7 +238,6 @@ public: // Accessors - unsigned getDebugVersion() const { return DebugVersion; } unsigned getLanguage() const { return Language; } const std::string &getFileName() const { return FileName; } const std::string &getDirectory() const { return Directory; } @@ -243,10 +253,6 @@ public: static bool classof(const CompileUnitDesc *) { return true; } 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. /// virtual void ApplyToFields(DIVisitor *Visitor); @@ -702,17 +708,13 @@ public: /// into DebugInfoDesc objects. class DIDeserializer { private: - unsigned DebugVersion; // Version of debug information in use. std::map GlobalDescs; // Previously defined gloabls. public: - DIDeserializer() : DebugVersion(LLVMDebugVersion) {} + DIDeserializer() {} ~DIDeserializer() {} - // Accessors - unsigned getDebugVersion() const { return DebugVersion; } - /// Deserialize - Reconstitute a GlobalVariable into it's component /// DebugInfoDesc objects. DebugInfoDesc *Deserialize(Value *V); @@ -780,14 +782,12 @@ private: Invalid, Valid }; - unsigned DebugVersion; // Version of debug information in use. std::map Validity;// Tracks prior results. std::map Counts; // Count of fields per Tag type. public: DIVerifier() - : DebugVersion(LLVMDebugVersion) - , Validity() + : Validity() , Counts() {} ~DIVerifier() {} @@ -1039,15 +1039,10 @@ public: std::vector AnchoredDescs; for (unsigned i = 0, N = Globals.size(); i < N; ++i) { GlobalVariable *GV = Globals[i]; - unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); - if (isa(&Desc)) { - unsigned DebugVersion = CompileUnitDesc::DebugVersionFromGlobal(GV); - // FIXME - In the short term, changes are too drastic to continue. - if (DebugVersion != LLVMDebugVersion) break; - } - - if (Tag == Desc.getTag()) { + // FIXME - In the short term, changes are too drastic to continue. + if (DebugInfoDesc::TagFromGlobal(GV) == Desc.getTag() && + DebugInfoDesc::VersionFromGlobal(GV) == LLVMDebugVersion) { AnchoredDescs.push_back(cast(DR.Deserialize(GV))); } } diff --git a/llvm/lib/CodeGen/MachineDebugInfo.cpp b/llvm/lib/CodeGen/MachineDebugInfo.cpp index 09d0d2b08085..fcdf30d9c965 100644 --- a/llvm/lib/CodeGen/MachineDebugInfo.cpp +++ b/llvm/lib/CodeGen/MachineDebugInfo.cpp @@ -455,11 +455,20 @@ public: //===----------------------------------------------------------------------===// -/// TagFromGlobal - Returns the Tag number from a debug info descriptor -/// GlobalVariable. +/// TagFromGlobal - Returns the tag number from a debug info descriptor +/// GlobalVariable. Return DIIValid if operand is not an unsigned int. unsigned DebugInfoDesc::TagFromGlobal(GlobalVariable *GV) { 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. @@ -563,6 +572,7 @@ const char *AnchorDesc::getTypeString() const { #ifndef NDEBUG void AnchorDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "AnchorTag(" << AnchorTag << ")\n"; } @@ -589,7 +599,6 @@ void AnchoredDesc::ApplyToFields(DIVisitor *Visitor) { CompileUnitDesc::CompileUnitDesc() : AnchoredDesc(DW_TAG_compile_unit) -, DebugVersion(LLVMDebugVersion) , Language(0) , FileName("") , Directory("") @@ -601,19 +610,11 @@ bool CompileUnitDesc::classof(const DebugInfoDesc *D) { 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. /// void CompileUnitDesc::ApplyToFields(DIVisitor *Visitor) { AnchoredDesc::ApplyToFields(Visitor); - Visitor->Apply(DebugVersion); Visitor->Apply(Language); Visitor->Apply(FileName); Visitor->Apply(Directory); @@ -642,9 +643,9 @@ const char *CompileUnitDesc::getAnchorString() const { #ifndef NDEBUG void CompileUnitDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Anchor(" << getAnchor() << "), " - << "DebugVersion(" << DebugVersion << "), " << "Language(" << Language << "), " << "FileName(\"" << FileName << "\"), " << "Directory(\"" << Directory << "\"), " @@ -696,6 +697,7 @@ const char *TypeDesc::getTypeString() const { #ifndef NDEBUG void TypeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << Context << "), " << "Name(\"" << Name << "\"), " @@ -742,6 +744,7 @@ const char *BasicTypeDesc::getTypeString() const { #ifndef NDEBUG void BasicTypeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << getContext() << "), " << "Name(\"" << getName() << "\"), " @@ -799,6 +802,7 @@ const char *DerivedTypeDesc::getTypeString() const { #ifndef NDEBUG void DerivedTypeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << getContext() << "), " << "Name(\"" << getName() << "\"), " @@ -853,6 +857,7 @@ const char *CompositeTypeDesc::getTypeString() const { #ifndef NDEBUG void CompositeTypeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << getContext() << "), " << "Name(\"" << getName() << "\"), " @@ -901,6 +906,7 @@ const char *SubrangeDesc::getTypeString() const { #ifndef NDEBUG void SubrangeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Lo(" << Lo << "), " << "Hi(" << Hi << ")\n"; @@ -944,6 +950,7 @@ const char *EnumeratorDesc::getTypeString() const { #ifndef NDEBUG void EnumeratorDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Name(" << Name << "), " << "Value(" << Value << ")\n"; @@ -1005,6 +1012,7 @@ const char *VariableDesc::getTypeString() const { #ifndef NDEBUG void VariableDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << Context << "), " << "Name(\"" << Name << "\"), " @@ -1087,6 +1095,7 @@ const char *GlobalVariableDesc::getAnchorString() const { #ifndef NDEBUG void GlobalVariableDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Anchor(" << getAnchor() << "), " << "Name(\"" << getName() << "\"), " @@ -1138,6 +1147,7 @@ const char *SubprogramDesc::getAnchorString() const { #ifndef NDEBUG void SubprogramDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Anchor(" << getAnchor() << "), " << "Name(\"" << getName() << "\"), " @@ -1184,6 +1194,7 @@ const char *BlockDesc::getTypeString() const { #ifndef NDEBUG void BlockDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << ")," << "Context(" << Context << ")\n"; } @@ -1205,11 +1216,6 @@ DebugInfoDesc *DIDeserializer::Deserialize(GlobalVariable *GV) { // Get the Tag from the global. 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. Slot = DebugInfoDesc::DescFactory(Tag); @@ -1366,16 +1372,6 @@ bool DIVerifier::Verify(GlobalVariable *GV) { // Check for user defined descriptors. 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. DebugInfoDesc *DD = DebugInfoDesc::DescFactory(Tag);