[PATCH] D35994: Debug info for variables whos type is shrinked to bool
Hal Finkel via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 1 09:42:53 PDT 2017
On 08/01/2017 11:28 AM, Adrian Prantl via llvm-commits wrote:
>
>> On Aug 1, 2017, at 9:24 AM, David Blaikie <dblaikie at gmail.com
>> <mailto:dblaikie at gmail.com>> wrote:
>>
>>
>>
>> On Tue, Aug 1, 2017 at 9:04 AM Adrian Prantl via Phabricator
>> <reviews at reviews.llvm.org <mailto:reviews at reviews.llvm.org>> wrote:
>>
>> aprantl added inline comments.
>>
>>
>> ================
>> Comment at: lib/Transforms/IPO/GlobalOpt.cpp:1577
>> + for(auto *GV : GVs)
>> + NewGV->addDebugInfo(GV);
>> +
>> ----------------
>> NikolaPrica wrote:
>> > aprantl wrote:
>> > > I'm not familiar with this transformation: Do we need to add
>> a DIExpression to mask out all but the first bit (i.e. can
>> multiple bools be packed into the same uint32_t such that it
>> could confuse debuggers)?
>> > The debug info which is provided here with addDebugInfo later
>> generates address of the variable (DW_OP_addr: xxxx) in
>> DW_AT_location. If we provide here metadata which is for 1byte
>> variable the debugger would get confused because the enum type
>> is written as 4-byte and he would try to read 4 bytes. This is
>> just temporary fix until proper way to handle this is found.
>> If I understood you correctly then the best way to represent this
>> would be a `DW_OP_LLVM_fragment /*offset*/0 /*bitsize*/1 (or 8?)`
>> expression. This will get lowered into a DW_OP_bit_piece to tell
>> the debugger that this location is describing of the first n bits
>> of the variable.
>>
>>
>> A slight problem with this is that at least GDB won't print a single
>> value if it's partially unavailable (eg: if it's a struct and the
>> fragment describes one member but not the othe,r I think that's OK -
>> but if it's a single int and only one out of 4 bytes are described -
>> well, the value is known/unknowable).
>>
>
> A debugger would have to print the value as something like 0x??????01
> to indicate that pieces are missing. But no debugger I'm aware of does
> that.
>
>> If this optimization is really based on the proof that the other
>> bytes are unused, never written to or read, then a fragment
>> describing the other bytes as constant zero would be good to have as
>> well.
No, it is more complicated than that. See TryToShrinkGlobalToBoolean in
lib/Transforms/IPO/GlobalOpt.cpp. It is looking for cases where the
global is only set to one initialized value and one other value. In that
case, it can make a Boolean global and replace uses of that Global with
selects over that value. I think you actually want to generate a DWARF
expression for these.
-Hal
>
> Agreed, that would be the most practical solution — if we can prove
> that it is correct.
>
> -- adrian
>>
>> But I doubt that's the case - no doubt if we can see all the reads
>> and writes, we optimize away the writes if we know they won't be
>> read, so we may end up with only the one byte. C'est la vie.
>>
>> Just mention it to check/understand what the optimization is/isn't
>> doing, etc.
>>
>>
>>
>> https://reviews.llvm.org/D35994
>>
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170801/1e6f6ff8/attachment.html>
More information about the llvm-commits
mailing list