This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch 2/3] Align stack for SSE (PR tdep/14222)


Hi,

this is mostly independent patch.  But it does not make sense to discuss
alignment in [patch 3/3] when it has been already broken.

	http://groups.google.com/group/ia32-abi/browse_thread/thread/4f9b3e5069943bf1
says that gcc-4.6 aligns stack to 32 bytes.  I do not see it anywhere:
	80482e8:       83 e4 f0                and    $0xfffffff0,%esp
It is aligned just to 16 bytes.  Also checked that Intel CPU documentation
does not require any more alignment than 16 bytes (sure it may be less
effective but traps never occur).  Therefore I consider amd64-tdep.c to be
correct and I have not changed its existing 16-bytes alignment.

No regressions on {x86_64,x86_64-m32,i686}-fedora17-linux-gnu.


Thanks,
Jan


gdb/
2012-06-13  Jan Kratochvil  <jan.kratochvil@redhat.com>

	PR tdep/14222
	* i386-tdep.c (i386_push_dummy_call): Align to 16 bytes unconditionally.

gdb/testsuite/
2012-06-13  Jan Kratochvil  <jan.kratochvil@redhat.com>

	PR tdep/14222
	* gdb.arch/i386-sse-stack-align.S: New file.
	* gdb.arch/i386-sse-stack-align.c: New file.
	* gdb.arch/i386-sse-stack-align.exp: New file.

--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -2399,9 +2399,11 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
       if (!write_pass)
 	{
-	  if (have_16_byte_aligned_arg)
-	    args_space = align_up (args_space, 16);
 	  sp -= args_space;
+
+	  /* ABI (since gcc-4.6?) says that caller should have SP aligned on
+	     a 16 byte boundary.  */
+	  sp &= ~0xf;
 	}
     }
 
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/i386-sse-stack-align.S
@@ -0,0 +1,214 @@
+/* Copyright 2012 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/*
+   gcc -S -o gdb.arch/i386-sse-stack-align.{S,c} -Wall -m32 -msse
+ */
+
+	.file	"i386-sse-stack-align.c"
+	.text
+	.type	foo, @function
+foo:
+.LFB0:
+	.cfi_startproc
+	pushl	%ebp
+	.cfi_def_cfa_offset 8
+	.cfi_offset 5, -8
+	movl	%esp, %ebp
+	.cfi_def_cfa_register 5
+	subl	$40, %esp
+	movaps	%xmm0, -24(%ebp)
+	movaps	%xmm1, -40(%ebp)
+	movaps	-24(%ebp), %xmm0
+	movaps	-40(%ebp), %xmm1
+	mulps	%xmm1, %xmm0
+	addps	-24(%ebp), %xmm0
+	leave
+	.cfi_restore 5
+	.cfi_def_cfa 4, 4
+	ret
+	.cfi_endproc
+.LFE0:
+	.size	foo, .-foo
+	.type	f, @function
+f:
+.LFB1:
+	.cfi_startproc
+	pushl	%ebp
+	.cfi_def_cfa_offset 8
+	.cfi_offset 5, -8
+	movl	%esp, %ebp
+	.cfi_def_cfa_register 5
+	subl	$40, %esp
+	movaps	.LC0, %xmm0
+	movaps	%xmm0, -24(%ebp)
+	movaps	-24(%ebp), %xmm1
+	movaps	-24(%ebp), %xmm0
+	call	foo
+	movaps	%xmm0, -40(%ebp)
+	leal	-40(%ebp), %eax
+	movss	(%eax), %xmm0
+	cvttss2si	%xmm0, %eax
+	leave
+	.cfi_restore 5
+	.cfi_def_cfa 4, 4
+	ret
+	.cfi_endproc
+.LFE1:
+	.size	f, .-f
+	.type	g0, @function
+g0:
+.LFB2:
+	.cfi_startproc
+	pushl	%ebp
+	.cfi_def_cfa_offset 8
+	.cfi_offset 5, -8
+	movl	%esp, %ebp
+	.cfi_def_cfa_register 5
+	subl	$8, %esp
+	call	f
+	leave
+	.cfi_restore 5
+	.cfi_def_cfa 4, 4
+	ret
+	.cfi_endproc
+.LFE2:
+	.size	g0, .-g0
+	.type	g1, @function
+g1:
+.LFB3:
+	.cfi_startproc
+	pushl	%ebp
+	.cfi_def_cfa_offset 8
+	.cfi_offset 5, -8
+	movl	%esp, %ebp
+	.cfi_def_cfa_register 5
+	subl	$8, %esp
+	call	f
+	leave
+	.cfi_restore 5
+	.cfi_def_cfa 4, 4
+	ret
+	.cfi_endproc
+.LFE3:
+	.size	g1, .-g1
+	.type	g2, @function
+g2:
+.LFB4:
+	.cfi_startproc
+	pushl	%ebp
+	.cfi_def_cfa_offset 8
+	.cfi_offset 5, -8
+	movl	%esp, %ebp
+	.cfi_def_cfa_register 5
+	subl	$8, %esp
+	call	f
+	leave
+	.cfi_restore 5
+	.cfi_def_cfa 4, 4
+	ret
+	.cfi_endproc
+.LFE4:
+	.size	g2, .-g2
+	.type	g3, @function
+g3:
+.LFB5:
+	.cfi_startproc
+	pushl	%ebp
+	.cfi_def_cfa_offset 8
+	.cfi_offset 5, -8
+	movl	%esp, %ebp
+	.cfi_def_cfa_register 5
+	subl	$8, %esp
+	call	f
+	leave
+	.cfi_restore 5
+	.cfi_def_cfa 4, 4
+	ret
+	.cfi_endproc
+.LFE5:
+	.size	g3, .-g3
+	.type	g4, @function
+g4:
+.LFB6:
+	.cfi_startproc
+	pushl	%ebp
+	.cfi_def_cfa_offset 8
+	.cfi_offset 5, -8
+	movl	%esp, %ebp
+	.cfi_def_cfa_register 5
+	subl	$8, %esp
+	call	f
+	leave
+	.cfi_restore 5
+	.cfi_def_cfa 4, 4
+	ret
+	.cfi_endproc
+.LFE6:
+	.size	g4, .-g4
+	.globl	main
+	.type	main, @function
+main:
+.LFB7:
+	.cfi_startproc
+	pushl	%ebp
+	.cfi_def_cfa_offset 8
+	.cfi_offset 5, -8
+	movl	%esp, %ebp
+	.cfi_def_cfa_register 5
+	pushl	%ebx
+	andl	$-16, %esp
+	subl	$16, %esp
+	.cfi_offset 3, -12
+	call	g0
+	movl	%eax, %ebx
+	movl	$1, (%esp)
+	call	g1
+	addl	%eax, %ebx
+	movl	$2, 4(%esp)
+	movl	$1, (%esp)
+	call	g2
+	addl	%eax, %ebx
+	movl	$3, 8(%esp)
+	movl	$2, 4(%esp)
+	movl	$1, (%esp)
+	call	g3
+	addl	%eax, %ebx
+	movl	$4, 12(%esp)
+	movl	$3, 8(%esp)
+	movl	$2, 4(%esp)
+	movl	$1, (%esp)
+	call	g4
+	addl	%ebx, %eax
+	movl	-4(%ebp), %ebx
+	leave
+	.cfi_restore 5
+	.cfi_def_cfa 4, 4
+	.cfi_restore 3
+	ret
+	.cfi_endproc
+.LFE7:
+	.size	main, .-main
+	.section	.rodata
+	.align 16
+.LC0:
+	.long	1065353216
+	.long	1073741824
+	.long	1077936128
+	.long	1082130432
+	.ident	"GCC: (GNU) 4.6.4 20120612 (prerelease)"
+	.section	.note.GNU-stack,"",@progbits
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/i386-sse-stack-align.c
@@ -0,0 +1,70 @@
+/* Copyright 2012 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+typedef float V __attribute__((vector_size(16)));
+
+static V
+foo (V a, V b)
+{
+  return a + b * a;
+}
+
+static __attribute__((noinline, noclone)) int
+f (void)
+{
+  volatile V a = { 1, 2, 3, 4 };
+  volatile V b;
+
+  b = foo (a, a);
+  return b[0];
+}
+
+static __attribute__((noinline, noclone)) int
+g0 (void)
+{
+  return f ();
+}
+
+static __attribute__((noinline, noclone)) int
+g1 (int p1)
+{
+  return f ();
+}
+
+static __attribute__((noinline, noclone)) int
+g2 (int p1, int p2)
+{
+  return f ();
+}
+
+static __attribute__((noinline, noclone)) int
+g3 (int p1, int p2, int p3)
+{
+  return f ();
+}
+
+static __attribute__((noinline, noclone)) int
+g4 (int p1, int p2, int p3, int p4)
+{
+  return f ();
+}
+
+int
+main (void)
+{
+  return g0 () + g1 (1) + g2 (1, 2) + g3 (1, 2, 3) + g4 (1, 2, 3, 4);
+}
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/i386-sse-stack-align.exp
@@ -0,0 +1,60 @@
+# Copyright 2012 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+if ![is_x86_like_target] {
+    verbose "Skipping x86 SSE stack alignment tests."
+    return
+}
+
+set testfile "i386-sse-stack-align"
+set srcfile ${testfile}.S
+set csrcfile ${testfile}.c
+set executable ${testfile}
+set binfile ${objdir}/${subdir}/${executable}
+set opts {}
+
+if [info exists COMPILE] {
+    set srcfile ${csrcfile}
+    lappend opts debug optimize=-O2 additional_flags=-msse
+}
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $opts] != "" } {
+    unsupported "cannot compile ${srcfile}"
+    return -1
+}
+
+clean_restart $executable
+
+if ![runto_main] then {
+    return -1
+}
+
+set args ""
+foreach i {0 1 2 3 4} {
+    set test "print g$i ($args)"
+    gdb_test_multiple $test $test {
+	-re " = 2\r\n$gdb_prompt $" {
+	    pass $test
+	}
+	-re "Program received signal SIGSEGV, Segmentation fault\\..*\r\n$gdb_prompt $" {
+	    fail $test
+	}
+    }
+
+    if {$args != ""} {
+	set args "$args, "
+    }
+    set args "$args[expr $i + 1]"
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]