1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
| # Create .debug_line containing absolute path in filename. Show that the path is sensibly printed/found/etc.
# REQUIRES: x86-registered-target
# RUN: sed s!FILEPATH!%/s! %s > %t.s
# RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %t.s -o %t.o
# RUN: llvm-symbolizer --obj=%t.o 0 | FileCheck %s -DPATH=%/s
# CHECK: {{^}}[[PATH]]:1:0
.type _start,@function
_start:
.Lfunc_begin0:
ret
.Lfunc_end0:
.section .debug_str,"MS",@progbits,1
.Linfo_string1:
.asciz "test.c"
.Linfo_string2:
.asciz "/some/dir"
.Linfo_string3:
.asciz "_start"
.section .debug_abbrev,"",@progbits
.byte 1 # Abbreviation Code
.byte 17 # DW_TAG_compile_unit
.byte 1 # DW_CHILDREN_yes
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 16 # DW_AT_stmt_list
.byte 23 # DW_FORM_sec_offset
.byte 27 # DW_AT_comp_dir
.byte 14 # DW_FORM_strp
.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 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 58 # DW_AT_decl_file
.byte 11 # DW_FORM_data1
.byte 59 # DW_AT_decl_line
.byte 11 # DW_FORM_data1
.byte 63 # DW_AT_external
.byte 25 # DW_FORM_flag_present
.byte 0 # EOM(1)
.byte 0 # EOM(2)
.byte 0 # EOM(3)
.section .debug_info,"",@progbits
.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:0x35 DW_TAG_compile_unit
.long .Linfo_string1 # DW_AT_name
.long .Lline_table_start0 # DW_AT_stmt_list
.long .Linfo_string2 # DW_AT_comp_dir
.quad .Lfunc_begin0 # DW_AT_low_pc
.long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc
.byte 2 # Abbrev [2] 0x2a:0x15 DW_TAG_subprogram
.quad .Lfunc_begin0 # DW_AT_low_pc
.long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc
.long .Linfo_string3 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 1 # DW_AT_decl_line
# DW_AT_external
.byte 0 # End Of Children Mark
.Ldebug_info_end0:
# Hand-written .debug_line to allow replacing in the absolute path
# into the filename table at runtime.
.section .debug_line,"",@progbits
.Lline_table_start0:
.long .Ltable_end - .Ltable_start # unit length
.Ltable_start:
.short 4 # version
.long .Lheader_end - .Lheader_start # header length
.Lheader_start:
.byte 1 # min instruction length
.byte 1 # max ops per instruction
.byte 1 # default is_stmt
.byte -5 # line base
.byte 14 # line range
.byte 13 # opcode base
.byte 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 # standard opcode lengths
.byte 0 # directory table
.asciz "FILEPATH" # filename table
.byte 0, 0, 0
.byte 0
.Lheader_end:
.byte 0, 9, 2 # DW_LNE_set_address
.quad .Lfunc_begin0
.byte 1 # DW_LNS_copy
.byte 33 # +1 address, +1 line
.byte 0, 1, 1 # DW_LNE_end_sequence
.Ltable_end:
|