[PATCH] D12737: Pass an optional "code" to EmitRecordWithAbbrevImpl()
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 9 14:28:28 PDT 2015
On Wed, Sep 9, 2015 at 2:22 PM, Duncan P. N. Exon Smith
<dexonsmith at apple.com> wrote:
>
>> On 2015-Sep-09, at 13:01, Mehdi AMINI <mehdi.amini at apple.com> wrote:
>>
>> joker.eph created this revision.
>> joker.eph added a reviewer: dexonsmith.
>> joker.eph added a subscriber: llvm-commits.
>>
>> This avoids having EmitRecord() shifts the Vals array to insert the
>> code at the front.
>
> This LGTM with a few minor changes below.
I already committed a variant of this (r247186).
>
>>
>> http://reviews.llvm.org/D12737
>>
>> Files:
>> include/llvm/Bitcode/BitstreamWriter.h
>>
>> Index: include/llvm/Bitcode/BitstreamWriter.h
>> ===================================================================
>> --- include/llvm/Bitcode/BitstreamWriter.h
>> +++ include/llvm/Bitcode/BitstreamWriter.h
>> @@ -287,9 +287,12 @@
>> /// emission code. If BlobData is non-null, then it specifies an array of
>> /// data that should be emitted as part of the Blob or Array operand that is
>> /// known to exist at the end of the record.
>> + /// An optional Code can be passed separately as a convenience to avoid
>> + /// having EmitRecord() performing a push_front on Vals.
>> template <typename uintty>
>> void EmitRecordWithAbbrevImpl(unsigned Abbrev, const ArrayRef<uintty> &Vals,
>
> We usually pass ArrayRefs by-value; no need for `const` and `&`.
>
>> - StringRef Blob) {
>> + StringRef Blob,
>> + Optional<uintty> Code = Optional<uintty>()) {
>
> This can be `Optional<uintty> Code = None`.
I can make that change to my commit, since I am passing in None for
the other callsites explictly right now.
>
>> const char *BlobData = Blob.data();
>> unsigned BlobLen = (unsigned) Blob.size();
>> unsigned AbbrevNo = Abbrev-bitc::FIRST_APPLICATION_ABBREV;
>> @@ -299,8 +302,24 @@
>> EmitCode(Abbrev);
>>
>> unsigned RecordIdx = 0;
>> - for (unsigned i = 0, e = static_cast<unsigned>(Abbv->getNumOperandInfos());
>> - i != e; ++i) {
>> + unsigned i = 0, e = static_cast<unsigned>(Abbv->getNumOperandInfos());
>> +
>> + // If a "Code" is passed in separately, emit it first.
>> + if (Code) {
>> + assert(e && "Expected non-empty abbreviation");
>> + const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i++);
>> + assert(!Op.getEncoding() == BitCodeAbbrevOp::Array &&
>> + !Op.getEncoding() == BitCodeAbbrevOp::Blob &&
>> + "Expected literal or scalar code");
This assert did not quite work and my commit fixes it (the "! ... =="
changed to "!=" and also I nested this within the else below since
getEncoding does not like to be called when isLiteral is true).
>> +
>> + if (Op.isLiteral())
>> + EmitAbbreviatedLiteral(Op, Code.getValue());
>> + else
>> + EmitAbbreviatedField(Op, Code.getValue());
>> + }
>> +
>> + // Main loop, emitting all value in Vals.
>> + for (; i != e; ++i) {
>> const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
>> if (Op.isLiteral()) {
>> assert(RecordIdx < Vals.size() && "Invalid abbrev/record");
>> @@ -396,10 +415,8 @@
>> return;
>> }
>>
>> - // Insert the code into Vals to treat it uniformly.
>> - Vals.insert(Vals.begin(), Code);
>> -
>> - EmitRecordWithAbbrev(Abbrev, makeArrayRef(Vals));
>> + EmitRecordWithAbbrevImpl(Abbrev, makeArrayRef(Vals), StringRef(),
>
> I like the paint colour `""` better than `StringRef()`.
>
>> + Optional<uintty>(Code));
>
> I think `Code` should implicitly convert to `Optional<uintty>`; no need
> to call the constructor explicitly.
My committed patch doesn't use the cast. Note I had to use
Optional<unsigned> instead of Optional<uintty> in
EmitRecordWithAbbrevImpl (regardless of whether a cast is used here,
it didn't compile correctly with uintty).
>
>> }
>>
>> /// EmitRecordWithAbbrev - Emit a record with the specified abbreviation.
>>
>>
>> <D12737.34361.patch>
>
--
Teresa Johnson | Software Engineer | tejohnson at google.com | 408-460-2413
More information about the llvm-commits
mailing list