summaryrefslogtreecommitdiff
path: root/lang/gcc27/files/patch-emit-rtl.c
diff options
context:
space:
mode:
Diffstat (limited to 'lang/gcc27/files/patch-emit-rtl.c')
-rw-r--r--lang/gcc27/files/patch-emit-rtl.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/lang/gcc27/files/patch-emit-rtl.c b/lang/gcc27/files/patch-emit-rtl.c
new file mode 100644
index 000000000000..47fc792c8c73
--- /dev/null
+++ b/lang/gcc27/files/patch-emit-rtl.c
@@ -0,0 +1,37 @@
+--- emit-rtl.c.orig Thu Sep 14 13:09:30 1995
++++ emit-rtl.c Mon Mar 20 13:29:11 2000
+@@ -159,6 +159,10 @@
+ rtx static_chain_incoming_rtx; /* (REG:Pmode STATIC_CHAIN_INCOMING_REGNUM) */
+ rtx pic_offset_table_rtx; /* (REG:Pmode PIC_OFFSET_TABLE_REGNUM) */
+
++/* This is used to implement __builtin_return_address for some machines.
++ See for instance the MIPS port. */
++rtx return_address_pointer_rtx; /* (REG:Pmode RETURN_ADDRESS_POINTER_REGNUM) */
++
+ rtx virtual_incoming_args_rtx; /* (REG:Pmode VIRTUAL_INCOMING_ARGS_REGNUM) */
+ rtx virtual_stack_vars_rtx; /* (REG:Pmode VIRTUAL_STACK_VARS_REGNUM) */
+ rtx virtual_stack_dynamic_rtx; /* (REG:Pmode VIRTUAL_STACK_DYNAMIC_REGNUM) */
+@@ -345,6 +349,11 @@
+ && ! reload_in_progress)
+ return arg_pointer_rtx;
+ #endif
++#ifdef RETURN_ADDRESS_POINTER_REGNUM
++ if (return_address_pointer_rtx && regno == RETURN_ADDRESS_POINTER_REGNUM
++ && mode == Pmode && ! reload_in_progress)
++ return return_address_pointer_rtx;
++#endif
+ if (stack_pointer_rtx && regno == STACK_POINTER_REGNUM && mode == Pmode
+ && ! reload_in_progress)
+ return stack_pointer_rtx;
+@@ -3391,6 +3400,11 @@
+ arg_pointer_rtx = stack_pointer_rtx;
+ else
+ arg_pointer_rtx = gen_rtx (REG, Pmode, ARG_POINTER_REGNUM);
++
++#ifdef RETURN_ADDRESS_POINTER_REGNUM
++ return_address_pointer_rtx = gen_rtx (REG, Pmode,
++ RETURN_ADDRESS_POINTER_REGNUM);
++#endif
+
+ /* Create the virtual registers. Do so here since the following objects
+ might reference them. */