diff options
author | Hans Wennborg <hans@hanshq.net> | 2016-06-22 16:21:14 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2016-06-22 16:21:14 +0000 |
commit | 8fcedf2f6e16057437fc0e7f890c9dcbafae9911 (patch) | |
tree | cfed54140ccda3c6ca0f6cb6b162bc2b1c53c37d /test | |
parent | 222836879511fa910a71f9c7f7ba8e658d4ceec9 (diff) |
Widen EHScope::ClenupBitFields::FixupDepth to avoid overflowing it (PR23490)
It currently only takes 2048 gotos to overflow the FixupDepth bitfield,
causing silent miscompilation. Apparently some parser generators run into
this (see PR).
I don't know that that data structure is terribly size sensitive anyway,
and since there's no room to widen the bitfield, let's just use a separate
word in EHCatchScope for it.
Differential Revision: http://reviews.llvm.org/D21566
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@273434 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGen/fixup-depth-overflow.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/test/CodeGen/fixup-depth-overflow.c b/test/CodeGen/fixup-depth-overflow.c new file mode 100644 index 0000000000..be8f54284e --- /dev/null +++ b/test/CodeGen/fixup-depth-overflow.c @@ -0,0 +1,26 @@ +// RUN: %clang_cc1 -O1 -disable-llvm-optzns -emit-llvm -o - %s | FileCheck %s + +#define M if (x) goto L1; +#define M10 M M M M M M M M M M +#define M100 M10 M10 M10 M10 M10 M10 M10 M10 M10 M10 +#define M1000 M100 M100 M100 M100 M100 M100 M100 M100 M100 M100 + +void f(int x) { + int h; + + // Many gotos to not-yet-emitted labels would cause EHScope's FixupDepth + // to overflow (PR23490). + M1000 M1000 M1000 + + if (x == 5) { + // This will cause us to emit a clean-up of the stack variable. If the + // FixupDepths are broken, fixups will erroneously get threaded through it. + int i; + } + +L1: + return; +} + +// CHECK-LABEL: define void @f +// CHECK-NOT: cleanup |