develop to GCC 4.8.0. * Adds libatomic1 and libitm1 sub-packages for transactional memory * Adds libasan0 and libtsan0 sub-packages for address and thread sanitizing OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gcc48?expand=0&rev=1
124 lines
4.1 KiB
Diff
124 lines
4.1 KiB
Diff
2005-07-08 Jakub Jelinek <jakub@redhat.com>
|
|
|
|
* config/ia64/ia64.h (FRAME_GROWS_DOWNWARD): Define to 1 if
|
|
-fstack-protect.
|
|
* config/ia64/ia64.c (ia64_compute_frame_size): Make sure
|
|
size is a multiple of 16 if FRAME_GROWS_DOWNWARD.
|
|
(ia64_initial_elimination_offset): Support FRAME_GROWS_DOWNWARD
|
|
layout.
|
|
* config/ia64/linux.h (TARGET_LIBC_PROVIDES_SSP): Define.
|
|
* config/ia64/ia64.md (stack_protect_set, stack_protect_test): New
|
|
expanders.
|
|
|
|
Index: gcc/config/ia64/linux.h
|
|
===================================================================
|
|
--- gcc/config/ia64/linux.h.orig 2012-08-16 13:13:45.000000000 +0200
|
|
+++ gcc/config/ia64/linux.h 2012-12-11 12:48:44.759086378 +0100
|
|
@@ -77,6 +77,11 @@ do { \
|
|
#undef LINK_EH_SPEC
|
|
#define LINK_EH_SPEC ""
|
|
|
|
+#ifdef TARGET_LIBC_PROVIDES_SSP
|
|
+/* IA-64 glibc provides __stack_chk_guard in [r13-8]. */
|
|
+#define TARGET_THREAD_SSP_OFFSET -8
|
|
+#endif
|
|
+
|
|
/* Put all *tf routines in libgcc. */
|
|
#undef LIBGCC2_HAS_TF_MODE
|
|
#define LIBGCC2_HAS_TF_MODE 1
|
|
Index: gcc/config/ia64/ia64.c
|
|
===================================================================
|
|
--- gcc/config/ia64/ia64.c.orig 2012-12-11 11:56:03.000000000 +0100
|
|
+++ gcc/config/ia64/ia64.c 2012-12-11 12:48:44.763086378 +0100
|
|
@@ -2879,6 +2879,9 @@ ia64_compute_frame_size (HOST_WIDE_INT s
|
|
else
|
|
pretend_args_size = crtl->args.pretend_args_size;
|
|
|
|
+ if (FRAME_GROWS_DOWNWARD)
|
|
+ size = IA64_STACK_ALIGN (size);
|
|
+
|
|
total_size = (spill_size + extra_spill_size + size + pretend_args_size
|
|
+ crtl->outgoing_args_size);
|
|
total_size = IA64_STACK_ALIGN (total_size);
|
|
@@ -2913,9 +2916,9 @@ ia64_can_eliminate (const int from ATTRI
|
|
HOST_WIDE_INT
|
|
ia64_initial_elimination_offset (int from, int to)
|
|
{
|
|
- HOST_WIDE_INT offset;
|
|
+ HOST_WIDE_INT offset, size = get_frame_size ();
|
|
|
|
- ia64_compute_frame_size (get_frame_size ());
|
|
+ ia64_compute_frame_size (size);
|
|
switch (from)
|
|
{
|
|
case FRAME_POINTER_REGNUM:
|
|
@@ -2936,6 +2939,7 @@ ia64_initial_elimination_offset (int fro
|
|
default:
|
|
gcc_unreachable ();
|
|
}
|
|
+ offset += FRAME_GROWS_DOWNWARD ? IA64_STACK_ALIGN (size) : 0;
|
|
break;
|
|
|
|
case ARG_POINTER_REGNUM:
|
|
Index: gcc/config/ia64/ia64.md
|
|
===================================================================
|
|
--- gcc/config/ia64/ia64.md.orig 2012-10-19 10:44:15.000000000 +0200
|
|
+++ gcc/config/ia64/ia64.md 2012-12-11 12:48:44.764086378 +0100
|
|
@@ -5205,6 +5205,43 @@
|
|
[(set_attr "itanium_class" "unknown")
|
|
(set_attr "predicable" "no")])
|
|
|
|
+;;
|
|
+;; Stack guard expanders
|
|
+
|
|
+(define_expand "stack_protect_set"
|
|
+ [(set (match_operand 0 "memory_operand" "")
|
|
+ (match_operand 1 "memory_operand" ""))]
|
|
+ ""
|
|
+{
|
|
+#ifdef TARGET_THREAD_SSP_OFFSET
|
|
+ rtx thread_pointer_rtx = gen_rtx_REG (Pmode, 13);
|
|
+ rtx canary = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, thread_pointer_rtx,
|
|
+ GEN_INT (TARGET_THREAD_SSP_OFFSET)));
|
|
+ MEM_VOLATILE_P (canary) = MEM_VOLATILE_P (operands[1]);
|
|
+ operands[1] = canary;
|
|
+#endif
|
|
+ emit_move_insn (operands[0], operands[1]);
|
|
+ DONE;
|
|
+})
|
|
+
|
|
+(define_expand "stack_protect_test"
|
|
+ [(match_operand 0 "memory_operand" "")
|
|
+ (match_operand 1 "memory_operand" "")
|
|
+ (match_operand 2 "" "")]
|
|
+ ""
|
|
+{
|
|
+#ifdef TARGET_THREAD_SSP_OFFSET
|
|
+ rtx thread_pointer_rtx = gen_rtx_REG (Pmode, 13);
|
|
+ rtx canary = gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, thread_pointer_rtx,
|
|
+ GEN_INT (TARGET_THREAD_SSP_OFFSET)));
|
|
+ MEM_VOLATILE_P (canary) = MEM_VOLATILE_P (operands[1]);
|
|
+ operands[1] = canary;
|
|
+#endif
|
|
+ emit_cmp_and_jump_insns (operands[0], operands[1], EQ, NULL_RTX,
|
|
+ ptr_mode, 1, operands[2]);
|
|
+ DONE;
|
|
+})
|
|
+
|
|
;; Vector operations
|
|
(include "vect.md")
|
|
;; Atomic operations
|
|
Index: gcc/config/ia64/ia64.h
|
|
===================================================================
|
|
--- gcc/config/ia64/ia64.h.orig 2012-04-17 12:30:33.000000000 +0200
|
|
+++ gcc/config/ia64/ia64.h 2012-12-11 12:48:44.764086378 +0100
|
|
@@ -872,7 +872,7 @@ enum reg_class
|
|
|
|
/* Define this macro to nonzero if the addresses of local variable slots
|
|
are at negative offsets from the frame pointer. */
|
|
-#define FRAME_GROWS_DOWNWARD 0
|
|
+#define FRAME_GROWS_DOWNWARD (flag_stack_protect != 0)
|
|
|
|
/* Offset from the frame pointer to the first local variable slot to
|
|
be allocated. */
|