/* Definitions for rtems targeting a PowerPC using elf. Copyright (C) 1996-2022 Free Software Foundation, Inc. Contributed by Joel Sherrill (joel@OARcorp.com). 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. Under Section 7 of GPL version 3, you are granted additional permissions described in the GCC Runtime Library Exception, version 3.1, as published by the Free Software Foundation. You should have received a copy of the GNU General Public License and a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ /* Undef gnu-user.h macro we don't want. */ #undef CPLUSPLUS_CPP_SPEC /* Copy and paste from linux64.h and freebsd64.h */ #ifdef IN_LIBGCC2 #undef TARGET_64BIT #ifdef __powerpc64__ #define TARGET_64BIT 1 #else #define TARGET_64BIT 0 #endif #endif /* Copy and paste from linux64.h and freebsd64.h */ #undef TARGET_AIX #define TARGET_AIX TARGET_64BIT /* Simplified copy and paste from linux64.h and freebsd64.h */ #undef DOT_SYMBOLS #define DOT_SYMBOLS 0 /* Copy and paste from linux64.h and freebsd64.h */ #undef TARGET_CMODEL #define TARGET_CMODEL rs6000_current_cmodel #define SET_CMODEL(opt) rs6000_current_cmodel = opt #undef TARGET_OS_CPP_BUILTINS #define TARGET_OS_CPP_BUILTINS() \ do \ { \ builtin_define ("__rtems__"); \ builtin_define ("__USE_INIT_FINI__"); \ builtin_assert ("system=rtems"); \ if (TARGET_64BIT) \ { \ builtin_define ("__PPC__"); \ builtin_define ("__PPC64__"); \ builtin_define ("__powerpc64__"); \ 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) /* Copy and paste from linux64.h and freebsd64.h */ #undef RELOCATABLE_NEEDS_FIXUP #define RELOCATABLE_NEEDS_FIXUP \ (rs6000_isa_flags & rs6000_isa_flags_explicit & OPTION_MASK_RELOCATABLE) /* Copy and paste from linux64.h */ #undef RS6000_ABI_NAME #define RS6000_ABI_NAME "linux" /* Copy and paste from linux64.h and freebsd64.h */ #define INVALID_64BIT "%<-m%s%> not supported in this configuration" /* A lot of copy and paste from linux64.h and freebsd64.h */ #undef SUBSUBTARGET_OVERRIDE_OPTIONS #define SUBSUBTARGET_OVERRIDE_OPTIONS \ do \ { \ if (rs6000_isa_flags & OPTION_MASK_64BIT) \ { \ rs6000_elf_abi = 2; \ rs6000_current_abi = ABI_ELFv2; \ if (rs6000_isa_flags & OPTION_MASK_RELOCATABLE) \ { \ rs6000_isa_flags &= ~OPTION_MASK_RELOCATABLE; \ error (INVALID_64BIT, "relocatable"); \ } \ if (rs6000_isa_flags & OPTION_MASK_EABI) \ { \ rs6000_isa_flags &= ~OPTION_MASK_EABI; \ error (INVALID_64BIT, "eabi"); \ } \ if (TARGET_PROTOTYPE) \ { \ target_prototype = 0; \ error (INVALID_64BIT, "prototype"); \ } \ if ((rs6000_isa_flags & OPTION_MASK_POWERPC64) == 0) \ { \ rs6000_isa_flags |= OPTION_MASK_POWERPC64; \ error ("%<-m64%> requires a PowerPC64 cpu"); \ } \ if ((rs6000_isa_flags_explicit \ & OPTION_MASK_MINIMAL_TOC) != 0) \ { \ if (OPTION_SET_P (rs6000_current_cmodel) \ && rs6000_current_cmodel != CMODEL_SMALL) \ error ("%<-mcmodel%> incompatible with other toc options"); \ SET_CMODEL (CMODEL_SMALL); \ } \ else \ { \ if (!OPTION_SET_P (rs6000_current_cmodel)) \ SET_CMODEL (CMODEL_MEDIUM); \ if (rs6000_current_cmodel != CMODEL_SMALL) \ { \ TARGET_NO_FP_IN_TOC = 0; \ TARGET_NO_SUM_IN_TOC = 0; \ } \ } \ } \ } \ while (0) #undef TARGET_LIBGCC_SDATA_SECTION #define TARGET_LIBGCC_SDATA_SECTION ".sdata" /* Copy and paste from linux64.h and freebsd64.h */ #undef SIZE_TYPE #define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int") /* Copy and paste from linux64.h and freebsd64.h */ #undef PTRDIFF_TYPE #define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int") /* Copy and paste from freebsd64.h */ #undef WCHAR_TYPE /* Copy and paste from freebsd64.h */ #undef WCHAR_TYPE_SIZE #define WCHAR_TYPE_SIZE 32 /* Copy and paste from linux64.h and freebsd64.h */ #ifdef __powerpc64__ #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ asm (SECTION_OP "\n" \ " bl " #FUNC "\n" \ " nop\n" \ " .previous"); #endif /* This could be also POWERPC_FREEBSD. It is related to the save/restore defines below. */ #define POWERPC_LINUX /* Copy and paste from linux64.h and freebsd64.h */ #undef SAVE_FP_PREFIX #define SAVE_FP_PREFIX (TARGET_64BIT ? "._savef" : "_savefpr_") #undef SAVE_FP_SUFFIX #define SAVE_FP_SUFFIX "" #undef RESTORE_FP_PREFIX #define RESTORE_FP_PREFIX (TARGET_64BIT ? "._restf" : "_restfpr_") #undef RESTORE_FP_SUFFIX #define RESTORE_FP_SUFFIX "" /* Copy and paste from linux64.h and freebsd64.h */ #undef ASM_PREFERRED_EH_DATA_FORMAT #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ (TARGET_64BIT || flag_pic \ ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel \ | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4)) \ : DW_EH_PE_absptr) /* Copy and paste from linux64.h and freebsd64.h */ #undef TOC_SECTION_ASM_OP #define TOC_SECTION_ASM_OP \ (TARGET_64BIT \ ? "\t.section\t\".toc\",\"aw\"" \ : "\t.section\t\".got\",\"aw\"") /* Copy and paste from linux64.h and freebsd64.h */ #undef MINIMAL_TOC_SECTION_ASM_OP #define MINIMAL_TOC_SECTION_ASM_OP \ (TARGET_64BIT \ ? "\t.section\t\".toc1\",\"aw\"" \ : (flag_pic \ ? "\t.section\t\".got2\",\"aw\"" \ : "\t.section\t\".got1\",\"aw\"")) /* Copy and paste from linux64.h and freebsd64.h */ #undef ASM_DECLARE_FUNCTION_SIZE #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ do \ { \ if (!flag_inhibit_size_directive) \ { \ fputs ("\t.size\t", (FILE)); \ if (TARGET_64BIT && DOT_SYMBOLS) \ putc ('.', (FILE)); \ assemble_name ((FILE), (FNAME)); \ fputs (",.-", (FILE)); \ rs6000_output_function_entry (FILE, FNAME); \ putc ('\n', (FILE)); \ } \ } \ while (0) /* Copy and paste from linux64.h and freebsd64.h */ #undef ASM_OUTPUT_SPECIAL_POOL_ENTRY_P #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE) \ (TARGET_TOC \ && (SYMBOL_REF_P (X) \ || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS \ && SYMBOL_REF_P (XEXP (XEXP (X, 0), 0))) \ || GET_CODE (X) == LABEL_REF \ || (CONST_INT_P (X) \ && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode)) \ || (CONST_DOUBLE_P (X) \ && ((TARGET_64BIT \ && (TARGET_MINIMAL_TOC \ || (SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ && ! TARGET_NO_FP_IN_TOC))) \ || (!TARGET_64BIT \ && !TARGET_NO_FP_IN_TOC \ && SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ && BITS_PER_WORD == HOST_BITS_PER_INT))))) #undef CPP_OS_DEFAULT_SPEC #define CPP_OS_DEFAULT_SPEC "\ %{!mcpu*: %{!Dppc*: %{!Dmpc*: -Dmpc750} } }\ %{mcpu=403: %{!Dppc*: %{!Dmpc*: -Dppc403} } } \ %{mcpu=505: %{!Dppc*: %{!Dmpc*: -Dmpc505} } } \ %{mcpu=601: %{!Dppc*: %{!Dmpc*: -Dppc601} } } \ %{mcpu=602: %{!Dppc*: %{!Dmpc*: -Dppc602} } } \ %{mcpu=603: %{!Dppc*: %{!Dmpc*: -Dppc603} } } \ %{mcpu=603e: %{!Dppc*: %{!Dmpc*: -Dppc603e} } } \ %{mcpu=604: %{!Dppc*: %{!Dmpc*: -Dmpc604} } } \ %{mcpu=750: %{!Dppc*: %{!Dmpc*: -Dmpc750} } } \ %{mcpu=821: %{!Dppc*: %{!Dmpc*: -Dmpc821} } } \ %{mcpu=860: %{!Dppc*: %{!Dmpc*: -Dmpc860} } } \ %{mcpu=8540: %{!Dppc*: %{!Dmpc*: -Dppc8540} } } \ %{mcpu=e6500: -D__PPC_CPU_E6500__} \ %{mvrsave: -D__PPC_VRSAVE__}" #undef ASM_SPEC #define ASM_SPEC "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)" #define ASM_SPEC32 "-a32 \ %{mrelocatable} %{mrelocatable-lib} %{" FPIE_OR_FPIC_SPEC ":-K PIC} \ %{memb|msdata=eabi: -memb}" #define ASM_SPEC64 "-a64" #define ASM_SPEC_COMMON "%(asm_cpu) \ %{,assembler|,assembler-with-cpp: %{mregnames} %{mno-regnames}}" \ ENDIAN_SELECT(" -mbig", " -mlittle", DEFAULT_ASM_ENDIAN) #undef LINK_OS_DEFAULT_SPEC #define LINK_OS_DEFAULT_SPEC \ "%{!m64:%(link_os_spec32)}%{m64:%(link_os_spec64)}" #define LINK_OS_SPEC32 ENDIAN_SELECT(" -m elf32ppc", \ " -m elf32lppc", \ " -m elf32ppc") #define LINK_OS_SPEC64 ENDIAN_SELECT(" -m elf64ppc", \ " -m elf64lppc", \ " -m elf64ppc") #undef SUBSUBTARGET_EXTRA_SPECS #define SUBSUBTARGET_EXTRA_SPECS \ { "asm_spec_common", ASM_SPEC_COMMON }, \ { "asm_spec32", ASM_SPEC32 }, \ { "asm_spec64", ASM_SPEC64 }, \ { "link_os_spec32", LINK_OS_SPEC32 }, \ { "link_os_spec64", LINK_OS_SPEC64 }, /* Use gnu-user.h LINK_GCC_SEQUENCE_SPEC for rtems. */ #undef LINK_GCC_C_SEQUENCE_SPEC #define LINK_GCC_C_SEQUENCE_SPEC \ "%{mads|myellowknife|mmvme|msim:%G %L %G;" \ "!mcall-*|mcall-linux:" GNU_USER_TARGET_LINK_GCC_C_SEQUENCE_SPEC ";" \ ":%G %L %G}" #define RTEMS_STARTFILE_SPEC "ecrti%O%s rtems_crti%O%s crtbegin%O%s" #define RTEMS_ENDFILE_SPEC "crtend%O%s rtems_crtn%O%s ecrtn%O%s"