[PATCH] D52641: Bitcode: Fix assert when writing arrays as blobs.

Sean Bartell via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 27 19:51:06 PDT 2018


bartell created this revision.
bartell added a reviewer: pcc.
Herald added a subscriber: llvm-commits.

When BitstreamWriter::EmitRecordWithAbbrevImpl is used to write a blob, but the blob data is provided in the Vals array argument instead of the Blob argument, it triggers an assertion failure. This happens because RecordIdx isn't updated correctly, so it looks like there are still unemitted values left in the Vals array. We fix this by updating RecordIdx to reflect the fact that everything in Vals has been emitted.

(LLVM currently always provides blob data in the Blob argument, so it can't trigger this bug as-is.)


Repository:
  rL LLVM

https://reviews.llvm.org/D52641

Files:
  include/llvm/Bitcode/BitstreamWriter.h
  unittests/Bitcode/BitstreamWriterTest.cpp


Index: unittests/Bitcode/BitstreamWriterTest.cpp
===================================================================
--- unittests/Bitcode/BitstreamWriterTest.cpp
+++ unittests/Bitcode/BitstreamWriterTest.cpp
@@ -8,8 +8,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Bitcode/BitstreamWriter.h"
+
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallString.h"
+#include "llvm/Bitcode/BitCodes.h"
 #include "gtest/gtest.h"
 
 using namespace llvm;
@@ -56,4 +58,29 @@
   EXPECT_EQ(StringRef("str0"), Buffer);
 }
 
+TEST(BitstreamWriterTest, emitBlobFromArray) {
+  auto Abbrev = std::make_shared<BitCodeAbbrev>();
+  Abbrev->Add(BitCodeAbbrevOp(0));
+  Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
+  SmallString<64> Buffer;
+  {
+    SmallVector<uint64_t, 1> Vals = {0, 0x12, 0x34};
+    BitstreamWriter W(Buffer);
+    W.EnterSubblock(0, 3);
+    unsigned AbbrevID = W.EmitAbbrev(Abbrev);
+    W.EmitRecordWithAbbrev(AbbrevID, Vals);
+    W.ExitBlock();
+  }
+  SmallString<64> Expected;
+  {
+    SmallVector<uint64_t, 1> Vals = {0};
+    BitstreamWriter W(Expected);
+    W.EnterSubblock(0, 3);
+    unsigned AbbrevID = W.EmitAbbrev(Abbrev);
+    W.EmitRecordWithBlob(AbbrevID, Vals, "\x12\x34");
+    W.ExitBlock();
+  }
+  EXPECT_EQ(StringRef(Expected), Buffer);
+}
+
 } // end namespace
Index: include/llvm/Bitcode/BitstreamWriter.h
===================================================================
--- include/llvm/Bitcode/BitstreamWriter.h
+++ include/llvm/Bitcode/BitstreamWriter.h
@@ -367,6 +367,7 @@
           BlobData = nullptr;
         } else {
           emitBlob(Vals.slice(RecordIdx));
+          RecordIdx = Vals.size();
         }
       } else {  // Single scalar field.
         assert(RecordIdx < Vals.size() && "Invalid abbrev/record");


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52641.167427.patch
Type: text/x-patch
Size: 1833 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180928/2ccfe64d/attachment.bin>


More information about the llvm-commits mailing list