## Check that the --debug-vars option works for simple register locations, when ## using DWARF4 debug info, with multiple functions in one section. Check that ## the live-range lines are rendered correctly when using the --no-show-raw-insn, ## --line-numbers and --source options. These do not affect the DWARF parsing ## used by --debug-vars, but do add extra lines or columns to the output, so we ## test to make sure the live ranges are still displayed correctly. ## Generated with this compile command, with the source code in Inputs/debug.c: ## clang --target=arm--none-eabi -march=armv7-a -c debug.c -O1 -gdwarf-4 -S -o - # RUN: llvm-mc -triple armv8a--none-eabi < %s -filetype=obj | \ # RUN: llvm-objdump - -d --debug-vars | \ # RUN: FileCheck %s --check-prefix=RAW --strict-whitespace ## Check that passing the default value for --debug-vars-indent (40) makes no ## change to the output. # RUN: llvm-mc -triple armv8a--none-eabi < %s -filetype=obj | \ # RUN: llvm-objdump - -d --debug-vars --debug-vars-indent=40 | \ # RUN: FileCheck %s --check-prefix=RAW --strict-whitespace # RUN: llvm-mc -triple armv8a--none-eabi < %s -filetype=obj | \ # RUN: llvm-objdump - -d --debug-vars --debug-vars-indent=30 | \ # RUN: FileCheck %s --check-prefix=INDENT --strict-whitespace # RUN: llvm-mc -triple armv8a--none-eabi < %s -filetype=obj | \ # RUN: llvm-objdump - -d --debug-vars --no-show-raw-insn | \ # RUN: FileCheck %s --check-prefix=NO-RAW --strict-whitespace # RUN: llvm-mc -triple armv8a--none-eabi < %s -filetype=obj | \ # RUN: llvm-objdump - -d --debug-vars --no-show-raw-insn --line-numbers | \ # RUN: FileCheck %s --check-prefix=LINE-NUMS --strict-whitespace # RUN: mkdir -p %t/a # RUN: cp %p/Inputs/debug.c %t/a/debug.c # RUN: sed -e "s,SRC_COMPDIR,%/t/a,g" %s > %t.s # RUN: llvm-mc -triple armv8a--none-eabi < %t.s -filetype=obj | \ # RUN: llvm-objdump - -d --debug-vars --no-show-raw-insn --source | \ # RUN: FileCheck %s --check-prefix=SOURCE --strict-whitespace ## An optional argument to the --debug-vars= option can be used to switch ## between unicode and ascii output (with unicode being the default). # RUN: llvm-mc -triple armv8a--none-eabi < %s -filetype=obj | \ # RUN: llvm-objdump - -d --debug-vars=unicode | \ # RUN: FileCheck %s --check-prefix=RAW --strict-whitespace # RUN: llvm-mc -triple armv8a--none-eabi < %s -filetype=obj | \ # RUN: llvm-objdump - -d --debug-vars=ascii | \ # RUN: FileCheck %s --check-prefix=ASCII --strict-whitespace ## Note that llvm-objdump emits tab characters in the disassembly, assuming an ## 8-byte tab stop, so these might not look aligned in a text editor. # RAW: 00000000 : # RAW-NEXT: ┠─ a = R0 # RAW-NEXT: ┃ ┠─ b = R1 # RAW-NEXT: ┃ ┃ ┠─ c = R2 # RAW-NEXT: ┃ ┃ ┃ ┌─ x = R0 # RAW-NEXT: 0: 00 00 81 e0 add r0, r1, r0 ┻ ┃ ┃ ╈ # RAW-NEXT: ┌─ y = R0 # RAW-NEXT: 4: 02 00 80 e0 add r0, r0, r2 ╈ ┃ ┃ ┻ # RAW-NEXT: 8: 1e ff 2f e1 bx lr ┻ ┻ ┻ # RAW-EMPTY: # RAW-NEXT: 0000000c : # RAW-NEXT: ┠─ a = R0 # RAW-NEXT: c: 01 00 80 e2 add r0, r0, #1 ┃ # RAW-NEXT: 10: 1e ff 2f e1 bx lr ┻ # INDENT: 00000000 : # INDENT-NEXT: ┠─ a = R0 # INDENT-NEXT: ┃ ┠─ b = R1 # INDENT-NEXT: ┃ ┃ ┠─ c = R2 # INDENT-NEXT: ┃ ┃ ┃ ┌─ x = R0 # INDENT-NEXT: 0: 00 00 81 e0 add r0, r1, r0 ┻ ┃ ┃ ╈ # INDENT-NEXT: ┌─ y = R0 # INDENT-NEXT: 4: 02 00 80 e0 add r0, r0, r2 ╈ ┃ ┃ ┻ # INDENT-NEXT: 8: 1e ff 2f e1 bx lr ┻ ┻ ┻ # INDENT-EMPTY: # INDENT-NEXT: 0000000c : # INDENT-NEXT: ┠─ a = R0 # INDENT-NEXT: c: 01 00 80 e2 add r0, r0, #1 ┃ # INDENT-NEXT: 10: 1e ff 2f e1 bx lr ┻ # NO-RAW: 00000000 : # NO-RAW-NEXT: ┠─ a = R0 # NO-RAW-NEXT: ┃ ┠─ b = R1 # NO-RAW-NEXT: ┃ ┃ ┠─ c = R2 # NO-RAW-NEXT: ┃ ┃ ┃ ┌─ x = R0 # NO-RAW-NEXT: 0: add r0, r1, r0 ┻ ┃ ┃ ╈ # NO-RAW-NEXT: ┌─ y = R0 # NO-RAW-NEXT: 4: add r0, r0, r2 ╈ ┃ ┃ ┻ # NO-RAW-NEXT: 8: bx lr ┻ ┻ ┻ # NO-RAW-EMPTY: # NO-RAW-NEXT: 0000000c : # NO-RAW-NEXT: ┠─ a = R0 # NO-RAW-NEXT: c: add r0, r0, #1 ┃ # NO-RAW-NEXT: 10: bx lr ┻ # LINE-NUMS: 00000000 : # LINE-NUMS-NEXT: ; foo(): # LINE-NUMS-NEXT: ; SRC_COMPDIR{{[\\/]}}debug.c:2 ┠─ a = R0 # LINE-NUMS-NEXT: ┃ ┠─ b = R1 # LINE-NUMS-NEXT: ┃ ┃ ┠─ c = R2 # LINE-NUMS-NEXT: ┃ ┃ ┃ ┌─ x = R0 # LINE-NUMS-NEXT: 0: add r0, r1, r0 ┻ ┃ ┃ ╈ # LINE-NUMS-NEXT: ; SRC_COMPDIR{{[\\/]}}debug.c:3 ┌─ y = R0 # LINE-NUMS-NEXT: 4: add r0, r0, r2 ╈ ┃ ┃ ┻ # LINE-NUMS-NEXT: ; SRC_COMPDIR{{[\\/]}}debug.c:4 ┃ ┃ ┃ # LINE-NUMS-NEXT: 8: bx lr ┻ ┻ ┻ # LINE-NUMS-EMPTY: # LINE-NUMS-NEXT: 0000000c : # LINE-NUMS-NEXT: ; bar(): # LINE-NUMS-NEXT: ; SRC_COMPDIR{{[\\/]}}debug.c:8 ┠─ a = R0 # LINE-NUMS-NEXT: c: add r0, r0, #1 ┃ # LINE-NUMS-NEXT: ; SRC_COMPDIR{{[\\/]}}debug.c:9 ┃ # LINE-NUMS-NEXT: 10: bx lr ┻ # SOURCE: 00000000 : # SOURCE-NEXT: ; int x = a + b; ┠─ a = R0 # SOURCE-NEXT: ┃ ┠─ b = R1 # SOURCE-NEXT: ┃ ┃ ┠─ c = R2 # SOURCE-NEXT: ┃ ┃ ┃ ┌─ x = R0 # SOURCE-NEXT: 0: add r0, r1, r0 ┻ ┃ ┃ ╈ # SOURCE-NEXT: ; int y = x + c; ┌─ y = R0 # SOURCE-NEXT: 4: add r0, r0, r2 ╈ ┃ ┃ ┻ # SOURCE-NEXT: ; return y; ┃ ┃ ┃ # SOURCE-NEXT: 8: bx lr ┻ ┻ ┻ # SOURCE-EMPTY: # SOURCE-NEXT: 0000000c : # SOURCE-NEXT: ; a++; ┠─ a = R0 # SOURCE-NEXT: c: add r0, r0, #1 ┃ # SOURCE-NEXT: ; return a; ┃ # SOURCE-NEXT: 10: bx lr ┻ # ASCII: 00000000 : # ASCII-NEXT: |- a = R0 # ASCII-NEXT: | |- b = R1 # ASCII-NEXT: | | |- c = R2 # ASCII-NEXT: | | | /- x = R0 # ASCII-NEXT: 0: 00 00 81 e0 add r0, r1, r0 v | | ^ # ASCII-NEXT: /- y = R0 # ASCII-NEXT: 4: 02 00 80 e0 add r0, r0, r2 ^ | | v # ASCII-NEXT: 8: 1e ff 2f e1 bx lr v v v # ASCII-EMPTY: # ASCII-NEXT: 0000000c : # ASCII-NEXT: |- a = R0 # ASCII-NEXT: c: 01 00 80 e2 add r0, r0, #1 | # ASCII-NEXT: 10: 1e ff 2f e1 bx lr v .text .syntax unified .eabi_attribute 67, "2.09" .eabi_attribute 6, 10 .eabi_attribute 7, 65 .eabi_attribute 8, 1 .eabi_attribute 9, 2 .fpu neon .eabi_attribute 34, 0 .eabi_attribute 17, 1 .eabi_attribute 20, 1 .eabi_attribute 21, 1 .eabi_attribute 23, 3 .eabi_attribute 24, 1 .eabi_attribute 25, 1 .eabi_attribute 38, 1 .eabi_attribute 18, 4 .eabi_attribute 26, 2 .eabi_attribute 14, 0 .file "debug.c" .globl foo .p2align 2 .type foo,%function .code 32 foo: .Lfunc_begin0: .file 1 "" "SRC_COMPDIR/debug.c" .loc 1 1 0 .fnstart .cfi_sections .debug_frame .cfi_startproc .loc 1 2 13 prologue_end add r0, r1, r0 .Ltmp0: .loc 1 3 13 add r0, r0, r2 .Ltmp1: .loc 1 4 3 bx lr .Ltmp2: .Lfunc_end0: .size foo, .Lfunc_end0-foo .cfi_endproc .cantunwind .fnend .globl bar .p2align 2 .type bar,%function .code 32 bar: .Lfunc_begin1: .loc 1 7 0 .fnstart .cfi_startproc .loc 1 8 4 prologue_end add r0, r0, #1 .Ltmp3: .loc 1 9 3 bx lr .Ltmp4: .Lfunc_end1: .size bar, .Lfunc_end1-bar .cfi_endproc .cantunwind .fnend .section .debug_str,"MS",%progbits,1 .Linfo_string0: .asciz "clang version 10.0.0 (git@github.com:llvm/llvm-project.git e73f78acd34360f7450b81167d9dc858ccddc262)" .Linfo_string1: .asciz "SRC_COMPDIR/debug.c" .Linfo_string2: .asciz "" .Linfo_string3: .asciz "foo" .Linfo_string4: .asciz "int" .Linfo_string5: .asciz "bar" .Linfo_string6: .asciz "a" .Linfo_string7: .asciz "b" .Linfo_string8: .asciz "c" .Linfo_string9: .asciz "x" .Linfo_string10: .asciz "y" .section .debug_loc,"",%progbits .Ldebug_loc0: .long .Lfunc_begin0-.Lfunc_begin0 .long .Ltmp0-.Lfunc_begin0 .short 1 .byte 80 .long 0 .long 0 .Ldebug_loc1: .long .Ltmp0-.Lfunc_begin0 .long .Ltmp1-.Lfunc_begin0 .short 1 .byte 80 .long 0 .long 0 .Ldebug_loc2: .long .Ltmp1-.Lfunc_begin0 .long .Lfunc_end0-.Lfunc_begin0 .short 1 .byte 80 .long 0 .long 0 .section .debug_abbrev,"",%progbits .byte 1 .byte 17 .byte 1 .byte 37 .byte 14 .byte 19 .byte 5 .byte 3 .byte 14 .byte 16 .byte 23 .byte 27 .byte 14 .byte 17 .byte 1 .byte 18 .byte 6 .byte 0 .byte 0 .byte 2 .byte 46 .byte 1 .byte 17 .byte 1 .byte 18 .byte 6 .byte 64 .byte 24 .ascii "\227B" .byte 25 .byte 3 .byte 14 .byte 58 .byte 11 .byte 59 .byte 11 .byte 39 .byte 25 .byte 73 .byte 19 .byte 63 .byte 25 .byte 0 .byte 0 .byte 3 .byte 5 .byte 0 .byte 2 .byte 23 .byte 3 .byte 14 .byte 58 .byte 11 .byte 59 .byte 11 .byte 73 .byte 19 .byte 0 .byte 0 .byte 4 .byte 5 .byte 0 .byte 2 .byte 24 .byte 3 .byte 14 .byte 58 .byte 11 .byte 59 .byte 11 .byte 73 .byte 19 .byte 0 .byte 0 .byte 5 .byte 52 .byte 0 .byte 2 .byte 23 .byte 3 .byte 14 .byte 58 .byte 11 .byte 59 .byte 11 .byte 73 .byte 19 .byte 0 .byte 0 .byte 6 .byte 36 .byte 0 .byte 3 .byte 14 .byte 62 .byte 11 .byte 11 .byte 11 .byte 0 .byte 0 .byte 0 .section .debug_info,"",%progbits .Lcu_begin0: .long .Ldebug_info_end0-.Ldebug_info_start0 .Ldebug_info_start0: .short 4 .long .debug_abbrev .byte 4 .byte 1 .long .Linfo_string0 .short 12 .long .Linfo_string1 .long .Lline_table_start0 .long .Linfo_string2 .long .Lfunc_begin0 .long .Lfunc_end1-.Lfunc_begin0 .byte 2 .long .Lfunc_begin0 .long .Lfunc_end0-.Lfunc_begin0 .byte 1 .byte 91 .long .Linfo_string3 .byte 1 .byte 1 .long 166 .byte 3 .long .Ldebug_loc0 .long .Linfo_string6 .byte 1 .byte 1 .long 166 .byte 4 .byte 1 .byte 81 .long .Linfo_string7 .byte 1 .byte 1 .long 166 .byte 4 .byte 1 .byte 82 .long .Linfo_string8 .byte 1 .byte 1 .long 166 .byte 5 .long .Ldebug_loc1 .long .Linfo_string9 .byte 1 .byte 2 .long 166 .byte 5 .long .Ldebug_loc2 .long .Linfo_string10 .byte 1 .byte 3 .long 166 .byte 0 .byte 2 .long .Lfunc_begin1 .long .Lfunc_end1-.Lfunc_begin1 .byte 1 .byte 91 .long .Linfo_string5 .byte 1 .byte 7 .long 166 .byte 4 .byte 1 .byte 80 .long .Linfo_string6 .byte 1 .byte 7 .long 166 .byte 0 .byte 6 .long .Linfo_string4 .byte 5 .byte 4 .byte 0 .Ldebug_info_end0: .ident "clang version 10.0.0 (git@github.com:llvm/llvm-project.git e73f78acd34360f7450b81167d9dc858ccddc262)" .section ".note.GNU-stack","",%progbits .addrsig .eabi_attribute 30, 1 .section .debug_line,"",%progbits .Lline_table_start0: