From 27183bba6bc249ae4c73bb799c7df702e98a2467 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Sun, 6 Apr 2008 08:40:47 +0200 Subject: 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 --- gcc/ChangeLog | 10 ++++++++-- gcc/config/i386/i386.c | 23 ++++++++++++++++++++++- gcc/testsuite/ChangeLog | 17 +++++++++++------ gcc/testsuite/gcc.target/i386/pr12329.c | 15 +++++++++++++++ 4 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr12329.c (limited to 'gcc') 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 + + 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 * 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 + + PR target/12329 + * gcc.target/i386/pr12329.c: New test. + 2008-04-05 Eric Botcazou * 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 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); +} -- cgit v1.1