Compare commits
1 commit
gcc-14.2.0
...
dev
Author | SHA1 | Date | |
---|---|---|---|
7913654e38 |
5 changed files with 55 additions and 42 deletions
|
@ -753,6 +753,8 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile)
|
||||||
case ABI_DARWIN:
|
case ABI_DARWIN:
|
||||||
builtin_define ("_CALL_DARWIN");
|
builtin_define ("_CALL_DARWIN");
|
||||||
break;
|
break;
|
||||||
|
case ABI_XENON:
|
||||||
|
builtin_define ("_CALL_SYSV"); /* Should be okay? */
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -767,7 +767,7 @@ rs6000_stack_info (void)
|
||||||
RS6000_ALIGN (crtl->outgoing_args_size + info->fixed_size,
|
RS6000_ALIGN (crtl->outgoing_args_size + info->fixed_size,
|
||||||
STACK_BOUNDARY / BITS_PER_UNIT) - info->fixed_size;
|
STACK_BOUNDARY / BITS_PER_UNIT) - info->fixed_size;
|
||||||
else
|
else
|
||||||
info->parm_size = RS6000_ALIGN (crtl->outgoing_args_size,
|
info->parm_size = RS6000_ALIGN (crtl->outgoing_args_size,
|
||||||
TARGET_ALTIVEC ? 16 : 8);
|
TARGET_ALTIVEC ? 16 : 8);
|
||||||
if (FRAME_GROWS_DOWNWARD)
|
if (FRAME_GROWS_DOWNWARD)
|
||||||
info->vars_size
|
info->vars_size
|
||||||
|
@ -826,29 +826,51 @@ rs6000_stack_info (void)
|
||||||
info->lr_save_offset = 2*reg_size;
|
info->lr_save_offset = 2*reg_size;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ABI_V4: /* Just replacing the SV4 ABI with the Xenon one... It's hacky, but I was having trouble defining a special ABI_XENON */
|
case ABI_V4:
|
||||||
info->cr_save_p = 0; /* We don't seem to save condition registers on 360 */
|
info->fp_save_offset = -info->fp_size;
|
||||||
|
info->gp_save_offset = info->fp_save_offset - info->gp_size;
|
||||||
|
info->cr_save_offset = info->gp_save_offset - info->cr_size;
|
||||||
|
|
||||||
|
if (TARGET_ALTIVEC_ABI)
|
||||||
|
{
|
||||||
|
info->vrsave_save_offset = info->cr_save_offset - info->vrsave_size;
|
||||||
|
|
||||||
|
/* Align stack so vector save area is on a quadword boundary. */
|
||||||
|
if (info->altivec_size != 0)
|
||||||
|
info->altivec_padding_size = 16 - (-info->vrsave_save_offset % 16);
|
||||||
|
|
||||||
|
info->altivec_save_offset = info->vrsave_save_offset
|
||||||
|
- info->altivec_padding_size
|
||||||
|
- info->altivec_size;
|
||||||
|
|
||||||
|
/* Adjust for AltiVec case. */
|
||||||
|
info->ehrd_offset = info->altivec_save_offset;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
info->ehrd_offset = info->cr_save_offset;
|
||||||
|
|
||||||
|
info->ehrd_offset -= ehrd_size;
|
||||||
|
info->lr_save_offset = reg_size;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ABI_XENON:
|
||||||
info->gp_save_offset = -0xC - info->gp_size;
|
info->gp_save_offset = -0xC - info->gp_size;
|
||||||
info->fp_save_offset = info->gp_save_offset - info->fp_size;
|
info->fp_save_offset = info->gp_save_offset - info->fp_size;
|
||||||
info->vrsave_save_offset = info->fp_save_offset - info->vrsave_size;
|
info->vrsave_save_offset = info->fp_save_offset - info->vrsave_size;
|
||||||
|
|
||||||
/* Align stack so vector save area is on a quadword boundary. */
|
/* Align stack so vector save area is on a quadword boundary. */
|
||||||
if (info->altivec_size != 0)
|
if (info->altivec_size != 0)
|
||||||
info->altivec_padding_size = 16 - (-info->vrsave_save_offset % 16);
|
info->altivec_padding_size = 16 - (-info->vrsave_save_offset % 16);
|
||||||
|
|
||||||
info->altivec_save_offset = info->vrsave_save_offset
|
info->altivec_save_offset = info->vrsave_save_offset
|
||||||
- info->altivec_padding_size
|
- info->altivec_padding_size
|
||||||
- info->altivec_size;
|
- info->altivec_size;
|
||||||
|
|
||||||
/* Adjust for AltiVec case. */
|
info->lr_save_offset = -0x8;
|
||||||
info->ehrd_offset = info->altivec_save_offset;
|
break;
|
||||||
|
|
||||||
info->ehrd_offset -= ehrd_size;
|
|
||||||
info->lr_save_offset = -0x8;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
save_align = ((TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) && DEFAULT_ABI != ABI_V4) ? 16 : 8;
|
save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8;
|
||||||
info->save_size = RS6000_ALIGN (info->fp_size
|
info->save_size = RS6000_ALIGN (info->fp_size
|
||||||
+ info->gp_size
|
+ info->gp_size
|
||||||
+ info->altivec_size
|
+ info->altivec_size
|
||||||
|
@ -865,12 +887,18 @@ rs6000_stack_info (void)
|
||||||
info->total_size = RS6000_ALIGN (non_fixed_size + info->fixed_size,
|
info->total_size = RS6000_ALIGN (non_fixed_size + info->fixed_size,
|
||||||
ABI_STACK_BOUNDARY / BITS_PER_UNIT);
|
ABI_STACK_BOUNDARY / BITS_PER_UNIT);
|
||||||
|
|
||||||
|
if(DEFAULT_ABI == ABI_XENON)
|
||||||
|
/* 0x10 == unknown area (empty?), 0x40 == slots for callee to store r3->r10, */
|
||||||
|
/* 0xC == space before saved regs */
|
||||||
|
info->total_size += RS6000_ALIGN(0x10 + 0x40 + 0xC, ABI_STACK_BOUNDARY / BITS_PER_UNIT);
|
||||||
|
|
||||||
/* Determine if we need to save the link register. */
|
/* Determine if we need to save the link register. */
|
||||||
if (info->calls_p
|
if (info->calls_p
|
||||||
|| ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
|
|| ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
|
||||||
&& crtl->profile
|
&& crtl->profile
|
||||||
&& !TARGET_PROFILE_KERNEL)
|
&& !TARGET_PROFILE_KERNEL)
|
||||||
|| (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
|
|| (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca)
|
||||||
|
|| DEFAULT_ABI == ABI_XENON
|
||||||
#ifdef TARGET_RELOCATABLE
|
#ifdef TARGET_RELOCATABLE
|
||||||
|| (DEFAULT_ABI == ABI_V4
|
|| (DEFAULT_ABI == ABI_V4
|
||||||
&& (TARGET_RELOCATABLE || flag_pic > 1)
|
&& (TARGET_RELOCATABLE || flag_pic > 1)
|
||||||
|
@ -942,7 +970,8 @@ debug_stack_info (rs6000_stack_t *info)
|
||||||
case ABI_AIX: abi_string = "AIX"; break;
|
case ABI_AIX: abi_string = "AIX"; break;
|
||||||
case ABI_ELFv2: abi_string = "ELFv2"; break;
|
case ABI_ELFv2: abi_string = "ELFv2"; break;
|
||||||
case ABI_DARWIN: abi_string = "Darwin"; break;
|
case ABI_DARWIN: abi_string = "Darwin"; break;
|
||||||
case ABI_V4: abi_string = "Xenon"; break;
|
case ABI_V4: abi_string = "V.4"; break;
|
||||||
|
case ABI_XENON: abi_string = "Xenon"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf (stderr, "\tABI = %5s\n", abi_string);
|
fprintf (stderr, "\tABI = %5s\n", abi_string);
|
||||||
|
|
|
@ -102,7 +102,8 @@ enum rs6000_abi {
|
||||||
ABI_AIX, /* IBM's AIX, or Linux ELFv1 */
|
ABI_AIX, /* IBM's AIX, or Linux ELFv1 */
|
||||||
ABI_ELFv2, /* Linux ELFv2 ABI */
|
ABI_ELFv2, /* Linux ELFv2 ABI */
|
||||||
ABI_V4, /* System V.4/eabi */
|
ABI_V4, /* System V.4/eabi */
|
||||||
ABI_DARWIN /* Apple's Darwin (OS X kernel) */
|
ABI_DARWIN, /* Apple's Darwin (OS X kernel) */
|
||||||
|
ABI_XENON /* Xbox 360 OS */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Small data support types. */
|
/* Small data support types. */
|
||||||
|
|
|
@ -103,6 +103,8 @@ do { \
|
||||||
rs6000_current_abi = ABI_V4; \
|
rs6000_current_abi = ABI_V4; \
|
||||||
else if (!strcmp (rs6000_abi_name, "openbsd")) \
|
else if (!strcmp (rs6000_abi_name, "openbsd")) \
|
||||||
rs6000_current_abi = ABI_V4; \
|
rs6000_current_abi = ABI_V4; \
|
||||||
|
else if (!strcmp (rs6000_abi_name, "xenon")) \
|
||||||
|
rs6000_current_abi = ABI_XENON; \
|
||||||
else if (!strcmp (rs6000_abi_name, "i960-old")) \
|
else if (!strcmp (rs6000_abi_name, "i960-old")) \
|
||||||
{ \
|
{ \
|
||||||
rs6000_current_abi = ABI_V4; \
|
rs6000_current_abi = ABI_V4; \
|
||||||
|
|
|
@ -1,32 +1,11 @@
|
||||||
/* Redefinitions for FreeChainXenon
|
/* Specify Xenon ABI */
|
||||||
Copyright (C) 2025 Aiden Isik
|
#undef RS6000_ABI_NAME
|
||||||
|
#define RS6000_ABI_NAME "xenon"
|
||||||
This file is part of GCC.
|
|
||||||
|
|
||||||
GCC 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, or (at your
|
|
||||||
option) any later version.
|
|
||||||
|
|
||||||
GCC 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 GCC; see the file COPYING3. If not see
|
|
||||||
<http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#undef TARGET_DEBUG_STACK
|
|
||||||
#define TARGET_DEBUG_STACK 1
|
|
||||||
|
|
||||||
/* Force the pointer size to 32 bits (even though we run in 64-bit mode) */
|
|
||||||
//#undef POINTER_SIZE
|
|
||||||
//#define POINTER_SIZE 32
|
|
||||||
|
|
||||||
/* Change the fixed area for the 360's stack frame convention */
|
/* Change the fixed area for the 360's stack frame convention */
|
||||||
#undef RS6000_SAVE_AREA
|
#undef RS6000_SAVE_AREA
|
||||||
#define RS6000_SAVE_AREA 0x10 + (RS6000_ALIGN (crtl->outgoing_args_size.to_constant (), 16) - crtl->outgoing_args_size.to_constant ()) + 0x40
|
#define RS6000_SAVE_AREA \
|
||||||
|
(0x10 + (RS6000_ALIGN (crtl->outgoing_args_size, 16) - crtl->outgoing_args_size) + 0x40)
|
||||||
|
|
||||||
/* Redefine the starting frame offset, since it relies on the size of the fixed area */
|
/* Redefine the starting frame offset, since it relies on the size of the fixed area */
|
||||||
#undef RS6000_STARTING_FRAME_OFFSET
|
#undef RS6000_STARTING_FRAME_OFFSET
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue