> On 08 Sep 2014, at 19:31, Greg Clayton <gclay...@apple.com> wrote:
> 
> This means you will see "S<A>" as the type for your variables in the debugger 
> when you view variables or children of structs/unions/classes. I think this 
> is not what the user would want to see. I would rather see "S<int>" as the 
> type for my variable than see "S<A>”.

I find it more accurate for the debugger to report what has actually been put 
in the code. Moreover when a typedef is used, it’s usually to make things more 
readable not to hide information, thus I guess it would usually be as 
informative while being more compact. The debugger needs to have a way to 
describe the real type behind the abbreviated name though, we must not have 
less information compared to what we have today.

Another point: this allows the debugger to know what S<A> actually is. Without 
it, the debugger only knows the canonical type. This means that currently you 
can’t copy/paste a piece of code that references that kind of template names 
and have it parse correctly. I /think/ that having this information in the 
debug info will allow more of this to work.

But we can agree to disagree :-) It would be great to have more people chime 
and give their opinion.

Fred

>> On Sep 5, 2014, at 4:00 PM, Adrian Prantl <apra...@apple.com> wrote:
>> 
>> 
>>> On Sep 5, 2014, at 3:49 PM, Eric Christopher <echri...@gmail.com> wrote:
>>> 
>>> 
>>> 
>>> 
>>> On Fri, Sep 5, 2014 at 3:43 PM, Duncan P. N. Exon Smith 
>>> <dexonsm...@apple.com> wrote:
>>> 
>>>> On 2014 Sep 5, at 16:01, Frédéric Riss <fr...@apple.com> wrote:
>>>> 
>>>> I couldn’t even find a subject expressing exactly what this patch is 
>>>> about… First of all, it’s meant to start a discussion, and I’m not 
>>>> proposing it for inclusion right now.
>>>> 
>>>> The issue I’m trying to address is that template types are always 
>>>> canonicalized when emitted in the debug information (this is the desugar() 
>>>> call in UnwrapTypeForDebugInformation).
>>>> 
>>>> This means that if the developer writes:
>>>> 
>>>> typedef int A;
>>>> template <typename T>
>>>> struct S {};
>>>> 
>>>> S<A> var;
>>>> 
>>>> The variable var will have type S<int> and not S<A>. In this simple 
>>>> example, it’s not that much of an issue, but for heavily templated code, 
>>>> the full expansion might be really different from the original declaration.
>>>> 
>>>> The attached patch makes us emit an intermediate typedef for the 
>>>> variable’s type:
>>>> 
>>>> 0x0000002a:   DW_TAG_variable [2]
>>>>               DW_AT_name [DW_FORM_strp]       ( .debug_str[0x00000032] = 
>>>> “var")
>>>>               DW_AT_type [DW_FORM_ref4]       (cu + 0x0040 => {0x00000040})
>>>>               DW_AT_external [DW_FORM_flag]   (0x01)
>>>>               DW_AT_decl_file [DW_FORM_data1] (0x01)
>>>>               DW_AT_decl_line [DW_FORM_data1] (8)
>>>>               DW_AT_location [DW_FORM_block1] (<0x09> 03 70 6c 00 00 00 00 
>>>> 00 00 )
>>>> 
>>>> 0x00000040:   DW_TAG_typedef [3]
>>>>               DW_AT_type [DW_FORM_ref4]       (cu + 0x004b => {0x0000004b})
>>>>               DW_AT_name [DW_FORM_strp]       ( .debug_str[0x00000035] = 
>>>> “S<A>")
>>>>               DW_AT_decl_file [DW_FORM_data1] (0x01)
>>>>               DW_AT_decl_line [DW_FORM_data1] (6)
>>>> 
>>>> 0x0000004b:   DW_TAG_structure_type [4] *
>>>>               DW_AT_name [DW_FORM_strp]       ( .debug_str[0x0000003e] = 
>>>> “S<int>")
>>>>               DW_AT_byte_size [DW_FORM_data1] (0x01)
>>>>               DW_AT_decl_file [DW_FORM_data1] (0x01)
>>>>               DW_AT_decl_line [DW_FORM_data1] (6)
>>>> 
>>>> 
>>>> Which basically is what I want, although I don’t like that it introduces a 
>>>> typedef where there is none in the code. I’d prefer that to be:
>>>> 
>>>> DW_TAG_variable
>>>> DW_AT_type: -> DW_TAG_structure_type
>>>>                  DW_AT_name: S<A>
>>>>                  DW_AT_specification: -> DW_TAG_structure_type
>>>>                                            DW_AT_name: S<int>
>>>>                                            …
>>>> 
>>>> The patch also has the nice property of omitting the defaulted template 
>>>> arguments in the first level typedef. For example you get vector<A> 
>>>> instead of vector<int, std::__1::allocator<int> >.
>>> 
>>> If you specify `vector<int>` in C++ do you get that instead of
>>> `vector<int, std::__1::allocator<int>>`?
>>> 
>>> Yeah, I mentioned this as possibly causing problems with debuggers or other 
>>> consumers, but I don't have any proof past "ooooo scary!”.
>> 
>> Well, [+lldb-dev], could this confuse debuggers? :-)
>> 
>> -- adrian
>>> 
>>> That said, I like the idea personally :)
>>> 
>>> -eric
>>> 
>>> 
>>>> Now there is one thing I really don’t like about the patch. In order not 
>>>> to emit typedefs for types that don’t need it, I use string comparison 
>>>> between the desugared and the original type. I haven’t quantified 
>>>> anything, but doing the construction of the type name for every template 
>>>> type and then comparing it to decide to use it or not seems like a big 
>>>> waste.
>>> 
>>> Maybe someone on cfe-dev knows a better way.
>>> 
>>>> 
>>>> Thoughts?
>>>> 
>>>> <template-arg-typedefs.diff>
>>>> 
>>>> Fred
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-comm...@cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
>>> 
>> 
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev@cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
> 


_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to