> 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 
> <mailto:dexonsm...@apple.com>> wrote:
> 
> > On 2014 Sep 5, at 16:01, Frédéric Riss <fr...@apple.com 
> > <mailto: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 <mailto:llvm-comm...@cs.uiuc.edu>
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits 
> > <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

Reply via email to