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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
;; XFAIL: darwin,sun
;; RUN: echo create > %t.commands
;; RUN: echo s >> %t.commands
;; RUN: echo s >> %t.commands
;; RUN: echo finish >> %t.commands
;; RUN: echo bt >> %t.commands
;; RUN: echo q >> %t.commands
;; RUN: echo y >> %t.commands
;; RUN: llvm-as -f %s -o %t.bc
;; RUN: llvm-db %t.bc < %t.commands | grep 'in main at funccall.c:11:2'
;; Debugger type declarations
%lldb.compile_unit = type { uint, ushort, ushort, sbyte*, sbyte*, sbyte*, {}* }
%lldb.global = type { uint, %lldb.compile_unit*, sbyte*, {}*, sbyte*, bool, bool }
%lldb.local = type { uint, %lldb.global*, sbyte*, sbyte*, bool, bool }
;; Debugger intrinsic declarations...
declare {}* %llvm.dbg.stoppoint({}*, uint, uint, %lldb.compile_unit*)
declare {}* %llvm.dbg.func.start(%lldb.global*)
declare {}* %llvm.dbg.region.start({}*)
declare {}* %llvm.dbg.region.end({}*)
declare {}* %llvm.dbg.declare({}*, ...)
;; Global object anchors
%llvm.dbg.translation_units = linkonce global {} {}
%llvm.dbg.globals = linkonce global {} {}
%.str_1 = internal constant [11 x sbyte] c"funccall.c\00"
%.str_2 = internal constant [12 x sbyte] c"/home/sabre\00"
%.str_3 = internal constant [14 x sbyte] c"llvmgcc 3.4.x\00"
%d.compile_unit = internal constant %lldb.compile_unit {
uint 17, ;; DW_TAG_compile_unit
ushort 0, ;; LLVM Debug version #
ushort 1, ;; Language: DW_LANG_C89
sbyte* getelementptr ([11 x sbyte]* %.str_1, long 0, long 0), ;; Source filename
sbyte* getelementptr ([12 x sbyte]* %.str_2, long 0, long 0), ;; Working directory
sbyte* getelementptr ([14 x sbyte]* %.str_3, long 0, long 0), ;; producer
{}* %llvm.dbg.translation_units ;; Anchor
}
%.str_5 = internal global [5 x sbyte] c"main\00"
%.str_6 = internal global [4 x sbyte] c"foo\00"
%.str_7 = internal global [2 x sbyte] c"q\00"
%.str_8 = internal global [2 x sbyte] c"t\00"
%d.main = global %lldb.global {
uint 46, ;; DW_TAG_subprogram
%lldb.compile_unit* %d.compile_unit, ;; context pointer
sbyte* getelementptr ([5 x sbyte]* %.str_5, long 0, long 0), ;; name
{}* %llvm.dbg.globals, ;; anchor
sbyte* null, ;; EVENTUALLY the type
bool true, ;; non-static linkage?
bool false ;; definition, not declaration
}
%d.foo = global %lldb.global {
uint 46, ;; DW_TAG_subprogram
%lldb.compile_unit* %d.compile_unit, ;; context pointer
sbyte* getelementptr ([4 x sbyte]* %.str_6, long 0, long 0), ;; name
{}* %llvm.dbg.globals, ;; anchor
sbyte* null, ;; EVENTUALLY the type
bool true, ;; non-static linkage
bool false ;; definition, not declaration
}
%d.q = internal global %lldb.global {
uint 52, ;; DW_TAG_variable
%lldb.compile_unit* %d.compile_unit, ;; context pointer
sbyte* getelementptr ([2 x sbyte]* %.str_7, long 0, long 0), ;; name
{}* %llvm.dbg.globals, ;; anchor
sbyte* null, ;; EVENTUALLY the type
bool false, ;; static linkage
bool false ;; definition, not declaration
}
%d.t = internal global %lldb.local {
uint 52, ;; DW_TAG_variable
%lldb.global* %d.foo, ;; context pointer
sbyte* getelementptr ([2 x sbyte]* %.str_8, long 0, long 0), ;; name
sbyte* null, ;; EVENTUALLY the type
bool false, ;; local variable
bool false ;; definition, not declaratation
}
%q = internal global int 0
implementation ; Functions:
void %foo() {
entry:
%t = alloca int
%.1 = call {}* %llvm.dbg.func.start(%lldb.global* %d.foo)
%.2 = call {}* %llvm.dbg.stoppoint({}* %.1, uint 5, uint 2, %lldb.compile_unit* %d.compile_unit)
%.3 = call {}*({}*, ...)* %llvm.dbg.declare({}* %.2, %lldb.local* %d.t, int* %t)
%tmp.0 = load int* %q
store int %tmp.0, int* %t
%.4 = call {}* %llvm.dbg.stoppoint({}* %.3, uint 6, uint 2, %lldb.compile_unit* %d.compile_unit)
%tmp.01 = load int* %t
%tmp.1 = add int %tmp.01, 1
store int %tmp.1, int* %q
%.5 = call {}* %llvm.dbg.stoppoint({}* %.4, uint 7, uint 1, %lldb.compile_unit* %d.compile_unit)
call {}* %llvm.dbg.region.end({}* %.5)
ret void
}
int %main() {
entry:
%.1 = call {}* %llvm.dbg.func.start(%lldb.global* %d.main)
%result = alloca int
%.2 = call {}* %llvm.dbg.stoppoint({}* %.1, uint 9, uint 2, %lldb.compile_unit* %d.compile_unit)
store int 0, int* %q
%.3 = call {}* %llvm.dbg.stoppoint({}* %.2, uint 10, uint 2, %lldb.compile_unit* %d.compile_unit)
call void %foo()
%.4 = call {}* %llvm.dbg.stoppoint({}* %.3, uint 11, uint 2, %lldb.compile_unit* %d.compile_unit)
%tmp.2 = load int* %q
%tmp.3 = sub int %tmp.2, 1
store int %tmp.3, int* %q
%.5 = call {}* %llvm.dbg.stoppoint({}* %.4, uint 13, uint 2, %lldb.compile_unit* %d.compile_unit)
%tmp.4 = load int* %q
store int %tmp.4, int* %result
%tmp.5 = load int* %result
%.6 = call {}* %llvm.dbg.stoppoint({}* %.5, uint 14, uint 1, %lldb.compile_unit* %d.compile_unit)
call {}* %llvm.dbg.region.end({}* %.6)
ret int %tmp.5
}
|