|
|
1.1 ! root 1: /* Definitions of target machine for GNU compiler. ! 2: ! 3: Citicorp/TTI Unicom PBD version ! 4: (using GAS and COFF (encapsulated is unacceptable) ) ! 5: ! 6: Copyright (C) 1990 Free Software Foundation, Inc. ! 7: ! 8: This file is part of GNU CC. ! 9: ! 10: GNU CC is free software; you can redistribute it and/or modify ! 11: it under the terms of the GNU General Public License as published by ! 12: the Free Software Foundation; either version 2, or (at your option) ! 13: any later version. ! 14: ! 15: GNU CC is distributed in the hope that it will be useful, ! 16: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 17: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 18: GNU General Public License for more details. ! 19: ! 20: You should have received a copy of the GNU General Public License ! 21: along with GNU CC; see the file COPYING. If not, write to ! 22: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 23: ! 24: #include "sparc/sparc.h" ! 25: ! 26: /* Names to predefine in the preprocessor for this target machine. */ ! 27: ! 28: #undef CPP_PREDEFINES ! 29: #define CPP_PREDEFINES "-Dsparc -DUnicomPBD -Dunix -D__GCC_NEW_VARARGS__ -Asystem(unix) -Acpu(sparc) -Amachine(sparc)" ! 30: ! 31: /* We want DBX format for use with gdb under COFF. */ ! 32: ! 33: #define DBX_DEBUGGING_INFO ! 34: ! 35: /* Generate calls to memcpy, memcmp and memset. */ ! 36: ! 37: #define TARGET_MEM_FUNCTIONS ! 38: ! 39: /* we use /lib/libp/lib* when profiling */ ! 40: ! 41: #undef LIB_SPEC ! 42: #define LIB_SPEC "%{p:-L/usr/lib/libp} %{pg:-L/usr/lib/libp} -lc" ! 43: ! 44: ! 45: /* Use crt1.o as a startup file and crtn.o as a closing file. */ ! 46: /* ! 47: * The loader directive file gcc.ifile defines how to merge the constructor ! 48: * sections into the data section. Also, since gas only puts out those ! 49: * sections in response to N_SETT stabs, and does not (yet) have a ! 50: * ".sections" directive, gcc.ifile also defines the list symbols ! 51: * __DTOR_LIST__ and __CTOR_LIST__. ! 52: * ! 53: * Finally, we must explicitly specify the file from libgcc.a that defines ! 54: * exit(), otherwise if the user specifies (for example) "-lc_s" on the ! 55: * command line, the wrong exit() will be used and global destructors will ! 56: * not get called . ! 57: */ ! 58: ! 59: #define STARTFILE_SPEC \ ! 60: "%{!r: gcc.ifile%s} %{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}} \ ! 61: %{!r:_exit.o%s}" ! 62: ! 63: #define ENDFILE_SPEC "crtn.o%s" ! 64: ! 65: /* cpp has to support a #sccs directive for the /usr/include files */ ! 66: ! 67: #define SCCS_DIRECTIVE ! 68: ! 69: /* LINK_SPEC is needed only for SunOS 4. */ ! 70: ! 71: #undef LINK_SPEC ! 72: ! 73: /* Although the gas we use can create .ctor and .dtor sections from N_SETT ! 74: stabs, it does not support section directives, so we need to have the loader ! 75: define the lists. ! 76: */ ! 77: #define CTOR_LISTS_DEFINED_EXTERNALLY ! 78: ! 79: /* similar to default, but allows for the table defined by ld with gcc.ifile. ! 80: nptrs is always 0. So we need to instead check that __DTOR_LIST__[1] != 0. ! 81: The old check is left in so that the same macro can be used if and when ! 82: a future version of gas does support section directives. */ ! 83: ! 84: #define DO_GLOBAL_DTORS_BODY {int nptrs = *(int *)__DTOR_LIST__; int i; \ ! 85: if (nptrs == -1 || (__DTOR_LIST__[0] == 0 && __DTOR_LIST__[1] != 0)) \ ! 86: for (nptrs = 0; __DTOR_LIST__[nptrs + 1] != 0; nptrs++); \ ! 87: for (i = nptrs; i >= 1; i--) \ ! 88: __DTOR_LIST__[i] (); } ! 89: ! 90: /* ! 91: * Here is an example gcc.ifile. I've tested it on PBD sparc ! 92: * systems. The NEXT(0x200000) works on just about all 386 and m68k systems, ! 93: * but can be reduced to any power of 2 that is >= NBPS (0x40000 on a pbd). ! 94: ! 95: SECTIONS { ! 96: .text BIND(0x41000200) BLOCK (0x200) : ! 97: { *(.init) *(.text) vfork = fork; *(.fini) } ! 98: ! 99: GROUP BIND( NEXT(0x200000) + ADDR(.text) + SIZEOF(.text)): ! 100: { .data : { __CTOR_LIST__ = . ; . += 4; *(.ctor) . += 4 ; ! 101: __DTOR_LIST__ = . ; . += 4; *(.dtor) . += 4 ; } ! 102: .bss : { } ! 103: } ! 104: } ! 105: */ ! 106: ! 107: #undef ASM_OUTPUT_LABELREF ! 108: #define ASM_OUTPUT_LABELREF(FILE,NAME) \ ! 109: fprintf (FILE, "%s", NAME) ! 110: ! 111: /* fixes: */ ! 112: /* ! 113: * Internal labels are prefixed with a period. ! 114: */ ! 115: ! 116: /* This is how to store into the string LABEL ! 117: the symbol_ref name of an internal numbered label where ! 118: PREFIX is the class of label and NUM is the number within the class. ! 119: This is suitable for output with `assemble_name'. */ ! 120: ! 121: #undef ASM_GENERATE_INTERNAL_LABEL ! 122: ! 123: #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ ! 124: sprintf (LABEL, "*.%s%d", PREFIX, NUM) ! 125: ! 126: ! 127: /* This is how to output an internal numbered label where ! 128: PREFIX is the class of label and NUM is the number within the class. */ ! 129: ! 130: #undef ASM_OUTPUT_INTERNAL_LABEL ! 131: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ ! 132: fprintf (FILE, ".%s%d:\n", PREFIX, NUM) ! 133: ! 134: /* This is how to output an element of a case-vector that is relative. */ ! 135: ! 136: #undef ASM_OUTPUT_ADDR_DIFF_ELT ! 137: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ ! 138: fprintf (FILE, "\t.word .L%d-.L%d\n", VALUE, REL) ! 139: ! 140: /* This is how to output an element of a case-vector that is absolute. ! 141: (The 68000 does not use such vectors, ! 142: but we must define this macro anyway.) */ ! 143: ! 144: #undef ASM_OUTPUT_ADDR_VEC_ELT ! 145: #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ ! 146: fprintf (FILE, "\t.word .L%d\n", VALUE) ! 147: ! 148: /* Output assembler code to FILE to increment profiler label # LABELNO ! 149: for profiling a function entry. */ ! 150: ! 151: #undef FUNCTION_PROFILER ! 152: #define FUNCTION_PROFILER(FILE, LABELNO) \ ! 153: fprintf (FILE, "\tsethi %%hi(.LP%d),%%o0\n\tcall mcount\n\tor %%lo(.LP%d),%%o0,%%o0\n", \ ! 154: (LABELNO), (LABELNO)) ! 155: ! 156: /* Output assembler code to FILE to initialize this source file's ! 157: basic block profiling info, if that has not already been done. */ ! 158: ! 159: #undef FUNCTION_BLOCK_PROFILER ! 160: #define FUNCTION_BLOCK_PROFILER(FILE, LABELNO) \ ! 161: fprintf (FILE, "\tsethi %%hi(.LPBX0),%%o0\n\tld [%%lo(.LPBX0)+%%o0],%%o1\n\ttst %%o1\n\tbne .LPY%d\n\tnop\n\tcall ___bb_init_func\n\tnop\n.LPY%d:\n", \ ! 162: (LABELNO), (LABELNO)) ! 163: ! 164: /* Output assembler code to FILE to increment the entry-count for ! 165: the BLOCKNO'th basic block in this source file. */ ! 166: ! 167: #undef BLOCK_PROFILER ! 168: #define BLOCK_PROFILER(FILE, BLOCKNO) \ ! 169: { \ ! 170: int blockn = (BLOCKNO); \ ! 171: fprintf (FILE, "\tsethi %%hi(.LPBX2+%d),%%g1\n\tld [%%lo(.LPBX2+%d)+%%g1],%%g2\n\ ! 172: \tadd %%g2,1,%%g2\n\tst %%g2,[%%lo(.LPBX2+%d)+%%g1]\n", \ ! 173: 4 * blockn, 4 * blockn, 4 * blockn); \ ! 174: CC_STATUS_INIT; /* We have clobbered %g1. Also %g2. */ \ ! 175: } ! 176: /* This is needed for SunOS 4.0, and should not hurt for 3.2 ! 177: versions either. */ ! 178: #undef ASM_OUTPUT_SOURCE_LINE(file, line) ! 179: #define ASM_OUTPUT_SOURCE_LINE(file, line) \ ! 180: { static int sym_lineno = 1; \ ! 181: fprintf (file, ".stabn 68,0,%d,.LM%d\n.LM%d:\n", \ ! 182: line, sym_lineno, sym_lineno); \ ! 183: sym_lineno += 1; } ! 184: ! 185: #define ASM_INT_OP ".long "
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.