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"); 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(); + Abbrev->Add(BitCodeAbbrevOp(0)); + Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); + SmallString<64> Buffer; + { + SmallVector 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 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