summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2016-06-22 16:21:14 +0000
committerHans Wennborg <hans@hanshq.net>2016-06-22 16:21:14 +0000
commit8fcedf2f6e16057437fc0e7f890c9dcbafae9911 (patch)
treecfed54140ccda3c6ca0f6cb6b162bc2b1c53c37d /test
parent222836879511fa910a71f9c7f7ba8e658d4ceec9 (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.c26
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