[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 10:20:07 PDT 2017
On 08/01/2017 11:54 AM, David Blaikie wrote:
>
>
> On Tue, Aug 1, 2017 at 9:43 AM Hal Finkel <hfinkel at anl.gov
> <mailto:hfinkel at anl.gov>> wrote:
>
>
> 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.
>
>
> Oh, wait - you mean a variable with value 42 and 87 gets collapsed to
> a boolean where true/1 is used to represent 42 and false/0 is used to
> represent 87?
Yes. The code does this:
// Change the load into a load of bool then a select.
LoadInst *LI = cast<LoadInst>(UI);
LoadInst *NLI = new LoadInst(NewGV, LI->getName()+".b", false, 0,
LI->getOrdering(),
LI->getSyncScopeID(), LI);
Value *NSI;
if (IsOneZero)
NSI = new ZExtInst(NLI, LI->getType(), "", LI);
else
NSI = SelectInst::Create(NLI, OtherVal, InitVal, "", LI);
NSI->takeName(LI);
LI->replaceAllUsesWith(NSI);
-Hal
>
> Oh. Yeah. That's a bit more involved. (but nice that it means we can
> represent the values exactly - hopefully)
>
> Thanks!
>
> 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 <mailto: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
>
--
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/b2f2ce05/attachment.html>
More information about the llvm-commits
mailing list