[PATCH] D12536: Function bitcode index in Value Symbol Table and lazy reading support
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 15 18:36:00 PDT 2015
+cc llvm-commits (which somehow got dropped despite being a subscriber).
Teresa
On Tue, Sep 15, 2015 at 4:26 PM, Duncan P. N. Exon Smith
<dexonsmith at apple.com> wrote:
> (Working backwards...)
>
>> On 2015-Sep-10, at 07:34, Teresa Johnson <tejohnson at google.com> wrote:
>>
>> On Wed, Sep 9, 2015 at 12:39 PM, Duncan P. N. Exon Smith
>> <dexonsmith at apple.com> wrote:
>>>
>>>> On 2015-Sep-09, at 09:14, Teresa Johnson <tejohnson at google.com> wrote:
>>>>
>>>> On Tue, Sep 8, 2015 at 11:40 AM, Duncan P. N. Exon Smith
>>>> <dexonsmith at apple.com> wrote:
>>>>>
>>>>>> On 2015-Sep-08, at 06:43, Teresa Johnson <tejohnson at google.com> wrote:
>>
>>>>>
>>>>>> + unsigned ByteNo = BitNo / 32 * 4;
>>>>>> + if ((BitNo & 31) == 0) {
>>>>>> + // Already 32-bit aligned
>>>>>> + support::endian::write32le(&Out[ByteNo], NewWord);
>>>>>
>>>>> Does the fast path work for anything that's 8-bit aligned? (I'm just
>>>>> guessing based on the change you made to the caller.)
>>>>
>>>> I assume you are asking whether the write32le works if it is 8-bit
>>>> aligned if we changed the guard here. Checking...
>>>
>>> Right. Otherwise maybe we were just getting lucky before?
>>
>> No, before it was only called for 32-bit aligned addresses. This is
>> because the only caller was from ExitBlock to update the block size
>> field, which is always 32-bit aligned (in fact the BitNo at the
>> callsite is computed by multiplying the StartSizeWord by 32). This is
>> because the placeholder is emitted just after a FlushToWord() in
>> EnterSubblock.
>>
>> I did confirm that the fast path does also work when BitNo is byte
>> aligned, so it is simple to support that particular new case.
>
> Great. Maybe add a unit test to confirm it?
>
>>>>>> + } else {
>>>>>> + // First patch in the lower 32-(BitNo&32) bits of NewWord, by
>>>>>> + // shifting and masking into bits BitNo&32 to 32 of the first byte.
>>>>>> + unsigned CurWord = support::endian::read32le(&Out[ByteNo]);
>>>>>> + unsigned StartBit = BitNo & 31;
>>>>>> + // Currently expect to backpatch 0-value placeholders.
>>>>>> + assert((CurWord >> StartBit) == 0);
>>>>>> + CurWord |= NewWord << StartBit;
>>>>>> + support::endian::write32le(&Out[ByteNo], CurWord);
>>>>>> +
>>>>>> + // Next patch in the upper BitNo&32 bits of NewWord, by
>>>>>> + // shifting and masking into bits 0 to (BitNo&32)-1 of the second byte.
>>>>>> + ByteNo += 4;
>>>>>> + CurWord = support::endian::read32le(&Out[ByteNo]);
>>>>>> + // Currently expect to backpatch 0-value placeholders.
>>>>>> + assert((CurWord << (32 - StartBit)) == 0);
>>>>>> + CurWord |= NewWord >> (32 - StartBit);
>>>>>> + support::endian::write32le(&Out[ByteNo], CurWord);
>>>>>
>>>>> It's seems weird to have this logic here for unaligned writes. Is there
>>>>> no functionality for this in llvm/Support? If not, can you add it in a
>>>>> separate commit (with unit tests)? (If so, just use it.)
>>
>>
>> In the new caller, the BitNo may not be even byte-aligned. In that
>> case some shifting and or-ing is required, although it turns out I can
>> do a single read and write via read64le and write64le to make it much
>> simpler. I don't see any support for doing something like this already
>> in lib/Support, do you still think it is useful to add this
>> functionality there? The new BackpatchWord is quite a bit simpler, the
>> following works:
>>
>> /// Backpatch a 32-bit word in the output with the specified value.
>> void BackpatchWord(uint64_t BitNo, unsigned NewWord) {
>> unsigned ByteNo = BitNo / 8;
>> if ((BitNo & 7) == 0) {
>> // Already 8-bit aligned
>> support::endian::write32le(&Out[ByteNo], NewWord);
>> } else {
>> uint64_t CurDWord = support::endian::read64le(&Out[ByteNo]);
>> unsigned StartBit = BitNo & 7;
>> // Currently expect to backpatch 0-value placeholders.
>> assert(((CurDWord >> StartBit) & 0xffffffff) == 0);
>> CurDWord |= NewWord << StartBit;
>> support::endian::write64le(&Out[ByteNo], CurDWord);
>> }
>> }
>
> This looks a lot better, but as I mentioned in my other mail, I think
> this would be useful to have in lib/Support (with a couple of unit
> tests).
>
> I'd be fine with you coming back and splitting it out as a follow-up
> though.
--
Teresa Johnson | Software Engineer | tejohnson at google.com | 408-460-2413
More information about the llvm-commits
mailing list