Use a std::map so that we record the group ID.
authorBill Wendling <isanbard@gmail.com>
Mon, 11 Feb 2013 22:32:29 +0000 (22:32 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 11 Feb 2013 22:32:29 +0000 (22:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174910 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bitcode/Reader/BitcodeReader.cpp
lib/Bitcode/Reader/BitcodeReader.h

index 30ba85eca61b351c39a719901448a89100a9afb6..476c68a6c0a3895ba6f702f50afb08d107ed45b9 100644 (file)
@@ -531,8 +531,7 @@ bool BitcodeReader::ParseAttributeGroupBlock() {
       if (Record.size() < 3)
         return Error("Invalid ENTRY record");
 
-      // FIXME: Record[0] is the 'group ID'. What should we do with it here?
-
+      uint64_t GrpID = Record[0];
       uint64_t Idx = Record[1]; // Index of the object this attribute refers to.
 
       AttrBuilder B;
@@ -545,27 +544,29 @@ bool BitcodeReader::ParseAttributeGroupBlock() {
           else
             B.addStackAlignmentAttr(Record[++i]);
         } else {                     // String attribute
+          assert((Record[i] == 3 || Record[i] == 4) &&
+                 "Invalid attribute group entry");
           bool HasValue = (Record[i++] == 4);
           SmallString<64> KindStr;
           SmallString<64> ValStr;
 
           while (Record[i] != 0 && i != e)
             KindStr += Record[i++];
-          assert(Record[i] == 0 && "Kind string not terminated with 0");
+          assert(Record[i] == 0 && "Kind string not null terminated");
 
           if (HasValue) {
             // Has a value associated with it.
-            ++i; // Skip the '0' that terminates the kind string.
+            ++i; // Skip the '0' that terminates the "kind" string.
             while (Record[i] != 0 && i != e)
               ValStr += Record[i++];
-            assert(Record[i] == 0 && "Value string not terminated with 0");
+            assert(Record[i] == 0 && "Value string not null terminated");
           }
 
           B.addAttribute(KindStr.str(), ValStr.str());
         }
       }
 
-      MAttributeGroups.push_back(AttributeSet::get(Context, Idx, B));
+      MAttributeGroups[GrpID] = AttributeSet::get(Context, Idx, B);
       break;
     }
     }
index 8d36e670757415511d92386c60d4ff99eefc2bf8..28674eb14ef2aece9f43a142d7283ed3ad1ec9ec 100644 (file)
@@ -149,7 +149,7 @@ class BitcodeReader : public GVMaterializer {
   std::vector<AttributeSet> MAttributes;
 
   /// \brief The set of attribute groups.
-  std::vector<AttributeSet> MAttributeGroups;
+  std::map<unsigned, AttributeSet> MAttributeGroups;
 
   /// FunctionBBs - While parsing a function body, this is a list of the basic
   /// blocks for the function.