diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -593,14 +593,17 @@ llvm_unreachable("Invalid ordering"); } +// Abbrev6 is used if all characters fit in char6, else Abbrev8. static void writeStringRecord(BitstreamWriter &Stream, unsigned Code, - StringRef Str, unsigned AbbrevToUse) { + StringRef Str, unsigned Abbrev6 = 0, + unsigned Abbrev8 = 0) { SmallVector Vals; + unsigned AbbrevToUse = Abbrev6 ? Abbrev6 : Abbrev8; // Code: [strchar x N] for (char C : Str) { if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(C)) - AbbrevToUse = 0; + AbbrevToUse = Abbrev8; Vals.push_back(C); } @@ -898,7 +901,12 @@ Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); - unsigned StructNameAbbrev = Stream.EmitAbbrev(std::move(Abbv)); + unsigned StructNameAbbrev6 = Stream.EmitAbbrev(std::move(Abbv)); + Abbv = std::make_shared(); + Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME)); + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); + unsigned StructNameAbbrev8 = Stream.EmitAbbrev(std::move(Abbv)); // Abbrev for TYPE_CODE_STRUCT_NAMED. Abbv = std::make_shared(); @@ -996,7 +1004,7 @@ // Emit the name if it is present. if (!ST->getName().empty()) writeStringRecord(Stream, bitc::TYPE_CODE_STRUCT_NAME, ST->getName(), - StructNameAbbrev); + StructNameAbbrev6, StructNameAbbrev8); } break; }