## 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: