> 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