Change versioning to per debug info descriptor (merged with tag.)
authorJim Laskey <jlaskey@mac.com>
Wed, 14 Jun 2006 14:45:39 +0000 (14:45 +0000)
committerJim Laskey <jlaskey@mac.com>
Wed, 14 Jun 2006 14:45:39 +0000 (14:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28782 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 0a95f4b235ba7ad2eff273dbb405c360e26746bc..8a7160caca245b004254f430bb353351a2a7b083 100644 (file)
@@ -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<GlobalVariable *, DebugInfoDesc *> 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<GlobalVariable *, unsigned> Validity;// Tracks prior results.
   std::map<unsigned, unsigned> Counts;  // Count of fields per Tag type.
   
 public:
   DIVerifier()
-  : DebugVersion(LLVMDebugVersion)
-  , Validity()
+  : Validity()
   , Counts()
   {}
   ~DIVerifier() {}
@@ -1039,15 +1039,10 @@ public:
     std::vector<T *> AnchoredDescs;
     for (unsigned i = 0, N = Globals.size(); i < N; ++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.
-        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<T>(DR.Deserialize(GV)));
       }
     }
index 09d0d2b08085ec7365137d41f4d7ed60e7d05dc5..fcdf30d9c9652d26048aa4aa16aee9ff362a0e18 100644 (file)
@@ -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);