aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2010-05-25 21:44:26 +0000
committerBill Wendling <isanbard@gmail.com>2010-05-25 21:44:26 +0000
commitbdfd6ab89d0bcefa2ca91a87da5fa2a03bcde305 (patch)
treeaa77fa5fdeb6487d133a82d1def78a0bb755a30d /lib/Transforms
parentfdc794a7f748a2b83c8a2e32378111785ad53146 (diff)
downloadexternal_llvm-bdfd6ab89d0bcefa2ca91a87da5fa2a03bcde305.zip
external_llvm-bdfd6ab89d0bcefa2ca91a87da5fa2a03bcde305.tar.gz
external_llvm-bdfd6ab89d0bcefa2ca91a87da5fa2a03bcde305.tar.bz2
Okay, bear with me here...
If you have a setjmp/longjmp situation, it's possible for stack slot coloring to reuse a stack slot before it's really dead. For instance, if we have something like this: 1: y = g; x = sigsetjmp(env, 0); switch (x) { case 1: /* ... */ goto run; case 0: run: do_run(); /* marked as "no return" */ break; case 3: if (...) { /* ... */ goto run; } /* ... */ break; } 2: g = y; "y" may be put onto the stack, so the expression "g = y" is relying upon the fact that the stack slot containing "y" isn't modified between (1) and (2). But it can be, because of the "no return" calls in there. A longjmp might come back with 3, modify the stack slot, and then go to case 0. And it's perfectly acceptable to reuse the stack slot there because there's no CFG flow from case 3 to (2). The fix is to disable certain optimizations in these situations. Ideally, we'd disable them for all "returns twice" functions. But we don't support that attribute. Check for "setjmp" and "sigsetjmp" instead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104640 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
0 files changed, 0 insertions, 0 deletions