> On Jun 14, 2018, at 9:36 AM, Adrian Prantl <apra...@apple.com> wrote:
> 
> 
> 
>> On Jun 14, 2018, at 7:01 AM, Pavel Labath via llvm-dev 
>> <llvm-...@lists.llvm.org <mailto:llvm-...@lists.llvm.org>> wrote:
>> 
>> Thank you all. I am going to try to reply to all comments in a single email.
>> 
>> Regarding the  .apple_objc idea, I am afraid the situation is not as
>> simple as just flipping a switch.
> 
> Jonas is currently working on adding the support for DWARF5-style Objective-C 
> accelerator tables to LLVM/LLDB/dsymutil. Based on the assumption that DWARF 
> 4 and earlier are unaffected by any of this, I don't think it's necessary to 
> spend any effort of making the transition smooth. I'm fine with having 
> Objective-C on DWARF 5 broken on trunk for two weeks until Jonas is done 
> adding Objective-C support to the DWARF 5 implementation.
> 
> 
>> (If it was, I don't think I would
>> have embarked on this adventure in the first place -- I would just
>> emit .apple_*** everywhere and call it done :)). The issue is that the
>> apple tables have assumptions about the macos debug info distribution
>> model hardcoded in them -- they assume they will either stay in the .o
>> file or be linked by a smart debug-info-aware linker (dsymutil). In
>> particular, this means they are not self-delimiting (no length field
>> as is typical for other dwarf artifacts), so if a linker which is not
>> aware of them would simply concatenate individual .o tables (which elf
>> linkers are really good at), the debugger would have no way to pry
>> them apart. And even if it somehow managed that, it still wouldn't
>> know if the indexes covered all of the compile units in the linked
>> file or only some of them (in case some of the object files were
>> compiled with the tables and some without).
>> 
>> In light of that, I don't think it's worth trying to combine
>> .apple_objc with .debug_names in some way, and it would be much
>> simpler to just extend .debug_names with the necessary information. I
>> think the simplest way of achieving this (one which would require
>> least amount of standard-bending) is to take the index entry for the
>> objc class and add a special attribute to it (DW_IDX_method_list?)
>> with form DW_FORM_blockXXX and just have the references to the method
>> DIEs in the block data. This should make the implementation an almost
>> drop-in for the current .apple_objc functionality (we would still need
>> to figure out what to do with category methods, but it's not clear to
>> me whether lldb actually uses those anywhere).
>> 
>> But, other options may be possible as well. What's not clear to me is
>> whether these tables couldn't be replaced by extra information in the
>> .debug_info section. It seems to me that these tables are trying to
>> work around the issue that there is no straight way to go from a
>> DW_TAG_structure type DIE describing an ObjC class to it's methods. If
>> these methods (their forward declarations) were be present as children
>> of the type DIE (as they are for c++ classes), then these tables may
>> not be necessary. But maybe (probably) that has already been
>> considered and deemed infeasible for some reason. In any case this
>> seemed like a thing best left for people who actually work on ObjC
>> support to figure out.
> 
> That's really a question for Greg or Jim — I don't know why the current 
> representation has the Objective-C methods outside of the structs. One reason 
> might be that an interface's implementation can define more methods than are 
> visible in its public interface in the header file, but we already seem to be 
> aware of this and mark the implementation with 
> DW_AT_APPLE_objc_complete_type. I also am not sure that this is the *only* 
> reason for the objc accelerator table. But I'd like to learn.

New categories to objective C classes can be added and I believe that 
implementations can be spread across multiple files. Not sure why objective C 
doesn't contain its DW_TAG_subprogram inside of its DW_TAG_class_type, but that 
is the way things have been for a while.

> 
> -- adrian
> 
>> As far as the .debug_names size goes, I should also point out that the
>> binary in question was built with -fno-limit-debug-info, which isn't a
>> default setup on linux. I have tried measuring the sizes without that
>> flag and with fission enabled (-gsplit-dwarf) and the results are:
>> without compression:
>> - clang binary: 960 MB
>> - .debug_names: 130 MB (13%)
>> - debug_pubnames: 175 MB (18%)
>> - debug_pubtypes: 204 MB (21%)
>> - median time for setting a breakpoint on non-existent function
>> (variance +/- 2%):
>> real 0m3.526s
>> user 0m3.156s
>> sys 0m0.364s
>> 
>> with -Wl,--compress-debug-sections=zlib:
>> - clang binary: 440 MB
>> - .debug_names: 80MB (18%)
>> - .debug_pubnames: 31 MB (7.2%)
>> - .debug_pubtypes: 42MB (9.5%)
>> - median time for setting a breakpoint on non-existent function:
>> real 0m4.369s
>> user 0m3.948s
>> sys 0m0.416s
>> 
>> So, .debug_names indeed compresses worse than .debug_pubnames/types,
>> but that is not surprising as it has a more condensed encoding to
>> begin with (no inline strings). However, even in it's compressed form
>> its size is only slightly larger that the two other sections combined
>> (while being infinitely more useful). As for the compression, my
>> takeaway from this is that compression definitely has a measurable
>> impact on startup time, but, on the grand scale of things, the impact
>> is not actually that big. And if a user deliberately adds the
>> compression flag to his command line, I would assume he really cares
>> about binary size, and is willing to sacrifice some debug performance
>> in return. So, I would honor his request and compress .debug_names as
>> well.
>> 
>> 
>> I have tried David Anderson's dwarfdump (after Paul pointed it out to
>> me), but as far as I can tell, it has no support from printing out the
>> .debug_names section (the print_debug_names function is stubbed out).
>> **I think** I got the correct source repository
>> (git://git.code.sf.net/p/libdwarf/code) as the last commit there is
>> dated yesterday.
>> 
>> 
>> For testing on the lldb side I have been deliberately trying to avoid
>> adding another dimensions to the ever-growing test matrix. I don't
>> think this functionality is worth it, especially not if you view the
>> test suite as a regression test suite. The entire functionality of
>> this in lldb is encompassed in a single .cpp file which is about 250
>> LOC. The class has about a dozen entry points and most of them are
>> accessible through the lldb-test tool, which I've used to write
>> targeted regression tests for this (it could probably use more of
>> those). I did use the "dotest" suite as an integration test suite, but
>> I did that by simply passing --env CFLAGS_EXTRAS="-mllvm
>> -accel-tables=Dwarf" to dotest (I also tried hacking clang to always
>> emit the new tables to make sure I'm not missing anything).
>> Ironically, if you try that now, you will see one test failing, but
>> that's because I have already added one test passing that flag
>> explicitly (I couldn't find a way to test this functionality through
>> lldb-test) and clang then complains about a duplicate argument. This
>> should go away once we have better -g flag to control this behavior. I
>> haven't yet figured out whether I want to set up a bot to run the
>> tests in this configuration, but I know I don't want to inflict that
>> extra overhead on developers running tests during day-to-day
>> development.
>> 
>> regards,
>> pavel
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-...@lists.llvm.org <mailto:llvm-...@lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev 
>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to