aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2008-04-06 08:40:47 +0200
committerUros Bizjak <uros@gcc.gnu.org>2008-04-06 08:40:47 +0200
commit27183bba6bc249ae4c73bb799c7df702e98a2467 (patch)
treefab042be595339e8cc2b6a43e033a7b1e7d24655 /gcc
parent93f14b2fc38a2221142d513151a437ef9f14feb8 (diff)
downloadgcc-27183bba6bc249ae4c73bb799c7df702e98a2467.zip
gcc-27183bba6bc249ae4c73bb799c7df702e98a2467.tar.gz
gcc-27183bba6bc249ae4c73bb799c7df702e98a2467.tar.bz2
re PR target/12329 (x86: local function declared with attribute((regparm(3))) gets corrupted parent frame pointer)
PR target/12329 * config/i386/i386.c (ix86_function_regparm): Error if regparm(3) attribute is used for nested functions. testsuite/ChangeLog: PR target/12329 * gcc.target/i386/pr12329.c: New test. From-SVN: r133954
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/i386.c23
-rw-r--r--gcc/testsuite/ChangeLog17
-rw-r--r--gcc/testsuite/gcc.target/i386/pr12329.c15
4 files changed, 56 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index de51e84..56c8a94 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-05 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/12329
+ * config/i386/i386.c (ix86_function_regparm): Error if regparm(3)
+ attribute is used for nested functions.
+
2008-04-05 Jan Hubicka <jh@suse.cz>
* emit-rtl.c (init_emit): xcalloc regno_pointer_align.
@@ -13,8 +19,8 @@
it out based on pass type.
(register_dump_files_1): Likewise.
(init_optimization_passes): Update register_one_dump_file calls.
- (execute_one_pass): Sanity check that IPA passes are called at IPA level
- and RTL passes at RTL level.
+ (execute_one_pass): Sanity check that IPA passes are called at IPA
+ level and RTL passes at RTL level.
(execute_pass_list): IPA pass can not be after or subpass of
GIMPLE/RTL pass.
(execute_ipa_pass_list): Handle IPA subpasses of IPA subpasses and
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 14aac46..161f9e4 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3250,12 +3250,33 @@ ix86_function_regparm (const_tree type, const_tree decl)
tree attr;
int regparm = ix86_regparm;
+ static bool error_issued;
+
if (TARGET_64BIT)
return regparm;
attr = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type));
if (attr)
- return TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
+ {
+ regparm
+ = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr)));
+
+ if (decl && TREE_CODE (decl) == FUNCTION_DECL)
+ {
+ /* We can't use regparm(3) for nested functions because
+ these pass static chain pointer in %ecx register. */
+ if (!error_issued && regparm == 3
+ && decl_function_context (decl)
+ && !DECL_NO_STATIC_CHAIN (decl))
+ {
+ error ("nested functions are limited to 2 register parameters");
+ error_issued = true;
+ return 0;
+ }
+ }
+
+ return regparm;
+ }
if (lookup_attribute ("fastcall", TYPE_ATTRIBUTES (type)))
return 2;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 85105c4..ee449b6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-04-06 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/12329
+ * gcc.target/i386/pr12329.c: New test.
+
2008-04-05 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/pr35823.adb: Rename to size_attribute.adb.
@@ -163,12 +168,12 @@
* lib/gfortran-dg.exp: New harness to compile Fortran progs
with all combinations of debug options available on target.
- * gfortran.dg/debug/debug.exp: Ditto.
- * gfortran.dg/debug/trivial.f: Ditto.
- * gfortran.dg/debug/pr35154-stabs.f: New test case for
- .stabs functionality.
- * gfortran.dg/debug/pr35154-dwarf2.f: New test case for
- DWARF functionality.
+ * gfortran.dg/debug/debug.exp: Ditto.
+ * gfortran.dg/debug/trivial.f: Ditto.
+ * gfortran.dg/debug/pr35154-stabs.f: New test case for
+ .stabs functionality.
+ * gfortran.dg/debug/pr35154-dwarf2.f: New test case for
+ DWARF functionality.
2008-04-01 Volker Reichelt <v.reichelt@netcologne.de>
diff --git a/gcc/testsuite/gcc.target/i386/pr12329.c b/gcc/testsuite/gcc.target/i386/pr12329.c
new file mode 100644
index 0000000..aeefeb0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr12329.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+int test_nested (int i)
+{
+ int __attribute__ ((__noinline__, __regparm__(3))) foo(int j, int k, int l)
+ { /* { dg-error "nested functions are limited to 2 register parameters" } */
+ return i + j + k + l;
+ }
+
+ return foo (i, i+1, i+2);
+}