(root)/
gcc-13.2.0/
gcc/
config/
alpha/
elf.h
       1  /* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF.
       2     Copyright (C) 1996-2023 Free Software Foundation, Inc.
       3     Contributed by Richard Henderson (rth@tamu.edu).
       4  
       5  This file is part of GCC.
       6  
       7  GCC is free software; you can redistribute it and/or modify
       8  it under the terms of the GNU General Public License as published by
       9  the Free Software Foundation; either version 3, or (at your option)
      10  any later version.
      11  
      12  GCC is distributed in the hope that it will be useful,
      13  but WITHOUT ANY WARRANTY; without even the implied warranty of
      14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15  GNU General Public License for more details.
      16  
      17  You should have received a copy of the GNU General Public License
      18  along with GCC; see the file COPYING3.  If not see
      19  <http://www.gnu.org/licenses/>.  */
      20  
      21  #undef  CC1_SPEC
      22  #define CC1_SPEC  "%{G*}"
      23  
      24  #undef  ASM_SPEC
      25  #define ASM_SPEC  "%{G*} %{relax:-relax} %{mcpu=*:-m%*}"
      26  
      27  /* Do not output a .file directive at the beginning of the input file.  */
      28   
      29  #undef  TARGET_ASM_FILE_START_FILE_DIRECTIVE
      30  #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
      31  
      32  /* This is how to output an assembler line
      33     that says to advance the location counter
      34     to a multiple of 2**LOG bytes.  */
      35  
      36  #define ASM_OUTPUT_ALIGN(FILE,LOG)		\
      37    if ((LOG) != 0)				\
      38      fprintf (FILE, "\t.align %d\n", LOG);
      39  
      40  /* This says how to output assembler code to declare an
      41     uninitialized internal linkage data object.  Under SVR4,
      42     the linker seems to want the alignment of data objects
      43     to depend on their types.  We do exactly that here.  */
      44  
      45  #undef  ASM_OUTPUT_ALIGNED_LOCAL
      46  #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)		\
      47  do {									\
      48    if ((SIZE) <= (unsigned HOST_WIDE_INT) g_switch_value)		\
      49      switch_to_section (sbss_section);					\
      50    else									\
      51      switch_to_section (bss_section);					\
      52    ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");			\
      53    if (!flag_inhibit_size_directive)					\
      54      ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE);			\
      55    ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT));	\
      56    ASM_OUTPUT_LABEL(FILE, NAME);						\
      57    ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1);				\
      58  } while (0)
      59  
      60  /* This says how to output assembler code to declare an
      61     uninitialized external linkage data object.  */
      62  
      63  #undef  ASM_OUTPUT_ALIGNED_BSS
      64  #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)		\
      65  do {									\
      66    ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN);			\
      67  } while (0)
      68  
      69  #undef  BSS_SECTION_ASM_OP
      70  #define BSS_SECTION_ASM_OP	"\t.section\t.bss"
      71  #undef  SBSS_SECTION_ASM_OP
      72  #define SBSS_SECTION_ASM_OP	"\t.section\t.sbss,\"aw\""
      73  #undef  SDATA_SECTION_ASM_OP
      74  #define SDATA_SECTION_ASM_OP	"\t.section\t.sdata,\"aw\""
      75  
      76  /* This is how we tell the assembler that two symbols have the same value.  */
      77  
      78  #undef  ASM_OUTPUT_DEF
      79  #define ASM_OUTPUT_DEF(FILE, ALIAS, NAME)			\
      80    do {								\
      81      assemble_name(FILE, ALIAS);					\
      82      fputs(" = ", FILE);						\
      83      assemble_name(FILE, NAME);					\
      84      fputc('\n', FILE);						\
      85    } while (0)
      86  
      87  #undef  ASM_OUTPUT_DEF_FROM_DECLS
      88  #define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL, TARGET)		\
      89    do {								\
      90      const char *alias = XSTR (XEXP (DECL_RTL (DECL), 0), 0);	\
      91      const char *name = IDENTIFIER_POINTER (TARGET);		\
      92      if (TREE_CODE (DECL) == FUNCTION_DECL)			\
      93        {								\
      94  	fputc ('$', FILE);					\
      95  	assemble_name (FILE, alias);				\
      96  	fputs ("..ng = $", FILE);				\
      97  	assemble_name (FILE, name);				\
      98  	fputs ("..ng\n", FILE);					\
      99        }								\
     100      ASM_OUTPUT_DEF (FILE, alias, name);				\
     101    } while (0)
     102  
     103  /* This variable should be set to 'true' if the target ABI requires
     104     unwinding tables even when exceptions are not used.  */
     105  #define TARGET_UNWIND_TABLES_DEFAULT true
     106  
     107  /* Select a format to encode pointers in exception handling data.  CODE
     108     is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
     109     true if the symbol may be affected by dynamic relocations.
     110  
     111     Since application size is already constrained to <2GB by the form of
     112     the ldgp relocation, we can use a 32-bit pc-relative relocation to
     113     static data.  Dynamic data is accessed indirectly to allow for read
     114     only EH sections.  */
     115  #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)       \
     116    (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4)
     117  
     118  /* If defined, a C statement to be executed just prior to the output of
     119     assembler code for INSN.  */
     120  #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS)	\
     121   (alpha_this_literal_sequence_number = 0,		\
     122    alpha_this_gpdisp_sequence_number = 0)
     123  extern int alpha_this_literal_sequence_number;
     124  extern int alpha_this_gpdisp_sequence_number;
     125  
     126  /* Since the bits of the _init and _fini function is spread across
     127     many object files, each potentially with its own GP, we must assume
     128     we need to load our GP.  Further, the .init/.fini section can
     129     easily be more than 4MB away from the function to call so we can't
     130     use bsr.  */
     131  #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)	\
     132     asm (SECTION_OP "\n"					\
     133  "	br $29,1f\n"					\
     134  "1:	ldgp $29,0($29)\n"				\
     135  "	unop\n"						\
     136  "	jsr $26," USER_LABEL_PREFIX #FUNC "\n"		\
     137  "	.align 3\n"					\
     138  "	.previous");
     139  
     140  /* If we have the capability create headers for efficient EH lookup.
     141     As of Jan 2002, only glibc 2.2.4 can actually make use of this, but
     142     I imagine that other systems will catch up.  In the meantime, it
     143     doesn't harm to make sure that the data exists to be used later.  */
     144  #if defined(HAVE_LD_EH_FRAME_HDR)
     145  #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
     146  #endif