| 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 | |