240 lines
10 KiB
Text
240 lines
10 KiB
Text
## Check that printing line numbers isn't attempted for files like bitcode,
|
|
## which have symbols but limited/no section or debug info.
|
|
# RUN: llvm-nm --line-numbers %p/Inputs/test.IRobj-x86_64 | FileCheck %s --check-prefix=BITCODE --match-full-lines --implicit-check-not={{.}}
|
|
# BITCODE: ---------------- S _global_const
|
|
# BITCODE-NEXT: ---------------- D _global_data
|
|
# BITCODE-NEXT: ---------------- T _global_func
|
|
# BITCODE-NEXT: ---------------- S _hidden_const
|
|
# BITCODE-NEXT: ---------------- D _hidden_data
|
|
# BITCODE-NEXT: ---------------- T _hidden_func
|
|
# BITCODE-NEXT: ---------------- s _static_const
|
|
# BITCODE-NEXT: ---------------- d _static_data
|
|
# BITCODE-NEXT: ---------------- t _static_func
|
|
|
|
## Check that various symbol types can use debug information if available to
|
|
## print line numbers, and if unavailable, don't print anything erroneous. The
|
|
## specific cases checked are given by the symbol names below. Other test cases
|
|
## place requirements on the contents of the whole file, so they are kept out
|
|
## of main.o.
|
|
# RUN: rm -rf %t
|
|
# RUN: split-file %s %t
|
|
# RUN: llvm-mc -g --filetype=obj -triple=x86_64-pc-linux %t/main.s -o %t/main.o
|
|
# RUN: llvm-nm -l %t/main.o | FileCheck %s --match-full-lines --implicit-check-not={{.}}
|
|
# RUN: llvm-nm --line-numbers %t/main.o | FileCheck %s --match-full-lines --implicit-check-not={{.}}
|
|
|
|
# CHECK: 0000000000001234 a absolute_symbol
|
|
# CHECK-NEXT: 0000000000000000 d data_no_dwarf
|
|
# CHECK-NEXT: 0000000000000000 T defined_global_function [[FILENAME:.*main.s]]:4
|
|
# CHECK-NEXT: 0000000000000001 t defined_local_function [[FILENAME]]:7
|
|
# CHECK-NEXT: 0000000000000000 t function_no_dwarf
|
|
# CHECK-NEXT: U undef1 [[FILENAME]]:12
|
|
# CHECK-NEXT: U undef2 [[FILENAME]]:14
|
|
# CHECK-NEXT: U undef_no_reloc
|
|
# CHECK-NEXT: 0000000000000002 t undefined_references [[FILENAME]]:12
|
|
|
|
## Check that in the absence of DWARF in the whole object, no line number
|
|
## information is printed.
|
|
# RUN: llvm-mc --filetype=obj %t/main.s -triple=x86_64-pc-linux -o %t/no-dwarf.o
|
|
# RUN: llvm-nm -l %t/no-dwarf.o | FileCheck %s --check-prefix=NO-DWARF --match-full-lines --implicit-check-not={{.}}
|
|
|
|
# NO-DWARF: 0000000000001234 a absolute_symbol
|
|
# NO-DWARF-NEXT: 0000000000000000 d data_no_dwarf
|
|
# NO-DWARF-NEXT: 0000000000000000 T defined_global_function
|
|
# NO-DWARF-NEXT: 0000000000000001 t defined_local_function
|
|
# NO-DWARF-NEXT: 0000000000000000 t function_no_dwarf
|
|
# NO-DWARF-NEXT: U undef1
|
|
# NO-DWARF-NEXT: U undef2
|
|
# NO-DWARF-NEXT: U undef_no_reloc
|
|
# NO-DWARF-NEXT: 0000000000000002 t undefined_references
|
|
|
|
## Check that printing line numbers for undefined values is not attempted in
|
|
## the absence of any relocation section.
|
|
# RUN: llvm-mc --filetype=obj %t/undef-no-reloc-sections.s -triple=x86_64-pc-linux -o %t/undef-no-reloc-sections.o
|
|
# RUN: llvm-nm --line-numbers %t/undef-no-reloc-sections.o | FileCheck %s --check-prefix=UNDEF-NO-RELOC-SECTIONS --match-full-lines --implicit-check-not={{.}}
|
|
|
|
# UNDEF-NO-RELOC-SECTIONS: U undef
|
|
|
|
## Check that printing line numbers for undefined values does not include
|
|
## relocations for non-text sections. This is broken out of main.s to ensure
|
|
## that the data relocation for undef comes first.
|
|
# RUN: llvm-mc -g --filetype=obj %t/undef-data-reloc.s -triple=x86_64-pc-linux -o %t/undef-data-reloc.o
|
|
# RUN: llvm-nm --line-numbers %t/undef-data-reloc.o | FileCheck %s --check-prefix=UNDEF-DATA-RELOC --match-full-lines --implicit-check-not={{.}}
|
|
|
|
# UNDEF-DATA-RELOC: 0000000000000000 r data_reloc
|
|
# UNDEF-DATA-RELOC-NEXT: U undef
|
|
|
|
## Check that line numbers can be printed for data definitions. These are broken
|
|
## out of main.s since their DWARF cannot be generated with llvm-mc -g.
|
|
# RUN: llvm-mc -g --filetype=obj %t/data-dwarf.s -triple=x86_64-pc-linux -o %t/data-dwarf.o
|
|
# RUN: llvm-nm --line-numbers %t/data-dwarf.o | FileCheck %s --check-prefix=DATA-DWARF --match-full-lines --implicit-check-not={{.}}
|
|
|
|
# DATA-DWARF: 0000000000000000 D defined_data /tmp{{\\|/}}tmp.c:1
|
|
|
|
#--- main.s
|
|
.text
|
|
.globl defined_global_function
|
|
defined_global_function:
|
|
ret
|
|
|
|
defined_local_function:
|
|
ret
|
|
|
|
absolute_symbol = 0x1234
|
|
|
|
undefined_references:
|
|
nop
|
|
.long undef1
|
|
nop
|
|
.long undef2
|
|
ret
|
|
|
|
# Note: llvm-mc -g produces no DWARF for data.
|
|
.data
|
|
data_no_dwarf:
|
|
.byte 0
|
|
|
|
.globl undef_no_reloc
|
|
|
|
# Note: llvm-mc -g does not produce DWARF for non-SHF_ALLOC sections.
|
|
.section no_alloc_text,"x",@progbits
|
|
function_no_dwarf:
|
|
ret
|
|
|
|
#--- undef-no-reloc-sections.s
|
|
.globl undef
|
|
|
|
#--- undef-data-reloc.s
|
|
.globl undef
|
|
.rodata
|
|
data_reloc:
|
|
.long undef
|
|
|
|
#--- data-dwarf.s
|
|
# char defined_data = 42
|
|
.text
|
|
.file "tmp.c"
|
|
.file 0 "/tmp" "/tmp/tmp.c" md5 0x39602a53b15a32d6a622ca86936e88d7
|
|
.file 1 "tmp.c" md5 0x39602a53b15a32d6a622ca86936e88d7
|
|
.type defined_data,@object # @defined_data
|
|
.data
|
|
.globl defined_data
|
|
defined_data:
|
|
.byte 42 # 0x2a
|
|
.size defined_data, 1
|
|
|
|
.section .debug_abbrev,"",@progbits
|
|
.byte 1 # Abbreviation Code
|
|
.byte 17 # DW_TAG_compile_unit
|
|
.byte 1 # DW_CHILDREN_yes
|
|
.byte 37 # DW_AT_producer
|
|
.byte 37 # DW_FORM_strx1
|
|
.byte 19 # DW_AT_language
|
|
.byte 5 # DW_FORM_data2
|
|
.byte 3 # DW_AT_name
|
|
.byte 37 # DW_FORM_strx1
|
|
.byte 114 # DW_AT_str_offsets_base
|
|
.byte 23 # DW_FORM_sec_offset
|
|
.byte 16 # DW_AT_stmt_list
|
|
.byte 23 # DW_FORM_sec_offset
|
|
.byte 27 # DW_AT_comp_dir
|
|
.byte 37 # DW_FORM_strx1
|
|
.byte 115 # DW_AT_addr_base
|
|
.byte 23 # DW_FORM_sec_offset
|
|
.byte 0 # EOM(1)
|
|
.byte 0 # EOM(2)
|
|
.byte 2 # Abbreviation Code
|
|
.byte 52 # DW_TAG_variable
|
|
.byte 0 # DW_CHILDREN_no
|
|
.byte 3 # DW_AT_name
|
|
.byte 37 # DW_FORM_strx1
|
|
.byte 73 # DW_AT_type
|
|
.byte 19 # DW_FORM_ref4
|
|
.byte 63 # DW_AT_external
|
|
.byte 25 # DW_FORM_flag_present
|
|
.byte 58 # DW_AT_decl_file
|
|
.byte 11 # DW_FORM_data1
|
|
.byte 59 # DW_AT_decl_line
|
|
.byte 11 # DW_FORM_data1
|
|
.byte 2 # DW_AT_location
|
|
.byte 24 # DW_FORM_exprloc
|
|
.byte 0 # EOM(1)
|
|
.byte 0 # EOM(2)
|
|
.byte 3 # Abbreviation Code
|
|
.byte 36 # DW_TAG_base_type
|
|
.byte 0 # DW_CHILDREN_no
|
|
.byte 3 # DW_AT_name
|
|
.byte 37 # DW_FORM_strx1
|
|
.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 0 # EOM(3)
|
|
.section .debug_info,"",@progbits
|
|
.Lcu_begin0:
|
|
.long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
|
|
.Ldebug_info_start0:
|
|
.short 5 # DWARF version number
|
|
.byte 1 # DWARF Unit Type
|
|
.byte 8 # Address Size (in bytes)
|
|
.long .debug_abbrev # Offset Into Abbrev. Section
|
|
.byte 1 # Abbrev [1] 0xc:0x22 DW_TAG_compile_unit
|
|
.byte 0 # DW_AT_producer
|
|
.short 12 # DW_AT_language
|
|
.byte 1 # DW_AT_name
|
|
.long .Lstr_offsets_base0 # DW_AT_str_offsets_base
|
|
.long .Lline_table_start0 # DW_AT_stmt_list
|
|
.byte 2 # DW_AT_comp_dir
|
|
.long .Laddr_table_base0 # DW_AT_addr_base
|
|
.byte 2 # Abbrev [2] 0x1e:0xb DW_TAG_variable
|
|
.byte 3 # DW_AT_name
|
|
.long 41 # DW_AT_type
|
|
# DW_AT_external
|
|
.byte 1 # DW_AT_decl_file
|
|
.byte 1 # DW_AT_decl_line
|
|
.byte 2 # DW_AT_location
|
|
.byte 161
|
|
.byte 0
|
|
.byte 3 # Abbrev [3] 0x29:0x4 DW_TAG_base_type
|
|
.byte 4 # DW_AT_name
|
|
.byte 6 # DW_AT_encoding
|
|
.byte 1 # DW_AT_byte_size
|
|
.byte 0 # End Of Children Mark
|
|
.Ldebug_info_end0:
|
|
.section .debug_str_offsets,"",@progbits
|
|
.long 24 # Length of String Offsets Set
|
|
.short 5
|
|
.short 0
|
|
.Lstr_offsets_base0:
|
|
.section .debug_str,"MS",@progbits,1
|
|
.Linfo_string0:
|
|
.asciz "Debian clang version 14.0.6" # string offset=0
|
|
.Linfo_string1:
|
|
.asciz "/tmp/tmp.c" # string offset=28
|
|
.Linfo_string2:
|
|
.asciz "/tmp" # string offset=39
|
|
.Linfo_string3:
|
|
.asciz "defined_data" # string offset=44
|
|
.Linfo_string4:
|
|
.asciz "char" # string offset=57
|
|
.section .debug_str_offsets,"",@progbits
|
|
.long .Linfo_string0
|
|
.long .Linfo_string1
|
|
.long .Linfo_string2
|
|
.long .Linfo_string3
|
|
.long .Linfo_string4
|
|
.section .debug_addr,"",@progbits
|
|
.long .Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution
|
|
.Ldebug_addr_start0:
|
|
.short 5 # DWARF version number
|
|
.byte 8 # Address size
|
|
.byte 0 # Segment selector size
|
|
.Laddr_table_base0:
|
|
.quad defined_data
|
|
.Ldebug_addr_end0:
|
|
.ident "Debian clang version 14.0.6"
|
|
.section ".note.GNU-stack","",@progbits
|
|
.addrsig
|
|
.section .debug_line,"",@progbits
|
|
.Lline_table_start0:
|