[llvm] r360380 - llvm-dwarfdump: Add dwo parsing to --statistics.
Caroline Tice via llvm-commits
llvm-commits at lists.llvm.org
Thu May 9 14:53:33 PDT 2019
Author: ctice
Date: Thu May 9 14:53:33 2019
New Revision: 360380
URL: http://llvm.org/viewvc/llvm-project?rev=360380&view=rev
Log:
llvm-dwarfdump: Add dwo parsing to --statistics.
Add check for, and parsing of, .dwo files to Statistics.cpp; create a new getNon
SkeletonUnitDie function for DWARFUnit.h
Reviewers: dblaikie
Differential Revision: https://review.llvm.org/D61755
Added:
llvm/trunk/test/tools/llvm-dwarfdump/X86/Inputs/statistics-fib.split-dwarf.s
llvm/trunk/test/tools/llvm-dwarfdump/X86/statistics-dwo.test
Modified:
llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
llvm/trunk/tools/llvm-dwarfdump/Statistics.cpp
Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h?rev=360380&r1=360379&r2=360380&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h Thu May 9 14:53:33 2019
@@ -385,6 +385,13 @@ public:
return DWARFDie(this, &DieArray[0]);
}
+ DWARFDie getNonSkeletonUnitDIE(bool ExtractUnitDIEOnly = true) {
+ parseDWO();
+ if (DWO)
+ return DWO->getUnitDIE(ExtractUnitDIEOnly);
+ return getUnitDIE(ExtractUnitDIEOnly);
+ }
+
const char *getCompilationDir();
Optional<uint64_t> getDWOId() {
extractDIEsIfNeeded(/*CUDieOnly*/ true);
Added: llvm/trunk/test/tools/llvm-dwarfdump/X86/Inputs/statistics-fib.split-dwarf.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/Inputs/statistics-fib.split-dwarf.s?rev=360380&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-dwarfdump/X86/Inputs/statistics-fib.split-dwarf.s (added)
+++ llvm/trunk/test/tools/llvm-dwarfdump/X86/Inputs/statistics-fib.split-dwarf.s Thu May 9 14:53:33 2019
@@ -0,0 +1,1359 @@
+ .text
+ .file "fibonacci.cc"
+ .globl _Z8real_fibiPi # -- Begin function _Z8real_fibiPi
+ .p2align 4, 0x90
+ .type _Z8real_fibiPi, at function
+_Z8real_fibiPi: # @_Z8real_fibiPi
+.Lfunc_begin0:
+ .file 1 "/usr/local/google3/cmtice/llvm.tot2/build/test/tools/llvm-dwarfdump/X86/Output/statistics-dwo.test.tmp" "fibonacci.cc"
+ .loc 1 5 0 # fibonacci.cc:5:0
+ .cfi_startproc
+# %bb.0: # %entry
+ #DEBUG_VALUE: real_fib:x <- $edi
+ #DEBUG_VALUE: real_fib:answers <- $rsi
+ #DEBUG_VALUE: real_fib:x <- $edi
+ pushq %rbp
+ .cfi_def_cfa_offset 16
+ pushq %r14
+ .cfi_def_cfa_offset 24
+ pushq %rbx
+ .cfi_def_cfa_offset 32
+ .cfi_offset %rbx, -32
+ .cfi_offset %r14, -24
+ .cfi_offset %rbp, -16
+ .loc 1 8 7 prologue_end # fibonacci.cc:8:7
+ movslq %edi, %rbp
+ movl (%rsi,%rbp,4), %eax
+ .loc 1 8 20 is_stmt 0 # fibonacci.cc:8:20
+ cmpl $-1, %eax
+.Ltmp0:
+ .loc 1 8 7 # fibonacci.cc:8:7
+ je .LBB0_1
+.Ltmp1:
+# %bb.2: # %cleanup
+ #DEBUG_VALUE: real_fib:answers <- $rsi
+ #DEBUG_VALUE: real_fib:x <- $edi
+ .loc 1 15 1 is_stmt 1 # fibonacci.cc:15:1
+ popq %rbx
+ .cfi_def_cfa_offset 24
+ popq %r14
+ .cfi_def_cfa_offset 16
+ popq %rbp
+ .cfi_def_cfa_offset 8
+ retq
+.Ltmp2:
+.LBB0_1: # %if.end
+ .cfi_def_cfa_offset 32
+ #DEBUG_VALUE: real_fib:answers <- $rsi
+ #DEBUG_VALUE: real_fib:x <- $edi
+ .loc 1 0 1 is_stmt 0 # fibonacci.cc:0:1
+ movq %rsi, %rbx
+.Ltmp3:
+ #DEBUG_VALUE: real_fib:answers <- $rbx
+ .loc 1 11 22 is_stmt 1 # fibonacci.cc:11:22
+ leal -1(%rbp), %edi
+.Ltmp4:
+ .loc 1 11 12 is_stmt 0 # fibonacci.cc:11:12
+ callq _Z8real_fibiPi
+ movl %eax, %r14d
+ .loc 1 11 47 # fibonacci.cc:11:47
+ leal -2(%rbp), %edi
+ .loc 1 11 37 # fibonacci.cc:11:37
+ movq %rbx, %rsi
+ callq _Z8real_fibiPi
+ .loc 1 11 35 # fibonacci.cc:11:35
+ addl %r14d, %eax
+.Ltmp5:
+ #DEBUG_VALUE: real_fib:result <- $eax
+ .loc 1 12 16 is_stmt 1 # fibonacci.cc:12:16
+ movl %eax, (%rbx,%rbp,4)
+ .loc 1 15 1 # fibonacci.cc:15:1
+ popq %rbx
+.Ltmp6:
+ .cfi_def_cfa_offset 24
+ popq %r14
+ .cfi_def_cfa_offset 16
+ popq %rbp
+ .cfi_def_cfa_offset 8
+ retq
+.Ltmp7:
+.Lfunc_end0:
+ .size _Z8real_fibiPi, .Lfunc_end0-_Z8real_fibiPi
+ .cfi_endproc
+ # -- End function
+ .globl _Z3fibi # -- Begin function _Z3fibi
+ .p2align 4, 0x90
+ .type _Z3fibi, at function
+_Z3fibi: # @_Z3fibi
+.Lfunc_begin1:
+ .loc 1 19 0 # fibonacci.cc:19:0
+ .cfi_startproc
+# %bb.0: # %entry
+ #DEBUG_VALUE: fib:x <- $edi
+ movl $-1, %eax
+ #DEBUG_VALUE: fib:x <- $edi
+.Ltmp8:
+ .loc 1 23 9 prologue_end # fibonacci.cc:23:9
+ cmpl $10, %edi
+.Ltmp9:
+ .loc 1 23 7 is_stmt 0 # fibonacci.cc:23:7
+ jg .LBB1_2
+.Ltmp10:
+# %bb.1: # %for.body.preheader
+ #DEBUG_VALUE: fib:x <- $edi
+ subq $56, %rsp
+ .cfi_def_cfa_offset 64
+.Ltmp11:
+ .loc 1 27 16 is_stmt 1 # fibonacci.cc:27:16
+ pcmpeqd %xmm0, %xmm0
+ movdqa %xmm0, (%rsp)
+ movdqu %xmm0, 28(%rsp)
+ movdqa %xmm0, 16(%rsp)
+ movabsq $4294967296, %rax # imm = 0x100000000
+.Ltmp12:
+ #DEBUG_VALUE: fib:i <- undef
+ #DEBUG_VALUE: fib:i <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
+ .loc 1 29 14 # fibonacci.cc:29:14
+ movq %rax, (%rsp)
+ .loc 1 31 14 # fibonacci.cc:31:14
+ movl $1, 8(%rsp)
+ movq %rsp, %rsi
+ .loc 1 33 10 # fibonacci.cc:33:10
+ callq _Z8real_fibiPi
+.Ltmp13:
+ .loc 1 0 10 is_stmt 0 # fibonacci.cc:0:10
+ addq $56, %rsp
+ .cfi_def_cfa_offset 8
+.LBB1_2: # %cleanup
+ .loc 1 34 1 is_stmt 1 # fibonacci.cc:34:1
+ retq
+.Ltmp14:
+.Lfunc_end1:
+ .size _Z3fibi, .Lfunc_end1-_Z3fibi
+ .cfi_endproc
+ # -- End function
+ .globl main # -- Begin function main
+ .p2align 4, 0x90
+ .type main, at function
+main: # @main
+.Lfunc_begin2:
+ .loc 1 37 0 # fibonacci.cc:37:0
+ .cfi_startproc
+# %bb.0: # %entry
+ #DEBUG_VALUE: main:argc <- $edi
+ #DEBUG_VALUE: main:argv <- $rsi
+ #DEBUG_VALUE: fib:x <- 3
+ pushq %rbp
+ .cfi_def_cfa_offset 16
+ pushq %r14
+ .cfi_def_cfa_offset 24
+ pushq %rbx
+ .cfi_def_cfa_offset 32
+ subq $48, %rsp
+ .cfi_def_cfa_offset 80
+ .cfi_offset %rbx, -32
+ .cfi_offset %r14, -24
+ .cfi_offset %rbp, -16
+ .loc 1 27 16 prologue_end # fibonacci.cc:27:16
+ pcmpeqd %xmm0, %xmm0
+ movdqa %xmm0, (%rsp)
+ movdqu %xmm0, 28(%rsp)
+ movdqa %xmm0, 16(%rsp)
+ movabsq $4294967296, %r14 # imm = 0x100000000
+.Ltmp15:
+ #DEBUG_VALUE: fib:i <- undef
+ #DEBUG_VALUE: fib:i <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
+ .loc 1 29 14 # fibonacci.cc:29:14
+ movq %r14, (%rsp)
+ .loc 1 31 14 # fibonacci.cc:31:14
+ movl $1, 8(%rsp)
+ movq %rsp, %rbx
+ .loc 1 33 10 # fibonacci.cc:33:10
+ movl $3, %edi
+.Ltmp16:
+ movq %rbx, %rsi
+.Ltmp17:
+ callq _Z8real_fibiPi
+.Ltmp18:
+ #DEBUG_VALUE: main:result <- $eax
+ .loc 1 41 3 # fibonacci.cc:41:3
+ movl $.L.str, %edi
+ movl %eax, %esi
+ xorl %eax, %eax
+.Ltmp19:
+ callq printf
+.Ltmp20:
+ .loc 1 27 16 # fibonacci.cc:27:16
+ pcmpeqd %xmm0, %xmm0
+.Ltmp21:
+ #DEBUG_VALUE: fib:x <- 4
+ .loc 1 27 16 is_stmt 0 # fibonacci.cc:27:16
+ movdqa %xmm0, (%rsp)
+ movdqu %xmm0, 28(%rsp)
+ movdqa %xmm0, 16(%rsp)
+.Ltmp22:
+ #DEBUG_VALUE: fib:i <- undef
+ #DEBUG_VALUE: fib:i <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
+ .loc 1 29 14 is_stmt 1 # fibonacci.cc:29:14
+ movq %r14, (%rsp)
+ .loc 1 31 14 # fibonacci.cc:31:14
+ movl $1, 8(%rsp)
+ .loc 1 33 10 # fibonacci.cc:33:10
+ movl $4, %edi
+ movq %rbx, %rsi
+ callq _Z8real_fibiPi
+.Ltmp23:
+ #DEBUG_VALUE: main:result <- $eax
+ .loc 1 43 3 # fibonacci.cc:43:3
+ movl $.L.str.1, %edi
+ movl %eax, %esi
+ xorl %eax, %eax
+.Ltmp24:
+ callq printf
+.Ltmp25:
+ .loc 1 27 16 # fibonacci.cc:27:16
+ pcmpeqd %xmm0, %xmm0
+.Ltmp26:
+ #DEBUG_VALUE: fib:x <- 5
+ .loc 1 27 16 is_stmt 0 # fibonacci.cc:27:16
+ movdqa %xmm0, (%rsp)
+ movdqu %xmm0, 28(%rsp)
+ movdqa %xmm0, 16(%rsp)
+.Ltmp27:
+ #DEBUG_VALUE: fib:i <- undef
+ #DEBUG_VALUE: fib:i <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
+ .loc 1 29 14 is_stmt 1 # fibonacci.cc:29:14
+ movq %r14, (%rsp)
+ .loc 1 31 14 # fibonacci.cc:31:14
+ movl $1, 8(%rsp)
+ .loc 1 33 10 # fibonacci.cc:33:10
+ movl $5, %edi
+ movq %rbx, %rsi
+ callq _Z8real_fibiPi
+.Ltmp28:
+ #DEBUG_VALUE: main:result <- $eax
+ .loc 1 45 3 # fibonacci.cc:45:3
+ movl $.L.str.2, %edi
+ movl %eax, %esi
+ xorl %eax, %eax
+.Ltmp29:
+ callq printf
+.Ltmp30:
+ .loc 1 27 16 # fibonacci.cc:27:16
+ pcmpeqd %xmm0, %xmm0
+.Ltmp31:
+ #DEBUG_VALUE: fib:x <- 6
+ .loc 1 27 16 is_stmt 0 # fibonacci.cc:27:16
+ movdqa %xmm0, (%rsp)
+ movdqu %xmm0, 28(%rsp)
+ movdqa %xmm0, 16(%rsp)
+.Ltmp32:
+ #DEBUG_VALUE: fib:i <- undef
+ #DEBUG_VALUE: fib:i <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
+ .loc 1 29 14 is_stmt 1 # fibonacci.cc:29:14
+ movq %r14, (%rsp)
+ .loc 1 31 14 # fibonacci.cc:31:14
+ movl $1, 8(%rsp)
+ .loc 1 33 10 # fibonacci.cc:33:10
+ movl $6, %edi
+ movq %rbx, %rsi
+ callq _Z8real_fibiPi
+.Ltmp33:
+ #DEBUG_VALUE: main:result <- $eax
+ .loc 1 47 3 # fibonacci.cc:47:3
+ movl $.L.str.3, %edi
+ movl %eax, %esi
+ xorl %eax, %eax
+.Ltmp34:
+ callq printf
+.Ltmp35:
+ .loc 1 27 16 # fibonacci.cc:27:16
+ pcmpeqd %xmm0, %xmm0
+.Ltmp36:
+ #DEBUG_VALUE: fib:x <- 7
+ .loc 1 27 16 is_stmt 0 # fibonacci.cc:27:16
+ movdqa %xmm0, (%rsp)
+ movdqu %xmm0, 28(%rsp)
+ movdqa %xmm0, 16(%rsp)
+.Ltmp37:
+ #DEBUG_VALUE: fib:i <- undef
+ #DEBUG_VALUE: fib:i <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
+ .loc 1 29 14 is_stmt 1 # fibonacci.cc:29:14
+ movq %r14, (%rsp)
+ .loc 1 31 14 # fibonacci.cc:31:14
+ movl $1, 8(%rsp)
+ .loc 1 33 10 # fibonacci.cc:33:10
+ movl $7, %edi
+ movq %rbx, %rsi
+ callq _Z8real_fibiPi
+.Ltmp38:
+ #DEBUG_VALUE: main:result <- $eax
+ .loc 1 49 3 # fibonacci.cc:49:3
+ movl $.L.str.4, %edi
+ movl %eax, %esi
+ xorl %eax, %eax
+.Ltmp39:
+ callq printf
+.Ltmp40:
+ .loc 1 27 16 # fibonacci.cc:27:16
+ pcmpeqd %xmm0, %xmm0
+.Ltmp41:
+ #DEBUG_VALUE: fib:x <- 8
+ .loc 1 27 16 is_stmt 0 # fibonacci.cc:27:16
+ movdqa %xmm0, (%rsp)
+ movdqu %xmm0, 28(%rsp)
+ movdqa %xmm0, 16(%rsp)
+.Ltmp42:
+ #DEBUG_VALUE: fib:i <- undef
+ #DEBUG_VALUE: fib:i <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
+ .loc 1 29 14 is_stmt 1 # fibonacci.cc:29:14
+ movq %r14, (%rsp)
+ .loc 1 31 14 # fibonacci.cc:31:14
+ movl $1, 8(%rsp)
+ .loc 1 33 10 # fibonacci.cc:33:10
+ movl $8, %edi
+ movq %rbx, %rsi
+ callq _Z8real_fibiPi
+ movl %eax, %ebp
+.Ltmp43:
+ #DEBUG_VALUE: main:result <- $ebp
+ .loc 1 51 3 # fibonacci.cc:51:3
+ movl $.L.str.5, %edi
+ movl %eax, %esi
+ xorl %eax, %eax
+ callq printf
+ .loc 1 52 3 # fibonacci.cc:52:3
+ movl $.L.str.6, %edi
+ movl %ebp, %esi
+ xorl %eax, %eax
+ callq printf
+.Ltmp44:
+ .loc 1 27 16 # fibonacci.cc:27:16
+ pcmpeqd %xmm0, %xmm0
+.Ltmp45:
+ #DEBUG_VALUE: fib:x <- 10
+ .loc 1 27 16 is_stmt 0 # fibonacci.cc:27:16
+ movdqa %xmm0, (%rsp)
+ movdqu %xmm0, 28(%rsp)
+ movdqa %xmm0, 16(%rsp)
+.Ltmp46:
+ #DEBUG_VALUE: fib:i <- undef
+ #DEBUG_VALUE: fib:i <- [DW_OP_plus_uconst 1, DW_OP_stack_value] undef
+ .loc 1 29 14 is_stmt 1 # fibonacci.cc:29:14
+ movq %r14, (%rsp)
+ .loc 1 31 14 # fibonacci.cc:31:14
+ movl $1, 8(%rsp)
+ .loc 1 33 10 # fibonacci.cc:33:10
+ movl $10, %edi
+ movq %rbx, %rsi
+ callq _Z8real_fibiPi
+.Ltmp47:
+ #DEBUG_VALUE: main:result <- $eax
+ .loc 1 54 3 # fibonacci.cc:54:3
+ movl $.L.str.7, %edi
+ movl %eax, %esi
+ xorl %eax, %eax
+.Ltmp48:
+ callq printf
+ .loc 1 56 3 # fibonacci.cc:56:3
+ xorl %eax, %eax
+ addq $48, %rsp
+ .cfi_def_cfa_offset 32
+ popq %rbx
+ .cfi_def_cfa_offset 24
+ popq %r14
+ .cfi_def_cfa_offset 16
+ popq %rbp
+ .cfi_def_cfa_offset 8
+ retq
+.Ltmp49:
+.Lfunc_end2:
+ .size main, .Lfunc_end2-main
+ .cfi_endproc
+ # -- End function
+ .type .L.str, at object # @.str
+ .section .rodata.str1.1,"aMS", at progbits,1
+.L.str:
+ .asciz "fibonacci(3) = %d\n"
+ .size .L.str, 19
+
+ .type .L.str.1, at object # @.str.1
+.L.str.1:
+ .asciz "fibonacci(4) = %d\n"
+ .size .L.str.1, 19
+
+ .type .L.str.2, at object # @.str.2
+.L.str.2:
+ .asciz "fibonacci(5) = %d\n"
+ .size .L.str.2, 19
+
+ .type .L.str.3, at object # @.str.3
+.L.str.3:
+ .asciz "fibonacci(6) = %d\n"
+ .size .L.str.3, 19
+
+ .type .L.str.4, at object # @.str.4
+.L.str.4:
+ .asciz "fibonacci(7) = %d\n"
+ .size .L.str.4, 19
+
+ .type .L.str.5, at object # @.str.5
+.L.str.5:
+ .asciz "fibonacci(8) = %d\n"
+ .size .L.str.5, 19
+
+ .type .L.str.6, at object # @.str.6
+.L.str.6:
+ .asciz "fibonacci(9) = %d\n"
+ .size .L.str.6, 19
+
+ .type .L.str.7, at object # @.str.7
+.L.str.7:
+ .asciz "fibonacci(10) = %d\n"
+ .size .L.str.7, 20
+
+ .section .debug_str,"MS", at progbits,1
+.Lskel_string0:
+ .asciz "/usr/local/google3/cmtice/llvm.tot2/build/test/tools/llvm-dwarfdump/X86/Output/statistics-dwo.test.tmp" # string offset=0
+.Lskel_string1:
+ .asciz "fib" # string offset=71
+.Lskel_string2:
+ .asciz "main" # string offset=75
+.Lskel_string3:
+ .asciz "statistics-fib.split-dwarf.dwo" # string offset=80
+ .section .debug_loc.dwo,"e", at progbits
+.Ldebug_loc0:
+ .byte 3
+ .byte 0
+ .long .Ltmp4-.Lfunc_begin0
+ .short 1 # Loc expr size
+ .byte 85 # super-register DW_OP_reg5
+ .byte 0
+.Ldebug_loc1:
+ .byte 3
+ .byte 0
+ .long .Ltmp3-.Lfunc_begin0
+ .short 1 # Loc expr size
+ .byte 84 # DW_OP_reg4
+ .byte 3
+ .byte 9
+ .long .Ltmp6-.Ltmp3
+ .short 1 # Loc expr size
+ .byte 83 # DW_OP_reg3
+ .byte 0
+.Ldebug_loc2:
+ .byte 3
+ .byte 10
+ .long .Lfunc_end0-.Ltmp5
+ .short 1 # Loc expr size
+ .byte 80 # super-register DW_OP_reg0
+ .byte 0
+.Ldebug_loc3:
+ .byte 3
+ .byte 1
+ .long .Ltmp13-.Lfunc_begin1
+ .short 1 # Loc expr size
+ .byte 85 # super-register DW_OP_reg5
+ .byte 0
+.Ldebug_loc4:
+ .byte 3
+ .byte 2
+ .long .Ltmp16-.Lfunc_begin2
+ .short 1 # Loc expr size
+ .byte 85 # super-register DW_OP_reg5
+ .byte 0
+.Ldebug_loc5:
+ .byte 3
+ .byte 2
+ .long .Ltmp17-.Lfunc_begin2
+ .short 1 # Loc expr size
+ .byte 84 # DW_OP_reg4
+ .byte 0
+.Ldebug_loc6:
+ .byte 3
+ .byte 11
+ .long .Ltmp19-.Ltmp18
+ .short 1 # Loc expr size
+ .byte 80 # super-register DW_OP_reg0
+ .byte 3
+ .byte 12
+ .long .Ltmp24-.Ltmp23
+ .short 1 # Loc expr size
+ .byte 80 # super-register DW_OP_reg0
+ .byte 3
+ .byte 13
+ .long .Ltmp29-.Ltmp28
+ .short 1 # Loc expr size
+ .byte 80 # super-register DW_OP_reg0
+ .byte 3
+ .byte 14
+ .long .Ltmp34-.Ltmp33
+ .short 1 # Loc expr size
+ .byte 80 # super-register DW_OP_reg0
+ .byte 3
+ .byte 15
+ .long .Ltmp39-.Ltmp38
+ .short 1 # Loc expr size
+ .byte 80 # super-register DW_OP_reg0
+ .byte 3
+ .byte 16
+ .long .Ltmp47-.Ltmp43
+ .short 1 # Loc expr size
+ .byte 86 # super-register DW_OP_reg6
+ .byte 3
+ .byte 17
+ .long .Ltmp48-.Ltmp47
+ .short 1 # Loc expr size
+ .byte 80 # super-register DW_OP_reg0
+ .byte 0
+.Ldebug_loc7:
+ .byte 3
+ .byte 3
+ .long .Lfunc_end2-.Ltmp21
+ .short 3 # Loc expr size
+ .byte 17 # DW_OP_consts
+ .byte 4 # 4
+ .byte 159 # DW_OP_stack_value
+ .byte 0
+.Ldebug_loc8:
+ .byte 3
+ .byte 4
+ .long .Lfunc_end2-.Ltmp26
+ .short 3 # Loc expr size
+ .byte 17 # DW_OP_consts
+ .byte 5 # 5
+ .byte 159 # DW_OP_stack_value
+ .byte 0
+.Ldebug_loc9:
+ .byte 3
+ .byte 5
+ .long .Lfunc_end2-.Ltmp31
+ .short 3 # Loc expr size
+ .byte 17 # DW_OP_consts
+ .byte 6 # 6
+ .byte 159 # DW_OP_stack_value
+ .byte 0
+.Ldebug_loc10:
+ .byte 3
+ .byte 6
+ .long .Lfunc_end2-.Ltmp36
+ .short 3 # Loc expr size
+ .byte 17 # DW_OP_consts
+ .byte 7 # 7
+ .byte 159 # DW_OP_stack_value
+ .byte 0
+.Ldebug_loc11:
+ .byte 3
+ .byte 7
+ .long .Lfunc_end2-.Ltmp41
+ .short 3 # Loc expr size
+ .byte 17 # DW_OP_consts
+ .byte 8 # 8
+ .byte 159 # DW_OP_stack_value
+ .byte 0
+.Ldebug_loc12:
+ .byte 3
+ .byte 8
+ .long .Lfunc_end2-.Ltmp45
+ .short 3 # Loc expr size
+ .byte 17 # DW_OP_consts
+ .byte 10 # 10
+ .byte 159 # DW_OP_stack_value
+ .byte 0
+ .section .debug_abbrev,"", at progbits
+ .byte 1 # Abbreviation Code
+ .byte 17 # DW_TAG_compile_unit
+ .byte 1 # DW_CHILDREN_yes
+ .byte 16 # DW_AT_stmt_list
+ .byte 23 # DW_FORM_sec_offset
+# .byte 27 # DW_AT_comp_dir
+# .byte 14 # DW_FORM_strp
+ .ascii "\264B" # DW_AT_GNU_pubnames
+ .byte 25 # DW_FORM_flag_present
+ .ascii "\260B" # DW_AT_GNU_dwo_name
+ .byte 14 # DW_FORM_strp
+ .ascii "\261B" # DW_AT_GNU_dwo_id
+ .byte 7 # DW_FORM_data8
+ .ascii "\262B" # DW_AT_GNU_ranges_base
+ .byte 23 # DW_FORM_sec_offset
+ .ascii "\263B" # DW_AT_GNU_addr_base
+ .byte 23 # DW_FORM_sec_offset
+ .byte 17 # DW_AT_low_pc
+ .byte 1 # DW_FORM_addr
+ .byte 18 # DW_AT_high_pc
+ .byte 6 # DW_FORM_data4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 2 # Abbreviation Code
+ .byte 46 # DW_TAG_subprogram
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .byte 14 # DW_FORM_strp
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 3 # Abbreviation Code
+ .byte 46 # DW_TAG_subprogram
+ .byte 1 # DW_CHILDREN_yes
+ .byte 17 # DW_AT_low_pc
+ .byte 1 # DW_FORM_addr
+ .byte 18 # DW_AT_high_pc
+ .byte 6 # DW_FORM_data4
+ .byte 3 # DW_AT_name
+ .byte 14 # DW_FORM_strp
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 4 # Abbreviation Code
+ .byte 29 # DW_TAG_inlined_subroutine
+ .byte 0 # DW_CHILDREN_no
+ .byte 49 # DW_AT_abstract_origin
+ .byte 19 # DW_FORM_ref4
+ .byte 85 # DW_AT_ranges
+ .byte 23 # DW_FORM_sec_offset
+ .byte 88 # DW_AT_call_file
+ .byte 11 # DW_FORM_data1
+ .byte 89 # DW_AT_call_line
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 5 # Abbreviation Code
+ .byte 29 # DW_TAG_inlined_subroutine
+ .byte 0 # DW_CHILDREN_no
+ .byte 49 # DW_AT_abstract_origin
+ .byte 19 # DW_FORM_ref4
+ .byte 17 # DW_AT_low_pc
+ .byte 1 # DW_FORM_addr
+ .byte 18 # DW_AT_high_pc
+ .byte 6 # DW_FORM_data4
+ .byte 88 # DW_AT_call_file
+ .byte 11 # DW_FORM_data1
+ .byte 89 # DW_AT_call_line
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 0 # EOM(3)
+ .section .debug_info,"", at progbits
+.Lcu_begin0:
+ .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+ .short 4 # DWARF version number
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 8 # Address Size (in bytes)
+ .byte 1 # Abbrev [1] 0xb:0xbe DW_TAG_compile_unit
+ .long .Lline_table_start0 # DW_AT_stmt_list
+# .long .Lskel_string0 # DW_AT_comp_dir
+ # DW_AT_GNU_pubnames
+ .long .Lskel_string3 # DW_AT_GNU_dwo_name
+ .quad -7268627715780183436 # DW_AT_GNU_dwo_id
+ .long .debug_ranges # DW_AT_GNU_ranges_base
+ .long .Laddr_table_base0 # DW_AT_GNU_addr_base
+ .quad .Lfunc_begin0 # DW_AT_low_pc
+ .long .Lfunc_end2-.Lfunc_begin0 # DW_AT_high_pc
+ .byte 2 # Abbrev [2] 0x34:0x5 DW_TAG_subprogram
+ .long .Lskel_string1 # DW_AT_name
+ .byte 3 # Abbrev [3] 0x39:0x8f DW_TAG_subprogram
+ .quad .Lfunc_begin2 # DW_AT_low_pc
+ .long .Lfunc_end2-.Lfunc_begin2 # DW_AT_high_pc
+ .long .Lskel_string2 # DW_AT_name
+ .byte 4 # Abbrev [4] 0x4a:0xb DW_TAG_inlined_subroutine
+ .long 52 # DW_AT_abstract_origin
+ .long .Ldebug_ranges1 # DW_AT_ranges
+ .byte 1 # DW_AT_call_file
+ .byte 40 # DW_AT_call_line
+ .byte 5 # Abbrev [5] 0x55:0x13 DW_TAG_inlined_subroutine
+ .long 52 # DW_AT_abstract_origin
+ .quad .Ltmp21 # DW_AT_low_pc
+ .long .Ltmp23-.Ltmp21 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 42 # DW_AT_call_line
+ .byte 5 # Abbrev [5] 0x68:0x13 DW_TAG_inlined_subroutine
+ .long 52 # DW_AT_abstract_origin
+ .quad .Ltmp26 # DW_AT_low_pc
+ .long .Ltmp28-.Ltmp26 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 44 # DW_AT_call_line
+ .byte 5 # Abbrev [5] 0x7b:0x13 DW_TAG_inlined_subroutine
+ .long 52 # DW_AT_abstract_origin
+ .quad .Ltmp31 # DW_AT_low_pc
+ .long .Ltmp33-.Ltmp31 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 46 # DW_AT_call_line
+ .byte 5 # Abbrev [5] 0x8e:0x13 DW_TAG_inlined_subroutine
+ .long 52 # DW_AT_abstract_origin
+ .quad .Ltmp36 # DW_AT_low_pc
+ .long .Ltmp38-.Ltmp36 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 48 # DW_AT_call_line
+ .byte 5 # Abbrev [5] 0xa1:0x13 DW_TAG_inlined_subroutine
+ .long 52 # DW_AT_abstract_origin
+ .quad .Ltmp41 # DW_AT_low_pc
+ .long .Ltmp43-.Ltmp41 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 50 # DW_AT_call_line
+ .byte 5 # Abbrev [5] 0xb4:0x13 DW_TAG_inlined_subroutine
+ .long 52 # DW_AT_abstract_origin
+ .quad .Ltmp45 # DW_AT_low_pc
+ .long .Ltmp47-.Ltmp45 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 53 # DW_AT_call_line
+ .byte 0 # End Of Children Mark
+ .byte 0 # End Of Children Mark
+.Ldebug_info_end0:
+ .section .debug_ranges,"", at progbits
+.Ldebug_ranges0:
+ .quad .Lfunc_begin2-.Lfunc_begin0
+ .quad .Ltmp18-.Lfunc_begin0
+ .quad .Ltmp20-.Lfunc_begin0
+ .quad .Ltmp21-.Lfunc_begin0
+ .quad .Ltmp25-.Lfunc_begin0
+ .quad .Ltmp26-.Lfunc_begin0
+ .quad .Ltmp30-.Lfunc_begin0
+ .quad .Ltmp31-.Lfunc_begin0
+ .quad .Ltmp35-.Lfunc_begin0
+ .quad .Ltmp36-.Lfunc_begin0
+ .quad .Ltmp40-.Lfunc_begin0
+ .quad .Ltmp41-.Lfunc_begin0
+ .quad .Ltmp44-.Lfunc_begin0
+ .quad .Ltmp45-.Lfunc_begin0
+ .quad 0
+ .quad 0
+.Ldebug_ranges1:
+ .quad .Lfunc_begin2-.Lfunc_begin0
+ .quad .Ltmp18-.Lfunc_begin0
+ .quad .Ltmp20-.Lfunc_begin0
+ .quad .Ltmp21-.Lfunc_begin0
+ .quad .Ltmp25-.Lfunc_begin0
+ .quad .Ltmp26-.Lfunc_begin0
+ .quad .Ltmp30-.Lfunc_begin0
+ .quad .Ltmp31-.Lfunc_begin0
+ .quad .Ltmp35-.Lfunc_begin0
+ .quad .Ltmp36-.Lfunc_begin0
+ .quad .Ltmp40-.Lfunc_begin0
+ .quad .Ltmp41-.Lfunc_begin0
+ .quad .Ltmp44-.Lfunc_begin0
+ .quad .Ltmp45-.Lfunc_begin0
+ .quad 0
+ .quad 0
+ .section .debug_macinfo,"", at progbits
+ .byte 0 # End Of Macro List Mark
+ .section .debug_str.dwo,"eMS", at progbits,1
+.Linfo_string0:
+ .asciz "_Z3fibi" # string offset=0
+.Linfo_string1:
+ .asciz "fib" # string offset=8
+.Linfo_string2:
+ .asciz "int" # string offset=12
+.Linfo_string3:
+ .asciz "x" # string offset=16
+.Linfo_string4:
+ .asciz "answers" # string offset=18
+.Linfo_string5:
+ .asciz "__ARRAY_SIZE_TYPE__" # string offset=26
+.Linfo_string6:
+ .asciz "i" # string offset=46
+.Linfo_string7:
+ .asciz "_Z8real_fibiPi" # string offset=48
+.Linfo_string8:
+ .asciz "real_fib" # string offset=63
+.Linfo_string9:
+ .asciz "main" # string offset=72
+.Linfo_string10:
+ .asciz "result" # string offset=77
+.Linfo_string11:
+ .asciz "argc" # string offset=84
+.Linfo_string12:
+ .asciz "argv" # string offset=89
+.Linfo_string13:
+ .asciz "char" # string offset=94
+.Linfo_string14:
+ .asciz "clang version 9.0.0 (trunk 358316)" # string offset=99
+.Linfo_string15:
+ .asciz "fibonacci.cc" # string offset=134
+.Linfo_string16:
+ .asciz "statistics-fib.split-dwarf.dwo" # string offset=147
+ .section .debug_str_offsets.dwo,"e", at progbits
+ .long 0
+ .long 8
+ .long 12
+ .long 16
+ .long 18
+ .long 26
+ .long 46
+ .long 48
+ .long 63
+ .long 72
+ .long 77
+ .long 84
+ .long 89
+ .long 94
+ .long 99
+ .long 134
+ .long 147
+ .section .debug_info.dwo,"e", at progbits
+ .long .Ldebug_info_dwo_end0-.Ldebug_info_dwo_start0 # Length of Unit
+.Ldebug_info_dwo_start0:
+ .short 4 # DWARF version number
+ .long 0 # Offset Into Abbrev. Section
+ .byte 8 # Address Size (in bytes)
+ .byte 1 # Abbrev [1] 0xb:0x1d6 DW_TAG_compile_unit
+ .byte 14 # DW_AT_producer
+ .short 4 # DW_AT_language
+ .byte 15 # DW_AT_name
+ .byte 16 # DW_AT_GNU_dwo_name
+ .quad -7268627715780183436 # DW_AT_GNU_dwo_id
+ .byte 2 # Abbrev [2] 0x19:0x35 DW_TAG_subprogram
+ .byte 0 # DW_AT_low_pc
+ .long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc
+ .byte 1 # DW_AT_frame_base
+ .byte 87
+ .byte 7 # DW_AT_linkage_name
+ .byte 8 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 4 # DW_AT_decl_line
+ .long 148 # DW_AT_type
+ # DW_AT_external
+ .byte 3 # Abbrev [3] 0x29:0xc DW_TAG_formal_parameter
+ .long .Ldebug_loc0-.debug_loc.dwo # DW_AT_location
+ .byte 3 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 4 # DW_AT_decl_line
+ .long 148 # DW_AT_type
+ .byte 3 # Abbrev [3] 0x35:0xc DW_TAG_formal_parameter
+ .long .Ldebug_loc1-.debug_loc.dwo # DW_AT_location
+ .byte 4 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 4 # DW_AT_decl_line
+ .long 461 # DW_AT_type
+ .byte 4 # Abbrev [4] 0x41:0xc DW_TAG_variable
+ .long .Ldebug_loc2-.debug_loc.dwo # DW_AT_location
+ .byte 10 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 6 # DW_AT_decl_line
+ .long 148 # DW_AT_type
+ .byte 0 # End Of Children Mark
+ .byte 5 # Abbrev [5] 0x4e:0x23 DW_TAG_subprogram
+ .byte 1 # DW_AT_low_pc
+ .long .Lfunc_end1-.Lfunc_begin1 # DW_AT_high_pc
+ .byte 1 # DW_AT_frame_base
+ .byte 87
+ .long 113 # DW_AT_abstract_origin
+ .byte 6 # Abbrev [6] 0x5a:0x9 DW_TAG_formal_parameter
+ .long .Ldebug_loc3-.debug_loc.dwo # DW_AT_location
+ .long 123 # DW_AT_abstract_origin
+ .byte 7 # Abbrev [7] 0x63:0x8 DW_TAG_variable
+ .byte 2 # DW_AT_location
+ .byte 145
+ .byte 0
+ .long 131 # DW_AT_abstract_origin
+ .byte 8 # Abbrev [8] 0x6b:0x5 DW_TAG_variable
+ .long 139 # DW_AT_abstract_origin
+ .byte 0 # End Of Children Mark
+ .byte 9 # Abbrev [9] 0x71:0x23 DW_TAG_subprogram
+ .byte 0 # DW_AT_linkage_name
+ .byte 1 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 18 # DW_AT_decl_line
+ .long 148 # DW_AT_type
+ # DW_AT_external
+ .byte 1 # DW_AT_inline
+ .byte 10 # Abbrev [10] 0x7b:0x8 DW_TAG_formal_parameter
+ .byte 3 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 18 # DW_AT_decl_line
+ .long 148 # DW_AT_type
+ .byte 11 # Abbrev [11] 0x83:0x8 DW_TAG_variable
+ .byte 4 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 20 # DW_AT_decl_line
+ .long 152 # DW_AT_type
+ .byte 11 # Abbrev [11] 0x8b:0x8 DW_TAG_variable
+ .byte 6 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 21 # DW_AT_decl_line
+ .long 148 # DW_AT_type
+ .byte 0 # End Of Children Mark
+ .byte 12 # Abbrev [12] 0x94:0x4 DW_TAG_base_type
+ .byte 2 # DW_AT_name
+ .byte 5 # DW_AT_encoding
+ .byte 4 # DW_AT_byte_size
+ .byte 13 # Abbrev [13] 0x98:0xc DW_TAG_array_type
+ .long 148 # DW_AT_type
+ .byte 14 # Abbrev [14] 0x9d:0x6 DW_TAG_subrange_type
+ .long 164 # DW_AT_type
+ .byte 11 # DW_AT_count
+ .byte 0 # End Of Children Mark
+ .byte 15 # Abbrev [15] 0xa4:0x4 DW_TAG_base_type
+ .byte 5 # DW_AT_name
+ .byte 8 # DW_AT_byte_size
+ .byte 7 # DW_AT_encoding
+ .byte 16 # Abbrev [16] 0xa8:0x125 DW_TAG_subprogram
+ .byte 2 # DW_AT_low_pc
+ .long .Lfunc_end2-.Lfunc_begin2 # DW_AT_high_pc
+ .byte 1 # DW_AT_frame_base
+ .byte 87
+ .byte 9 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 36 # DW_AT_decl_line
+ .long 148 # DW_AT_type
+ # DW_AT_external
+ .byte 3 # Abbrev [3] 0xb7:0xc DW_TAG_formal_parameter
+ .long .Ldebug_loc4-.debug_loc.dwo # DW_AT_location
+ .byte 11 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 36 # DW_AT_decl_line
+ .long 148 # DW_AT_type
+ .byte 3 # Abbrev [3] 0xc3:0xc DW_TAG_formal_parameter
+ .long .Ldebug_loc5-.debug_loc.dwo # DW_AT_location
+ .byte 12 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 36 # DW_AT_decl_line
+ .long 466 # DW_AT_type
+ .byte 4 # Abbrev [4] 0xcf:0xc DW_TAG_variable
+ .long .Ldebug_loc6-.debug_loc.dwo # DW_AT_location
+ .byte 10 # DW_AT_name
+ .byte 1 # DW_AT_decl_file
+ .byte 38 # DW_AT_decl_line
+ .long 148 # DW_AT_type
+ .byte 17 # Abbrev [17] 0xdb:0x1f DW_TAG_inlined_subroutine
+ .long 113 # DW_AT_abstract_origin
+ .long .Ldebug_ranges0-.debug_ranges # DW_AT_ranges
+ .byte 1 # DW_AT_call_file
+ .byte 40 # DW_AT_call_line
+ .byte 18 # Abbrev [18] 0xe6:0x6 DW_TAG_formal_parameter
+ .byte 3 # DW_AT_const_value
+ .long 123 # DW_AT_abstract_origin
+ .byte 7 # Abbrev [7] 0xec:0x8 DW_TAG_variable
+ .byte 2 # DW_AT_location
+ .byte 145
+ .byte 0
+ .long 131 # DW_AT_abstract_origin
+ .byte 8 # Abbrev [8] 0xf4:0x5 DW_TAG_variable
+ .long 139 # DW_AT_abstract_origin
+ .byte 0 # End Of Children Mark
+ .byte 19 # Abbrev [19] 0xfa:0x23 DW_TAG_inlined_subroutine
+ .long 113 # DW_AT_abstract_origin
+ .byte 3 # DW_AT_low_pc
+ .long .Ltmp23-.Ltmp21 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 42 # DW_AT_call_line
+ .byte 6 # Abbrev [6] 0x106:0x9 DW_TAG_formal_parameter
+ .long .Ldebug_loc7-.debug_loc.dwo # DW_AT_location
+ .long 123 # DW_AT_abstract_origin
+ .byte 7 # Abbrev [7] 0x10f:0x8 DW_TAG_variable
+ .byte 2 # DW_AT_location
+ .byte 145
+ .byte 0
+ .long 131 # DW_AT_abstract_origin
+ .byte 8 # Abbrev [8] 0x117:0x5 DW_TAG_variable
+ .long 139 # DW_AT_abstract_origin
+ .byte 0 # End Of Children Mark
+ .byte 19 # Abbrev [19] 0x11d:0x23 DW_TAG_inlined_subroutine
+ .long 113 # DW_AT_abstract_origin
+ .byte 4 # DW_AT_low_pc
+ .long .Ltmp28-.Ltmp26 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 44 # DW_AT_call_line
+ .byte 6 # Abbrev [6] 0x129:0x9 DW_TAG_formal_parameter
+ .long .Ldebug_loc8-.debug_loc.dwo # DW_AT_location
+ .long 123 # DW_AT_abstract_origin
+ .byte 7 # Abbrev [7] 0x132:0x8 DW_TAG_variable
+ .byte 2 # DW_AT_location
+ .byte 145
+ .byte 0
+ .long 131 # DW_AT_abstract_origin
+ .byte 8 # Abbrev [8] 0x13a:0x5 DW_TAG_variable
+ .long 139 # DW_AT_abstract_origin
+ .byte 0 # End Of Children Mark
+ .byte 19 # Abbrev [19] 0x140:0x23 DW_TAG_inlined_subroutine
+ .long 113 # DW_AT_abstract_origin
+ .byte 5 # DW_AT_low_pc
+ .long .Ltmp33-.Ltmp31 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 46 # DW_AT_call_line
+ .byte 6 # Abbrev [6] 0x14c:0x9 DW_TAG_formal_parameter
+ .long .Ldebug_loc9-.debug_loc.dwo # DW_AT_location
+ .long 123 # DW_AT_abstract_origin
+ .byte 7 # Abbrev [7] 0x155:0x8 DW_TAG_variable
+ .byte 2 # DW_AT_location
+ .byte 145
+ .byte 0
+ .long 131 # DW_AT_abstract_origin
+ .byte 8 # Abbrev [8] 0x15d:0x5 DW_TAG_variable
+ .long 139 # DW_AT_abstract_origin
+ .byte 0 # End Of Children Mark
+ .byte 19 # Abbrev [19] 0x163:0x23 DW_TAG_inlined_subroutine
+ .long 113 # DW_AT_abstract_origin
+ .byte 6 # DW_AT_low_pc
+ .long .Ltmp38-.Ltmp36 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 48 # DW_AT_call_line
+ .byte 6 # Abbrev [6] 0x16f:0x9 DW_TAG_formal_parameter
+ .long .Ldebug_loc10-.debug_loc.dwo # DW_AT_location
+ .long 123 # DW_AT_abstract_origin
+ .byte 7 # Abbrev [7] 0x178:0x8 DW_TAG_variable
+ .byte 2 # DW_AT_location
+ .byte 145
+ .byte 0
+ .long 131 # DW_AT_abstract_origin
+ .byte 8 # Abbrev [8] 0x180:0x5 DW_TAG_variable
+ .long 139 # DW_AT_abstract_origin
+ .byte 0 # End Of Children Mark
+ .byte 19 # Abbrev [19] 0x186:0x23 DW_TAG_inlined_subroutine
+ .long 113 # DW_AT_abstract_origin
+ .byte 7 # DW_AT_low_pc
+ .long .Ltmp43-.Ltmp41 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 50 # DW_AT_call_line
+ .byte 6 # Abbrev [6] 0x192:0x9 DW_TAG_formal_parameter
+ .long .Ldebug_loc11-.debug_loc.dwo # DW_AT_location
+ .long 123 # DW_AT_abstract_origin
+ .byte 7 # Abbrev [7] 0x19b:0x8 DW_TAG_variable
+ .byte 2 # DW_AT_location
+ .byte 145
+ .byte 0
+ .long 131 # DW_AT_abstract_origin
+ .byte 8 # Abbrev [8] 0x1a3:0x5 DW_TAG_variable
+ .long 139 # DW_AT_abstract_origin
+ .byte 0 # End Of Children Mark
+ .byte 19 # Abbrev [19] 0x1a9:0x23 DW_TAG_inlined_subroutine
+ .long 113 # DW_AT_abstract_origin
+ .byte 8 # DW_AT_low_pc
+ .long .Ltmp47-.Ltmp45 # DW_AT_high_pc
+ .byte 1 # DW_AT_call_file
+ .byte 53 # DW_AT_call_line
+ .byte 6 # Abbrev [6] 0x1b5:0x9 DW_TAG_formal_parameter
+ .long .Ldebug_loc12-.debug_loc.dwo # DW_AT_location
+ .long 123 # DW_AT_abstract_origin
+ .byte 7 # Abbrev [7] 0x1be:0x8 DW_TAG_variable
+ .byte 2 # DW_AT_location
+ .byte 145
+ .byte 0
+ .long 131 # DW_AT_abstract_origin
+ .byte 8 # Abbrev [8] 0x1c6:0x5 DW_TAG_variable
+ .long 139 # DW_AT_abstract_origin
+ .byte 0 # End Of Children Mark
+ .byte 0 # End Of Children Mark
+ .byte 20 # Abbrev [20] 0x1cd:0x5 DW_TAG_pointer_type
+ .long 148 # DW_AT_type
+ .byte 20 # Abbrev [20] 0x1d2:0x5 DW_TAG_pointer_type
+ .long 471 # DW_AT_type
+ .byte 20 # Abbrev [20] 0x1d7:0x5 DW_TAG_pointer_type
+ .long 476 # DW_AT_type
+ .byte 12 # Abbrev [12] 0x1dc:0x4 DW_TAG_base_type
+ .byte 13 # DW_AT_name
+ .byte 6 # DW_AT_encoding
+ .byte 1 # DW_AT_byte_size
+ .byte 0 # End Of Children Mark
+.Ldebug_info_dwo_end0:
+ .section .debug_abbrev.dwo,"e", at progbits
+ .byte 1 # Abbreviation Code
+ .byte 17 # DW_TAG_compile_unit
+ .byte 1 # DW_CHILDREN_yes
+ .byte 37 # DW_AT_producer
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 19 # DW_AT_language
+ .byte 5 # DW_FORM_data2
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .ascii "\260B" # DW_AT_GNU_dwo_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .ascii "\261B" # DW_AT_GNU_dwo_id
+ .byte 7 # DW_FORM_data8
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 2 # Abbreviation Code
+ .byte 46 # DW_TAG_subprogram
+ .byte 1 # DW_CHILDREN_yes
+ .byte 17 # DW_AT_low_pc
+ .ascii "\201>" # DW_FORM_GNU_addr_index
+ .byte 18 # DW_AT_high_pc
+ .byte 6 # DW_FORM_data4
+ .byte 64 # DW_AT_frame_base
+ .byte 24 # DW_FORM_exprloc
+ .byte 110 # DW_AT_linkage_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 58 # DW_AT_decl_file
+ .byte 11 # DW_FORM_data1
+ .byte 59 # DW_AT_decl_line
+ .byte 11 # DW_FORM_data1
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 63 # DW_AT_external
+ .byte 25 # DW_FORM_flag_present
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 3 # Abbreviation Code
+ .byte 5 # DW_TAG_formal_parameter
+ .byte 0 # DW_CHILDREN_no
+ .byte 2 # DW_AT_location
+ .byte 23 # DW_FORM_sec_offset
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 58 # DW_AT_decl_file
+ .byte 11 # DW_FORM_data1
+ .byte 59 # DW_AT_decl_line
+ .byte 11 # DW_FORM_data1
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 4 # Abbreviation Code
+ .byte 52 # DW_TAG_variable
+ .byte 0 # DW_CHILDREN_no
+ .byte 2 # DW_AT_location
+ .byte 23 # DW_FORM_sec_offset
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 58 # DW_AT_decl_file
+ .byte 11 # DW_FORM_data1
+ .byte 59 # DW_AT_decl_line
+ .byte 11 # DW_FORM_data1
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 5 # Abbreviation Code
+ .byte 46 # DW_TAG_subprogram
+ .byte 1 # DW_CHILDREN_yes
+ .byte 17 # DW_AT_low_pc
+ .ascii "\201>" # DW_FORM_GNU_addr_index
+ .byte 18 # DW_AT_high_pc
+ .byte 6 # DW_FORM_data4
+ .byte 64 # DW_AT_frame_base
+ .byte 24 # DW_FORM_exprloc
+ .byte 49 # DW_AT_abstract_origin
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 6 # Abbreviation Code
+ .byte 5 # DW_TAG_formal_parameter
+ .byte 0 # DW_CHILDREN_no
+ .byte 2 # DW_AT_location
+ .byte 23 # DW_FORM_sec_offset
+ .byte 49 # DW_AT_abstract_origin
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 7 # Abbreviation Code
+ .byte 52 # DW_TAG_variable
+ .byte 0 # DW_CHILDREN_no
+ .byte 2 # DW_AT_location
+ .byte 24 # DW_FORM_exprloc
+ .byte 49 # DW_AT_abstract_origin
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 8 # Abbreviation Code
+ .byte 52 # DW_TAG_variable
+ .byte 0 # DW_CHILDREN_no
+ .byte 49 # DW_AT_abstract_origin
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 9 # Abbreviation Code
+ .byte 46 # DW_TAG_subprogram
+ .byte 1 # DW_CHILDREN_yes
+ .byte 110 # DW_AT_linkage_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 58 # DW_AT_decl_file
+ .byte 11 # DW_FORM_data1
+ .byte 59 # DW_AT_decl_line
+ .byte 11 # DW_FORM_data1
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 63 # DW_AT_external
+ .byte 25 # DW_FORM_flag_present
+ .byte 32 # DW_AT_inline
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 10 # Abbreviation Code
+ .byte 5 # DW_TAG_formal_parameter
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 58 # DW_AT_decl_file
+ .byte 11 # DW_FORM_data1
+ .byte 59 # DW_AT_decl_line
+ .byte 11 # DW_FORM_data1
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 11 # Abbreviation Code
+ .byte 52 # DW_TAG_variable
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 58 # DW_AT_decl_file
+ .byte 11 # DW_FORM_data1
+ .byte 59 # DW_AT_decl_line
+ .byte 11 # DW_FORM_data1
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 12 # Abbreviation Code
+ .byte 36 # DW_TAG_base_type
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 62 # DW_AT_encoding
+ .byte 11 # DW_FORM_data1
+ .byte 11 # DW_AT_byte_size
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 13 # Abbreviation Code
+ .byte 1 # DW_TAG_array_type
+ .byte 1 # DW_CHILDREN_yes
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 14 # Abbreviation Code
+ .byte 33 # DW_TAG_subrange_type
+ .byte 0 # DW_CHILDREN_no
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 55 # DW_AT_count
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 15 # Abbreviation Code
+ .byte 36 # DW_TAG_base_type
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 11 # DW_AT_byte_size
+ .byte 11 # DW_FORM_data1
+ .byte 62 # DW_AT_encoding
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 16 # Abbreviation Code
+ .byte 46 # DW_TAG_subprogram
+ .byte 1 # DW_CHILDREN_yes
+ .byte 17 # DW_AT_low_pc
+ .ascii "\201>" # DW_FORM_GNU_addr_index
+ .byte 18 # DW_AT_high_pc
+ .byte 6 # DW_FORM_data4
+ .byte 64 # DW_AT_frame_base
+ .byte 24 # DW_FORM_exprloc
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 58 # DW_AT_decl_file
+ .byte 11 # DW_FORM_data1
+ .byte 59 # DW_AT_decl_line
+ .byte 11 # DW_FORM_data1
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 63 # DW_AT_external
+ .byte 25 # DW_FORM_flag_present
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 17 # Abbreviation Code
+ .byte 29 # DW_TAG_inlined_subroutine
+ .byte 1 # DW_CHILDREN_yes
+ .byte 49 # DW_AT_abstract_origin
+ .byte 19 # DW_FORM_ref4
+ .byte 85 # DW_AT_ranges
+ .byte 23 # DW_FORM_sec_offset
+ .byte 88 # DW_AT_call_file
+ .byte 11 # DW_FORM_data1
+ .byte 89 # DW_AT_call_line
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 18 # Abbreviation Code
+ .byte 5 # DW_TAG_formal_parameter
+ .byte 0 # DW_CHILDREN_no
+ .byte 28 # DW_AT_const_value
+ .byte 13 # DW_FORM_sdata
+ .byte 49 # DW_AT_abstract_origin
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 19 # Abbreviation Code
+ .byte 29 # DW_TAG_inlined_subroutine
+ .byte 1 # DW_CHILDREN_yes
+ .byte 49 # DW_AT_abstract_origin
+ .byte 19 # DW_FORM_ref4
+ .byte 17 # DW_AT_low_pc
+ .ascii "\201>" # DW_FORM_GNU_addr_index
+ .byte 18 # DW_AT_high_pc
+ .byte 6 # DW_FORM_data4
+ .byte 88 # DW_AT_call_file
+ .byte 11 # DW_FORM_data1
+ .byte 89 # DW_AT_call_line
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 20 # Abbreviation Code
+ .byte 15 # DW_TAG_pointer_type
+ .byte 0 # DW_CHILDREN_no
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 0 # EOM(3)
+ .section .debug_addr,"", at progbits
+.Laddr_table_base0:
+ .quad .Lfunc_begin0
+ .quad .Lfunc_begin1
+ .quad .Lfunc_begin2
+ .quad .Ltmp21
+ .quad .Ltmp26
+ .quad .Ltmp31
+ .quad .Ltmp36
+ .quad .Ltmp41
+ .quad .Ltmp45
+ .quad .Ltmp3
+ .quad .Ltmp5
+ .quad .Ltmp18
+ .quad .Ltmp23
+ .quad .Ltmp28
+ .quad .Ltmp33
+ .quad .Ltmp38
+ .quad .Ltmp43
+ .quad .Ltmp47
+ .section .debug_gnu_pubnames,"", at progbits
+ .long .LpubNames_end0-.LpubNames_begin0 # Length of Public Names Info
+.LpubNames_begin0:
+ .short 2 # DWARF Version
+ .long .Lcu_begin0 # Offset of Compilation Unit Info
+ .long 201 # Compilation Unit Length
+ .long 113 # DIE offset
+ .byte 48 # Attributes: FUNCTION, EXTERNAL
+ .asciz "fib" # External Name
+ .long 25 # DIE offset
+ .byte 48 # Attributes: FUNCTION, EXTERNAL
+ .asciz "real_fib" # External Name
+ .long 168 # DIE offset
+ .byte 48 # Attributes: FUNCTION, EXTERNAL
+ .asciz "main" # External Name
+ .long 0 # End Mark
+.LpubNames_end0:
+ .section .debug_gnu_pubtypes,"", at progbits
+ .long .LpubTypes_end0-.LpubTypes_begin0 # Length of Public Types Info
+.LpubTypes_begin0:
+ .short 2 # DWARF Version
+ .long .Lcu_begin0 # Offset of Compilation Unit Info
+ .long 201 # Compilation Unit Length
+ .long 148 # DIE offset
+ .byte 144 # Attributes: TYPE, STATIC
+ .asciz "int" # External Name
+ .long 476 # DIE offset
+ .byte 144 # Attributes: TYPE, STATIC
+ .asciz "char" # External Name
+ .long 0 # End Mark
+.LpubTypes_end0:
+
+ .ident "clang version 9.0.0 (trunk 358316)"
+ .section ".note.GNU-stack","", at progbits
+ .addrsig
+ .section .debug_line,"", at progbits
+.Lline_table_start0:
Added: llvm/trunk/test/tools/llvm-dwarfdump/X86/statistics-dwo.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/statistics-dwo.test?rev=360380&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-dwarfdump/X86/statistics-dwo.test (added)
+++ llvm/trunk/test/tools/llvm-dwarfdump/X86/statistics-dwo.test Thu May 9 14:53:33 2019
@@ -0,0 +1,96 @@
+# Test of the llmv-dwarfdump --statistics with split dwarf (dwo files)
+# (version 3).
+#
+# Create a directory in which to put all files, so .o file can find .dwo file.
+RUN: rm -rf %t && mkdir -p %t
+RUN: cp -f %S/Inputs/statistics-fib.split-dwarf.s %t/.
+RUN: cd %t
+RUN: llvm-mc -triple x86_64-unknown-linux-gnu statistics-fib.split-dwarf.s -filetype=obj -split-dwarf-file statistics-fib.split-dwarf.dwo -o statistics-fib.split-dwarf.o
+RUN: llvm-dwarfdump --statistics statistics-fib.split-dwarf.o | FileCheck %s
+
+# Source program - A version of Fibonacci
+# Compilation options: -gsplit-dwarf -O3 -c -S
+#
+# int
+# real_fib (int x, int answers[11])
+# {
+# int result;
+#
+# if ((answers)[x] != -1)
+# return (answers)[x];
+#
+# result = real_fib(x-1, answers) + real_fib(x-2, answers);
+# (answers)[x] = result;
+#
+# return result;
+# }
+#
+# int
+# fib (int x)
+# {
+# int answers[11];
+# int i;
+#
+# if (x > 10)
+# return -1;
+#
+# for (i = 0; i < 11; i++)
+# answers[i] = -1;
+#
+# answers[0] = 0;
+# answers[1] = 1;
+# answers[2] = 1;
+#
+# return real_fib(x, answers);
+# }
+#
+# int main (int argc, char **argv)
+# {
+# int result;
+#
+# result = fib(3);
+# printf ("fibonacci(3) = %d\n", result);
+# result = fib(4);
+# printf ("fibonacci(4) = %d\n", result);
+# result = fib(5);
+# printf ("fibonacci(5) = %d\n", result);
+# result = fib(6);
+# printf ("fibonacci(6) = %d\n", result);
+# result = fib(7);
+# printf ("fibonacci(7) = %d\n", result);
+# result = fib(8);
+# printf ("fibonacci(8) = %d\n", result);
+# result = fib(9);
+# printf ("fibonacci(9) = %d\n", result);
+# result = fib(10);
+# printf ("fibonacci(10) = %d\n", result);
+#
+# return 0;
+# }
+#
+
+CHECK: "version":3
+CHECK: "source functions":3
+CHECK: "source functions with location":3
+CHECK: "inlined functions":7
+CHECK: "inlined funcs with abstract origins":7
+CHECK: "unique source variables":9
+CHECK: "source variables":30
+
+# Ideally the value below would be 33 but currently it's not.
+CHECK: "variables with location":22
+CHECK: "call site entries":7
+CHECK: "scope bytes total":2817
+CHECK: "scope bytes covered":506
+CHECK: "total function size":594
+CHECK: "total inlined function size":345
+CHECK: "total formal params":12
+CHECK: "formal params with source location":12
+CHECK: "formal params with type":12
+CHECK: "formal params with binary location":12
+CHECK: "total vars":18
+CHECK: "vars with source location":18
+CHECK: "vars with type":18
+
+# Ideally the value below would be 18, but currently it's not.
+CHECK: "vars with binary location":10
Modified: llvm/trunk/tools/llvm-dwarfdump/Statistics.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/Statistics.cpp?rev=360380&r1=360379&r2=360380&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-dwarfdump/Statistics.cpp (original)
+++ llvm/trunk/tools/llvm-dwarfdump/Statistics.cpp Thu May 9 14:53:33 2019
@@ -323,7 +323,7 @@ bool collectStatsForObjectFile(ObjectFil
GlobalStats GlobalStats;
StringMap<PerFunctionStats> Statistics;
for (const auto &CU : static_cast<DWARFContext *>(&DICtx)->compile_units())
- if (DWARFDie CUDie = CU->getUnitDIE(false))
+ if (DWARFDie CUDie = CU->getNonSkeletonUnitDIE(false))
collectStatsRecursive(CUDie, "/", "g", 0, 0, 0, Statistics, GlobalStats);
/// The version number should be increased every time the algorithm is changed
More information about the llvm-commits
mailing list