1 | // XFAIL: * |
2 | // Incorrect location for variable "param", see PR48719. |
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 | // 1. param is escaped by inlineme(¶m) so it is not promoted by |
10 | // SROA/mem2reg. |
11 | // 2. InstCombine's LowerDbgDeclare converts the dbg.declare to a set of |
12 | // dbg.values. |
13 | // 3. inlineme(¶m) is inlined. |
14 | // 4. SROA/mem2reg fully promotes param. It does not insert a dbg.value after the |
15 | // PHI it inserts which merges the values out of entry and if.then in the |
16 | // sucessor block. This behaviour is inconsistent. If the dbg.declare was |
17 | // still around (i.e. if param was promoted in the first round of mem2reg |
18 | // BEFORE LowerDbgDeclare) we would see a dbg.value insered for the PHI. |
19 | // 5. JumpThreading removes the if.then block, changing entry to |
20 | // unconditionally branch to if.end. |
21 | // 6. SimplifyCFG stitches entry and if.end together. |
22 | |
23 | // The debug info is not updated to account for the merged value prior to or |
24 | // during JumpThreading/SimplifyCFG so we end up seeing param=5 for the entire |
25 | // function, when we'd expect to see param=10 when stepping onto fluff(). |
26 | |
27 | __attribute__((always_inline)) |
28 | int inlineme(int* p) { return *p * 2; } |
29 | |
30 | __attribute__((optnone)) |
31 | void fluff() {} |
32 | |
33 | __attribute__((noinline)) |
34 | int fun(int param) { |
35 | if (param) |
36 | param = inlineme(p: ¶m); |
37 | fluff(); // DexLabel('s0') |
38 | return param; |
39 | } |
40 | |
41 | int main() { |
42 | return fun(param: 5); |
43 | } |
44 | |
45 | // DexExpectWatchValue('param', 10, on_line=ref('s0')) |
46 | |