r218129 - Omit DW_TAG_subprograms for subprograms without inlined subroutines when producing -gmlt data

Adrian Prantl aprantl at apple.com
Thu Sep 25 16:13:05 PDT 2014


I suggest that we disable the optimization on Darwin until we have a dsymutil that supports this, then.

thanks,
adrian

> On Sep 25, 2014, at 4:07 PM, Greg Clayton <gclayton at apple.com> wrote:
> 
> Yes dsymutil should be fixed. We have a radar for this:
> 
> <rdar://problem/18442575> TOT clang: using -gline-table-only produces no line numbers
> 
> But the reason it is failing is because the clang symbolizer is only looking at debug info for the function bounds. It should be modified to also look at symbols from the symbol table.
> 
> Greg
> 
> 
>> On Sep 25, 2014, at 3:49 PM, Adrian Prantl <aprantl at apple.com> wrote:
>> 
>> Hi Greg,
>> 
>> This commit causes testcases on Darwin to fail, and appears the reason for this is that dsymutil is skipping compile units that do not have any subprograms in it (see Kuba&David’s analysis below). Is that the case? If so, would it make sense to change that behavior in dsymutil or should we rather disable this optimization on Darwin?
>> 
>> -- adrian
>> 
>> Author: dblaikie
>> Date: Fri Sep 19 12:03:16 2014
>> New Revision: 218129
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=218129&view=rev
>> Log:
>> Omit DW_TAG_subprograms for subprograms without inlined subroutines when producing -gmlt data
>> 
>> To reduce the size of -gmlt data, skip the subprograms without any
>> inlined subroutines. Since we've now got the ability to make these
>> determinations in the backend (funnily enough - we added the flag so we
>> wouldn't produce ranges under -gmlt, but with this change we use the
>> flag, but go back to producing ranges under -gmlt).
>> 
>> Instead, just produce CU ranges to inform the consumer which parts of
>> the code are described by this CU's line table. Tools could inspect the
>> line table directly to compute the range, but the CU ranges only seem to
>> be about 0.5% of object/executable size, so I'm not too worried about
>> teaching llvm-symbolizer that trick just yet - it's certainly a possible
>> piece of future work.
>> 
>> Update an llvm-symbolizer test just to demonstrate that this schema is
>> acceptable there (if it wasn't, the compiler-rt tests would catch this,
>> but good to have an in-llvm-tree test for llvm-symbolizer's behavior
>> here)
>> 
>> Building the clang binary with -gmlt with this patch reduces the total
>> size of object files by 5.1% (5.56% without ranges) without compression
>> and the executable by 4.37% (4.75% without ranges).
>> 
>> 
>> 
>>> On Sep 25, 2014, at 3:07 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>> 
>>> 
>>> 
>>> On Thu, Sep 25, 2014 at 2:56 PM, Kuba Brecka <kuba.brecka at gmail.com> wrote:
>>> I believe you're tight about dsymutil. This commit enabled -gline-tables-only for compiler-rt tests: http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140901/234084.html
>>> and I'm having lots of test failures on OS X. So should we revert it? Or at least just for OS X?
>>> 
>>> Lots of options, depending on what you do what to do for your platform & ASan. You could change dsymutil (presumably that'll have some turnaround time), modify -gmlt to not do this optimization on your platform (or perhaps there's some cheap-and-dirty way we could produce /just/ enough DWARF to fool dsymutil into not dropping all the debug info), just decide that users of ASan on MacOS need to use -g (in which case we'd want to change the build system)
>>> 
>>> Alexey - I guess you have an opinion on this too, perhaps? (not sure how much you care/are invested in MacOS sanitizer support)
>>> 
>>> 
>>> Kuba
>>> 
>>> 
>>> On Thu, Sep 25, 2014 at 2:28 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>> 
>>> 
>>> On Thu, Sep 25, 2014 at 2:20 PM, Kuba Brecka <kuba.brecka at gmail.com> wrote:
>>> Dwarfdumping a.out produces nothing, but dwarfdumping a.o does and there are differences. Attaching the two outputs. This is the diff for running  cc1, ld and dwarfdump, between r218128 and r218129:
>>> 
>>> The changes to the dump of a.o look like what I intended. It sounds like dsymutil is being smart and omitting debug info if there are no subprograms in the CU? Perhaps you'd need to disable this optimization on Darwin unless/until you can teach dsymutil not to do this?
>>> 
>>> You'd have to experiment more/investigate/read/etc dsymutil to understand whether my hypothesis is correct.
>>> 
>>> 
>>> --- clang-218128.txt	2014-09-25 14:17:51.000000000 -0700
>>> +++ clang-218129.txt	2014-09-25 14:17:44.000000000 -0700
>>> @@ -1,190 +1,171 @@
>>> $ ./bin/clang -v
>>> -clang version 3.6.0 (218128)
>>> +clang version 3.6.0 (218129)
>>> Target: x86_64-apple-darwin14.0.0
>>> Thread model: posix
>>> $ ./bin/clang -cc1 -triple x86_64-apple-macosx10.10.0 -emit-obj -gline-tables-only a.c -o a.o
>>> $ ld -arch x86_64 -macosx_version_min 10.10.0 a.o -o a.out -lSystem
>>> $ ./bin/llvm-dwarfdump -debug-dump=all a.out
>>> a.out:  file format Mach-O 64-bit x86-64
>>> 
>>> .debug_abbrev contents:
>>> < EMPTY >
>>> 
>>> .debug_abbrev.dwo contents:
>>> < EMPTY >
>>> 
>>> .debug_info contents:
>>> 
>>> .debug_loc contents:
>>> 
>>> .debug_loc.dwo contents:
>>> 
>>> .debug_frame contents:
>>> 
>>> 
>>> .debug_aranges contents:
>>> 
>>> .debug_line contents:
>>> 
>>> .debug_line.dwo contents:
>>> 
>>> .debug_str contents:
>>> 
>>> .debug_ranges contents:
>>> 
>>> .debug_pubnames contents:
>>> 
>>> .debug_pubtypes contents:
>>> 
>>> .debug_gnu_pubnames contents:
>>> 
>>> .debug_gnu_pubtypes contents:
>>> $ ./bin/llvm-dwarfdump -debug-dump=all a.o
>>> error: failed to compute relocation: X86_64_RELOC_UNSIGNED
>>> error: failed to compute relocation: X86_64_RELOC_UNSIGNED
>>> -error: failed to compute relocation: X86_64_RELOC_UNSIGNED
>>> a.o:  file format Mach-O 64-bit x86-64
>>> 
>>> .debug_abbrev contents:
>>> Abbrev table for offset: 0x00000000
>>> -[1] DW_TAG_compile_unit DW_CHILDREN_yes
>>> +[1] DW_TAG_compile_unit DW_CHILDREN_no
>>>  DW_AT_producer  DW_FORM_strp
>>>  DW_AT_language  DW_FORM_data2
>>>  DW_AT_name  DW_FORM_strp
>>>  DW_AT_stmt_list DW_FORM_sec_offset
>>>  DW_AT_comp_dir  DW_FORM_strp
>>> -
>>> -[2] DW_TAG_subprogram DW_CHILDREN_no
>>>  DW_AT_low_pc  DW_FORM_addr
>>>  DW_AT_high_pc DW_FORM_data4
>>> -  DW_AT_APPLE_omit_frame_ptr  DW_FORM_flag_present
>>> -  DW_AT_name  DW_FORM_strp
>>> 
>>> 
>>> .debug_abbrev.dwo contents:
>>> < EMPTY >
>>> 
>>> .debug_info contents:
>>> -0x00000000: Compile Unit: length = 0x0000003d version = 0x0004 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x00000041)
>>> +0x00000000: Compile Unit: length = 0x00000026 version = 0x0004 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x0000002a)
>>> 
>>> -0x0000000b: DW_TAG_compile_unit [1] *
>>> -              DW_AT_producer [DW_FORM_strp] ( .debug_str[0x00000000] = "clang version 3.6.0 (218128)")
>>> +0x0000000b: DW_TAG_compile_unit [1]  
>>> +              DW_AT_producer [DW_FORM_strp] ( .debug_str[0x00000000] = "clang version 3.6.0 (218129)")
>>>              DW_AT_language [DW_FORM_data2]  (DW_LANG_C99)
>>>              DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000001d] = "<stdin>")
>>>              DW_AT_stmt_list [DW_FORM_sec_offset]  (0x00000000)
>>>              DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x00000025] = "/Users/kuba/llvm-tot-cmake-release")
>>> -
>>> -0x0000001e:   DW_TAG_subprogram [2]  
>>> -                DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
>>> -                DW_AT_high_pc [DW_FORM_data4] (0x00000019)
>>> -                DW_AT_APPLE_omit_frame_ptr [DW_FORM_flag_present] (true)
>>> -                DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000048] = "f")
>>> -
>>> -0x0000002f:   DW_TAG_subprogram [2]  
>>> -                DW_AT_low_pc [DW_FORM_addr] (0x0000000000000020)
>>> -                DW_AT_high_pc [DW_FORM_data4] (0x00000043)
>>> -                DW_AT_APPLE_omit_frame_ptr [DW_FORM_flag_present] (true)
>>> -                DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000004a] = "main")
>>> -
>>> -0x00000040:   NULL
>>> +              DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
>>> +              DW_AT_high_pc [DW_FORM_data4] (0x00000063)
>>> 
>>> .debug_loc contents:
>>> 
>>> .debug_loc.dwo contents:
>>> 
>>> .debug_frame contents:
>>> 
>>> 00000000 00000014 ffffffff CIE
>>>  Version:               3
>>>  Augmentation:          ""
>>>  Code alignment factor: 1
>>>  Data alignment factor: -8
>>>  Return address column: 16
>>> 
>>>  DW_CFA_def_cfa:
>>>  DW_CFA_offset:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>> 
>>> 00000018 0000001c 00000000 FDE cie=00000000 pc=00000000...00000019
>>>  DW_CFA_advance_loc:
>>>  DW_CFA_def_cfa_offset:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>> 
>>> 00000038 0000001c 00000000 FDE cie=00000000 pc=00000020...00000063
>>>  DW_CFA_advance_loc:
>>>  DW_CFA_def_cfa_offset:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>>  DW_CFA_nop:
>>> 
>>> 
>>> .debug_aranges contents:
>>> 
>>> .debug_line contents:
>>> Line table prologue:
>>>    total_length: 0x0000003b
>>>         version: 2
>>> prologue_length: 0x0000001a
>>> min_inst_length: 1
>>> default_is_stmt: 1
>>>       line_base: -5
>>>      line_range: 14
>>>     opcode_base: 13
>>> standard_opcode_lengths[DW_LNS_copy] = 0
>>> standard_opcode_lengths[DW_LNS_advance_pc] = 1
>>> standard_opcode_lengths[DW_LNS_advance_line] = 1
>>> standard_opcode_lengths[DW_LNS_set_file] = 1
>>> standard_opcode_lengths[DW_LNS_set_column] = 1
>>> standard_opcode_lengths[DW_LNS_negate_stmt] = 0
>>> standard_opcode_lengths[DW_LNS_set_basic_block] = 0
>>> standard_opcode_lengths[DW_LNS_const_add_pc] = 0
>>> standard_opcode_lengths[DW_LNS_fixed_advance_pc] = 1
>>> standard_opcode_lengths[DW_LNS_set_prologue_end] = 0
>>> standard_opcode_lengths[DW_LNS_set_epilogue_begin] = 0
>>> standard_opcode_lengths[DW_LNS_set_isa] = 1
>>>                Dir  Mod Time   File Len   File Name
>>>                ---- ---------- ---------- ---------------------------
>>> file_names[  1]    0 0x00000000 0x00000000 a.c
>>> 
>>> Address            Line   Column File   ISA Discriminator Flags
>>> ------------------ ------ ------ ------ --- ------------- -------------
>>> 0x0000000000000000      3      0      1   0             0  is_stmt
>>> 0x0000000000000008      4      0      1   0             0  is_stmt prologue_end
>>> 0x0000000000000011      5      0      1   0             0  is_stmt
>>> 0x0000000000000020      8      0      1   0             0  is_stmt
>>> 0x000000000000002b      9      0      1   0             0  is_stmt prologue_end
>>> 0x0000000000000039     10      0      1   0             0  is_stmt
>>> 0x000000000000004b     11      0      1   0             0  is_stmt
>>> 0x0000000000000058     12      0      1   0             0  is_stmt
>>> 0x0000000000000063     12      0      1   0             0  is_stmt end_sequence
>>> 
>>> .debug_line.dwo contents:
>>> 
>>> .debug_str contents:
>>> -0x00000000: "clang version 3.6.0 (218128)"
>>> +0x00000000: "clang version 3.6.0 (218129)"
>>> 0x0000001d: "<stdin>"
>>> 0x00000025: "/Users/kuba/llvm-tot-cmake-release"
>>> -0x00000048: "f"
>>> -0x0000004a: "main"
>>> 
>>> .debug_ranges contents:
>>> 
>>> .debug_pubnames contents:
>>> 
>>> .debug_pubtypes contents:
>>> 
>>> .debug_gnu_pubnames contents:
>>> 
>>> .debug_gnu_pubtypes contents:
>>> $ 
>>> 
>>> 
>>> Kuba
>>> 
>>> 
>>> 
>>> On Thu, Sep 25, 2014 at 1:42 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>> 
>>> 
>>> On Thu, Sep 25, 2014 at 1:03 PM, Kuba Brecka <kuba.brecka at gmail.com> wrote:
>>> Clang r218129:
>>> 
>>> $ ./bin/clang -gline-tables-only a.c -o a.out -###
>>> clang version 3.6.0 (218129) 
>>> Target: x86_64-apple-darwin14.0.0
>>> Thread model: posix
>>> "/Users/kuba/llvm-tot-cmake-release/bin/clang-3.6" "-cc1" "-triple" "x86_64-apple-macosx10.10.0" "-emit-obj" "-mrelax-all" "-disable-free" "-main-file-name" "a.c" "-mrelocation-model" "pic" "-pic-level" "2" "-mdisable-fp-elim" "-masm-verbose" "-munwind-tables" "-target-cpu" "core2" "-gline-tables-only" "-gdwarf-2" "-dwarf-column-info" "-resource-dir" "/Users/kuba/llvm-tot-cmake-release/bin/../lib/clang/3.6.0" "-fdebug-compilation-dir" "/Users/kuba/llvm-tot-cmake-release" "-ferror-limit" "19" "-fmessage-length" "364" "-stack-protector" "1" "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-10.10.0" "-fencode-extended-block-signature" "-fmax-type-align=16" "-fdiagnostics-show-option" "-fcolor-diagnostics" "-o" "/var/folders/k0/qjt5nwj91314gwrg0j9ltrrw0000gn/T/a-87344c.o" "-x" "c" "a.c"
>>> "/usr/bin/ld" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.10.0" "-o" "a.out" "/var/folders/k0/qjt5nwj91314gwrg0j9ltrrw0000gn/T/a-87344c.o" "-lSystem"
>>> "/usr/bin/dsymutil" "-o" "a.out.dSYM" "a.out"
>>> $ ./bin/clang -cc1 -triple x86_64-apple-macosx10.10.0 -emit-obj -gline-tables-only -gdwarf-2 -dwarf-column-info a.c -o a.o
>>> $ ld -dynamic -arch x86_64 -o a.out a.o -lSystem -macosx_version_min 10.10.0
>>> $ dsymutil a.out -o a.out.dSYM
>>> warning: no debug symbols in executable (-arch x86_64)
>>> 
>>> I'm not sure what this warning is meant to express - but it might be related to the issue. Have you tried dwarfdumping a.out before running dsymutil? At least using your command line and running dwarfdump on the object file (on Linux I don't have dsymutil, nm for MachO, etc) I see the debug info I expect, whereas it looks like no debug info made it to the dsym file below \/.
>>> 
>>> $ ./bin/llvm-dwarfdump -debug-dump=all a.out.dSYM/Contents/Resources/DWARF/a.out
>>> a.out.dSYM/Contents/Resources/DWARF/a.out:	file format Mach-O 64-bit x86-64
>>> .debug_abbrev contents:
>>> Abbrev table for offset: 0x00000000
>>> .debug_abbrev.dwo contents:
>>> < EMPTY >
>>> .debug_info contents:
>>> .debug_loc contents:
>>> .debug_loc.dwo contents:
>>> .debug_frame contents:
>>> .debug_aranges contents:
>>> .debug_line contents:
>>> .debug_line.dwo contents:
>>> .debug_str contents:
>>> 0x00000000: ""
>>> .debug_ranges contents:
>>> .debug_pubnames contents:
>>> .debug_pubtypes contents:
>>> .debug_gnu_pubnames contents:
>>> .debug_gnu_pubtypes contents:
>>> $ 
>>> 
>>> Clang r218128:
>>> 
>>> $ ./bin/clang -gline-tables-only a.c -o a.out -###
>>> clang version 3.6.0 (218128)
>>> Target: x86_64-apple-darwin14.0.0
>>> Thread model: posix
>>> "/Users/kuba/llvm-tot-cmake-release/bin/clang-3.6" "-cc1" "-triple" "x86_64-apple-macosx10.10.0" "-emit-obj" "-mrelax-all" "-disable-free" "-main-file-name" "a.c" "-mrelocation-model" "pic" "-pic-level" "2" "-mdisable-fp-elim" "-masm-verbose" "-munwind-tables" "-target-cpu" "core2" "-gline-tables-only" "-gdwarf-2" "-dwarf-column-info" "-resource-dir" "/Users/kuba/llvm-tot-cmake-release/bin/../lib/clang/3.6.0" "-fdebug-compilation-dir" "/Users/kuba/llvm-tot-cmake-release" "-ferror-limit" "19" "-fmessage-length" "364" "-stack-protector" "1" "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-10.10.0" "-fencode-extended-block-signature" "-fmax-type-align=16" "-fdiagnostics-show-option" "-fcolor-diagnostics" "-o" "/var/folders/k0/qjt5nwj91314gwrg0j9ltrrw0000gn/T/a-d4d93b.o" "-x" "c" "a.c"
>>> "/usr/bin/ld" "-dynamic" "-arch" "x86_64" "-macosx_version_min" "10.10.0" "-o" "a.out" "/var/folders/k0/qjt5nwj91314gwrg0j9ltrrw0000gn/T/a-d4d93b.o" "-lSystem"
>>> "/usr/bin/dsymutil" "-o" "a.out.dSYM" "a.out"
>>> $ ./bin/clang -cc1 -triple x86_64-apple-macosx10.10.0 -emit-obj -gline-tables-only -gdwarf-2 -dwarf-column-info a.c -o a.o
>>> $ ld -dynamic -arch x86_64 -o a.out a.o -lSystem -macosx_version_min 10.10.0
>>> $ dsymutil a.out -o a.out.dSYM
>>> $ ./bin/llvm-dwarfdump -debug-dump=all a.out.dSYM/Contents/Resources/DWARF/a.out
>>> a.out.dSYM/Contents/Resources/DWARF/a.out:	file format Mach-O 64-bit x86-64
>>> 
>>> .debug_abbrev contents:
>>> Abbrev table for offset: 0x00000000
>>> [1] DW_TAG_compile_unit	DW_CHILDREN_yes
>>> 	DW_AT_producer	DW_FORM_strp
>>> 	DW_AT_language	DW_FORM_data2
>>> 	DW_AT_name	DW_FORM_strp
>>> 	DW_AT_stmt_list	DW_FORM_data4
>>> 	DW_AT_comp_dir	DW_FORM_strp
>>> 
>>> [2] DW_TAG_subprogram	DW_CHILDREN_no
>>> 	DW_AT_low_pc	DW_FORM_addr
>>> 	DW_AT_high_pc	DW_FORM_addr
>>> 	DW_AT_APPLE_omit_frame_ptr	DW_FORM_flag
>>> 	DW_AT_name	DW_FORM_strp
>>> 
>>> 
>>> .debug_abbrev.dwo contents:
>>> < EMPTY >
>>> 
>>> .debug_info contents:
>>> 0x00000000: Compile Unit: length = 0x00000047 version = 0x0002 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x0000004b)
>>> 
>>> 0x0000000b: DW_TAG_compile_unit [1] *
>>>             DW_AT_producer [DW_FORM_strp]	( .debug_str[0x00000001] = "clang version 3.6.0 (218128)")
>>>             DW_AT_language [DW_FORM_data2]	(DW_LANG_C99)
>>>             DW_AT_name [DW_FORM_strp]	( .debug_str[0x0000001e] = "<stdin>")
>>>             DW_AT_stmt_list [DW_FORM_data4]	(0x00000000)
>>>             DW_AT_comp_dir [DW_FORM_strp]	( .debug_str[0x00000026] = "/Users/kuba/llvm-tot-cmake-release")
>>> 
>>> 0x0000001e:   DW_TAG_subprogram [2]  
>>>               DW_AT_low_pc [DW_FORM_addr]	(0x0000000100000f20)
>>>               DW_AT_high_pc [DW_FORM_addr]	(0x0000000100000f39)
>>>               DW_AT_APPLE_omit_frame_ptr [DW_FORM_flag]	(0x01)
>>>               DW_AT_name [DW_FORM_strp]	( .debug_str[0x00000049] = "f")
>>> 
>>> 0x00000034:   DW_TAG_subprogram [2]  
>>>               DW_AT_low_pc [DW_FORM_addr]	(0x0000000100000f40)
>>>               DW_AT_high_pc [DW_FORM_addr]	(0x0000000100000f83)
>>>               DW_AT_APPLE_omit_frame_ptr [DW_FORM_flag]	(0x01)
>>>               DW_AT_name [DW_FORM_strp]	( .debug_str[0x0000004b] = "main")
>>> 
>>> 0x0000004a:   NULL
>>> 
>>> .debug_loc contents:
>>> 
>>> .debug_loc.dwo contents:
>>> 
>>> .debug_frame contents:
>>> 
>>> 00000000 00000014 ffffffff CIE
>>> Version:               1
>>> Augmentation:          ""
>>> Code alignment factor: 1
>>> Data alignment factor: -8
>>> Return address column: 16
>>> 
>>> DW_CFA_def_cfa:
>>> DW_CFA_offset:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> 
>>> 00000018 0000001c 00000000 FDE cie=00000000 pc=00000f20...00000f39
>>> DW_CFA_advance_loc:
>>> DW_CFA_def_cfa_offset:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> 
>>> 00000038 0000001c 00000000 FDE cie=00000000 pc=00000f40...00000f83
>>> DW_CFA_advance_loc:
>>> DW_CFA_def_cfa_offset:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> DW_CFA_nop:
>>> 
>>> 
>>> .debug_aranges contents:
>>> Address Range Header: length = 0x0000003c, version = 0x0002, cu_offset = 0x00000000, addr_size = 0x08, seg_size = 0x00
>>> [0x0000000100000f20 - 0x0000000100000f39)
>>> [0x0000000100000f40 - 0x0000000100000f83)
>>> 
>>> .debug_line contents:
>>> Line table prologue:
>>>   total_length: 0x00000052
>>>        version: 2
>>> prologue_length: 0x0000001a
>>> min_inst_length: 1
>>> default_is_stmt: 1
>>>      line_base: -5
>>>     line_range: 14
>>>    opcode_base: 13
>>> standard_opcode_lengths[DW_LNS_copy] = 0
>>> standard_opcode_lengths[DW_LNS_advance_pc] = 1
>>> standard_opcode_lengths[DW_LNS_advance_line] = 1
>>> standard_opcode_lengths[DW_LNS_set_file] = 1
>>> standard_opcode_lengths[DW_LNS_set_column] = 1
>>> standard_opcode_lengths[DW_LNS_negate_stmt] = 0
>>> standard_opcode_lengths[DW_LNS_set_basic_block] = 0
>>> standard_opcode_lengths[DW_LNS_const_add_pc] = 0
>>> standard_opcode_lengths[DW_LNS_fixed_advance_pc] = 1
>>> standard_opcode_lengths[DW_LNS_set_prologue_end] = 0
>>> standard_opcode_lengths[DW_LNS_set_epilogue_begin] = 0
>>> standard_opcode_lengths[DW_LNS_set_isa] = 1
>>>               Dir  Mod Time   File Len   File Name
>>>               ---- ---------- ---------- ---------------------------
>>> file_names[  1]    0 0x00000000 0x00000000 a.c
>>> 
>>> Address            Line   Column File   ISA Discriminator Flags
>>> ------------------ ------ ------ ------ --- ------------- -------------
>>> 0x0000000100000f20      3      0      1   0             0  is_stmt
>>> 0x0000000100000f28      4      2      1   0             0  is_stmt prologue_end
>>> 0x0000000100000f31      5      2      1   0             0  is_stmt
>>> 0x0000000100000f39      5      2      1   0             0  is_stmt end_sequence
>>> 0x0000000100000f40      8      0      1   0             0  is_stmt
>>> 0x0000000100000f4b      9      2      1   0             0  is_stmt prologue_end
>>> 0x0000000100000f59     10      2      1   0             0  is_stmt
>>> 0x0000000100000f6b     11      2      1   0             0  is_stmt
>>> 0x0000000100000f78     12      1      1   0             0  is_stmt
>>> 0x0000000100000f83     12      1      1   0             0  is_stmt end_sequence
>>> 
>>> .debug_line.dwo contents:
>>> 
>>> .debug_str contents:
>>> 0x00000000: ""
>>> 0x00000001: "clang version 3.6.0 (218128)"
>>> 0x0000001e: "<stdin>"
>>> 0x00000026: "/Users/kuba/llvm-tot-cmake-release"
>>> 0x00000049: "f"
>>> 0x0000004b: "main"
>>> 
>>> .debug_ranges contents:
>>> 
>>> .debug_pubnames contents:
>>> length = 0x0000001d version = 0x0002 unit_offset = 0x00000000 unit_size = 0x0000004b
>>> Offset     Name
>>> 0x0000001e "f"
>>> 0x00000034 "main"
>>> 
>>> .debug_pubtypes contents:
>>> 
>>> .debug_gnu_pubnames contents:
>>> 
>>> .debug_gnu_pubtypes contents:
>>> $ 
>>> 
>>> 
>>> 
>>> Kuba
>>> 
>>> 
>>> 
>>> On Thu, Sep 25, 2014 at 10:51 AM, David Blaikie <dblaikie at gmail.com> wrote:
>>> 
>>> 
>>> On Wed, Sep 24, 2014 at 12:27 PM, Kuba Brecka <kuba.brecka at gmail.com> wrote:
>>> Sure. It works with my system's clang, but when using my just-built ./bin/clang, the symbolizer doesn't give me any line information.
>>> 
>>> $ cat a.c
>>> #include <stdio.h>
>>> 
>>> int f() {
>>>       printf("X");
>>>       return 0;
>>> }
>>> 
>>> int main() {
>>>       printf("1");
>>>       printf("2");
>>>       printf("3");
>>> }
>>> $ clang a.c -o a.out -gline-tables-only
>>> 
>>> A -cc1 command line would be helpful, not sure which -target I should use, etc.
>>> 
>>> $ nm a.out
>>> 0000000100000000 T __mh_execute_header
>>> 0000000100000f00 T _f
>>> 0000000100000f30 T _main
>>>                U _printf
>>>                U dyld_stub_binder
>>> $ echo "a.out 0x0000000100000f00" | ./bin/llvm-symbolizer 
>>> f
>>> /Users/kuba/llvm-tot-cmake-release/a.c:3:0
>>> $ echo "a.out 0x0000000100000f18" | ./bin/llvm-symbolizer 
>>> f
>>> /Users/kuba/llvm-tot-cmake-release/a.c:5:2
>>> $ ./bin/llvm-dwarfdump -debug-dump=line a.out.dSYM/Contents/Resources/DWARF/a.out
>>> 
>>> The full dwarfdump, not just the line table, is probably necessary to investigate this - my change didn't modify the line table, it modified the compile units in the debug_info section (and added ranges back into the debug_ranges section).
>>> 
>>> a.out.dSYM/Contents/Resources/DWARF/a.out:      file format Mach-O 64-bit x86-64
>>> .debug_line contents:
>>> Line table prologue:
>>>   total_length: 0x00000052
>>>        version: 2
>>> prologue_length: 0x0000001a
>>> min_inst_length: 1
>>> default_is_stmt: 1
>>>      line_base: -5
>>>     line_range: 14
>>>    opcode_base: 13
>>> standard_opcode_lengths[DW_LNS_copy] = 0
>>> standard_opcode_lengths[DW_LNS_advance_pc] = 1
>>> standard_opcode_lengths[DW_LNS_advance_line] = 1
>>> standard_opcode_lengths[DW_LNS_set_file] = 1
>>> standard_opcode_lengths[DW_LNS_set_column] = 1
>>> standard_opcode_lengths[DW_LNS_negate_stmt] = 0
>>> standard_opcode_lengths[DW_LNS_set_basic_block] = 0
>>> standard_opcode_lengths[DW_LNS_const_add_pc] = 0
>>> standard_opcode_lengths[DW_LNS_fixed_advance_pc] = 1
>>> standard_opcode_lengths[DW_LNS_set_prologue_end] = 0
>>> standard_opcode_lengths[DW_LNS_set_epilogue_begin] = 0
>>> standard_opcode_lengths[DW_LNS_set_isa] = 1
>>>               Dir  Mod Time   File Len   File Name
>>>               ---- ---------- ---------- ---------------------------
>>> file_names[  1]    0 0x00000000 0x00000000 a.c
>>> Address            Line   Column File   ISA Discriminator Flags
>>> ------------------ ------ ------ ------ --- ------------- -------------
>>> 0x0000000100000f00      3      0      1   0             0  is_stmt
>>> 0x0000000100000f0f      4      2      1   0             0  is_stmt prologue_end
>>> 0x0000000100000f18      5      2      1   0             0  is_stmt
>>> 0x0000000100000f23      5      2      1   0             0  is_stmt end_sequence
>>> 0x0000000100000f30      8      0      1   0             0  is_stmt
>>> 0x0000000100000f3f      9      2      1   0             0  is_stmt prologue_end
>>> 0x0000000100000f4d     10      2      1   0             0  is_stmt
>>> 0x0000000100000f5e     11      2      1   0             0  is_stmt
>>> 0x0000000100000f6a     12      1      1   0             0  is_stmt
>>> 0x0000000100000f75     12      1      1   0             0  is_stmt end_sequence
>>> 
>>> $ ./bin/clang a.c -o a.out -gline-tables-only
>>> warning: no debug symbols in executable (-arch x86_64)
>>> $ echo "a.out 0x0000000100000f00" | ./bin/llvm-symbolizer 
>>> f
>>> ??:0:0
>>> $ echo "a.out 0x0000000100000f18" | ./bin/llvm-symbolizer 
>>> f
>>> ??:0:0
>>> $ ./bin/llvm-dwarfdump -debug-dump=line a.out.dSYM/Contents/Resources/DWARF/a.out
>>> a.out.dSYM/Contents/Resources/DWARF/a.out:      file format Mach-O 64-bit x86-64
>>> 
>>> 
>>> .debug_line contents:
>>> $
>>> 
>>> Kuba
>>> 
>>> 
>>> On Wed, Sep 24, 2014 at 12:10 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>> 
>>> 
>>> On Wed, Sep 24, 2014 at 12:08 PM, Kuba Brecka <kuba.brecka at gmail.com> wrote:
>>> I'm getting test failures for compiler-rt asan tests after this patch. It seems the symbolizer stops working with -gline-tables-only on OS X:
>>> 
>>> Could you provide a simple reproduction? (a clang command line with a -target and an llvm-symbolizer invocation that should symbolize a particular instruction/offset in the binary, etc) and/or llvm-dwarfdump of a simple binary that fails symbolication when it shouldn't.
>>> 
>>> 
>>> FAIL: AddressSanitizer32 :: TestCases/use-after-free.cc (222 of 460)
>>> ******************** TEST 'AddressSanitizer32 :: TestCases/use-after-free.cc' FAILED ********************
>>> Script:
>>> --
>>> /Users/kuba/llvm-tot-cmake-release/./bin/clang --driver-mode=g++ -fsanitize=address -mno-omit-leaf-frame-pointer -fno-omit-frame-pointer -fno-optimize-sibling-calls -gline-tables-only -m32 -O0 /Users/kuba/llvm-tot/projects/compiler-rt/test/asan/TestCases/use-after-free.cc -o /Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp && not  /Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp 2>&1 | FileCheck /Users/kuba/llvm-tot/projects/compiler-rt/test/asan/TestCases/use-after-free.cc --check-prefix=CHECK-Darwin --check-prefix=CHECK
>>> /Users/kuba/llvm-tot-cmake-release/./bin/clang --driver-mode=g++ -fsanitize=address -mno-omit-leaf-frame-pointer -fno-omit-frame-pointer -fno-optimize-sibling-calls -gline-tables-only -m32 -O1 /Users/kuba/llvm-tot/projects/compiler-rt/test/asan/TestCases/use-after-free.cc -o /Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp && not  /Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp 2>&1 | FileCheck /Users/kuba/llvm-tot/projects/compiler-rt/test/asan/TestCases/use-after-free.cc --check-prefix=CHECK-Darwin --check-prefix=CHECK
>>> /Users/kuba/llvm-tot-cmake-release/./bin/clang --driver-mode=g++ -fsanitize=address -mno-omit-leaf-frame-pointer -fno-omit-frame-pointer -fno-optimize-sibling-calls -gline-tables-only -m32 -O2 /Users/kuba/llvm-tot/projects/compiler-rt/test/asan/TestCases/use-after-free.cc -o /Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp && not  /Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp 2>&1 | FileCheck /Users/kuba/llvm-tot/projects/compiler-rt/test/asan/TestCases/use-after-free.cc --check-prefix=CHECK-Darwin --check-prefix=CHECK
>>> /Users/kuba/llvm-tot-cmake-release/./bin/clang --driver-mode=g++ -fsanitize=address -mno-omit-leaf-frame-pointer -fno-omit-frame-pointer -fno-optimize-sibling-calls -gline-tables-only -m32 -O3 /Users/kuba/llvm-tot/projects/compiler-rt/test/asan/TestCases/use-after-free.cc -o /Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp && not  /Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp 2>&1 | FileCheck /Users/kuba/llvm-tot/projects/compiler-rt/test/asan/TestCases/use-after-free.cc --check-prefix=CHECK-Darwin --check-prefix=CHECK
>>> --
>>> Exit Code: 1
>>> 
>>> Command Output (stdout):
>>> --
>>> warning: no debug symbols in executable (-arch i386)
>>> 
>>> --
>>> Command Output (stderr):
>>> --
>>> /Users/kuba/llvm-tot/projects/compiler-rt/test/asan/TestCases/use-after-free.cc:15:12: error: expected string not found in input
>>> // CHECK: {{ #0 0x.* in main .*use-after-free.cc:}}[[@LINE-4]]
>>>          ^
>>> <stdin>:4:2: note: scanning from here
>>> #0 0x75e5f in main (/Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp+0x1e5f)
>>> ^
>>> <stdin>:4:2: note: with expression "@LINE-4" equal to "11"
>>> #0 0x75e5f in main (/Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp+0x1e5f)
>>> ^
>>> <stdin>:4:97: note: possible intended match here
>>> #0 0x75e5f in main (/Users/kuba/llvm-tot-cmake-release/projects/compiler-rt/test/asan/32bitConfig/TestCases/Output/use-after-free.cc.tmp+0x1e5f)
>>> 
>>> Kuba
>>> 
>>> Author: dblaikie
>>> Date: Fri Sep 19 12:03:16 2014
>>> New Revision: 218129
>>> URL: http://llvm.org/viewvc/llvm-project?rev=218129&view=rev
>>> Log:
>>> Omit DW_TAG_subprograms for subprograms without inlined subroutines when producing -gmlt data
>>> To reduce the size of -gmlt data, skip the subprograms without any
>>> inlined subroutines. Since we've now got the ability to make these
>>> determinations in the backend (funnily enough - we added the flag so we
>>> wouldn't produce ranges under -gmlt, but with this change we use the
>>> flag, but go back to producing ranges under -gmlt).
>>> Instead, just produce CU ranges to inform the consumer which parts of
>>> the code are described by this CU's line table. Tools could inspect the
>>> line table directly to compute the range, but the CU ranges only seem to
>>> be about 0.5% of object/executable size, so I'm not too worried about
>>> teaching llvm-symbolizer that trick just yet - it's certainly a possible
>>> piece of future work.
>>> Update an llvm-symbolizer test just to demonstrate that this schema is
>>> acceptable there (if it wasn't, the compiler-rt tests would catch this,
>>> but good to have an in-llvm-tree test for llvm-symbolizer's behavior
>>> here)
>>> Building the clang binary with -gmlt with this patch reduces the total
>>> size of object files by 5.1% (5.56% without ranges) without compression
>>> and the executable by 4.37% (4.75% without ranges).
>>> Modified:
>>>   llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>>   llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>>>   llvm/trunk/test/DebugInfo/Inputs/dwarfdump-inl-test.elf-x86-64
>>>   llvm/trunk/test/DebugInfo/gmlt.ll
>>>   llvm/trunk/test/DebugInfo/llvm-symbolizer.test
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
> 





More information about the llvm-commits mailing list