aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2008-06-13 22:07:28 +0000
committerOlivier Hainque <hainque@gcc.gnu.org>2008-06-13 22:07:28 +0000
commitd8612af2ce55574685f370c438431d3c0881553f (patch)
tree791e14f9e7ddcb75fa91e32178b0ce5a940da33a /gcc
parent7f7e76a4ee4bf15404cdd73840c30566a39460bb (diff)
downloadgcc-d8612af2ce55574685f370c438431d3c0881553f.zip
gcc-d8612af2ce55574685f370c438431d3c0881553f.tar.gz
gcc-d8612af2ce55574685f370c438431d3c0881553f.tar.bz2
decl.c (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN): Define to 0 if undefined.
2008-06-13 Olivier Hainque <hainque@adacore.com> ada/ * decl.c (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN): Define to 0 if undefined. (gnat_to_gnu_entity) <case E_Function/Procedure>: Request stack realignment with force_align_arg_pointer attribute on foreign convention subprograms if FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN. testsuite/ * gnat.dg/task_stack_align.adb: New test. From-SVN: r136768
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog8
-rw-r--r--gcc/ada/decl.c36
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/task_stack_align.adb31
4 files changed, 79 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index f0eb327..2ad33ef 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,13 @@
2008-06-13 Olivier Hainque <hainque@adacore.com>
+ * decl.c (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN): Define to 0
+ if undefined.
+ (gnat_to_gnu_entity) <case E_Function/Procedure>: Request stack
+ realignment with force_align_arg_pointer attribute on foreign
+ convention subprograms if FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN.
+
+2008-06-13 Olivier Hainque <hainque@adacore.com>
+
* utils.c (rest_of_record_type_compilation): When computing
encodings for the components of a variable size type, early
strip conversions on the current position expression to make
diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c
index dbd7970..ff2927f 100644
--- a/gcc/ada/decl.c
+++ b/gcc/ada/decl.c
@@ -67,6 +67,29 @@
#define Has_Stdcall_Convention(E) (0)
#endif
+/* Stack realignment for functions with foreign conventions is provided on a
+ per back-end basis now, as it is handled by the prologue expanders and not
+ as part of the function's body any more. It might be requested by way of a
+ dedicated function type attribute on the targets that support it.
+
+ We need a way to avoid setting the attribute on the targets that don't
+ support it and use FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN for this purpose.
+
+ It is defined on targets where the circuitry is available, and indicates
+ whether the realignment is needed for 'main'. We use this to decide for
+ foreign subprograms as well.
+
+ It is not defined on targets where the circuitry is not implemented, and
+ we just never set the attribute in these cases.
+
+ Whether it is defined on all targets that would need it in theory is
+ not entirely clear. We currently trust the base GCC settings for this
+ purpose. */
+
+#ifndef FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN
+#define FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN 0
+#endif
+
struct incomplete
{
struct incomplete *next;
@@ -3951,6 +3974,19 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
get_identifier ("stdcall"), NULL_TREE,
gnat_entity);
+ /* If we are on a target where stack realignment is needed for 'main'
+ to honor GCC's implicit expectations (stack alignment greater than
+ what the base ABI guarantees), ensure we do the same for foreign
+ convention subprograms as they might be used as callbacks from code
+ breaking such expectations. Note that this applies to task entry
+ points in particular. */
+ if (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN
+ && Has_Foreign_Convention (gnat_entity))
+ prepend_one_attribute_to
+ (&attr_list, ATTR_MACHINE_ATTRIBUTE,
+ get_identifier ("force_align_arg_pointer"), NULL_TREE,
+ gnat_entity);
+
/* The lists have been built in reverse. */
gnu_param_list = nreverse (gnu_param_list);
if (has_stub)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dd044c2..6ddf1ce 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2008-06-13 Olivier Hainque <hainque@adacore.com>
+
+ * gnat.dg/task_stack_align.adb: New test.
+
2008-06-13 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/35863
diff --git a/gcc/testsuite/gnat.dg/task_stack_align.adb b/gcc/testsuite/gnat.dg/task_stack_align.adb
new file mode 100644
index 0000000..1151a91
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/task_stack_align.adb
@@ -0,0 +1,31 @@
+-- { dg-do run }
+
+with Ada.Text_IO; use Ada.Text_IO;
+with System.Storage_Elements; use System.Storage_Elements;
+
+procedure Task_Stack_Align is
+
+ type Align_Me is record
+ Value : Integer;
+ end record;
+ for Align_Me'Alignment use Standard'Maximum_Alignment;
+
+ procedure Check_Local_Alignment_From (Context : String) is
+ Object : Align_Me;
+ begin
+ if To_Integer (Object'Address) mod Object'Alignment /= 0 then
+ Put_Line ("alignment check failed in " & Context);
+ end if;
+ end;
+
+ task type T;
+
+ task body T is
+ begin
+ Check_Local_Alignment_From ("task T");
+ end;
+
+ Tasks : array (1 .. 50) of T;
+begin
+ Check_Local_Alignment_From ("environment");
+end;