linux.h (NO_PROFILE_COUNTERS): Define to 1.
* config/i386/linux.h (NO_PROFILE_COUNTERS): Define to 1. * config/i386/freebsd.h (NO_PROFILE_COUNTERS): Likewise. * config/i386/netbsd-elf.h (NO_PROFILE_COUNTERS): Likewise. * config/xtensa/xtensa.h (NO_PROFILE_COUTNERS): Likewise. * config/darwin.h (NO_PROFILE_COUNTERS): Likewise. * final.c (NO_PROFILE_COUNTERS): Define to 0 if not defined. (profile_function): Allow NO_PROFILE_COUNTERS to be non-constant. * config/rs6000/rs6000.c (output_profile_hook): Likewise. * configure.in (powerpc*-*, s390*-*): Set tls_as_opt. Pass it to $gcc_cv_as. * configure: Rebuilt. * config/rs6000/rs6000.c (rs6000_abi_name): Remove initializer. (print_operand): Allow TARGET_AIX to be non-constant. (rs6000_aix_emit_builtin_unwind_init, rs6000_emit_eh_toc_restore): Define unconditionally. (rs6000_elf_declare_function_name): New function. * config/rs6000/rs6000.md (eh_return): Allow TARGET_AIX to be non-constant. * config/rs6000/linux64.h [!RS6000_BI_ARCH] (TARGET_64BIT): Define to 1. (DEFAULT_ARCH64_P, RS6000_BI_ARCH_P): Define. [IN_LIBGCC2] (TARGET_64BIT): Define based on whether __powerpc64__ is defined. (TARGET_AIX): Define to 1 if TARGET_64BIT. (PROCESSOR_DEFAULT): Remove. (TARGET_RELOCATABLE, RS6000_ABI_NAME, INVALID_64BIT, INVALID_32BIT, SUBSUBTARGET_OVERRIDE_OPTIONS): Define. [RS6000_BI_ARCH] (OVERRIDE_OPTIONS, ASM_FILE_START): Define. (ASM_DEFAULT_SPEC, ASM_SPEC, LINK_OS_LINUX_SPEC): Define for both -m32 and -m64. (MULTILIB_DEFAULTS): Define. (SUBSUBTARGET_EXTRA_SPECS): Define. (ASM_SPEC32, ASM_SPEC64, ASM_SPEC_COMMON): Define. (TARGET_TOC): Define only if !RS6000_BI_ARCH. (TARGET_NO_TOC): Remove. [!RS6000_BI_ARCH] (TARGET_RELOCATABLE, TARGET_EABI, TARGET_PROTOTYPE): Define to 0. (NO_PROFILE_COUNTERS): Define to TARGET_64BIT. (PROFILE_HOOK): Only call output_profile_hook if TARGET_64BIT. (ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Adjust to work properly if !TARGET_64BIT. (USER_LABEL_PREFIX): Remove. (JUMP_TABLES_IN_TEXT_SECTION): Define to TARGET_64BIT. (SETUP_FRAME_ADDRESSES): Only call rs6000_aix_emit_builtin_unwind_init if TARGET_64BIT. (TARGET_OS_CPP_BUILTINS): Handle both -m32 and -m64. (LINK_OS_LINUX_SPEC32, LINK_OS_LINUX_SPEC64): Define. (STARTFILE_LINUX_SPEC, ENDFILE_LINUX_SPEC): Remove. (TOC_SECTION_ASM_OP): Define depending on TARGET_64BIT. (MINIMAL_TOC_SECTION_ASM_OP): Likewise. (SIZE_TYPE, PTRDIFF_TYPE, WCHAR_TYPE): Define depending on TARGET_64BIT. (RS6000_CALL_GLUE): Likewise. (SAVE_FP_PREFIX, SAVE_FP_SUFFIX, RESTORE_FP_PREFIX, RESTORE_FP_SUFFIX): Likewise. (ASM_DECLARE_FUNCTION_NAME): Remove. (ASM_DECLARE_FUNCTION_SIZE, ASM_OUTPUT_SOURCE_LINE, DBX_OUTPUT_BRAC, DBX_OUTPUT_NFUN): Only output dot before function name if TARGET_64BIT. (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Handle both TARGET_64BIT and !TARGET_64BIT. (ASM_OUTPUT_REG_PUSH, ASM_OUTPUT_REG_POP): Remove undefs. (ASM_PREFERRED_EH_DATA_FORMAT): Take TARGET_64BIT into account. (DRAFT_V4_STRUCT_RET): Define. (SIGNAL_FRAMESIZE): New enum value. (MD_FALLBACK_FRAME_STATE_FOR): Define. * config/rs6000/default64.h: New file. * config/rs6000/sysv4.h (SUBTARGET_SWITCHES): Add -m32 and -m64 options. (SUBTARGET_OVERRIDE_OPTIONS): If rs6000_abi_name is NULL, set it to RS6000_ABI_NAME. Only disallow mixing of -fPIC with -mcall-aixdesc if !TARGET_64BIT. [!RS6000_BI_ARCH] (SUBSUBTARGET_OVERRIDE_OPTIONS): Define. (ASM_DECLARE_FUNCTION_NAME): Use rs6000_elf_declare_function_name function. (TARGET_OS_SYSV_CPP_BUILTINS): Define. (TARGET_OS_CPP_BUILTINS): Use it. (CPP_SYSV_SPEC): Remove. (CPP_SPEC): Remove cpp_sysv. (SUBTARGET_EXTRA_SPECS): Remove cpp_sysv. Add SUBSUBTARGET_EXTRA_SPECS. (SUBSUBTARGET_EXTRA_SPECS): Define. * config/rs6000/biarch64.h: New file. * config/rs6000/rs6000-protos.h (rs6000_elf_declare_function_name): New prototype. * config/rs6000/x-linux64: New file. * config/rs6000/t-linux64: Build -m64, -m32 and -m32 -msoft-float multilibs. * config/rs6000/eabi-ci.asm: Protect with #ifndef __powerpc64__. * config/rs6000/eabi-cn.asm: Likewise. * config/rs6000/tramp.asm: Likewise. * config/rs6000/sol-ci.asm: Likewise. * config/rs6000/sol-cn.asm: Likewise. * config/rs6000/linux.h (TARGET_64BIT): Define to 0. (TARGET_OS_CPP_BUILTINS): Use TARGET_OS_SYSV_CPP_BUILTINS. * config/rs6000/ppc-asm.h: Move __powerpc64__ section before _CALL_AIXDESC section. * config.gcc (powerpc64-*-linux*): Configure a bi-arch compiler, defaulting to -m64 unless --with-cpu= is one of the 32-bit CPUs or default32. Co-Authored-By: Alan Modra <amodra@bigpond.net.au> From-SVN: r67442
This commit is contained in:
parent
150b72ed1f
commit
9739c90c8d
106
gcc/ChangeLog
106
gcc/ChangeLog
|
@ -1,3 +1,109 @@
|
|||
2003-06-04 Jakub Jelinek <jakub@redhat.com>
|
||||
Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* config/i386/linux.h (NO_PROFILE_COUNTERS): Define to 1.
|
||||
* config/i386/freebsd.h (NO_PROFILE_COUNTERS): Likewise.
|
||||
* config/i386/netbsd-elf.h (NO_PROFILE_COUNTERS): Likewise.
|
||||
* config/xtensa/xtensa.h (NO_PROFILE_COUTNERS): Likewise.
|
||||
* config/darwin.h (NO_PROFILE_COUNTERS): Likewise.
|
||||
* final.c (NO_PROFILE_COUNTERS): Define to 0 if not defined.
|
||||
(profile_function): Allow NO_PROFILE_COUNTERS to be non-constant.
|
||||
* config/rs6000/rs6000.c (output_profile_hook): Likewise.
|
||||
|
||||
* configure.in (powerpc*-*, s390*-*): Set tls_as_opt.
|
||||
Pass it to $gcc_cv_as.
|
||||
* configure: Rebuilt.
|
||||
|
||||
* config/rs6000/rs6000.c (rs6000_abi_name): Remove initializer.
|
||||
(print_operand): Allow TARGET_AIX to be non-constant.
|
||||
(rs6000_aix_emit_builtin_unwind_init, rs6000_emit_eh_toc_restore):
|
||||
Define unconditionally.
|
||||
(rs6000_elf_declare_function_name): New function.
|
||||
* config/rs6000/rs6000.md (eh_return): Allow TARGET_AIX to be
|
||||
non-constant.
|
||||
* config/rs6000/linux64.h [!RS6000_BI_ARCH] (TARGET_64BIT): Define
|
||||
to 1.
|
||||
(DEFAULT_ARCH64_P, RS6000_BI_ARCH_P): Define.
|
||||
[IN_LIBGCC2] (TARGET_64BIT): Define based on whether __powerpc64__
|
||||
is defined.
|
||||
(TARGET_AIX): Define to 1 if TARGET_64BIT.
|
||||
(PROCESSOR_DEFAULT): Remove.
|
||||
(TARGET_RELOCATABLE, RS6000_ABI_NAME, INVALID_64BIT,
|
||||
INVALID_32BIT, SUBSUBTARGET_OVERRIDE_OPTIONS): Define.
|
||||
[RS6000_BI_ARCH] (OVERRIDE_OPTIONS, ASM_FILE_START): Define.
|
||||
(ASM_DEFAULT_SPEC, ASM_SPEC, LINK_OS_LINUX_SPEC): Define for both
|
||||
-m32 and -m64.
|
||||
(MULTILIB_DEFAULTS): Define.
|
||||
(SUBSUBTARGET_EXTRA_SPECS): Define.
|
||||
(ASM_SPEC32, ASM_SPEC64, ASM_SPEC_COMMON): Define.
|
||||
(TARGET_TOC): Define only if !RS6000_BI_ARCH.
|
||||
(TARGET_NO_TOC): Remove.
|
||||
[!RS6000_BI_ARCH] (TARGET_RELOCATABLE, TARGET_EABI,
|
||||
TARGET_PROTOTYPE): Define to 0.
|
||||
(NO_PROFILE_COUNTERS): Define to TARGET_64BIT.
|
||||
(PROFILE_HOOK): Only call output_profile_hook if TARGET_64BIT.
|
||||
(ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Adjust to work properly
|
||||
if !TARGET_64BIT.
|
||||
(USER_LABEL_PREFIX): Remove.
|
||||
(JUMP_TABLES_IN_TEXT_SECTION): Define to TARGET_64BIT.
|
||||
(SETUP_FRAME_ADDRESSES): Only call rs6000_aix_emit_builtin_unwind_init
|
||||
if TARGET_64BIT.
|
||||
(TARGET_OS_CPP_BUILTINS): Handle both -m32 and -m64.
|
||||
(LINK_OS_LINUX_SPEC32, LINK_OS_LINUX_SPEC64): Define.
|
||||
(STARTFILE_LINUX_SPEC, ENDFILE_LINUX_SPEC): Remove.
|
||||
(TOC_SECTION_ASM_OP): Define depending on TARGET_64BIT.
|
||||
(MINIMAL_TOC_SECTION_ASM_OP): Likewise.
|
||||
(SIZE_TYPE, PTRDIFF_TYPE, WCHAR_TYPE): Define depending on
|
||||
TARGET_64BIT.
|
||||
(RS6000_CALL_GLUE): Likewise.
|
||||
(SAVE_FP_PREFIX, SAVE_FP_SUFFIX, RESTORE_FP_PREFIX,
|
||||
RESTORE_FP_SUFFIX): Likewise.
|
||||
(ASM_DECLARE_FUNCTION_NAME): Remove.
|
||||
(ASM_DECLARE_FUNCTION_SIZE, ASM_OUTPUT_SOURCE_LINE,
|
||||
DBX_OUTPUT_BRAC, DBX_OUTPUT_NFUN): Only output dot before function
|
||||
name if TARGET_64BIT.
|
||||
(ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Handle both TARGET_64BIT and
|
||||
!TARGET_64BIT.
|
||||
(ASM_OUTPUT_REG_PUSH, ASM_OUTPUT_REG_POP): Remove undefs.
|
||||
(ASM_PREFERRED_EH_DATA_FORMAT): Take TARGET_64BIT into account.
|
||||
(DRAFT_V4_STRUCT_RET): Define.
|
||||
(SIGNAL_FRAMESIZE): New enum value.
|
||||
(MD_FALLBACK_FRAME_STATE_FOR): Define.
|
||||
* config/rs6000/default64.h: New file.
|
||||
* config/rs6000/sysv4.h (SUBTARGET_SWITCHES): Add -m32 and -m64
|
||||
options.
|
||||
(SUBTARGET_OVERRIDE_OPTIONS): If rs6000_abi_name is NULL, set it
|
||||
to RS6000_ABI_NAME. Only disallow mixing of -fPIC with -mcall-aixdesc
|
||||
if !TARGET_64BIT.
|
||||
[!RS6000_BI_ARCH] (SUBSUBTARGET_OVERRIDE_OPTIONS): Define.
|
||||
(ASM_DECLARE_FUNCTION_NAME): Use rs6000_elf_declare_function_name
|
||||
function.
|
||||
(TARGET_OS_SYSV_CPP_BUILTINS): Define.
|
||||
(TARGET_OS_CPP_BUILTINS): Use it.
|
||||
(CPP_SYSV_SPEC): Remove.
|
||||
(CPP_SPEC): Remove cpp_sysv.
|
||||
(SUBTARGET_EXTRA_SPECS): Remove cpp_sysv.
|
||||
Add SUBSUBTARGET_EXTRA_SPECS.
|
||||
(SUBSUBTARGET_EXTRA_SPECS): Define.
|
||||
* config/rs6000/biarch64.h: New file.
|
||||
* config/rs6000/rs6000-protos.h (rs6000_elf_declare_function_name):
|
||||
New prototype.
|
||||
* config/rs6000/x-linux64: New file.
|
||||
* config/rs6000/t-linux64: Build -m64, -m32 and -m32 -msoft-float
|
||||
multilibs.
|
||||
* config/rs6000/eabi-ci.asm: Protect with #ifndef __powerpc64__.
|
||||
* config/rs6000/eabi-cn.asm: Likewise.
|
||||
* config/rs6000/tramp.asm: Likewise.
|
||||
* config/rs6000/sol-ci.asm: Likewise.
|
||||
* config/rs6000/sol-cn.asm: Likewise.
|
||||
* config/rs6000/linux.h (TARGET_64BIT): Define to 0.
|
||||
(TARGET_OS_CPP_BUILTINS): Use TARGET_OS_SYSV_CPP_BUILTINS.
|
||||
* config/rs6000/ppc-asm.h: Move __powerpc64__ section before
|
||||
_CALL_AIXDESC section.
|
||||
* config.gcc (powerpc64-*-linux*): Configure a bi-arch compiler,
|
||||
defaulting to -m64 unless --with-cpu= is one of the 32-bit CPUs
|
||||
or default32.
|
||||
|
||||
2003-06-04 Daniel Jacobowitz <drow@mvista.com>
|
||||
|
||||
* config.gcc: Revert accidentally committed ARM changes.
|
||||
|
|
|
@ -1581,8 +1581,12 @@ powerpc-*-openbsd*)
|
|||
extra_headers=
|
||||
;;
|
||||
powerpc64-*-linux*)
|
||||
tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux64.h"
|
||||
tmake_file="rs6000/t-fprules t-slibgcc-elf-ver t-linux rs6000/t-linux64"
|
||||
tm_file="rs6000/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h"
|
||||
case x$with_cpu in
|
||||
x|xpowerpc64|xdefault64) tm_file="${tm_file} rs6000/default64.h";;
|
||||
esac
|
||||
tm_file="${tm_file} rs6000/linux64.h"
|
||||
tmake_file="rs6000/t-fprules t-slibgcc-elf-ver t-linux rs6000/t-ppccomm rs6000/t-linux64"
|
||||
;;
|
||||
powerpc64-*-gnu*)
|
||||
tm_file="${cpu_type}/${cpu_type}.h elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux64.h rs6000/gnu.h"
|
||||
|
@ -1713,14 +1717,14 @@ rs6000-ibm-aix4.[12]* | powerpc-ibm-aix4.[12]*)
|
|||
extra_headers=
|
||||
;;
|
||||
rs6000-ibm-aix4.[3456789]* | powerpc-ibm-aix4.[3456789]*)
|
||||
tm_file="${tm_file} rs6000/aix.h rs6000/aix43.h rs6000/xcoff.h"
|
||||
tm_file="rs6000/biarch64.h ${tm_file} rs6000/aix.h rs6000/aix43.h rs6000/xcoff.h"
|
||||
tmake_file=rs6000/t-aix43
|
||||
use_collect2=yes
|
||||
thread_file='aix'
|
||||
extra_headers=
|
||||
;;
|
||||
rs6000-ibm-aix5.1.* | powerpc-ibm-aix5.1.*)
|
||||
tm_file="${tm_file} rs6000/aix.h rs6000/aix51.h rs6000/xcoff.h"
|
||||
tm_file="rs6000/biarch64.h ${tm_file} rs6000/aix.h rs6000/aix51.h rs6000/xcoff.h"
|
||||
tmake_file=rs6000/t-aix43
|
||||
use_collect2=yes
|
||||
thread_file='aix'
|
||||
|
@ -2306,7 +2310,7 @@ powerpc*-*-* | rs6000-*-*)
|
|||
tm_file="$tm_file rs6000/altivec-defs.h"
|
||||
fi
|
||||
case "x$with_cpu" in
|
||||
x)
|
||||
x | xdefault32 | xdefault64)
|
||||
;;
|
||||
|
||||
xcommon | xpowerpc | xpowerpc64 \
|
||||
|
|
|
@ -310,7 +310,7 @@ do { text_section (); \
|
|||
|
||||
/* Our profiling scheme doesn't LP labels and counter words. */
|
||||
|
||||
#define NO_PROFILE_COUNTERS
|
||||
#define NO_PROFILE_COUNTERS 1
|
||||
|
||||
#undef INIT_SECTION_ASM_OP
|
||||
#define INIT_SECTION_ASM_OP
|
||||
|
|
|
@ -43,7 +43,7 @@ Boston, MA 02111-1307, USA. */
|
|||
(TARGET_64BIT ? dbx64_register_map[n] : svr4_dbx_register_map[n])
|
||||
|
||||
#undef NO_PROFILE_COUNTERS
|
||||
#define NO_PROFILE_COUNTERS
|
||||
#define NO_PROFILE_COUNTERS 1
|
||||
|
||||
/* Tell final.c that we don't need a label passed to mcount. */
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ Boston, MA 02111-1307, USA. */
|
|||
To the best of my knowledge, no Linux libc has required the label
|
||||
argument to mcount. */
|
||||
|
||||
#define NO_PROFILE_COUNTERS
|
||||
#define NO_PROFILE_COUNTERS 1
|
||||
|
||||
#undef MCOUNT_NAME
|
||||
#define MCOUNT_NAME "mcount"
|
||||
|
|
|
@ -76,7 +76,7 @@ Boston, MA 02111-1307, USA. */
|
|||
/* Output assembler code to FILE to call the profiler. */
|
||||
|
||||
#undef NO_PROFILE_COUNTERS
|
||||
#define NO_PROFILE_COUNTERS
|
||||
#define NO_PROFILE_COUNTERS 1
|
||||
|
||||
#undef FUNCTION_PROFILER
|
||||
#define FUNCTION_PROFILER(FILE, LABELNO) \
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
/* Definitions of target machine for GNU compiler, for 32/64 bit powerpc.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
GNU CC 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 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU CC 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 GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Specify this in a cover file to provide bi-architecture (32/64) support. */
|
||||
#define RS6000_BI_ARCH 1
|
|
@ -0,0 +1,24 @@
|
|||
/* Definitions of target machine for GNU compiler,
|
||||
for 64 bit powerpc linux defaulting to -m64.
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
GNU CC 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 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU CC 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 GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#undef TARGET_DEFAULT
|
||||
#define TARGET_DEFAULT \
|
||||
(MASK_POWERPC | MASK_POWERPC64 | MASK_64BIT | MASK_NEW_MNEMONICS)
|
|
@ -41,6 +41,7 @@ Boston, MA 02111-1307, USA.
|
|||
|
||||
#include <ppc-asm.h>
|
||||
|
||||
#ifndef __powerpc64__
|
||||
.section ".got","aw"
|
||||
.globl __GOT_START__
|
||||
.type __GOT_START__,@object
|
||||
|
@ -122,3 +123,4 @@ FUNC_START(__fini)
|
|||
stwu 1,-16(1)
|
||||
mflr 0
|
||||
stw 0,20(1)
|
||||
#endif
|
||||
|
|
|
@ -39,6 +39,7 @@ Boston, MA 02111-1307, USA.
|
|||
.file "crtn.s"
|
||||
.ident "GNU C crtn.s"
|
||||
|
||||
#ifndef __powerpc64__
|
||||
.section ".got","aw"
|
||||
.globl __GOT_END__
|
||||
.type __GOT_END__,@object
|
||||
|
@ -113,3 +114,4 @@ __EH_FRAME_END__:
|
|||
mtlr 0
|
||||
addi 1,1,16
|
||||
blr
|
||||
#endif
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
builtin_define_std ("powerpc"); \
|
||||
builtin_assert ("cpu=powerpc"); \
|
||||
builtin_assert ("machine=powerpc"); \
|
||||
TARGET_OS_SYSV_CPP_BUILTINS (); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
|
@ -78,6 +79,13 @@
|
|||
#undef DRAFT_V4_STRUCT_RET
|
||||
#define DRAFT_V4_STRUCT_RET 1
|
||||
|
||||
/* We are 32-bit all the time, so optimize a little. */
|
||||
#undef TARGET_64BIT
|
||||
#define TARGET_64BIT 0
|
||||
|
||||
/* We don't need to generate entries in .fixup. */
|
||||
#undef RELOCATABLE_NEEDS_FIXUP
|
||||
|
||||
/* Do code reading to identify a signal frame, and set the frame
|
||||
state data appropriately. See unwind-dw2.c for the structs. */
|
||||
|
||||
|
|
|
@ -19,43 +19,163 @@
|
|||
Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA. */
|
||||
|
||||
/* Yes! We are AIX! Err. Wait. We're Linux!. No, wait, we're a
|
||||
combo of both!*/
|
||||
#undef DEFAULT_ABI
|
||||
#define DEFAULT_ABI ABI_AIX
|
||||
#ifndef RS6000_BI_ARCH
|
||||
|
||||
#undef TARGET_AIX
|
||||
#define TARGET_AIX 1
|
||||
#undef DEFAULT_ABI
|
||||
#define DEFAULT_ABI ABI_AIX
|
||||
|
||||
#undef TARGET_DEFAULT
|
||||
#define TARGET_DEFAULT \
|
||||
(MASK_POWERPC | MASK_POWERPC64 | MASK_64BIT | MASK_NEW_MNEMONICS)
|
||||
#undef TARGET_64BIT
|
||||
#define TARGET_64BIT 1
|
||||
|
||||
#undef PROCESSOR_DEFAULT
|
||||
#define PROCESSOR_DEFAULT PROCESSOR_PPC630
|
||||
#undef PROCESSOR_DEFAULT64
|
||||
#define DEFAULT_ARCH64_P 1
|
||||
#define RS6000_BI_ARCH_P 0
|
||||
|
||||
#else
|
||||
|
||||
#define DEFAULT_ARCH64_P (TARGET_DEFAULT & MASK_64BIT)
|
||||
#define RS6000_BI_ARCH_P 1
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef IN_LIBGCC2
|
||||
#undef TARGET_64BIT
|
||||
#ifdef __powerpc64__
|
||||
#define TARGET_64BIT 1
|
||||
#else
|
||||
#define TARGET_64BIT 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef TARGET_AIX
|
||||
#define TARGET_AIX TARGET_64BIT
|
||||
|
||||
#undef PROCESSOR_DEFAULT64
|
||||
#define PROCESSOR_DEFAULT64 PROCESSOR_PPC630
|
||||
|
||||
#undef ASM_DEFAULT_SPEC
|
||||
#define ASM_DEFAULT_SPEC "-mppc64"
|
||||
#undef TARGET_RELOCATABLE
|
||||
#define TARGET_RELOCATABLE (!TARGET_64BIT && (target_flags & MASK_RELOCATABLE))
|
||||
|
||||
#undef RS6000_ABI_NAME
|
||||
#define RS6000_ABI_NAME (TARGET_64BIT ? "aixdesc" : "sysv")
|
||||
|
||||
#define INVALID_64BIT "-m%s not supported in this configuration"
|
||||
#define INVALID_32BIT INVALID_64BIT
|
||||
|
||||
#undef SUBSUBTARGET_OVERRIDE_OPTIONS
|
||||
#define SUBSUBTARGET_OVERRIDE_OPTIONS \
|
||||
do \
|
||||
{ \
|
||||
if (TARGET_64BIT) \
|
||||
{ \
|
||||
if (DEFAULT_ABI != ABI_AIX) \
|
||||
{ \
|
||||
DEFAULT_ABI = ABI_AIX; \
|
||||
error (INVALID_64BIT, "call"); \
|
||||
} \
|
||||
if (TARGET_RELOCATABLE) \
|
||||
{ \
|
||||
target_flags &= ~MASK_RELOCATABLE; \
|
||||
error (INVALID_64BIT, "relocatable"); \
|
||||
} \
|
||||
if (TARGET_EABI) \
|
||||
{ \
|
||||
target_flags &= ~MASK_EABI; \
|
||||
error (INVALID_64BIT, "eabi"); \
|
||||
} \
|
||||
if (TARGET_PROTOTYPE) \
|
||||
{ \
|
||||
target_flags &= ~MASK_PROTOTYPE; \
|
||||
error (INVALID_64BIT, "prototype"); \
|
||||
} \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
if (!RS6000_BI_ARCH_P) \
|
||||
error (INVALID_32BIT, "32"); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#ifdef RS6000_BI_ARCH
|
||||
|
||||
#undef OVERRIDE_OPTIONS
|
||||
#define OVERRIDE_OPTIONS \
|
||||
rs6000_override_options (((TARGET_DEFAULT ^ target_flags) & MASK_64BIT) \
|
||||
? (char *) 0 : TARGET_CPU_DEFAULT)
|
||||
|
||||
#undef ASM_FILE_START
|
||||
#define ASM_FILE_START(FILE) \
|
||||
do \
|
||||
{ \
|
||||
output_file_directive ((FILE), main_input_filename); \
|
||||
rs6000_file_start (FILE, (((TARGET_DEFAULT ^ target_flags) \
|
||||
& MASK_64BIT) \
|
||||
? (char *) 0 : TARGET_CPU_DEFAULT)); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#endif
|
||||
|
||||
#undef ASM_DEFAULT_SPEC
|
||||
#undef ASM_SPEC
|
||||
#define ASM_SPEC "%{.s: %{mregnames} %{mno-regnames}} \
|
||||
%{.S: %{mregnames} %{mno-regnames}} \
|
||||
%{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} \
|
||||
%{v:-V} %{Qy:} %{!Qn:-Qy} -a64 %(asm_cpu) %{Wa,*:%*}"
|
||||
#undef LINK_OS_LINUX_SPEC
|
||||
|
||||
/* This is always a 64 bit compiler. */
|
||||
#undef TARGET_64BIT
|
||||
#define TARGET_64BIT 1
|
||||
#ifndef RS6000_BI_ARCH
|
||||
#define ASM_DEFAULT_SPEC "-mppc64"
|
||||
#define ASM_SPEC "%(asm_spec64) %(asm_spec_common)"
|
||||
#define LINK_OS_LINUX_SPEC "%(link_os_linux_spec64)"
|
||||
#else
|
||||
#if DEFAULT_ARCH64_P
|
||||
#define ASM_DEFAULT_SPEC "-mppc%{!m32:64}"
|
||||
#define ASM_SPEC "%{m32:%(asm_spec32)}%{!m32:%(asm_spec64)} %(asm_spec_common)"
|
||||
#define LINK_OS_LINUX_SPEC "%{m32:%(link_os_linux_spec32)}%{!m32:%(link_os_linux_spec64)}"
|
||||
#else
|
||||
#define ASM_DEFAULT_SPEC "-mppc%{m64:64}"
|
||||
#define ASM_SPEC "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)"
|
||||
#define LINK_OS_LINUX_SPEC "%{!m64:%(link_os_linux_spec32)}%{m64:%(link_os_linux_spec64)}"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define ASM_SPEC32 "-a32 %{n} %{T} %{Ym,*} %{Yd,*} \
|
||||
%{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \
|
||||
%{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} \
|
||||
%{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
|
||||
%{mcall-freebsd: -mbig} \
|
||||
%{mcall-i960-old: -mlittle} \
|
||||
%{mcall-linux: -mbig} \
|
||||
%{mcall-gnu: -mbig} \
|
||||
%{mcall-netbsd: -mbig} \
|
||||
}}}}"
|
||||
|
||||
#define ASM_SPEC64 "-a64"
|
||||
|
||||
#define ASM_SPEC_COMMON "%(asm_cpu) \
|
||||
%{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
|
||||
%{v:-V} %{Qy:} %{!Qn:-Qy} %{Wa,*:%*} \
|
||||
%{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian}"
|
||||
|
||||
#undef SUBSUBTARGET_EXTRA_SPECS
|
||||
#define SUBSUBTARGET_EXTRA_SPECS \
|
||||
{ "asm_spec_common", ASM_SPEC_COMMON }, \
|
||||
{ "asm_spec32", ASM_SPEC32 }, \
|
||||
{ "asm_spec64", ASM_SPEC64 }, \
|
||||
{ "link_os_linux_spec32", LINK_OS_LINUX_SPEC32 }, \
|
||||
{ "link_os_linux_spec64", LINK_OS_LINUX_SPEC64 },
|
||||
|
||||
#undef MULTILIB_DEFAULTS
|
||||
#if DEFAULT_ARCH64_P
|
||||
#define MULTILIB_DEFAULTS { "m64" }
|
||||
#else
|
||||
#define MULTILIB_DEFAULTS { "m32" }
|
||||
#endif
|
||||
|
||||
#ifndef RS6000_BI_ARCH
|
||||
|
||||
/* 64-bit PowerPC Linux always has a TOC. */
|
||||
#undef TARGET_NO_TOC
|
||||
#define TARGET_NO_TOC 0
|
||||
#undef TARGET_TOC
|
||||
#define TARGET_TOC 1
|
||||
|
||||
/* Some things from sysv4.h we don't do. */
|
||||
/* Some things from sysv4.h we don't do when 64 bit. */
|
||||
#undef TARGET_RELOCATABLE
|
||||
#define TARGET_RELOCATABLE 0
|
||||
#undef TARGET_EABI
|
||||
|
@ -63,8 +183,9 @@
|
|||
#undef TARGET_PROTOTYPE
|
||||
#define TARGET_PROTOTYPE 0
|
||||
|
||||
/* Reuse sysv4 mask bits we made available above. */
|
||||
#define MASK_PROFILE_KERNEL 0x08000000
|
||||
#endif
|
||||
|
||||
#define MASK_PROFILE_KERNEL 0x00080000
|
||||
|
||||
/* Non-standard profiling for kernels, which just saves LR then calls
|
||||
_mcount without worrying about arg saves. The idea is to change
|
||||
|
@ -73,88 +194,62 @@
|
|||
#define TARGET_PROFILE_KERNEL (target_flags & MASK_PROFILE_KERNEL)
|
||||
|
||||
/* Override sysv4.h. */
|
||||
#undef SUBTARGET_SWITCHES
|
||||
#define SUBTARGET_SWITCHES \
|
||||
{"bit-align", -MASK_NO_BITFIELD_TYPE, \
|
||||
N_("Align to the base type of the bit-field") }, \
|
||||
{"no-bit-align", MASK_NO_BITFIELD_TYPE, \
|
||||
N_("Don't align to the base type of the bit-field") }, \
|
||||
{"strict-align", MASK_STRICT_ALIGN, \
|
||||
N_("Don't assume that unaligned accesses are handled by the system") }, \
|
||||
{"no-strict-align", -MASK_STRICT_ALIGN, \
|
||||
N_("Assume that unaligned accesses are handled by the system") }, \
|
||||
{"little-endian", MASK_LITTLE_ENDIAN, \
|
||||
N_("Produce little endian code") }, \
|
||||
{"little", MASK_LITTLE_ENDIAN, \
|
||||
N_("Produce little endian code") }, \
|
||||
{"big-endian", -MASK_LITTLE_ENDIAN, \
|
||||
N_("Produce big endian code") }, \
|
||||
{"big", -MASK_LITTLE_ENDIAN, \
|
||||
N_("Produce big endian code") }, \
|
||||
{"bit-word", -MASK_NO_BITFIELD_WORD, \
|
||||
N_("Allow bit-fields to cross word boundaries") }, \
|
||||
{"no-bit-word", MASK_NO_BITFIELD_WORD, \
|
||||
N_("Do not allow bit-fields to cross word boundaries") }, \
|
||||
{"regnames", MASK_REGNAMES, \
|
||||
N_("Use alternate register names") }, \
|
||||
{"no-regnames", -MASK_REGNAMES, \
|
||||
N_("Don't use alternate register names") }, \
|
||||
#undef EXTRA_SUBTARGET_SWITCHES
|
||||
#define EXTRA_SUBTARGET_SWITCHES \
|
||||
{"profile-kernel", MASK_PROFILE_KERNEL, \
|
||||
N_("Call mcount for profiling before a function prologue") }, \
|
||||
{"no-profile-kernel", -MASK_PROFILE_KERNEL, \
|
||||
N_("Call mcount for profiling after a function prologue") },
|
||||
|
||||
#undef SUBTARGET_OPTIONS
|
||||
#define SUBTARGET_OPTIONS
|
||||
|
||||
#undef SUBTARGET_OVERRIDE_OPTIONS
|
||||
#define SUBTARGET_OVERRIDE_OPTIONS {}
|
||||
|
||||
/* We use glibc _mcount for profiling. */
|
||||
#define NO_PROFILE_COUNTERS 1
|
||||
#define PROFILE_HOOK(LABEL) output_profile_hook (LABEL)
|
||||
#define NO_PROFILE_COUNTERS TARGET_64BIT
|
||||
#define PROFILE_HOOK(LABEL) \
|
||||
do { if (TARGET_64BIT) output_profile_hook (LABEL); } while (0)
|
||||
|
||||
/* We don't need to generate entries in .fixup. */
|
||||
#undef RELOCATABLE_NEEDS_FIXUP
|
||||
|
||||
#define USER_LABEL_PREFIX ""
|
||||
|
||||
/* This now supports a natural alignment mode. */
|
||||
/* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints. */
|
||||
#undef ADJUST_FIELD_ALIGN
|
||||
#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
|
||||
(TARGET_ALIGN_NATURAL ? (COMPUTED) : \
|
||||
(TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE \
|
||||
? get_inner_array_type (FIELD) \
|
||||
: TREE_TYPE (FIELD)) == DFmode \
|
||||
? MIN ((COMPUTED), 32) : (COMPUTED)))
|
||||
((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \
|
||||
? 128 \
|
||||
: (TARGET_64BIT \
|
||||
&& TARGET_ALIGN_NATURAL == 0 \
|
||||
&& TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE \
|
||||
? get_inner_array_type (FIELD) \
|
||||
: TREE_TYPE (FIELD)) == DFmode) \
|
||||
? MIN ((COMPUTED), 32) \
|
||||
: (COMPUTED))
|
||||
|
||||
/* AIX increases natural record alignment to doubleword if the first
|
||||
field is an FP double while the FP fields remain word aligned. */
|
||||
#undef ROUND_TYPE_ALIGN
|
||||
#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \
|
||||
((TREE_CODE (STRUCT) == RECORD_TYPE \
|
||||
|| TREE_CODE (STRUCT) == UNION_TYPE \
|
||||
|| TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \
|
||||
&& TYPE_FIELDS (STRUCT) != 0 \
|
||||
&& TARGET_ALIGN_NATURAL == 0 \
|
||||
&& DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode \
|
||||
? MAX (MAX ((COMPUTED), (SPECIFIED)), 64) \
|
||||
#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \
|
||||
((TARGET_ALTIVEC && TREE_CODE (STRUCT) == VECTOR_TYPE) \
|
||||
? MAX (MAX ((COMPUTED), (SPECIFIED)), 128) \
|
||||
: (TARGET_64BIT \
|
||||
&& (TREE_CODE (STRUCT) == RECORD_TYPE \
|
||||
|| TREE_CODE (STRUCT) == UNION_TYPE \
|
||||
|| TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \
|
||||
&& TYPE_FIELDS (STRUCT) != 0 \
|
||||
&& TARGET_ALIGN_NATURAL == 0 \
|
||||
&& DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode) \
|
||||
? MAX (MAX ((COMPUTED), (SPECIFIED)), 64) \
|
||||
: MAX ((COMPUTED), (SPECIFIED)))
|
||||
|
||||
/* Indicate that jump tables go in the text section. */
|
||||
#undef JUMP_TABLES_IN_TEXT_SECTION
|
||||
#define JUMP_TABLES_IN_TEXT_SECTION 1
|
||||
|
||||
/* 64-bit PowerPC Linux always has GPR13 fixed. */
|
||||
#define FIXED_R13 1
|
||||
#define JUMP_TABLES_IN_TEXT_SECTION TARGET_64BIT
|
||||
|
||||
/* __throw will restore its own return address to be the same as the
|
||||
return address of the function that the throw is being made to.
|
||||
This is unfortunate, because we want to check the original
|
||||
return address to see if we need to restore the TOC.
|
||||
So we have to squirrel it away with this. */
|
||||
#define SETUP_FRAME_ADDRESSES() rs6000_aix_emit_builtin_unwind_init ()
|
||||
#define SETUP_FRAME_ADDRESSES() \
|
||||
do { if (TARGET_64BIT) rs6000_aix_emit_builtin_unwind_init (); } while (0)
|
||||
|
||||
/* Override svr4.h */
|
||||
#undef MD_EXEC_PREFIX
|
||||
|
@ -165,17 +260,28 @@
|
|||
#define CPP_SYSV_SPEC ""
|
||||
|
||||
#undef TARGET_OS_CPP_BUILTINS
|
||||
#define TARGET_OS_CPP_BUILTINS() \
|
||||
do \
|
||||
{ \
|
||||
builtin_define ("__PPC__"); \
|
||||
builtin_define ("__PPC64__"); \
|
||||
builtin_define ("__powerpc__"); \
|
||||
builtin_define ("__powerpc64__"); \
|
||||
builtin_define ("__PIC__"); \
|
||||
builtin_assert ("cpu=powerpc64"); \
|
||||
builtin_assert ("machine=powerpc64"); \
|
||||
} \
|
||||
#define TARGET_OS_CPP_BUILTINS() \
|
||||
do \
|
||||
{ \
|
||||
if (TARGET_64BIT) \
|
||||
{ \
|
||||
builtin_define ("__PPC__"); \
|
||||
builtin_define ("__PPC64__"); \
|
||||
builtin_define ("__powerpc__"); \
|
||||
builtin_define ("__powerpc64__"); \
|
||||
builtin_define ("__PIC__"); \
|
||||
builtin_assert ("cpu=powerpc64"); \
|
||||
builtin_assert ("machine=powerpc64"); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
builtin_define_std ("PPC"); \
|
||||
builtin_define_std ("powerpc"); \
|
||||
builtin_assert ("cpu=powerpc"); \
|
||||
builtin_assert ("machine=powerpc"); \
|
||||
TARGET_OS_SYSV_CPP_BUILTINS (); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#undef CPP_OS_DEFAULT_SPEC
|
||||
|
@ -205,48 +311,40 @@
|
|||
#undef LINK_OS_DEFAULT_SPEC
|
||||
#define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
|
||||
|
||||
#undef LINK_OS_LINUX_SPEC
|
||||
#define LINK_OS_LINUX_SPEC "-m elf64ppc %{!shared: %{!static: \
|
||||
#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \
|
||||
%{rdynamic:-export-dynamic} \
|
||||
%{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
|
||||
|
||||
#define LINK_OS_LINUX_SPEC64 "-m elf64ppc %{!shared: %{!static: \
|
||||
%{rdynamic:-export-dynamic} \
|
||||
%{!dynamic-linker:-dynamic-linker /lib64/ld64.so.1}}}"
|
||||
|
||||
#ifdef NATIVE_CROSS
|
||||
#define STARTFILE_PREFIX_SPEC "/usr/local/lib64/ /lib64/ /usr/lib64/"
|
||||
#endif
|
||||
|
||||
#undef STARTFILE_LINUX_SPEC
|
||||
#ifdef HAVE_LD_PIE
|
||||
#define STARTFILE_LINUX_SPEC "\
|
||||
%{!shared: %{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} crti.o%s \
|
||||
%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
|
||||
#else
|
||||
#define STARTFILE_LINUX_SPEC "\
|
||||
%{!shared: %{pg|p:gcrt1.o%s;:crt1.o%s}} crti.o%s \
|
||||
%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
|
||||
#endif
|
||||
|
||||
#undef ENDFILE_LINUX_SPEC
|
||||
#define ENDFILE_LINUX_SPEC "\
|
||||
%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
|
||||
|
||||
#undef TOC_SECTION_ASM_OP
|
||||
#define TOC_SECTION_ASM_OP "\t.section\t\".toc\",\"aw\""
|
||||
#define TOC_SECTION_ASM_OP \
|
||||
(TARGET_64BIT \
|
||||
? "\t.section\t\".toc\",\"aw\"" \
|
||||
: "\t.section\t\".got\",\"aw\"")
|
||||
|
||||
#undef MINIMAL_TOC_SECTION_ASM_OP
|
||||
#define MINIMAL_TOC_SECTION_ASM_OP "\t.section\t\".toc1\",\"aw\""
|
||||
#define MINIMAL_TOC_SECTION_ASM_OP \
|
||||
(TARGET_64BIT \
|
||||
? "\t.section\t\".toc1\",\"aw\"" \
|
||||
: ((TARGET_RELOCATABLE || flag_pic) \
|
||||
? "\t.section\t\".got2\",\"aw\"" \
|
||||
: "\t.section\t\".got1\",\"aw\""))
|
||||
|
||||
#undef TARGET_VERSION
|
||||
#define TARGET_VERSION fprintf (stderr, " (PowerPC64 GNU/Linux)");
|
||||
|
||||
/* Must be at least as big as our pointer type. */
|
||||
#undef SIZE_TYPE
|
||||
#define SIZE_TYPE "long unsigned int"
|
||||
#undef SIZE_TYPE
|
||||
#define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int")
|
||||
|
||||
#undef PTRDIFF_TYPE
|
||||
#define PTRDIFF_TYPE "long int"
|
||||
#undef PTRDIFF_TYPE
|
||||
#define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int")
|
||||
|
||||
#undef WCHAR_TYPE
|
||||
#define WCHAR_TYPE "int"
|
||||
#undef WCHAR_TYPE
|
||||
#define WCHAR_TYPE (TARGET_64BIT ? "int" : "long int")
|
||||
#undef WCHAR_TYPE_SIZE
|
||||
#define WCHAR_TYPE_SIZE 32
|
||||
|
||||
|
@ -260,51 +358,25 @@
|
|||
|
||||
/* PowerPC no-op instruction. */
|
||||
#undef RS6000_CALL_GLUE
|
||||
#define RS6000_CALL_GLUE "nop"
|
||||
#define RS6000_CALL_GLUE (TARGET_64BIT ? "nop" : "cror 31,31,31")
|
||||
|
||||
#undef RS6000_MCOUNT
|
||||
#define RS6000_MCOUNT "_mcount"
|
||||
|
||||
/* FP save and restore routines. */
|
||||
#undef SAVE_FP_PREFIX
|
||||
#define SAVE_FP_PREFIX "._savef"
|
||||
#define SAVE_FP_PREFIX (TARGET_64BIT ? "._savef" : "_savefpr_")
|
||||
#undef SAVE_FP_SUFFIX
|
||||
#define SAVE_FP_SUFFIX ""
|
||||
#define SAVE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
|
||||
#undef RESTORE_FP_PREFIX
|
||||
#define RESTORE_FP_PREFIX "._restf"
|
||||
#define RESTORE_FP_PREFIX (TARGET_64BIT ? "._restf" : "_restfpr_")
|
||||
#undef RESTORE_FP_SUFFIX
|
||||
#define RESTORE_FP_SUFFIX ""
|
||||
#define RESTORE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
|
||||
|
||||
/* Dwarf2 debugging. */
|
||||
#undef PREFERRED_DEBUGGING_TYPE
|
||||
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
|
||||
|
||||
#undef ASM_DECLARE_FUNCTION_NAME
|
||||
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
|
||||
do \
|
||||
{ \
|
||||
fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", (FILE)); \
|
||||
ASM_OUTPUT_LABEL ((FILE), (NAME)); \
|
||||
fputs (DOUBLE_INT_ASM_OP, (FILE)); \
|
||||
putc ('.', (FILE)); \
|
||||
assemble_name ((FILE), (NAME)); \
|
||||
fputs (",.TOC.@tocbase,0\n\t.previous\n\t.size\t", (FILE)); \
|
||||
assemble_name ((FILE), (NAME)); \
|
||||
fputs (",24\n\t.type\t.", (FILE)); \
|
||||
assemble_name ((FILE), (NAME)); \
|
||||
fputs (",@function\n", (FILE)); \
|
||||
if (TREE_PUBLIC (DECL) && ! DECL_WEAK (DECL)) \
|
||||
{ \
|
||||
fputs ("\t.globl\t.", (FILE)); \
|
||||
assemble_name ((FILE), (NAME)); \
|
||||
putc ('\n', (FILE)); \
|
||||
} \
|
||||
ASM_DECLARE_RESULT ((FILE), DECL_RESULT (DECL)); \
|
||||
putc ('.', (FILE)); \
|
||||
ASM_OUTPUT_LABEL ((FILE), (NAME)); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
/* This is how to declare the size of a function. */
|
||||
#undef ASM_DECLARE_FUNCTION_SIZE
|
||||
#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
|
||||
|
@ -312,9 +384,13 @@
|
|||
{ \
|
||||
if (!flag_inhibit_size_directive) \
|
||||
{ \
|
||||
fputs ("\t.size\t.", (FILE)); \
|
||||
fputs ("\t.size\t", (FILE)); \
|
||||
if (TARGET_64BIT) \
|
||||
putc ('.', (FILE)); \
|
||||
assemble_name ((FILE), (FNAME)); \
|
||||
fputs (",.-.", (FILE)); \
|
||||
fputs (",.-", (FILE)); \
|
||||
if (TARGET_64BIT) \
|
||||
putc ('.', (FILE)); \
|
||||
assemble_name ((FILE), (FNAME)); \
|
||||
putc ('\n', (FILE)); \
|
||||
} \
|
||||
|
@ -341,10 +417,16 @@
|
|||
|| (GET_CODE (X) == CONST_INT \
|
||||
&& GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode)) \
|
||||
|| (GET_CODE (X) == CONST_DOUBLE \
|
||||
&& (TARGET_POWERPC64 \
|
||||
|| TARGET_MINIMAL_TOC \
|
||||
|| (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
|
||||
&& ! TARGET_NO_FP_IN_TOC)))))
|
||||
&& ((TARGET_64BIT \
|
||||
&& (TARGET_POWERPC64 \
|
||||
|| TARGET_MINIMAL_TOC \
|
||||
|| (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
|
||||
&& ! TARGET_NO_FP_IN_TOC))) \
|
||||
|| (!TARGET_64BIT \
|
||||
&& !TARGET_NO_FP_IN_TOC \
|
||||
&& !TARGET_RELOCATABLE \
|
||||
&& GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
|
||||
&& BITS_PER_WORD == HOST_BITS_PER_INT)))))
|
||||
|
||||
/* This is the same as the dbxelf.h version, except that we need to
|
||||
use the function code label, not the function descriptor. */
|
||||
|
@ -357,7 +439,9 @@ do \
|
|||
ASM_GENERATE_INTERNAL_LABEL (temp, "LM", sym_lineno); \
|
||||
fprintf (FILE, "\t.stabn 68,0,%d,", LINE); \
|
||||
assemble_name (FILE, temp); \
|
||||
fputs ("-.", FILE); \
|
||||
putc ('-', FILE); \
|
||||
if (TARGET_64BIT) \
|
||||
putc ('.', FILE); \
|
||||
assemble_name (FILE, \
|
||||
XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
|
||||
putc ('\n', FILE); \
|
||||
|
@ -378,7 +462,8 @@ while (0)
|
|||
flab = IDENTIFIER_POINTER (current_function_func_begin_label); \
|
||||
else \
|
||||
{ \
|
||||
putc ('.', FILE); \
|
||||
if (TARGET_64BIT) \
|
||||
putc ('.', FILE); \
|
||||
flab = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); \
|
||||
} \
|
||||
assemble_name (FILE, flab); \
|
||||
|
@ -395,19 +480,175 @@ while (0)
|
|||
{ \
|
||||
fprintf (FILE, "%s\"\",%d,0,0,", ASM_STABS_OP, N_FUN); \
|
||||
assemble_name (FILE, LSCOPE); \
|
||||
fputs ("-.", FILE); \
|
||||
putc ('-', FILE); \
|
||||
if (TARGET_64BIT) \
|
||||
putc ('.', FILE); \
|
||||
assemble_name (FILE, XSTR (XEXP (DECL_RTL (DECL), 0), 0)); \
|
||||
putc ('\n', FILE); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
/* Override sysv4.h as these are ABI_V4 only. */
|
||||
#undef ASM_OUTPUT_REG_PUSH
|
||||
#undef ASM_OUTPUT_REG_POP
|
||||
|
||||
/* Select a format to encode pointers in exception handling data. CODE
|
||||
is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is
|
||||
true if the symbol may be affected by dynamic relocations. */
|
||||
#undef ASM_PREFERRED_EH_DATA_FORMAT
|
||||
#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
|
||||
(((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_udata8)
|
||||
((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE) \
|
||||
? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel \
|
||||
| (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4)) \
|
||||
: DW_EH_PE_absptr)
|
||||
|
||||
/* For backward compatibility, we must continue to use the AIX
|
||||
structure return convention. */
|
||||
#undef DRAFT_V4_STRUCT_RET
|
||||
#define DRAFT_V4_STRUCT_RET (!TARGET_64BIT)
|
||||
|
||||
/* Do code reading to identify a signal frame, and set the frame
|
||||
state data appropriately. See unwind-dw2.c for the structs. */
|
||||
|
||||
#ifdef IN_LIBGCC2
|
||||
#include <signal.h>
|
||||
#include <sys/ucontext.h>
|
||||
|
||||
#ifdef __powerpc64__
|
||||
enum { SIGNAL_FRAMESIZE = 128 };
|
||||
#else
|
||||
enum { SIGNAL_FRAMESIZE = 64 };
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __powerpc64__
|
||||
|
||||
#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
|
||||
do { \
|
||||
unsigned char *pc_ = (CONTEXT)->ra; \
|
||||
struct sigcontext *sc_; \
|
||||
long new_cfa_; \
|
||||
int i_; \
|
||||
\
|
||||
/* addi r1, r1, 128; li r0, 0x0077; sc (sigreturn) */ \
|
||||
/* addi r1, r1, 128; li r0, 0x00AC; sc (rt_sigreturn) */ \
|
||||
if (*(unsigned int *) (pc_+0) != 0x38210000 + SIGNAL_FRAMESIZE \
|
||||
|| *(unsigned int *) (pc_+8) != 0x44000002) \
|
||||
break; \
|
||||
if (*(unsigned int *) (pc_+4) == 0x38000077) \
|
||||
{ \
|
||||
struct sigframe { \
|
||||
char gap[SIGNAL_FRAMESIZE]; \
|
||||
struct sigcontext sigctx; \
|
||||
} *rt_ = (CONTEXT)->cfa; \
|
||||
sc_ = &rt_->sigctx; \
|
||||
} \
|
||||
else if (*(unsigned int *) (pc_+4) == 0x380000AC) \
|
||||
{ \
|
||||
struct rt_sigframe { \
|
||||
int tramp[6]; \
|
||||
struct siginfo *pinfo; \
|
||||
struct ucontext *puc; \
|
||||
} *rt_ = (struct rt_sigframe *) pc_; \
|
||||
sc_ = &rt_->puc->uc_mcontext; \
|
||||
} \
|
||||
else \
|
||||
break; \
|
||||
\
|
||||
new_cfa_ = sc_->regs->gpr[STACK_POINTER_REGNUM]; \
|
||||
(FS)->cfa_how = CFA_REG_OFFSET; \
|
||||
(FS)->cfa_reg = STACK_POINTER_REGNUM; \
|
||||
(FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa; \
|
||||
\
|
||||
for (i_ = 0; i_ < 32; i_++) \
|
||||
if (i_ != STACK_POINTER_REGNUM) \
|
||||
{ \
|
||||
(FS)->regs.reg[i_].how = REG_SAVED_OFFSET; \
|
||||
(FS)->regs.reg[i_].loc.offset \
|
||||
= (long)&(sc_->regs->gpr[i_]) - new_cfa_; \
|
||||
} \
|
||||
\
|
||||
(FS)->regs.reg[LINK_REGISTER_REGNUM].how = REG_SAVED_OFFSET; \
|
||||
(FS)->regs.reg[LINK_REGISTER_REGNUM].loc.offset \
|
||||
= (long)&(sc_->regs->link) - new_cfa_; \
|
||||
\
|
||||
/* The unwinder expects the IP to point to the following insn, \
|
||||
whereas the kernel returns the address of the actual \
|
||||
faulting insn. We store NIP+4 in an unused register slot to \
|
||||
get the same result for multiple evaluation of the same signal \
|
||||
frame. */ \
|
||||
sc_->regs->gpr[47] = sc_->regs->nip + 4; \
|
||||
(FS)->regs.reg[CR0_REGNO].how = REG_SAVED_OFFSET; \
|
||||
(FS)->regs.reg[CR0_REGNO].loc.offset \
|
||||
= (long)&(sc_->regs->gpr[47]) - new_cfa_; \
|
||||
(FS)->retaddr_column = CR0_REGNO; \
|
||||
goto SUCCESS; \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
||||
#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
|
||||
do { \
|
||||
unsigned char *pc_ = (CONTEXT)->ra; \
|
||||
struct sigcontext *sc_; \
|
||||
long new_cfa_; \
|
||||
int i_; \
|
||||
\
|
||||
/* li r0, 0x7777; sc (sigreturn old) */ \
|
||||
/* li r0, 0x0077; sc (sigreturn new) */ \
|
||||
/* li r0, 0x6666; sc (rt_sigreturn old) */ \
|
||||
/* li r0, 0x00AC; sc (rt_sigreturn new) */ \
|
||||
if (*(unsigned int *) (pc_+4) != 0x44000002) \
|
||||
break; \
|
||||
if (*(unsigned int *) (pc_+0) == 0x38007777 \
|
||||
|| *(unsigned int *) (pc_+0) == 0x38000077) \
|
||||
{ \
|
||||
struct sigframe { \
|
||||
char gap[SIGNAL_FRAMESIZE]; \
|
||||
struct sigcontext sigctx; \
|
||||
} *rt_ = (CONTEXT)->cfa; \
|
||||
sc_ = &rt_->sigctx; \
|
||||
} \
|
||||
else if (*(unsigned int *) (pc_+0) == 0x38006666 \
|
||||
|| *(unsigned int *) (pc_+0) == 0x380000AC) \
|
||||
{ \
|
||||
struct rt_sigframe { \
|
||||
char gap[SIGNAL_FRAMESIZE]; \
|
||||
unsigned long _unused[2]; \
|
||||
struct siginfo *pinfo; \
|
||||
void *puc; \
|
||||
struct siginfo info; \
|
||||
struct ucontext uc; \
|
||||
} *rt_ = (CONTEXT)->cfa; \
|
||||
sc_ = &rt_->uc.uc_mcontext; \
|
||||
} \
|
||||
else \
|
||||
break; \
|
||||
\
|
||||
new_cfa_ = sc_->regs->gpr[STACK_POINTER_REGNUM]; \
|
||||
(FS)->cfa_how = CFA_REG_OFFSET; \
|
||||
(FS)->cfa_reg = STACK_POINTER_REGNUM; \
|
||||
(FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa; \
|
||||
\
|
||||
for (i_ = 0; i_ < 32; i_++) \
|
||||
if (i_ != STACK_POINTER_REGNUM) \
|
||||
{ \
|
||||
(FS)->regs.reg[i_].how = REG_SAVED_OFFSET; \
|
||||
(FS)->regs.reg[i_].loc.offset \
|
||||
= (long)&(sc_->regs->gpr[i_]) - new_cfa_; \
|
||||
} \
|
||||
\
|
||||
(FS)->regs.reg[LINK_REGISTER_REGNUM].how = REG_SAVED_OFFSET; \
|
||||
(FS)->regs.reg[LINK_REGISTER_REGNUM].loc.offset \
|
||||
= (long)&(sc_->regs->link) - new_cfa_; \
|
||||
\
|
||||
/* The unwinder expects the IP to point to the following insn, \
|
||||
whereas the kernel returns the address of the actual \
|
||||
faulting insn. We store NIP+4 in an unused register slot to \
|
||||
get the same result for multiple evaluation of the same signal \
|
||||
frame. */ \
|
||||
sc_->regs->gpr[47] = sc_->regs->nip + 4; \
|
||||
(FS)->regs.reg[CR0_REGNO].how = REG_SAVED_OFFSET; \
|
||||
(FS)->regs.reg[CR0_REGNO].loc.offset \
|
||||
= (long)&(sc_->regs->gpr[47]) - new_cfa_; \
|
||||
(FS)->retaddr_column = CR0_REGNO; \
|
||||
goto SUCCESS; \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -95,32 +95,7 @@
|
|||
* the real function with one or two leading periods respectively.
|
||||
*/
|
||||
|
||||
#ifdef _RELOCATABLE
|
||||
#define DESC_SECTION ".got2"
|
||||
#else
|
||||
#define DESC_SECTION ".got1"
|
||||
#endif
|
||||
|
||||
#if defined(_CALL_AIXDESC)
|
||||
#define FUNC_NAME(name) GLUE(.,name)
|
||||
#define JUMP_TARGET(name) FUNC_NAME(name)
|
||||
#define FUNC_START(name) \
|
||||
.section DESC_SECTION,"aw"; \
|
||||
name: \
|
||||
.long GLUE(.,name); \
|
||||
.long _GLOBAL_OFFSET_TABLE_; \
|
||||
.long 0; \
|
||||
.previous; \
|
||||
.type GLUE(.,name),@function; \
|
||||
.globl name; \
|
||||
.globl GLUE(.,name); \
|
||||
GLUE(.,name):
|
||||
|
||||
#define FUNC_END(name) \
|
||||
GLUE(.L,name): \
|
||||
.size GLUE(.,name),GLUE(.L,name)-GLUE(.,name)
|
||||
|
||||
#elif defined (__powerpc64__)
|
||||
#if defined (__powerpc64__)
|
||||
#define FUNC_NAME(name) GLUE(.,name)
|
||||
#define JUMP_TARGET(name) FUNC_NAME(name)
|
||||
#define FUNC_START(name) \
|
||||
|
@ -139,7 +114,34 @@ GLUE(.,name):
|
|||
GLUE(.L,name): \
|
||||
.size GLUE(.,name),GLUE(.L,name)-GLUE(.,name)
|
||||
|
||||
#elif defined(_CALL_AIXDESC)
|
||||
|
||||
#ifdef _RELOCATABLE
|
||||
#define DESC_SECTION ".got2"
|
||||
#else
|
||||
#define DESC_SECTION ".got1"
|
||||
#endif
|
||||
|
||||
#define FUNC_NAME(name) GLUE(.,name)
|
||||
#define JUMP_TARGET(name) FUNC_NAME(name)
|
||||
#define FUNC_START(name) \
|
||||
.section DESC_SECTION,"aw"; \
|
||||
name: \
|
||||
.long GLUE(.,name); \
|
||||
.long _GLOBAL_OFFSET_TABLE_; \
|
||||
.long 0; \
|
||||
.previous; \
|
||||
.type GLUE(.,name),@function; \
|
||||
.globl name; \
|
||||
.globl GLUE(.,name); \
|
||||
GLUE(.,name):
|
||||
|
||||
#define FUNC_END(name) \
|
||||
GLUE(.L,name): \
|
||||
.size GLUE(.,name),GLUE(.L,name)-GLUE(.,name)
|
||||
|
||||
#else
|
||||
|
||||
#define FUNC_NAME(name) GLUE(__USER_LABEL_PREFIX__,name)
|
||||
#if defined __PIC__ || defined __pic__
|
||||
#define JUMP_TARGET(name) FUNC_NAME(name@plt)
|
||||
|
@ -155,4 +157,3 @@ FUNC_NAME(name):
|
|||
GLUE(.L,name): \
|
||||
.size FUNC_NAME(name),GLUE(.L,name)-FUNC_NAME(name)
|
||||
#endif
|
||||
|
||||
|
|
|
@ -156,6 +156,8 @@ extern rtx rs6000_function_value (tree, tree);
|
|||
extern rtx rs6000_libcall_value (enum machine_mode);
|
||||
extern struct rtx_def *rs6000_va_arg PARAMS ((tree, tree));
|
||||
extern int function_ok_for_sibcall PARAMS ((tree));
|
||||
extern void rs6000_elf_declare_function_name
|
||||
PARAMS ((FILE *, const char *, tree));
|
||||
#ifdef ARGS_SIZE_RTX
|
||||
/* expr.h defines ARGS_SIZE_RTX and `enum direction' */
|
||||
extern enum direction function_arg_padding PARAMS ((enum machine_mode, tree));
|
||||
|
|
|
@ -124,7 +124,7 @@ int rs6000_pic_labelno;
|
|||
|
||||
#ifdef USING_ELFOS_H
|
||||
/* Which abi to adhere to */
|
||||
const char *rs6000_abi_name = RS6000_ABI_NAME;
|
||||
const char *rs6000_abi_name;
|
||||
|
||||
/* Semantics of the small data area */
|
||||
enum rs6000_sdata_type rs6000_sdata = SDATA_DATA;
|
||||
|
@ -8661,11 +8661,10 @@ print_operand (file, x, code)
|
|||
break;
|
||||
}
|
||||
}
|
||||
#if TARGET_AIX
|
||||
RS6000_OUTPUT_BASENAME (file, XSTR (x, 0));
|
||||
#else
|
||||
assemble_name (file, XSTR (x, 0));
|
||||
#endif
|
||||
if (TARGET_AIX)
|
||||
RS6000_OUTPUT_BASENAME (file, XSTR (x, 0));
|
||||
else
|
||||
assemble_name (file, XSTR (x, 0));
|
||||
return;
|
||||
|
||||
case 'Z':
|
||||
|
@ -10566,7 +10565,6 @@ create_TOC_reference (symbol)
|
|||
gen_rtx_SYMBOL_REF (Pmode, toc_label_name))));
|
||||
}
|
||||
|
||||
#if TARGET_AIX
|
||||
/* __throw will restore its own return address to be the same as the
|
||||
return address of the function that the throw is being made to.
|
||||
This is unfortunate, because we want to check the original
|
||||
|
@ -10694,7 +10692,6 @@ rs6000_emit_eh_toc_restore (stacksize)
|
|||
emit_note (NULL, NOTE_INSN_LOOP_END);
|
||||
emit_label (loop_exit);
|
||||
}
|
||||
#endif /* TARGET_AIX */
|
||||
|
||||
/* This ties together stack memory (MEM with an alias set of
|
||||
rs6000_sr_alias_set) and the change to the stack pointer. */
|
||||
|
@ -12885,20 +12882,24 @@ output_profile_hook (labelno)
|
|||
|
||||
if (DEFAULT_ABI == ABI_AIX)
|
||||
{
|
||||
#ifdef NO_PROFILE_COUNTERS
|
||||
emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
|
||||
#else
|
||||
char buf[30];
|
||||
const char *label_name;
|
||||
rtx fun;
|
||||
|
||||
ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
|
||||
label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
|
||||
fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
|
||||
|
||||
emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
|
||||
fun, Pmode);
|
||||
#ifndef NO_PROFILE_COUNTERS
|
||||
# define NO_PROFILE_COUNTERS 0
|
||||
#endif
|
||||
if (NO_PROFILE_COUNTERS)
|
||||
emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
|
||||
else
|
||||
{
|
||||
char buf[30];
|
||||
const char *label_name;
|
||||
rtx fun;
|
||||
|
||||
ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
|
||||
label_name = (*targetm.strip_name_encoding) (ggc_strdup (buf));
|
||||
fun = gen_rtx_SYMBOL_REF (Pmode, label_name);
|
||||
|
||||
emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
|
||||
fun, Pmode);
|
||||
}
|
||||
}
|
||||
else if (DEFAULT_ABI == ABI_DARWIN)
|
||||
{
|
||||
|
@ -13934,6 +13935,79 @@ rs6000_elf_asm_out_destructor (symbol, priority)
|
|||
else
|
||||
assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
|
||||
}
|
||||
|
||||
void
|
||||
rs6000_elf_declare_function_name (file, name, decl)
|
||||
FILE *file;
|
||||
const char *name;
|
||||
tree decl;
|
||||
{
|
||||
if (TARGET_64BIT)
|
||||
{
|
||||
fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", file);
|
||||
ASM_OUTPUT_LABEL (file, name);
|
||||
fputs (DOUBLE_INT_ASM_OP, file);
|
||||
putc ('.', file);
|
||||
assemble_name (file, name);
|
||||
fputs (",.TOC.@tocbase,0\n\t.previous\n\t.size\t", file);
|
||||
assemble_name (file, name);
|
||||
fputs (",24\n\t.type\t.", file);
|
||||
assemble_name (file, name);
|
||||
fputs (",@function\n", file);
|
||||
if (TREE_PUBLIC (decl) && ! DECL_WEAK (decl))
|
||||
{
|
||||
fputs ("\t.globl\t.", file);
|
||||
assemble_name (file, name);
|
||||
putc ('\n', file);
|
||||
}
|
||||
ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
|
||||
putc ('.', file);
|
||||
ASM_OUTPUT_LABEL (file, name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (TARGET_RELOCATABLE
|
||||
&& (get_pool_size () != 0 || current_function_profile)
|
||||
&& uses_TOC())
|
||||
{
|
||||
char buf[256];
|
||||
|
||||
(*targetm.asm_out.internal_label) (file, "LCL", rs6000_pic_labelno);
|
||||
|
||||
ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);
|
||||
fprintf (file, "\t.long ");
|
||||
assemble_name (file, buf);
|
||||
putc ('-', file);
|
||||
ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
|
||||
assemble_name (file, buf);
|
||||
putc ('\n', file);
|
||||
}
|
||||
|
||||
ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
|
||||
ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
|
||||
|
||||
if (DEFAULT_ABI == ABI_AIX)
|
||||
{
|
||||
const char *desc_name, *orig_name;
|
||||
|
||||
orig_name = (*targetm.strip_name_encoding) (name);
|
||||
desc_name = orig_name;
|
||||
while (*desc_name == '.')
|
||||
desc_name++;
|
||||
|
||||
if (TREE_PUBLIC (decl))
|
||||
fprintf (file, "\t.globl %s\n", desc_name);
|
||||
|
||||
fprintf (file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
|
||||
fprintf (file, "%s:\n", desc_name);
|
||||
fprintf (file, "\t.long %s\n", orig_name);
|
||||
fputs ("\t.long _GLOBAL_OFFSET_TABLE_\n", file);
|
||||
if (DEFAULT_ABI == ABI_AIX)
|
||||
fputs ("\t.long 0\n", file);
|
||||
fprintf (file, "\t.previous\n");
|
||||
}
|
||||
ASM_OUTPUT_LABEL (file, name);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TARGET_XCOFF
|
||||
|
|
|
@ -14581,9 +14581,8 @@
|
|||
""
|
||||
"
|
||||
{
|
||||
#if TARGET_AIX
|
||||
rs6000_emit_eh_toc_restore (EH_RETURN_STACKADJ_RTX);
|
||||
#endif
|
||||
if (TARGET_AIX)
|
||||
rs6000_emit_eh_toc_restore (EH_RETURN_STACKADJ_RTX);
|
||||
if (TARGET_32BIT)
|
||||
emit_insn (gen_eh_set_lr_si (operands[0]));
|
||||
else
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
.file "scrti.s"
|
||||
.ident "GNU C scrti.s"
|
||||
|
||||
#ifndef __powerpc64__
|
||||
# Start of .text
|
||||
.section ".text"
|
||||
.globl _ex_text0
|
||||
|
@ -102,3 +103,4 @@ _fini: stwu %r1,-16(%r1)
|
|||
.space 4
|
||||
.weak environ
|
||||
.set environ,_environ
|
||||
#endif
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
.file "scrtn.s"
|
||||
.ident "GNU C scrtn.s"
|
||||
|
||||
#ifndef __powerpc64__
|
||||
# Default versions of exception handling register/deregister
|
||||
.weak _ex_register
|
||||
.weak _ex_deregister
|
||||
|
@ -80,3 +81,4 @@ _ex_range1:
|
|||
mtlr %r0
|
||||
addi %r1,%r1,16
|
||||
blr
|
||||
#endif
|
||||
|
|
|
@ -149,6 +149,10 @@ extern const char *rs6000_tls_size_string; /* For -mtls-size= */
|
|||
N_("Set the PPC_EMB bit in the ELF flags header") }, \
|
||||
{ "windiss", 0, N_("Use the WindISS simulator") }, \
|
||||
{ "shlib", 0, N_("no description yet") }, \
|
||||
{ "64", MASK_64BIT | MASK_POWERPC64 | MASK_POWERPC, \
|
||||
N_("Generate 64-bit code") }, \
|
||||
{ "32", - (MASK_64BIT | MASK_POWERPC64), \
|
||||
N_("Generate 32-bit code") }, \
|
||||
EXTRA_SUBTARGET_SWITCHES \
|
||||
{ "newlib", 0, N_("no description yet") },
|
||||
|
||||
|
@ -172,6 +176,9 @@ do { \
|
|||
if (!g_switch_set) \
|
||||
g_switch_value = SDATA_DEFAULT_SIZE; \
|
||||
\
|
||||
if (rs6000_abi_name == NULL) \
|
||||
rs6000_abi_name = RS6000_ABI_NAME; \
|
||||
\
|
||||
if (!strcmp (rs6000_abi_name, "sysv")) \
|
||||
rs6000_current_abi = ABI_V4; \
|
||||
else if (!strcmp (rs6000_abi_name, "sysv-noeabi")) \
|
||||
|
@ -274,7 +281,7 @@ do { \
|
|||
rs6000_abi_name); \
|
||||
} \
|
||||
\
|
||||
if (flag_pic > 1 && rs6000_current_abi == ABI_AIX) \
|
||||
if (!TARGET_64BIT && flag_pic > 1 && rs6000_current_abi == ABI_AIX) \
|
||||
{ \
|
||||
flag_pic = 0; \
|
||||
error ("-fPIC and -mcall-%s are incompatible", \
|
||||
|
@ -293,9 +300,16 @@ do { \
|
|||
\
|
||||
else if (TARGET_RELOCATABLE) \
|
||||
flag_pic = 2; \
|
||||
\
|
||||
} while (0)
|
||||
|
||||
#ifndef RS6000_BI_ARCH
|
||||
# define SUBSUBTARGET_OVERRIDE_OPTIONS \
|
||||
do { \
|
||||
if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT) \
|
||||
error ("-m%s not supported in this configuration", \
|
||||
(target_flags & MASK_64BIT) ? "64" : "32"); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/* Override rs6000.h definition. */
|
||||
#undef TARGET_DEFAULT
|
||||
|
@ -590,51 +604,7 @@ extern int rs6000_pic_labelno;
|
|||
/* Override elfos.h definition. */
|
||||
#undef ASM_DECLARE_FUNCTION_NAME
|
||||
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
|
||||
do { \
|
||||
const char *const init_ptr = (TARGET_64BIT) ? ".quad" : ".long"; \
|
||||
\
|
||||
if (TARGET_RELOCATABLE \
|
||||
&& (get_pool_size () != 0 || current_function_profile) \
|
||||
&& uses_TOC()) \
|
||||
{ \
|
||||
char buf[256]; \
|
||||
\
|
||||
(*targetm.asm_out.internal_label) (FILE, "LCL", rs6000_pic_labelno); \
|
||||
\
|
||||
ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1); \
|
||||
fprintf (FILE, "\t%s ", init_ptr); \
|
||||
assemble_name (FILE, buf); \
|
||||
putc ('-', FILE); \
|
||||
ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno); \
|
||||
assemble_name (FILE, buf); \
|
||||
putc ('\n', FILE); \
|
||||
} \
|
||||
\
|
||||
ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \
|
||||
ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
|
||||
\
|
||||
if (DEFAULT_ABI == ABI_AIX) \
|
||||
{ \
|
||||
const char *desc_name, *orig_name; \
|
||||
\
|
||||
orig_name = (*targetm.strip_name_encoding) (NAME); \
|
||||
desc_name = orig_name; \
|
||||
while (*desc_name == '.') \
|
||||
desc_name++; \
|
||||
\
|
||||
if (TREE_PUBLIC (DECL)) \
|
||||
fprintf (FILE, "\t.globl %s\n", desc_name); \
|
||||
\
|
||||
fprintf (FILE, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); \
|
||||
fprintf (FILE, "%s:\n", desc_name); \
|
||||
fprintf (FILE, "\t%s %s\n", init_ptr, orig_name); \
|
||||
fprintf (FILE, "\t%s _GLOBAL_OFFSET_TABLE_\n", init_ptr); \
|
||||
if (DEFAULT_ABI == ABI_AIX) \
|
||||
fprintf (FILE, "\t%s 0\n", init_ptr); \
|
||||
fprintf (FILE, "\t.previous\n"); \
|
||||
} \
|
||||
ASM_OUTPUT_LABEL (FILE, NAME); \
|
||||
} while (0)
|
||||
rs6000_elf_declare_function_name ((FILE), (NAME), (DECL))
|
||||
|
||||
/* The USER_LABEL_PREFIX stuff is affected by the -fleading-underscore
|
||||
flag. The LOCAL_LABEL_PREFIX variable is used by dbxelf.h. */
|
||||
|
@ -789,6 +759,25 @@ extern int fixuplabelno;
|
|||
#define TARGET_VERSION fprintf (stderr, " (PowerPC System V.4)");
|
||||
#endif
|
||||
|
||||
#define TARGET_OS_SYSV_CPP_BUILTINS() \
|
||||
do \
|
||||
{ \
|
||||
if (flag_pic == 1) \
|
||||
{ \
|
||||
builtin_define ("__pic__=1"); \
|
||||
builtin_define ("__PIC__=1"); \
|
||||
} \
|
||||
else if (flag_pic == 2) \
|
||||
{ \
|
||||
builtin_define ("__pic__=2"); \
|
||||
builtin_define ("__PIC__=2"); \
|
||||
} \
|
||||
if (target_flags_explicit \
|
||||
& MASK_RELOCATABLE) \
|
||||
builtin_define ("_RELOCATABLE"); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#ifndef TARGET_OS_CPP_BUILTINS
|
||||
#define TARGET_OS_CPP_BUILTINS() \
|
||||
do \
|
||||
|
@ -800,6 +789,7 @@ extern int fixuplabelno;
|
|||
builtin_assert ("system=svr4"); \
|
||||
builtin_assert ("cpu=powerpc"); \
|
||||
builtin_assert ("machine=powerpc"); \
|
||||
TARGET_OS_SYSV_CPP_BUILTINS (); \
|
||||
} \
|
||||
while (0)
|
||||
#endif
|
||||
|
@ -945,14 +935,9 @@ extern int fixuplabelno;
|
|||
|
||||
#define LINK_OS_DEFAULT_SPEC ""
|
||||
|
||||
#define CPP_SYSV_SPEC \
|
||||
"%{mrelocatable*: -D_RELOCATABLE} \
|
||||
%{fpic|fpie: -D__PIC__=1 -D__pic__=1} \
|
||||
%{!fpic: %{fPIC|fPIE: -D__PIC__=2 -D__pic__=2}}"
|
||||
|
||||
/* Override rs6000.h definition. */
|
||||
#undef CPP_SPEC
|
||||
#define CPP_SPEC "%{posix: -D_POSIX_SOURCE} %(cpp_sysv) \
|
||||
#define CPP_SPEC "%{posix: -D_POSIX_SOURCE} \
|
||||
%{mads : %(cpp_os_ads) ; \
|
||||
myellowknife : %(cpp_os_yellowknife) ; \
|
||||
mmvme : %(cpp_os_mvme) ; \
|
||||
|
@ -1219,7 +1204,6 @@ ncrtn.o%s"
|
|||
/* Override rs6000.h definition. */
|
||||
#undef SUBTARGET_EXTRA_SPECS
|
||||
#define SUBTARGET_EXTRA_SPECS \
|
||||
{ "cpp_sysv", CPP_SYSV_SPEC }, \
|
||||
{ "crtsavres_default", CRTSAVRES_DEFAULT_SPEC }, \
|
||||
{ "lib_ads", LIB_ADS_SPEC }, \
|
||||
{ "lib_yellowknife", LIB_YELLOWKNIFE_SPEC }, \
|
||||
|
@ -1288,7 +1272,10 @@ ncrtn.o%s"
|
|||
{ "cpp_os_linux", CPP_OS_LINUX_SPEC }, \
|
||||
{ "cpp_os_netbsd", CPP_OS_NETBSD_SPEC }, \
|
||||
{ "cpp_os_windiss", CPP_OS_WINDISS_SPEC }, \
|
||||
{ "cpp_os_default", CPP_OS_DEFAULT_SPEC },
|
||||
{ "cpp_os_default", CPP_OS_DEFAULT_SPEC }, \
|
||||
SUBSUBTARGET_EXTRA_SPECS
|
||||
|
||||
#define SUBSUBTARGET_EXTRA_SPECS
|
||||
|
||||
/* Define this macro as a C expression for the initializer of an
|
||||
array of string to tell the driver program which options are
|
||||
|
|
|
@ -1,19 +1,32 @@
|
|||
# Override t-linux. We don't want -fPIC.
|
||||
CRTSTUFF_T_CFLAGS_S =
|
||||
TARGET_LIBGCC2_CFLAGS =
|
||||
|
||||
EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o \
|
||||
crtsavres.o
|
||||
|
||||
# These functions are needed for soft-float on powerpc64-linux.
|
||||
LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/ppc64-fp.c
|
||||
|
||||
# ld provides these functions as needed.
|
||||
crtsavres.S:
|
||||
echo >crtsavres.S
|
||||
|
||||
$(T)crtsavres.o: crtsavres.S
|
||||
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c crtsavres.S -o $(T)crtsavres.o
|
||||
LIB2FUNCS_EXTRA = tramp.S $(srcdir)/config/rs6000/ppc64-fp.c
|
||||
|
||||
# Modify the shared lib version file
|
||||
SHLIB_MKMAP_OPTS = -v dotsyms=1
|
||||
|
||||
MULTILIB_OPTIONS = m64/m32 msoft-float
|
||||
MULTILIB_DIRNAMES = 64 32 nof
|
||||
MULTILIB_EXTRA_OPTS = fPIC mstrict-align
|
||||
MULTILIB_EXCEPTIONS = m64/msoft-float
|
||||
MULTILIB_EXCLUSIONS = m64/!m32/msoft-float
|
||||
MULTILIB_OSDIRNAMES = ../lib64 ../lib nof
|
||||
MULTILIB_MATCHES = $(MULTILIB_MATCHES_FLOAT)
|
||||
|
||||
TARGET_LIBGCC2_CFLAGS = -mno-minimal-toc -fPIC
|
||||
|
||||
# We want fine grained libraries, so use the new code to build the
|
||||
# floating point emulation libraries.
|
||||
# fp-bit is only to be used by 32-bit multilibs
|
||||
FPBIT = fp-bit32.c
|
||||
DPBIT = dp-bit32.c
|
||||
|
||||
dp-bit32.c: $(srcdir)/config/fp-bit.c
|
||||
( echo '#ifndef __powerpc64__'; \
|
||||
cat $(srcdir)/config/fp-bit.c; \
|
||||
echo '#endif' ) > dp-bit32.c
|
||||
|
||||
fp-bit32.c: $(srcdir)/config/fp-bit.c
|
||||
( echo '#ifndef __powerpc64__'; \
|
||||
echo '#define FLOAT'; \
|
||||
cat $(srcdir)/config/fp-bit.c; \
|
||||
echo '#endif' ) > fp-bit32.c
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
.section ".text"
|
||||
#include "ppc-asm.h"
|
||||
|
||||
#ifndef __powerpc64__
|
||||
.type trampoline_initial,@object
|
||||
.align 2
|
||||
trampoline_initial:
|
||||
|
@ -107,3 +108,4 @@ FUNC_START(__trampoline_setup)
|
|||
bl JUMP_TARGET(abort)
|
||||
FUNC_END(__trampoline_setup)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
# parts of gcc need more than a 64k TOC.
|
||||
X_CFLAGS = -mminimal-toc
|
|
@ -942,7 +942,7 @@ typedef struct xtensa_args {
|
|||
_mcount uses a window size of 8 to make sure that it doesn't clobber
|
||||
any incoming argument values. */
|
||||
|
||||
#define NO_PROFILE_COUNTERS
|
||||
#define NO_PROFILE_COUNTERS 1
|
||||
|
||||
#define FUNCTION_PROFILER(FILE, LABELNO) \
|
||||
do { \
|
||||
|
|
|
@ -8127,6 +8127,7 @@ gcc_cv_as_tls=no
|
|||
conftest_s=
|
||||
tls_first_major=
|
||||
tls_first_minor=
|
||||
tls_as_opt=
|
||||
case "$target" in
|
||||
alpha*-*-*)
|
||||
conftest_s='
|
||||
|
@ -8224,6 +8225,7 @@ x3: .space 4
|
|||
addi 9,9,x2@tprel@l'
|
||||
tls_first_major=2
|
||||
tls_first_minor=14
|
||||
tls_as_opt=-a32
|
||||
;;
|
||||
powerpc64-*-*)
|
||||
conftest_s='
|
||||
|
@ -8257,6 +8259,7 @@ x3: .space 8
|
|||
nop'
|
||||
tls_first_major=2
|
||||
tls_first_minor=14
|
||||
tls_as_opt=-a64
|
||||
;;
|
||||
s390-*-*)
|
||||
conftest_s='
|
||||
|
@ -8275,6 +8278,7 @@ foo: .long 25
|
|||
bas %r14,0(%r1,%r13):tls_ldcall:foo'
|
||||
tls_first_major=2
|
||||
tls_first_minor=14
|
||||
tls_as_opt=-m31
|
||||
;;
|
||||
s390x-*-*)
|
||||
conftest_s='
|
||||
|
@ -8292,6 +8296,7 @@ foo: .long 25
|
|||
brasl %r14,__tls_get_offset@PLT:tls_ldcall:foo'
|
||||
tls_first_major=2
|
||||
tls_first_minor=14
|
||||
tls_as_opt="-m64 -Aesame"
|
||||
;;
|
||||
esac
|
||||
if test -z "$tls_first_major"; then
|
||||
|
@ -8309,7 +8314,7 @@ fi
|
|||
|
||||
elif test x$gcc_cv_as != x; then
|
||||
echo "$conftest_s" > conftest.s
|
||||
if $gcc_cv_as --fatal-warnings -o conftest.o conftest.s > /dev/null 2>&1
|
||||
if $gcc_cv_as $tls_as_opt --fatal-warnings -o conftest.o conftest.s > /dev/null 2>&1
|
||||
then
|
||||
gcc_cv_as_tls=yes
|
||||
fi
|
||||
|
|
|
@ -2052,6 +2052,7 @@ gcc_cv_as_tls=no
|
|||
conftest_s=
|
||||
tls_first_major=
|
||||
tls_first_minor=
|
||||
tls_as_opt=
|
||||
case "$target" in
|
||||
changequote(,)dnl
|
||||
alpha*-*-*)
|
||||
|
@ -2151,6 +2152,7 @@ x3: .space 4
|
|||
addi 9,9,x2@tprel@l'
|
||||
tls_first_major=2
|
||||
tls_first_minor=14
|
||||
tls_as_opt=-a32
|
||||
;;
|
||||
powerpc64-*-*)
|
||||
conftest_s='
|
||||
|
@ -2184,6 +2186,7 @@ x3: .space 8
|
|||
nop'
|
||||
tls_first_major=2
|
||||
tls_first_minor=14
|
||||
tls_as_opt=-a64
|
||||
;;
|
||||
s390-*-*)
|
||||
conftest_s='
|
||||
|
@ -2202,6 +2205,7 @@ foo: .long 25
|
|||
bas %r14,0(%r1,%r13):tls_ldcall:foo'
|
||||
tls_first_major=2
|
||||
tls_first_minor=14
|
||||
tls_as_opt=-m31
|
||||
;;
|
||||
s390x-*-*)
|
||||
conftest_s='
|
||||
|
@ -2219,6 +2223,7 @@ foo: .long 25
|
|||
brasl %r14,__tls_get_offset@PLT:tls_ldcall:foo'
|
||||
tls_first_major=2
|
||||
tls_first_minor=14
|
||||
tls_as_opt="-m64 -Aesame"
|
||||
;;
|
||||
esac
|
||||
if test -z "$tls_first_major"; then
|
||||
|
@ -2229,7 +2234,7 @@ elif test $in_tree_gas = yes ; then
|
|||
])
|
||||
elif test x$gcc_cv_as != x; then
|
||||
echo "$conftest_s" > conftest.s
|
||||
if $gcc_cv_as --fatal-warnings -o conftest.o conftest.s > /dev/null 2>&1
|
||||
if $gcc_cv_as $tls_as_opt --fatal-warnings -o conftest.o conftest.s > /dev/null 2>&1
|
||||
then
|
||||
gcc_cv_as_tls=yes
|
||||
fi
|
||||
|
|
16
gcc/final.c
16
gcc/final.c
|
@ -1426,7 +1426,7 @@ profile_function (file)
|
|||
FILE *file ATTRIBUTE_UNUSED;
|
||||
{
|
||||
#ifndef NO_PROFILE_COUNTERS
|
||||
int align = MIN (BIGGEST_ALIGNMENT, LONG_TYPE_SIZE);
|
||||
# define NO_PROFILE_COUNTERS 0
|
||||
#endif
|
||||
#if defined(ASM_OUTPUT_REG_PUSH)
|
||||
#if defined(STRUCT_VALUE_INCOMING_REGNUM) || defined(STRUCT_VALUE_REGNUM)
|
||||
|
@ -1437,12 +1437,14 @@ profile_function (file)
|
|||
#endif
|
||||
#endif /* ASM_OUTPUT_REG_PUSH */
|
||||
|
||||
#ifndef NO_PROFILE_COUNTERS
|
||||
data_section ();
|
||||
ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
|
||||
(*targetm.asm_out.internal_label) (file, "LP", current_function_funcdef_no);
|
||||
assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
|
||||
#endif
|
||||
if (! NO_PROFILE_COUNTERS)
|
||||
{
|
||||
int align = MIN (BIGGEST_ALIGNMENT, LONG_TYPE_SIZE);
|
||||
data_section ();
|
||||
ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
|
||||
(*targetm.asm_out.internal_label) (file, "LP", current_function_funcdef_no);
|
||||
assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
|
||||
}
|
||||
|
||||
function_section (current_function_decl);
|
||||
|
||||
|
|
Loading…
Reference in New Issue