123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- /* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF.
- Copyright (C) 1996-2015 Free Software Foundation, Inc.
- Contributed by Richard Henderson (rth@tamu.edu).
- 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 CC1_SPEC
- #define CC1_SPEC "%{G*}"
- #undef ASM_SPEC
- #define ASM_SPEC "%{G*} %{relax:-relax} %{!gstabs*:-no-mdebug}%{gstabs*:-mdebug}"
- /* Do not output a .file directive at the beginning of the input file. */
-
- #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
- #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
- /* This is how to output an assembler line
- that says to advance the location counter
- to a multiple of 2**LOG bytes. */
- #define ASM_OUTPUT_ALIGN(FILE,LOG) \
- if ((LOG) != 0) \
- fprintf (FILE, "\t.align %d\n", LOG);
- /* This says how to output assembler code to declare an
- uninitialized internal linkage data object. Under SVR4,
- the linker seems to want the alignment of data objects
- to depend on their types. We do exactly that here. */
- #undef ASM_OUTPUT_ALIGNED_LOCAL
- #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
- do { \
- if ((SIZE) <= (unsigned HOST_WIDE_INT) g_switch_value) \
- switch_to_section (sbss_section); \
- else \
- switch_to_section (bss_section); \
- ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \
- if (!flag_inhibit_size_directive) \
- ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \
- ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \
- ASM_OUTPUT_LABEL(FILE, NAME); \
- ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1); \
- } while (0)
- /* This says how to output assembler code to declare an
- uninitialized external linkage data object. */
- #undef ASM_OUTPUT_ALIGNED_BSS
- #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
- do { \
- ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \
- } while (0)
- #undef BSS_SECTION_ASM_OP
- #define BSS_SECTION_ASM_OP "\t.section\t.bss"
- #undef SBSS_SECTION_ASM_OP
- #define SBSS_SECTION_ASM_OP "\t.section\t.sbss,\"aw\""
- #undef SDATA_SECTION_ASM_OP
- #define SDATA_SECTION_ASM_OP "\t.section\t.sdata,\"aw\""
- /* This is how we tell the assembler that two symbols have the same value. */
- #undef ASM_OUTPUT_DEF
- #define ASM_OUTPUT_DEF(FILE, ALIAS, NAME) \
- do { \
- assemble_name(FILE, ALIAS); \
- fputs(" = ", FILE); \
- assemble_name(FILE, NAME); \
- fputc('\n', FILE); \
- } while (0)
- #undef ASM_OUTPUT_DEF_FROM_DECLS
- #define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL, TARGET) \
- do { \
- const char *alias = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
- const char *name = IDENTIFIER_POINTER (TARGET); \
- if (TREE_CODE (DECL) == FUNCTION_DECL) \
- { \
- fputc ('$', FILE); \
- assemble_name (FILE, alias); \
- fputs ("..ng = $", FILE); \
- assemble_name (FILE, name); \
- fputs ("..ng\n", FILE); \
- } \
- ASM_OUTPUT_DEF (FILE, alias, name); \
- } while (0)
- /* Provide a STARTFILE_SPEC appropriate for ELF. Here we add the
- (even more) magical crtbegin.o file which provides part of the
- support for getting C++ file-scope static object constructed
- before entering `main'. */
- #undef STARTFILE_SPEC
- #ifdef HAVE_LD_PIE
- #define STARTFILE_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_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
- /* Provide a ENDFILE_SPEC appropriate for ELF. Here we tack on the
- magical crtend.o file which provides part of the support for
- getting C++ file-scope static object constructed before entering
- `main', followed by a normal ELF "finalizer" file, `crtn.o'. */
- #undef ENDFILE_SPEC
- #define ENDFILE_SPEC \
- "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
- %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
- /* This variable should be set to 'true' if the target ABI requires
- unwinding tables even when exceptions are not used. */
- #define TARGET_UNWIND_TABLES_DEFAULT true
- /* 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.
- Since application size is already constrained to <2GB by the form of
- the ldgp relocation, we can use a 32-bit pc-relative relocation to
- static data. Dynamic data is accessed indirectly to allow for read
- only EH sections. */
- #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
- (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4)
- /* If defined, a C statement to be executed just prior to the output of
- assembler code for INSN. */
- #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
- (alpha_this_literal_sequence_number = 0, \
- alpha_this_gpdisp_sequence_number = 0)
- extern int alpha_this_literal_sequence_number;
- extern int alpha_this_gpdisp_sequence_number;
- /* Since the bits of the _init and _fini function is spread across
- many object files, each potentially with its own GP, we must assume
- we need to load our GP. Further, the .init/.fini section can
- easily be more than 4MB away from the function to call so we can't
- use bsr. */
- #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
- asm (SECTION_OP "\n" \
- " br $29,1f\n" \
- "1: ldgp $29,0($29)\n" \
- " unop\n" \
- " jsr $26," USER_LABEL_PREFIX #FUNC "\n" \
- " .align 3\n" \
- " .previous");
- /* If we have the capability create headers for efficient EH lookup.
- As of Jan 2002, only glibc 2.2.4 can actually make use of this, but
- I imagine that other systems will catch up. In the meantime, it
- doesn't harm to make sure that the data exists to be used later. */
- #if defined(HAVE_LD_EH_FRAME_HDR)
- #define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
- #endif
|