xref: /llvm-project/llvm/test/tools/llvm-nm/X86/line-numbers.test (revision 2baf4a06ef06c51c2ef09f981f204983b0f8082c)
1## Check that printing line numbers isn't attempted for files like bitcode,
2## which have symbols but limited/no section or debug info.
3# RUN: llvm-nm --line-numbers %p/Inputs/test.IRobj-x86_64 | FileCheck %s --check-prefix=BITCODE --match-full-lines --implicit-check-not={{.}}
4# BITCODE:      ---------------- S _global_const
5# BITCODE-NEXT: ---------------- D _global_data
6# BITCODE-NEXT: ---------------- T _global_func
7# BITCODE-NEXT: ---------------- S _hidden_const
8# BITCODE-NEXT: ---------------- D _hidden_data
9# BITCODE-NEXT: ---------------- T _hidden_func
10# BITCODE-NEXT: ---------------- s _static_const
11# BITCODE-NEXT: ---------------- d _static_data
12# BITCODE-NEXT: ---------------- t _static_func
13
14## Check that various symbol types can use debug information if available to
15## print line numbers, and if unavailable, don't print anything erroneous. The
16## specific cases checked are given by the symbol names below. Other test cases
17## place requirements on the contents of the whole file, so they are kept out
18## of main.o.
19# RUN: rm -rf %t
20# RUN: split-file %s %t
21# RUN: llvm-mc -g --filetype=obj -triple=x86_64-pc-linux %t/main.s -o %t/main.o
22# RUN: llvm-nm -l %t/main.o | FileCheck %s --match-full-lines --implicit-check-not={{.}}
23# RUN: llvm-nm --line-numbers %t/main.o | FileCheck %s --match-full-lines --implicit-check-not={{.}}
24
25# CHECK:      0000000000001234 a absolute_symbol
26# CHECK-NEXT: 0000000000000000 d data_no_dwarf
27# CHECK-NEXT: 0000000000000000 T defined_global_function [[FILENAME:.*main.s]]:4
28# CHECK-NEXT: 0000000000000001 t defined_local_function [[FILENAME]]:7
29# CHECK-NEXT: 0000000000000000 t function_no_dwarf
30# CHECK-NEXT:                  U undef1 [[FILENAME]]:12
31# CHECK-NEXT:                  U undef2 [[FILENAME]]:14
32# CHECK-NEXT:                  U undef_no_reloc
33# CHECK-NEXT: 0000000000000002 t undefined_references [[FILENAME]]:12
34
35## Check that in the absence of DWARF in the whole object, no line number
36## information is printed.
37# RUN: llvm-mc --filetype=obj %t/main.s -triple=x86_64-pc-linux -o %t/no-dwarf.o
38# RUN: llvm-nm -l %t/no-dwarf.o | FileCheck %s --check-prefix=NO-DWARF --match-full-lines --implicit-check-not={{.}}
39
40# NO-DWARF:      0000000000001234 a absolute_symbol
41# NO-DWARF-NEXT: 0000000000000000 d data_no_dwarf
42# NO-DWARF-NEXT: 0000000000000000 T defined_global_function
43# NO-DWARF-NEXT: 0000000000000001 t defined_local_function
44# NO-DWARF-NEXT: 0000000000000000 t function_no_dwarf
45# NO-DWARF-NEXT:                  U undef1
46# NO-DWARF-NEXT:                  U undef2
47# NO-DWARF-NEXT:                  U undef_no_reloc
48# NO-DWARF-NEXT: 0000000000000002 t undefined_references
49
50## Check that printing line numbers for undefined values is not attempted in
51## the absence of any relocation section.
52# RUN: llvm-mc --filetype=obj %t/undef-no-reloc-sections.s -triple=x86_64-pc-linux -o %t/undef-no-reloc-sections.o
53# 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={{.}}
54
55# UNDEF-NO-RELOC-SECTIONS: U undef
56
57## Check that printing line numbers for undefined values does not include
58## relocations for non-text sections. This is broken out of main.s to ensure
59## that the data relocation for undef comes first.
60# RUN: llvm-mc -g --filetype=obj %t/undef-data-reloc.s -triple=x86_64-pc-linux -o %t/undef-data-reloc.o
61# RUN: llvm-nm --line-numbers %t/undef-data-reloc.o | FileCheck %s --check-prefix=UNDEF-DATA-RELOC --match-full-lines --implicit-check-not={{.}}
62
63# UNDEF-DATA-RELOC:      0000000000000000 r data_reloc
64# UNDEF-DATA-RELOC-NEXT:                  U undef
65
66## Check that line numbers can be printed for data definitions. These are broken
67## out of main.s since their DWARF cannot be generated with llvm-mc -g.
68# RUN: llvm-mc -g --filetype=obj %t/data-dwarf.s -triple=x86_64-pc-linux -o %t/data-dwarf.o
69# RUN: llvm-nm --line-numbers %t/data-dwarf.o | FileCheck %s --check-prefix=DATA-DWARF --match-full-lines --implicit-check-not={{.}}
70
71# DATA-DWARF: 0000000000000000 D defined_data /tmp{{\\|/}}tmp.c:1
72
73#--- main.s
74.text
75.globl defined_global_function
76defined_global_function:
77  ret
78
79defined_local_function:
80  ret
81
82absolute_symbol = 0x1234
83
84undefined_references:
85  nop
86  .long undef1
87  nop
88  .long undef2
89  ret
90
91# Note: llvm-mc -g produces no DWARF for data.
92.data
93data_no_dwarf:
94  .byte 0
95
96.globl undef_no_reloc
97
98# Note: llvm-mc -g does not produce DWARF for non-SHF_ALLOC sections.
99.section no_alloc_text,"x",@progbits
100function_no_dwarf:
101  ret
102
103#--- undef-no-reloc-sections.s
104.globl undef
105
106#--- undef-data-reloc.s
107.globl undef
108.rodata
109data_reloc:
110  .long undef
111
112#--- data-dwarf.s
113# char defined_data = 42
114	.text
115	.file	"tmp.c"
116	.file	0 "/tmp" "/tmp/tmp.c" md5 0x39602a53b15a32d6a622ca86936e88d7
117	.file	1 "tmp.c" md5 0x39602a53b15a32d6a622ca86936e88d7
118	.type	defined_data,@object            # @defined_data
119	.data
120	.globl	defined_data
121defined_data:
122	.byte	42                              # 0x2a
123	.size	defined_data, 1
124
125	.section	.debug_abbrev,"",@progbits
126	.byte	1                               # Abbreviation Code
127	.byte	17                              # DW_TAG_compile_unit
128	.byte	1                               # DW_CHILDREN_yes
129	.byte	37                              # DW_AT_producer
130	.byte	37                              # DW_FORM_strx1
131	.byte	19                              # DW_AT_language
132	.byte	5                               # DW_FORM_data2
133	.byte	3                               # DW_AT_name
134	.byte	37                              # DW_FORM_strx1
135	.byte	114                             # DW_AT_str_offsets_base
136	.byte	23                              # DW_FORM_sec_offset
137	.byte	16                              # DW_AT_stmt_list
138	.byte	23                              # DW_FORM_sec_offset
139	.byte	27                              # DW_AT_comp_dir
140	.byte	37                              # DW_FORM_strx1
141	.byte	115                             # DW_AT_addr_base
142	.byte	23                              # DW_FORM_sec_offset
143	.byte	0                               # EOM(1)
144	.byte	0                               # EOM(2)
145	.byte	2                               # Abbreviation Code
146	.byte	52                              # DW_TAG_variable
147	.byte	0                               # DW_CHILDREN_no
148	.byte	3                               # DW_AT_name
149	.byte	37                              # DW_FORM_strx1
150	.byte	73                              # DW_AT_type
151	.byte	19                              # DW_FORM_ref4
152	.byte	63                              # DW_AT_external
153	.byte	25                              # DW_FORM_flag_present
154	.byte	58                              # DW_AT_decl_file
155	.byte	11                              # DW_FORM_data1
156	.byte	59                              # DW_AT_decl_line
157	.byte	11                              # DW_FORM_data1
158	.byte	2                               # DW_AT_location
159	.byte	24                              # DW_FORM_exprloc
160	.byte	0                               # EOM(1)
161	.byte	0                               # EOM(2)
162	.byte	3                               # Abbreviation Code
163	.byte	36                              # DW_TAG_base_type
164	.byte	0                               # DW_CHILDREN_no
165	.byte	3                               # DW_AT_name
166	.byte	37                              # DW_FORM_strx1
167	.byte	62                              # DW_AT_encoding
168	.byte	11                              # DW_FORM_data1
169	.byte	11                              # DW_AT_byte_size
170	.byte	11                              # DW_FORM_data1
171	.byte	0                               # EOM(1)
172	.byte	0                               # EOM(2)
173	.byte	0                               # EOM(3)
174	.section	.debug_info,"",@progbits
175.Lcu_begin0:
176	.long	.Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
177.Ldebug_info_start0:
178	.short	5                               # DWARF version number
179	.byte	1                               # DWARF Unit Type
180	.byte	8                               # Address Size (in bytes)
181	.long	.debug_abbrev                   # Offset Into Abbrev. Section
182	.byte	1                               # Abbrev [1] 0xc:0x22 DW_TAG_compile_unit
183	.byte	0                               # DW_AT_producer
184	.short	12                              # DW_AT_language
185	.byte	1                               # DW_AT_name
186	.long	.Lstr_offsets_base0             # DW_AT_str_offsets_base
187	.long	.Lline_table_start0             # DW_AT_stmt_list
188	.byte	2                               # DW_AT_comp_dir
189	.long	.Laddr_table_base0              # DW_AT_addr_base
190	.byte	2                               # Abbrev [2] 0x1e:0xb DW_TAG_variable
191	.byte	3                               # DW_AT_name
192	.long	41                              # DW_AT_type
193                                        # DW_AT_external
194	.byte	1                               # DW_AT_decl_file
195	.byte	1                               # DW_AT_decl_line
196	.byte	2                               # DW_AT_location
197	.byte	161
198	.byte	0
199	.byte	3                               # Abbrev [3] 0x29:0x4 DW_TAG_base_type
200	.byte	4                               # DW_AT_name
201	.byte	6                               # DW_AT_encoding
202	.byte	1                               # DW_AT_byte_size
203	.byte	0                               # End Of Children Mark
204.Ldebug_info_end0:
205	.section	.debug_str_offsets,"",@progbits
206	.long	24                              # Length of String Offsets Set
207	.short	5
208	.short	0
209.Lstr_offsets_base0:
210	.section	.debug_str,"MS",@progbits,1
211.Linfo_string0:
212	.asciz	"Debian clang version 14.0.6"   # string offset=0
213.Linfo_string1:
214	.asciz	"/tmp/tmp.c"                    # string offset=28
215.Linfo_string2:
216	.asciz	"/tmp"                          # string offset=39
217.Linfo_string3:
218	.asciz	"defined_data"                  # string offset=44
219.Linfo_string4:
220	.asciz	"char"                          # string offset=57
221	.section	.debug_str_offsets,"",@progbits
222	.long	.Linfo_string0
223	.long	.Linfo_string1
224	.long	.Linfo_string2
225	.long	.Linfo_string3
226	.long	.Linfo_string4
227	.section	.debug_addr,"",@progbits
228	.long	.Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution
229.Ldebug_addr_start0:
230	.short	5                               # DWARF version number
231	.byte	8                               # Address size
232	.byte	0                               # Segment selector size
233.Laddr_table_base0:
234	.quad	defined_data
235.Ldebug_addr_end0:
236	.ident	"Debian clang version 14.0.6"
237	.section	".note.GNU-stack","",@progbits
238	.addrsig
239	.section	.debug_line,"",@progbits
240.Lline_table_start0:
241