diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h index 794c07b4e4c0bd..c3882594820881 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h @@ -479,6 +479,8 @@ template <> class SPSSerializationTraits { static bool serialize(SPSOutputBuffer &OB, StringRef S) { if (!SPSArgList::serialize(OB, static_cast(S.size()))) return false; + if (S.empty()) // Empty StringRef may have null data, so bail out early. + return true; return OB.write(S.data(), S.size()); } @@ -490,7 +492,7 @@ template <> class SPSSerializationTraits { Data = IB.data(); if (!IB.skip(Size)) return false; - S = StringRef(Data, Size); + S = StringRef(Size ? Data : nullptr, Size); return true; } }; diff --git a/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp b/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp index f5319e32877663..ee73614d53d44d 100644 --- a/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp @@ -208,3 +208,24 @@ TEST(SimplePackedSerializationTest, ArrayRefEmpty) { EXPECT_EQ(AIn.data(), nullptr); EXPECT_EQ(AIn.size(), 0U); } + +TEST(SimplePackedSerializationTest, StringRefEmpty) { + // Make sure that empty StringRefs serialize and deserialize as expected. + // Empty StringRefs should not succeed even when the data field is null, and + // should deserialize to a default-constructed StringRef, not a pointer into + // the stream. + constexpr unsigned BufferSize = sizeof(uint64_t); + char Buffer[BufferSize]; + memset(Buffer, 0, BufferSize); + + StringRef SROut; + SPSOutputBuffer OB(Buffer, BufferSize); + EXPECT_TRUE(SPSArgList>::serialize(OB, SROut)); + + StringRef SRIn; + SPSInputBuffer IB(Buffer, BufferSize); + EXPECT_TRUE(SPSArgList>::deserialize(IB, SRIn)); + + EXPECT_EQ(SRIn.data(), nullptr); + EXPECT_EQ(SRIn.size(), 0U); +}