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

Alexey Samsonov vonosmas at gmail.com
Fri Sep 26 13:37:46 PDT 2014


On Thu, Sep 25, 2014 at 4:19 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> On Thu, 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.
>>
>
> Hmm - I'm confused then. The llvm-symbolizer knows how to look in the
> symbol table, but it'll only consult the line table if it's present and the
> CU's ranges (either ranges on the compile_unit itself, or the ranegs of the
> subprograms within it) covers the instruction.
>

To be more specific: llvm-symbolizer first looks at the DWARF data and
locates compilation unit corresponding to instruction address (as David
says, it either uses DW_AT_ranges from CU DIE, or scans all subprogram DIEs
for this unit).
When the compilation unit is located, llvm-symbolizer:
1) finds a subprogram DIE for instruction address, and fetches function
name from it.
2) takes a line table for this CU, and gets file/line info for given
address from it.
Afterwards, it does
3) overrides function name with a symbol table entry.


>
> It'd be nice to remove that latter restriction (it'd save another 8% on
> object file size in -O0 -gmlt) if possible. That'd require the symbolizer
> to walk the line table to build up the address ranges, though, which might
> be a performance problem.
>

Exactly. The ability to build [instruction address] -> [compile unit]
mapping without scanning the whole line table is critical for quick
symbolization.

Now, speaking of failing tests. We can at least fix the symbolizer
test-suite by restoring "-g" flag on Darwin. Are there other tests that are
affected?



>
>
>>
>> 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
>> >
>>
>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>


-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140926/96ad5abd/attachment.html>


More information about the llvm-commits mailing list