📄 i386-interix.h
字号:
/* Target definitions for GNU compiler for Intel 80386 running Interix Parts Copyright (C) 1991, 1999 Free Software Foundation, Inc. Parts: by Douglas B. Rupp (drupp@cs.washington.edu). by Ron Guilmette (rfg@netcom.com). by Donn Terry (donn@softway.com). by Mumit Khan (khan@xraylith.wisc.edu).This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING. If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA. */#define YES_UNDERSCORES/* YES_UNDERSCORES must preceed gas.h */#include <i386/gas.h>/* The rest must follow. */#define DBX_DEBUGGING_INFO#define SDB_DEBUGGING_INFO#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG#define HANDLE_SYSV_PRAGMA#undef HANDLE_PRAGMA_WEAK /* until the link format can handle it *//* By default, target has a 80387, uses IEEE compatible arithmetic, and returns float values in the 387 and needs stack probes We also align doubles to 64-bits for MSVC default compatability */#undef TARGET_DEFAULT#define TARGET_DEFAULT \ (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_STACK_PROBE | \ MASK_ALIGN_DOUBLE)#undef TARGET_CPU_DEFAULT#define TARGET_CPU_DEFAULT 2 /* 486 */#define WCHAR_UNSIGNED 1#define WCHAR_TYPE_SIZE 16#define WCHAR_TYPE "short unsigned int"/* WinNT (and thus Interix) use unsigned int */#define SIZE_TYPE "unsigned int"#define ASM_LOAD_ADDR(loc, reg) " leal " #loc "," #reg "\n"/* For the sake of libgcc2.c, indicate target supports atexit. */#define HAVE_ATEXIT/* cpp handles __STDC__ */#undef CPP_PREDEFINES#define CPP_PREDEFINES " \ -D__INTERIX \ -D__OPENNT \ -D_M_IX86=300 -D_X86_=1 \ -D__stdcall=__attribute__((__stdcall__)) \ -D__cdecl=__attribute__((__cdecl__)) \ -Asystem(unix) -Asystem(interix) -Asystem(interix) -Acpu(i386) -Amachine(i386)"#undef CPP_SPEC/* Write out the correct language type definition for the header files. Unless we have assembler language, write out the symbols for C. cpp_cpu is an Intel specific variant. See i386.h mieee is an Alpha specific variant. Cross polination a bad idea. */#define CPP_SPEC "\%{!.S: -D__LANGUAGE_C__ -D__LANGUAGE_C %{!ansi:-DLANGUAGE_C}} \%{.S: -D__LANGUAGE_ASSEMBLY__ -D__LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \%{.cc: -D__LANGUAGE_C_PLUS_PLUS__ -D__LANGUAGE_C_PLUS_PLUS -D__cplusplus} \%{.cxx: -D__LANGUAGE_C_PLUS_PLUS__ -D__LANGUAGE_C_PLUS_PLUS -D__cplusplus} \%{.C: -D__LANGUAGE_C_PLUS_PLUS__ -D__LANGUAGE_C_PLUS_PLUS -D__cplusplus} \%{.m: -D__LANGUAGE_OBJECTIVE_C__ -D__LANGUAGE_OBJECTIVE_C} \-remap \%(cpp_cpu) \%{posix:-D_POSIX_SOURCE} \-idirafter %$INTERIX_ROOT/usr/include"#undef TARGET_VERSION#define TARGET_VERSION fprintf (stderr, " (i386 Interix)");/* The global __fltused is necessary to cause the printf/scanf routines for outputting/inputting floating point numbers to be loaded. Since this is kind of hard to detect, we just do it all the time. */#ifdef ASM_FILE_START#undef ASM_FILE_START#endif#define ASM_FILE_START(FILE) \ do { fprintf (FILE, "\t.file\t"); \ output_quoted_string (FILE, dump_base_name); \ fprintf (FILE, "\n"); \ fprintf (FILE, ".global\t__fltused\n"); \ } while (0)/* A table of bytes codes used by the ASM_OUTPUT_ASCII and ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table corresponds to a particular byte value [0..255]. For any given byte value, if the value in the corresponding table position is zero, the given character can be output directly. If the table value is 1, the byte must be output as a \ooo octal escape. If the tables value is anything else, then the byte value should be output as a \ followed by the value in the table. Note that we can use standard UN*X escape sequences for many control characters, but we don't use \a to represent BEL because some svr4 assemblers (e.g. on the i386) don't know about that. Also, we don't use \v since some versions of gas, such as 2.2 did not accept it. */#define ESCAPES \"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"/* Some svr4 assemblers have a limit on the number of characters which can appear in the operand of a .string directive. If your assembler has such a limitation, you should define STRING_LIMIT to reflect that limit. Note that at least some svr4 assemblers have a limit on the actual number of bytes in the double-quoted string, and that they count each character in an escape sequence as one byte. Thus, an escape sequence like \377 would count as four bytes. If your target assembler doesn't support the .string directive, you should define this to zero.*/#define STRING_LIMIT ((unsigned) 256)#define STRING_ASM_OP ".string"/* The routine used to output NUL terminated strings. We use a special version of this for most svr4 targets because doing so makes the generated assembly code more compact (and thus faster to assemble) as well as more readable, especially for targets like the i386 (where the only alternative is to output character sequences as comma separated lists of numbers). */#define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \ do \ { \ register unsigned char *_limited_str = (unsigned char *) (STR); \ register unsigned ch; \ fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP); \ for (; (ch = *_limited_str); _limited_str++) \ { \ register int escape = ESCAPES[ch]; \ switch (escape) \ { \ case 0: \ putc (ch, (FILE)); \ break; \ case 1: \ fprintf ((FILE), "\\%03o", ch); \ break; \ default: \ putc ('\\', (FILE)); \ putc (escape, (FILE)); \ break; \ } \ } \ fprintf ((FILE), "\"\n"); \ } \ while (0)/* The routine used to output sequences of byte values. We use a special version of this for most svr4 targets because doing so makes the generated assembly code more compact (and thus faster to assemble) as well as more readable. Note that if we find subparts of the character sequence which end with NUL (and which are shorter than STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */#undef ASM_OUTPUT_ASCII#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \ do \ { \ register unsigned char *_ascii_bytes = (unsigned char *) (STR); \ register unsigned char *limit = _ascii_bytes + (LENGTH); \ register unsigned bytes_in_chunk = 0; \ for (; _ascii_bytes < limit; _ascii_bytes++) \ { \ register unsigned char *p; \ if (bytes_in_chunk >= 64) \ { \ fputc ('\n', (FILE)); \ bytes_in_chunk = 0; \ } \ for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \ continue; \ if (p < limit && (p - _ascii_bytes) <= STRING_LIMIT) \ { \ if (bytes_in_chunk > 0) \ { \ fputc ('\n', (FILE)); \ bytes_in_chunk = 0; \ } \ ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \ _ascii_bytes = p; \ } \ else \ { \ if (bytes_in_chunk == 0) \ fprintf ((FILE), "\t.byte\t"); \ else \ fputc (',', (FILE)); \ fprintf ((FILE), "0x%02x", *_ascii_bytes); \ bytes_in_chunk += 5; \ } \ } \ if (bytes_in_chunk > 0) \ fprintf ((FILE), "\n"); \ } \ while (0)/* This is how to output an element of a case-vector that is relative. This is only used for PIC code. See comments by the `casesi' insn in i386.md for an explanation of the expression this outputs. PE format differs on what PC-relative offsets look like (see coff_i386_rtype_to_howto), and we need to compensate (by one word) here. */#undef ASM_OUTPUT_ADDR_DIFF_ELT#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ fprintf (FILE, "\t.long __GLOBAL_OFFSET_TABLE_+[.-%s%d+4]\n", LPREFIX, VALUE)/* Indicate that jump tables go in the text section. This is necessary when compiling PIC code. */#define JUMP_TABLES_IN_TEXT_SECTION 1/* Emit code to check the stack when allocating more that 4000 bytes in one go. */#define CHECK_STACK_LIMIT 0x1000/* the following are OSF linker (not gld) specific... we don't want them */#undef HAS_INIT_SECTION#undef LD_INIT_SWITCH#undef LD_FINI_SWITCH/* The following are needed for C++, but also needed for profiling *//* Support const sections and the ctors and dtors sections for g++. Note that there appears to be two different ways to support const sections at the moment. You can either #define the symbol READONLY_DATA_SECTION (giving it some code which switches to the readonly data section) or else you can #define the symbols EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and SELECT_RTX_SECTION. We do both here just to be on the safe side. */#define USE_CONST_SECTION 1#define CONST_SECTION_ASM_OP ".section\t.rdata,\"r\""/* Define the pseudo-ops used to switch to the .ctors and .dtors sections. Note that we want to give these sections the SHF_WRITE attribute because these sections will actually contain data (i.e. tables of addresses of functions in the current root executable or shared library file) and, in the case of a shared library, the relocatable addresses will have to be properly resolved/relocated (and then written into) by the dynamic linker when it actually attaches the given shared library to the executing process. (Note that on SVR4, you may wish to use the `-z text' option to the ELF linker, when building a shared library, as an additional check that you are doing everything right. But if you do use the `-z text' option when building a shared library, you will get errors unless the .ctors and .dtors sections are marked as writable via the SHF_WRITE attribute.) */#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"x\""#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"x\""
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -