s390.c (s390_backchain_string): Removed.
2004-11-23 Andreas Krebbel <krebbel1@de.ibm.com> * config/s390/s390.c (s390_backchain_string): Removed. (s390_return_addr_rtx, s390_back_chain_rtx, s390_frame_info) (s390_emit_prologue, s390_va_start, s390_gimplify_va_arg): Changed users of TARGET_BACKCHAIN, TARGET_NO_BACKCHAIN and TARGET_KERNEL_BACKCHAIN to reflect the new options. * config/s390/s390.h (MASK_BACKCHAIN, MASK_PACKED_STACK): New macros. (TARGET_KERNEL_BACKCHAIN): Removed. (TARGET_BACKCHAIN): Former triple state option change to a target flag. (TARGET_PACKED_STACK): New macro. (TARGET_SWITCHES): New switches added. (TARGET_OPTIONS): "backchain", "no-backchain" and "kernel-backchain" removed. (DYNAMIC_CHAIN_ADDRESS): Use TARGET_PACKED_STACK. * config/s390/s390.md ("allocate_stack", "restore_stack_block") ("save_stack_nonlocal", "restore_stack_nonlocal"): Modified to reflect the change in target switch semantics. * config/s390/tpf.h (TARGET_DEFAULT_BACKCHAIN): Removed. (TARGET_DEFAULT): MASK_BACKCHAIN added. * doc/invoke.texi: Added documentation for the new/changed options. From-SVN: r91096
This commit is contained in:
parent
27b28c6dcd
commit
b3d31392c8
|
@ -1,3 +1,25 @@
|
|||
2004-11-23 Andreas Krebbel <krebbel1@de.ibm.com>
|
||||
|
||||
* config/s390/s390.c (s390_backchain_string): Removed.
|
||||
(s390_return_addr_rtx, s390_back_chain_rtx, s390_frame_info)
|
||||
(s390_emit_prologue, s390_va_start, s390_gimplify_va_arg):
|
||||
Changed users of TARGET_BACKCHAIN, TARGET_NO_BACKCHAIN and
|
||||
TARGET_KERNEL_BACKCHAIN to reflect the new options.
|
||||
* config/s390/s390.h (MASK_BACKCHAIN, MASK_PACKED_STACK): New macros.
|
||||
(TARGET_KERNEL_BACKCHAIN): Removed.
|
||||
(TARGET_BACKCHAIN): Former triple state option change to a target flag.
|
||||
(TARGET_PACKED_STACK): New macro.
|
||||
(TARGET_SWITCHES): New switches added.
|
||||
(TARGET_OPTIONS): "backchain", "no-backchain" and "kernel-backchain"
|
||||
removed.
|
||||
(DYNAMIC_CHAIN_ADDRESS): Use TARGET_PACKED_STACK.
|
||||
* config/s390/s390.md ("allocate_stack", "restore_stack_block")
|
||||
("save_stack_nonlocal", "restore_stack_nonlocal"): Modified to reflect
|
||||
the change in target switch semantics.
|
||||
* config/s390/tpf.h (TARGET_DEFAULT_BACKCHAIN): Removed.
|
||||
(TARGET_DEFAULT): MASK_BACKCHAIN added.
|
||||
* doc/invoke.texi: Added documentation for the new/changed options.
|
||||
|
||||
2004-11-23 Uros Bizjak <uros@kss-loka.si>
|
||||
|
||||
PR rtl-optimization/18614
|
||||
|
|
|
@ -205,10 +205,6 @@ enum processor_flags s390_arch_flags;
|
|||
const char *s390_tune_string; /* for -mtune=<xxx> */
|
||||
const char *s390_arch_string; /* for -march=<xxx> */
|
||||
|
||||
/* String to specify backchain mode:
|
||||
"" no-backchain, "1" backchain, "2" kernel-backchain. */
|
||||
const char *s390_backchain_string = TARGET_DEFAULT_BACKCHAIN;
|
||||
|
||||
const char *s390_warn_framesize_string;
|
||||
const char *s390_warn_dynamicstack_string;
|
||||
const char *s390_stack_size_string;
|
||||
|
@ -6083,7 +6079,7 @@ s390_return_addr_rtx (int count, rtx frame ATTRIBUTE_UNUSED)
|
|||
|
||||
/* Without backchain, we fail for all but the current frame. */
|
||||
|
||||
if (!TARGET_BACKCHAIN && !TARGET_KERNEL_BACKCHAIN && count > 0)
|
||||
if (!TARGET_BACKCHAIN && count > 0)
|
||||
return NULL_RTX;
|
||||
|
||||
/* For the current frame, we need to make sure the initial
|
||||
|
@ -6095,10 +6091,10 @@ s390_return_addr_rtx (int count, rtx frame ATTRIBUTE_UNUSED)
|
|||
return gen_rtx_MEM (Pmode, return_address_pointer_rtx);
|
||||
}
|
||||
|
||||
if (TARGET_BACKCHAIN)
|
||||
offset = RETURN_REGNUM * UNITS_PER_WORD;
|
||||
else
|
||||
if (TARGET_PACKED_STACK)
|
||||
offset = -2 * UNITS_PER_WORD;
|
||||
else
|
||||
offset = RETURN_REGNUM * UNITS_PER_WORD;
|
||||
|
||||
addr = plus_constant (frame, offset);
|
||||
addr = memory_address (Pmode, addr);
|
||||
|
@ -6113,13 +6109,13 @@ s390_back_chain_rtx (void)
|
|||
{
|
||||
rtx chain;
|
||||
|
||||
gcc_assert (TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN);
|
||||
gcc_assert (TARGET_BACKCHAIN);
|
||||
|
||||
if (TARGET_BACKCHAIN)
|
||||
chain = stack_pointer_rtx;
|
||||
else
|
||||
if (TARGET_PACKED_STACK)
|
||||
chain = plus_constant (stack_pointer_rtx,
|
||||
STACK_POINTER_OFFSET - UNITS_PER_WORD);
|
||||
else
|
||||
chain = stack_pointer_rtx;
|
||||
|
||||
chain = gen_rtx_MEM (Pmode, chain);
|
||||
return chain;
|
||||
|
@ -6287,10 +6283,9 @@ s390_frame_info (void)
|
|||
if (!TARGET_64BIT && cfun_frame_layout.frame_size > 0x7fff0000)
|
||||
fatal_error ("Total size of local variables exceeds architecture limit.");
|
||||
|
||||
cfun_frame_layout.save_backchain_p = (TARGET_BACKCHAIN
|
||||
|| TARGET_KERNEL_BACKCHAIN);
|
||||
cfun_frame_layout.save_backchain_p = TARGET_BACKCHAIN;
|
||||
|
||||
if (TARGET_BACKCHAIN)
|
||||
if (!TARGET_PACKED_STACK)
|
||||
{
|
||||
cfun_frame_layout.backchain_offset = 0;
|
||||
cfun_frame_layout.f0_offset = 16 * UNITS_PER_WORD;
|
||||
|
@ -6299,7 +6294,7 @@ s390_frame_info (void)
|
|||
cfun_frame_layout.gprs_offset = (cfun_frame_layout.first_save_gpr
|
||||
* UNITS_PER_WORD);
|
||||
}
|
||||
else if (TARGET_KERNEL_BACKCHAIN)
|
||||
else if (TARGET_BACKCHAIN) /* kernel stack layout */
|
||||
{
|
||||
cfun_frame_layout.backchain_offset = (STACK_POINTER_OFFSET
|
||||
- UNITS_PER_WORD);
|
||||
|
@ -6354,7 +6349,7 @@ s390_frame_info (void)
|
|||
&& !current_function_stdarg)
|
||||
return;
|
||||
|
||||
if (TARGET_BACKCHAIN)
|
||||
if (!TARGET_PACKED_STACK)
|
||||
cfun_frame_layout.frame_size += (STARTING_FRAME_OFFSET
|
||||
+ cfun_frame_layout.high_fprs * 8);
|
||||
else
|
||||
|
@ -6753,7 +6748,7 @@ s390_emit_prologue (void)
|
|||
save_fpr (stack_pointer_rtx, offset, i + 16);
|
||||
offset += 8;
|
||||
}
|
||||
else if (TARGET_BACKCHAIN)
|
||||
else if (!TARGET_PACKED_STACK)
|
||||
offset += 8;
|
||||
}
|
||||
|
||||
|
@ -6771,11 +6766,11 @@ s390_emit_prologue (void)
|
|||
if (!call_really_used_regs[i + 16])
|
||||
RTX_FRAME_RELATED_P (insn) = 1;
|
||||
}
|
||||
else if (TARGET_BACKCHAIN)
|
||||
else if (!TARGET_PACKED_STACK)
|
||||
offset += 8;
|
||||
}
|
||||
|
||||
if (!TARGET_BACKCHAIN
|
||||
if (TARGET_PACKED_STACK
|
||||
&& cfun_save_high_fprs_p
|
||||
&& cfun_frame_layout.f8_offset + cfun_frame_layout.high_fprs * 8 > 0)
|
||||
{
|
||||
|
@ -6794,7 +6789,7 @@ s390_emit_prologue (void)
|
|||
next_fpr = i + 16;
|
||||
}
|
||||
|
||||
if (TARGET_BACKCHAIN)
|
||||
if (!TARGET_PACKED_STACK)
|
||||
next_fpr = cfun_save_high_fprs_p ? 31 : 0;
|
||||
|
||||
/* Decrement stack pointer. */
|
||||
|
@ -7050,7 +7045,7 @@ s390_emit_epilogue (bool sibcall)
|
|||
offset + next_offset, i);
|
||||
next_offset += 8;
|
||||
}
|
||||
else if (TARGET_BACKCHAIN)
|
||||
else if (!TARGET_PACKED_STACK)
|
||||
next_offset += 8;
|
||||
}
|
||||
|
||||
|
@ -7516,7 +7511,7 @@ s390_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED)
|
|||
|
||||
/* Find the register save area. */
|
||||
t = make_tree (TREE_TYPE (sav), return_address_pointer_rtx);
|
||||
if (TARGET_KERNEL_BACKCHAIN)
|
||||
if (TARGET_BACKCHAIN && TARGET_PACKED_STACK) /* kernel stack layout */
|
||||
t = build (PLUS_EXPR, TREE_TYPE (sav), t,
|
||||
build_int_cst (NULL_TREE,
|
||||
-(RETURN_REGNUM - 2) * UNITS_PER_WORD
|
||||
|
@ -7589,11 +7584,11 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
|
|||
reg = gpr;
|
||||
n_reg = 1;
|
||||
|
||||
/* TARGET_KERNEL_BACKCHAIN on 31 bit: It is assumed here that no padding
|
||||
/* kernel stack layout on 31 bit: It is assumed here that no padding
|
||||
will be added by s390_frame_info because for va_args always an even
|
||||
number of gprs has to be saved r15-r2 = 14 regs. */
|
||||
sav_ofs = (TARGET_KERNEL_BACKCHAIN
|
||||
? (TARGET_64BIT ? 4 : 2) * 8 : 2 * UNITS_PER_WORD);
|
||||
sav_ofs = ((TARGET_BACKCHAIN && TARGET_PACKED_STACK) ?
|
||||
(TARGET_64BIT ? 4 : 2) * 8 : 2 * UNITS_PER_WORD);
|
||||
sav_scale = UNITS_PER_WORD;
|
||||
size = UNITS_PER_WORD;
|
||||
max_reg = 4;
|
||||
|
@ -7610,7 +7605,8 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
|
|||
indirect_p = 0;
|
||||
reg = fpr;
|
||||
n_reg = 1;
|
||||
sav_ofs = TARGET_KERNEL_BACKCHAIN ? 0 : 16 * UNITS_PER_WORD;
|
||||
sav_ofs = ((TARGET_BACKCHAIN && TARGET_PACKED_STACK) ?
|
||||
0 : 16 * UNITS_PER_WORD);
|
||||
sav_scale = 8;
|
||||
/* TARGET_64BIT has up to 4 parameter in fprs */
|
||||
max_reg = TARGET_64BIT ? 3 : 1;
|
||||
|
@ -7628,11 +7624,11 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
|
|||
reg = gpr;
|
||||
n_reg = (size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
|
||||
|
||||
/* TARGET_KERNEL_BACKCHAIN on 31 bit: It is assumed here that no padding
|
||||
will be added by s390_frame_info because for va_args always an even
|
||||
number of gprs has to be saved r15-r2 = 14 regs. */
|
||||
sav_ofs = TARGET_KERNEL_BACKCHAIN ?
|
||||
(TARGET_64BIT ? 4 : 2) * 8 : 2*UNITS_PER_WORD;
|
||||
/* kernel stack layout on 31 bit: It is assumed here that no padding
|
||||
will be added by s390_frame_info because for va_args always an even
|
||||
number of gprs has to be saved r15-r2 = 14 regs. */
|
||||
sav_ofs = ((TARGET_BACKCHAIN && TARGET_PACKED_STACK) ?
|
||||
(TARGET_64BIT ? 4 : 2) * 8 : 2 * UNITS_PER_WORD);
|
||||
|
||||
if (size < UNITS_PER_WORD)
|
||||
sav_ofs += UNITS_PER_WORD - size;
|
||||
|
|
|
@ -60,8 +60,6 @@ extern enum processor_type s390_arch;
|
|||
extern enum processor_flags s390_arch_flags;
|
||||
extern const char *s390_arch_string;
|
||||
|
||||
extern const char *s390_backchain_string;
|
||||
|
||||
extern const char *s390_warn_framesize_string;
|
||||
extern const char *s390_warn_dynamicstack_string;
|
||||
extern const char *s390_stack_size_string;
|
||||
|
@ -106,6 +104,8 @@ extern int target_flags;
|
|||
#define MASK_MVCLE 0x40
|
||||
#define MASK_TPF_PROFILING 0x80
|
||||
#define MASK_NO_FUSED_MADD 0x100
|
||||
#define MASK_BACKCHAIN 0x200
|
||||
#define MASK_PACKED_STACK 0x400
|
||||
|
||||
#define TARGET_HARD_FLOAT (target_flags & MASK_HARD_FLOAT)
|
||||
#define TARGET_SOFT_FLOAT (!(target_flags & MASK_HARD_FLOAT))
|
||||
|
@ -117,9 +117,8 @@ extern int target_flags;
|
|||
#define TARGET_TPF_PROFILING (target_flags & MASK_TPF_PROFILING)
|
||||
#define TARGET_NO_FUSED_MADD (target_flags & MASK_NO_FUSED_MADD)
|
||||
#define TARGET_FUSED_MADD (! TARGET_NO_FUSED_MADD)
|
||||
|
||||
#define TARGET_BACKCHAIN (s390_backchain_string[0] == '1')
|
||||
#define TARGET_KERNEL_BACKCHAIN (s390_backchain_string[0] == '2')
|
||||
#define TARGET_BACKCHAIN (target_flags & MASK_BACKCHAIN)
|
||||
#define TARGET_PACKED_STACK (target_flags & MASK_PACKED_STACK)
|
||||
|
||||
/* ??? Once this actually works, it could be made a runtime option. */
|
||||
#define TARGET_IBM_FLOAT 0
|
||||
|
@ -131,25 +130,27 @@ extern int target_flags;
|
|||
#define TARGET_DEFAULT MASK_HARD_FLOAT
|
||||
#endif
|
||||
|
||||
#define TARGET_DEFAULT_BACKCHAIN ""
|
||||
|
||||
#define TARGET_SWITCHES \
|
||||
{ { "hard-float", 1, N_("Use hardware fp")}, \
|
||||
{ "soft-float", -1, N_("Don't use hardware fp")}, \
|
||||
{ "small-exec", 4, N_("Use bras for executable < 64k")}, \
|
||||
{ "no-small-exec", -4, N_("Don't use bras")}, \
|
||||
{ "debug", 8, N_("Additional debug prints")}, \
|
||||
{ "no-debug", -8, N_("Don't print additional debug prints")}, \
|
||||
{ "64", 16, N_("64 bit ABI")}, \
|
||||
{ "31", -16, N_("31 bit ABI")}, \
|
||||
{ "zarch", 32, N_("z/Architecture")}, \
|
||||
{ "esa", -32, N_("ESA/390 architecture")}, \
|
||||
{ "mvcle", 64, N_("mvcle use")}, \
|
||||
{ "no-mvcle", -64, N_("mvc&ex")}, \
|
||||
{ "tpf-trace", 128, N_("enable tpf OS tracing code")}, \
|
||||
{ "no-tpf-trace", -128, N_("disable tpf OS tracing code")}, \
|
||||
{ "no-fused-madd", 256, N_("disable fused multiply/add instructions")},\
|
||||
{ "fused-madd", -256, N_("enable fused multiply/add instructions")}, \
|
||||
#define TARGET_SWITCHES \
|
||||
{ { "hard-float", 1, N_("Use hardware fp")}, \
|
||||
{ "soft-float", -1, N_("Don't use hardware fp")}, \
|
||||
{ "small-exec", 4, N_("Use bras for executable < 64k")}, \
|
||||
{ "no-small-exec", -4, N_("Don't use bras")}, \
|
||||
{ "debug", 8, N_("Additional debug prints")}, \
|
||||
{ "no-debug", -8, N_("Don't print additional debug prints")}, \
|
||||
{ "64", 16, N_("64 bit ABI")}, \
|
||||
{ "31", -16, N_("31 bit ABI")}, \
|
||||
{ "zarch", 32, N_("z/Architecture")}, \
|
||||
{ "esa", -32, N_("ESA/390 architecture")}, \
|
||||
{ "mvcle", 64, N_("mvcle use")}, \
|
||||
{ "no-mvcle", -64, N_("mvc&ex")}, \
|
||||
{ "tpf-trace", 128, N_("Enable tpf OS tracing code")}, \
|
||||
{ "no-tpf-trace", -128, N_("Disable tpf OS tracing code")}, \
|
||||
{ "no-fused-madd", 256, N_("Disable fused multiply/add instructions")},\
|
||||
{ "fused-madd", -256, N_("Enable fused multiply/add instructions")}, \
|
||||
{ "backchain", 512, N_("Maintain backchain pointer")}, \
|
||||
{ "no-backchain", -512, N_("Don't maintain backchain pointer")}, \
|
||||
{ "packed-stack", 1024, N_("Use packed stack layout")}, \
|
||||
{ "no-packed-stack", -1024, N_("Don't use packed stack layout")}, \
|
||||
{ "", TARGET_DEFAULT, 0 } }
|
||||
|
||||
#define TARGET_OPTIONS \
|
||||
|
@ -157,12 +158,6 @@ extern int target_flags;
|
|||
N_("Schedule code for given CPU"), 0}, \
|
||||
{ "arch=", &s390_arch_string, \
|
||||
N_("Generate code for given CPU"), 0}, \
|
||||
{ "backchain", &s390_backchain_string, \
|
||||
N_("Set backchain"), "1"}, \
|
||||
{ "no-backchain", &s390_backchain_string, \
|
||||
N_("Do not set backchain"), ""}, \
|
||||
{ "kernel-backchain", &s390_backchain_string, \
|
||||
N_("Set backchain appropriate for the linux kernel"), "2"}, \
|
||||
{ "warn-framesize=", &s390_warn_framesize_string, \
|
||||
N_("Warn if a single function's framesize exceeds the given framesize"), \
|
||||
0}, \
|
||||
|
@ -623,12 +618,12 @@ extern int current_function_outgoing_args_size;
|
|||
the corresponding RETURN_REGNUM register was saved. */
|
||||
|
||||
#define DYNAMIC_CHAIN_ADDRESS(FRAME) \
|
||||
(TARGET_BACKCHAIN ? \
|
||||
((FRAME) != hard_frame_pointer_rtx ? (FRAME) : \
|
||||
plus_constant (arg_pointer_rtx, -STACK_POINTER_OFFSET)) : \
|
||||
(TARGET_PACKED_STACK ? \
|
||||
((FRAME) != hard_frame_pointer_rtx ? \
|
||||
plus_constant ((FRAME), STACK_POINTER_OFFSET - UNITS_PER_WORD) : \
|
||||
plus_constant (arg_pointer_rtx, -UNITS_PER_WORD)))
|
||||
plus_constant (arg_pointer_rtx, -UNITS_PER_WORD)) : \
|
||||
((FRAME) != hard_frame_pointer_rtx ? (FRAME) : \
|
||||
plus_constant (arg_pointer_rtx, -STACK_POINTER_OFFSET)))
|
||||
|
||||
#define RETURN_ADDR_RTX(COUNT, FRAME) \
|
||||
s390_return_addr_rtx ((COUNT), DYNAMIC_CHAIN_ADDRESS ((FRAME)))
|
||||
|
|
|
@ -7892,7 +7892,7 @@
|
|||
(define_expand "allocate_stack"
|
||||
[(match_operand 0 "general_operand" "")
|
||||
(match_operand 1 "general_operand" "")]
|
||||
"TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN"
|
||||
"TARGET_BACKCHAIN"
|
||||
{
|
||||
rtx temp = gen_reg_rtx (Pmode);
|
||||
|
||||
|
@ -7942,7 +7942,7 @@
|
|||
(define_expand "restore_stack_block"
|
||||
[(match_operand 0 "register_operand" "")
|
||||
(match_operand 1 "register_operand" "")]
|
||||
"TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN"
|
||||
"TARGET_BACKCHAIN"
|
||||
{
|
||||
rtx temp = gen_reg_rtx (Pmode);
|
||||
|
||||
|
@ -7964,7 +7964,7 @@
|
|||
/* Copy the backchain to the first word, sp to the second and the
|
||||
literal pool base to the third. */
|
||||
|
||||
if (TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN)
|
||||
if (TARGET_BACKCHAIN)
|
||||
{
|
||||
rtx temp = force_reg (Pmode, s390_back_chain_rtx ());
|
||||
emit_move_insn (operand_subword (operands[0], 0, 0, mode), temp);
|
||||
|
@ -7988,7 +7988,7 @@
|
|||
/* Restore the backchain from the first word, sp from the second and the
|
||||
literal pool base from the third. */
|
||||
|
||||
if (TARGET_BACKCHAIN || TARGET_KERNEL_BACKCHAIN)
|
||||
if (TARGET_BACKCHAIN)
|
||||
temp = force_reg (Pmode, operand_subword (operands[1], 0, 0, mode));
|
||||
|
||||
emit_move_insn (base, operand_subword (operands[1], 2, 0, mode));
|
||||
|
|
|
@ -58,10 +58,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
Also, enable TPF profiling support and the standard backchain by default. */
|
||||
#undef TARGET_DEFAULT
|
||||
#define TARGET_DEFAULT (MASK_64BIT | MASK_ZARCH | MASK_HARD_FLOAT \
|
||||
| MASK_TPF_PROFILING)
|
||||
#undef TARGET_DEFAULT_BACKCHAIN
|
||||
#define TARGET_DEFAULT_BACKCHAIN "1"
|
||||
|
||||
| MASK_TPF_PROFILING | MASK_BACKCHAIN)
|
||||
/* Exception handling. */
|
||||
|
||||
/* Select a format to encode pointers in exception handling data. */
|
||||
|
|
|
@ -623,7 +623,8 @@ See RS/6000 and PowerPC Options.
|
|||
|
||||
@emph{S/390 and zSeries Options}
|
||||
@gccoptlist{-mtune=@var{cpu-type} -march=@var{cpu-type} @gol
|
||||
-mhard-float -msoft-float -mbackchain -mno-backchain -mkernel-backchain @gol
|
||||
-mhard-float -msoft-float -mbackchain -mno-backchain @gol
|
||||
-mpacked-stack -mno-packed-stack @gol
|
||||
-msmall-exec -mno-small-exec -mmvcle -mno-mvcle @gol
|
||||
-m64 -m31 -mdebug -mno-debug -mesa -mzarch @gol
|
||||
-mtpf-trace -mno-tpf-trace -mfused-madd -mno-fused-madd @gol
|
||||
|
@ -10827,27 +10828,49 @@ generates IEEE floating-point instructions. This is the default.
|
|||
|
||||
@item -mbackchain
|
||||
@itemx -mno-backchain
|
||||
@itemx -mkernel-backchain
|
||||
@opindex mbackchain
|
||||
@opindex mno-backchain
|
||||
@opindex mkernel-backchain
|
||||
In order to provide a backchain the address of the caller's frame
|
||||
is stored within the callee's stack frame.
|
||||
Store (do not store) the address of the caller's frame as backchain pointer
|
||||
into the callee's stack frame.
|
||||
A backchain may be needed to allow debugging using tools that do not understand
|
||||
DWARF-2 call frame information.
|
||||
For @option{-mno-backchain} no backchain is maintained at all which is the
|
||||
default.
|
||||
If one of the other options is present the backchain pointer is placed either
|
||||
on top of the stack frame (@option{-mkernel-backchain}) or on
|
||||
the bottom (@option{-mbackchain}).
|
||||
Beside the different backchain location @option{-mkernel-backchain}
|
||||
also changes stack frame layout breaking the ABI@. This option
|
||||
is intended to be used for code which internally needs a backchain but has
|
||||
to get by with a limited stack size e.g.@: the linux kernel.
|
||||
Internal unwinding code not using DWARF-2 info has to be able to locate the
|
||||
return address of a function. That will be eased be the fact that
|
||||
the return address of a function is placed two words below the backchain
|
||||
pointer.
|
||||
When @option{-mno-packed-stack} is in effect, the backchain pointer is stored
|
||||
at the bottom of the stack frame; when @option{-mpacked-stack} is in effect,
|
||||
the backchain is placed into the topmost word of the 96/160 byte register
|
||||
save area.
|
||||
|
||||
In general, code compiled with @option{-mbackchain} is call-compatible with
|
||||
code compiled with @option{-mmo-backchain}; however, use of the backchain
|
||||
for debugging purposes usually requires that the whole binary is built with
|
||||
@option{-mbackchain}. Note that the combination of @option{-mbackchain} and
|
||||
@option{-mpacked-stack} generates code that is not ABI-compatible.
|
||||
|
||||
The default is to not maintain the backchain.
|
||||
|
||||
@item -mpacked-stack
|
||||
@item -mno-packed-stack
|
||||
@opindex mpacked-stack
|
||||
@opindex mno-packed-stack
|
||||
Use (do not use) the packed stack layout. When @option{-mno-packed-stack} is
|
||||
specified, the compiler uses the all fields of the 96/160 byte register save
|
||||
area only for their default purpose; unused fields still take up stack space.
|
||||
When @option{-mpacked-stack} is specified, register save slots are densely
|
||||
packed at the top of the register save area; unused space is reused for other
|
||||
purposes, allowing for more efficient use of the available stack space.
|
||||
However, when @option{-mbackchain} is also in effect, the topmost word of
|
||||
the save area is always used to store the backchain, and the return address
|
||||
register is always saved two words below the backchain.
|
||||
|
||||
As long as the stack frame backchain is not used, code generated with
|
||||
@option{-mpacked-stack} is call-compatible with code generated with
|
||||
@option{-mno-packed-stack}. Note that some non-FSF releases of GCC 2.95 for
|
||||
S/390 or zSeries generated code that uses the stack frame backchain at run
|
||||
time, not just for debugging purposes. Such code is not call-compatible
|
||||
with code compiled with @option{-mpacked-stack}. Also, note that the
|
||||
combination of @option{-mbackchain} and @option{-mpacked-stack} generates code
|
||||
that is not ABI-compatible.
|
||||
|
||||
The default is to not use the packed stack layout.
|
||||
|
||||
@item -msmall-exec
|
||||
@itemx -mno-small-exec
|
||||
|
|
Loading…
Reference in New Issue