[llvm-dev] Proposal for multi location debug info support in LLVM IR

Keno Fischer via llvm-dev llvm-dev at lists.llvm.org
Wed Jan 6 14:05:23 PST 2016


>
> Makes sense. If I understand your comment correctly, the following snippet:
>
> %1 = ...
> %token = call llvm.dbg.value(token %undef, %1, !var, !())
> %2 = ...
> call llvm.dbg.value(token %token, %undef, !var, !())
> call llvm.dbg.value(token %undef, %2, !var, !())
>
> is equivalent to
>
> %1 = ...
> call llvm.dbg.value(token %undef, %1, !var, !())
> %2 = ...
> call llvm.dbg.value(token %undef, %2, !var, !())
>
> and both are legal.
>

Yes


> > > >
>> > > >     - To add a location with the same value for the same variable,
>> you
>> > > pass the
>> > > >       token of the FIRST llvm.dbg.value, as this llvm.dbg.value's
>> first
>> > > argument
>> > > >       E.g. to add another location for the variable above:
>> > > >
>> > > >         %second =3D call token @llvm.dbg.value(token %first,
>> metadata
>> > > %val2,
>> > > >                                             metadata !var, metadata
>> > > !expr2)
>> > >
>> > > Does this invalidate the first location, or does this add an
>> additional
>> > > location
>> > > to the set of locations for var at this point? If I want to add a
>> third
>> > > location,
>> > > which token do I pass in? Can you explain a bit more what information
>> the
>> > > token
>> > > allows us to express that is currently not possible?
>> > >
>> >
>> > It adds a second location. If you want to add a third location you pass
>> in
>> > the first token again.
>> > Thus the first call (key call) indicates a change of values, and all
>> > locations that have the same value should use the key call's token.
>> >
>>
>> Ok. Looks like this is going to be somewhat verbose for partial updates
>> of SROA’ed aggregates as in the following example:
>>
>> // struct s { int i, j };
>> // void foo(struct s) { s.j = 0; ... }
>>
>> define void @foo(i32 %i, i32 %j) {
>>   %token = call llvm.dbg.value(token %undef, %i, !Struct,
>> !DIExpression(DW_OP_bit_piece(0, 32)))
>>            call llvm.dbg.value(token %token, %j, !Struct,
>> !DIExpression(DW_OP_bit_piece(32, 32)))
>>   ...
>>
>>   ; have to repeat %i here:
>>   %tok2 = call llvm.dbg.value(token %undef, %i, !Struct,
>> !DIExpression(DW_OP_bit_piece(0, 32)))
>>           call llvm.dbg.value(token %tok2, metadata i32 0, !Struct,
>> !DIExpression(DW_OP_bit_piece(32, 32)))
>>
>> On the upside, having all this information explicit could simplify the
>> code in DwarfDebug::buildLocationList().
>>
>
> Yeah, this is true. We could potentially extend the semantics by allowing
> separate key calls for pieces, i.e.
>
> %token = call llvm.dbg.value(token %undef, %i, !Struct,
> !DIExpression(DW_OP_bit_piece(0, 32)))
>            call llvm.dbg.value(token undef, %j, !Struct,
> !DIExpression(DW_OP_bit_piece(32, 32)))
>
> ; This now only invalidates the .j part
> %tok2 = call llvm.dbg.value(token %undef, %j, !Struct,
> !DIExpression(DW_OP_bit_piece(32, 32)))
>
> In that case we would probably have to require that all DW_OP_bit_pieces
> in non-key-call expressions are a subrange of those in the associated key
> call.
>
>
> This way all non-key-call additional locations are describing alternative
> locations for (a subset of) the bits described the key-call location. Makes
> sense, and again would simplify the backend’s work.
>

Yes, I think that's a reasonable change to the semantics, so let's make it
so.


> One thing I’m wondering about is whether we couldn’t design a friendlier
> (assembler) syntax for the three different use-cases:
>   %tok1 = call llvm.dbg.value(token %undef, %1, !var, !())
>   %tok2 = call llvm.dbg.value(token %token, %2, !var, !())
>   %tok3 = call llvm.dbg.value(token %tok1, %undef, !var, !())
>
> Could be written as e.g.:
>
>   %tok1 = call llvm.dbg.value.new(%1, !var, !())
>   %tok2 = call llvm.dbg.value.add(token %token, %2, !var, !())
>   %tok3 = call llvm.dbg.value.delete(token %tok1, !var, !())
>

Yeah, I would be ok with that (and think it's a good idea).


> -- adrian
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160106/bd05d132/attachment.html>


More information about the llvm-dev mailing list