1 | // XFAIL: !system-darwin || !target-aarch64 |
2 | //// Suboptimal coverage, see inlined comments. |
3 | |
4 | // REQUIRES: lldb |
5 | // UNSUPPORTED: system-windows |
6 | // RUN: %clang -std=gnu11 -O3 -glldb %s -o %t |
7 | // RUN: %dexter --fail-lt 1.0 -w --debugger lldb --binary %t -- %s |
8 | |
9 | //// Adapted from https://bugs.llvm.org/show_bug.cgi?id=34136#c4 |
10 | |
11 | int g; |
12 | |
13 | __attribute__((__noinline__)) |
14 | void esc(int* p) { |
15 | g = *p; |
16 | *p = 5; |
17 | } |
18 | |
19 | __attribute__((__noinline__)) |
20 | void thing(int x) { |
21 | g = x; |
22 | } |
23 | |
24 | __attribute__((__noinline__)) |
25 | int fun(int param) { |
26 | esc(p: ¶m); //// alloca is live until here DexLabel('s1') |
27 | if (param == 0) { //// end of alloca live range |
28 | //// param is now a constant, but without lowering to dbg.value we can't |
29 | //// capture that and would still point to the stack slot that may even have |
30 | //// been reused by now. |
31 | //// |
32 | //// Right now we get suboptimal coverage for x86: the param load below is |
33 | //// CSE'd with the if condition. |
34 | //// Instcombine runs LowerDbgDeclare and inserts a dbg.value after the load. |
35 | //// SelectionDAG combines the load and cmp. We go from this IR: |
36 | //// %0 = load i32, i32* %param.addr, align 4, !dbg !42, !tbaa !20 |
37 | //// call void @llvm.dbg.value(metadata i32 %0, ... |
38 | //// %cmp = icmp eq i32 %0, 0, !dbg !44 |
39 | //// to this MIR: |
40 | //// DBG_VALUE $noreg, $noreg, !"param"... |
41 | //// CMP32mi8 %param.addr, 1, $noreg, 0, $noreg, 0, implicit-def $eflags, debug-location !44 |
42 | thing(x: param); |
43 | } |
44 | return 0; // DexLabel('s2') |
45 | } |
46 | |
47 | int main() { |
48 | return fun(param: 5); |
49 | } |
50 | |
51 | // DexExpectWatchValue('param', '5', from_line=ref('s1'), to_line=ref('s2')) |
52 | |
53 | |