/contrib/sdk/sources/gcc_eh/Makefile |
---|
0,0 → 1,55 |
LIBRARY= gcc_eh |
CC=gcc |
CPP=g++ |
CFLAGS = -U_Win32 -U_WIN32 -U__MINGW32__ -c -O2 -fomit-frame-pointer |
LD = ld |
AR= ar |
STRIP = $(PREFIX)strip |
INCLUDES= -I. -I../newlib/include |
LIBS:= -ldll -lc.dll |
DEFINES= -DIN_GCC -DUSE_EMUTLS=1 |
SOURCES = unwind-c.c \ |
unwind-dw2.c \ |
unwind-dw2-fde.c |
OBJECTS = $(patsubst %.cc, %.o, $(patsubst %.c, %.o, $(SOURCES))) |
# targets |
all:$(LIBRARY).a |
$(LIBRARY).a: $(OBJECTS) Makefile |
ar cvrs $(LIBRARY).a $(OBJECTS) |
mv -f $(LIBRARY).a ../../lib |
%.o : %.c Makefile |
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< |
%.o : %.cc Makefile |
$(CPP) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< |
clean: |
-rm -f *.o |
/contrib/sdk/sources/gcc_eh/ansidecl.h |
---|
0,0 → 1,423 |
/* ANSI and traditional C compatability macros |
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, |
2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of the GNU C Library. |
This program 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 2 of the License, or |
(at your option) any later version. |
This program 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 this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* ANSI and traditional C compatibility macros |
ANSI C is assumed if __STDC__ is #defined. |
Macro ANSI C definition Traditional C definition |
----- ---- - ---------- ----------- - ---------- |
ANSI_PROTOTYPES 1 not defined |
PTR `void *' `char *' |
PTRCONST `void *const' `char *' |
LONG_DOUBLE `long double' `double' |
const not defined `' |
volatile not defined `' |
signed not defined `' |
VA_START(ap, var) va_start(ap, var) va_start(ap) |
Note that it is safe to write "void foo();" indicating a function |
with no return value, in all K+R compilers we have been able to test. |
For declaring functions with prototypes, we also provide these: |
PARAMS ((prototype)) |
-- for functions which take a fixed number of arguments. Use this |
when declaring the function. When defining the function, write a |
K+R style argument list. For example: |
char *strcpy PARAMS ((char *dest, char *source)); |
... |
char * |
strcpy (dest, source) |
char *dest; |
char *source; |
{ ... } |
VPARAMS ((prototype, ...)) |
-- for functions which take a variable number of arguments. Use |
PARAMS to declare the function, VPARAMS to define it. For example: |
int printf PARAMS ((const char *format, ...)); |
... |
int |
printf VPARAMS ((const char *format, ...)) |
{ |
... |
} |
For writing functions which take variable numbers of arguments, we |
also provide the VA_OPEN, VA_CLOSE, and VA_FIXEDARG macros. These |
hide the differences between K+R <varargs.h> and C89 <stdarg.h> more |
thoroughly than the simple VA_START() macro mentioned above. |
VA_OPEN and VA_CLOSE are used *instead of* va_start and va_end. |
Immediately after VA_OPEN, put a sequence of VA_FIXEDARG calls |
corresponding to the list of fixed arguments. Then use va_arg |
normally to get the variable arguments, or pass your va_list object |
around. You do not declare the va_list yourself; VA_OPEN does it |
for you. |
Here is a complete example: |
int |
printf VPARAMS ((const char *format, ...)) |
{ |
int result; |
VA_OPEN (ap, format); |
VA_FIXEDARG (ap, const char *, format); |
result = vfprintf (stdout, format, ap); |
VA_CLOSE (ap); |
return result; |
} |
You can declare variables either before or after the VA_OPEN, |
VA_FIXEDARG sequence. Also, VA_OPEN and VA_CLOSE are the beginning |
and end of a block. They must appear at the same nesting level, |
and any variables declared after VA_OPEN go out of scope at |
VA_CLOSE. Unfortunately, with a K+R compiler, that includes the |
argument list. You can have multiple instances of VA_OPEN/VA_CLOSE |
pairs in a single function in case you need to traverse the |
argument list more than once. |
For ease of writing code which uses GCC extensions but needs to be |
portable to other compilers, we provide the GCC_VERSION macro that |
simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various |
wrappers around __attribute__. Also, __extension__ will be #defined |
to nothing if it doesn't work. See below. |
This header also defines a lot of obsolete macros: |
CONST, VOLATILE, SIGNED, PROTO, EXFUN, DEFUN, DEFUN_VOID, |
AND, DOTS, NOARGS. Don't use them. */ |
#ifndef _ANSIDECL_H |
#define _ANSIDECL_H 1 |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* Every source file includes this file, |
so they will all get the switch for lint. */ |
/* LINTLIBRARY */ |
/* Using MACRO(x,y) in cpp #if conditionals does not work with some |
older preprocessors. Thus we can't define something like this: |
#define HAVE_GCC_VERSION(MAJOR, MINOR) \ |
(__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR))) |
and then test "#if HAVE_GCC_VERSION(2,7)". |
So instead we use the macro below and test it against specific values. */ |
/* This macro simplifies testing whether we are using gcc, and if it |
is of a particular minimum version. (Both major & minor numbers are |
significant.) This macro will evaluate to 0 if we are not using |
gcc at all. */ |
#ifndef GCC_VERSION |
#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) |
#endif /* GCC_VERSION */ |
#if defined (__STDC__) || defined(__cplusplus) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32) |
/* All known AIX compilers implement these things (but don't always |
define __STDC__). The RISC/OS MIPS compiler defines these things |
in SVR4 mode, but does not define __STDC__. */ |
/* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other |
C++ compilers, does not define __STDC__, though it acts as if this |
was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */ |
#define ANSI_PROTOTYPES 1 |
#define PTR void * |
#define PTRCONST void *const |
#define LONG_DOUBLE long double |
/* PARAMS is often defined elsewhere (e.g. by libintl.h), so wrap it in |
a #ifndef. */ |
#ifndef PARAMS |
#define PARAMS(ARGS) ARGS |
#endif |
#define VPARAMS(ARGS) ARGS |
#define VA_START(VA_LIST, VAR) va_start(VA_LIST, VAR) |
/* variadic function helper macros */ |
/* "struct Qdmy" swallows the semicolon after VA_OPEN/VA_FIXEDARG's |
use without inhibiting further decls and without declaring an |
actual variable. */ |
#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP, VAR); { struct Qdmy |
#define VA_CLOSE(AP) } va_end(AP); } |
#define VA_FIXEDARG(AP, T, N) struct Qdmy |
#undef const |
#undef volatile |
#undef signed |
/* inline requires special treatment; it's in C99, and GCC >=2.7 supports |
it too, but it's not in C89. */ |
#undef inline |
#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__)) |
/* it's a keyword */ |
#else |
# if GCC_VERSION >= 2007 |
# define inline __inline__ /* __inline__ prevents -pedantic warnings */ |
# else |
# define inline /* nothing */ |
# endif |
#endif |
/* These are obsolete. Do not use. */ |
#ifndef IN_GCC |
#define CONST const |
#define VOLATILE volatile |
#define SIGNED signed |
#define PROTO(type, name, arglist) type name arglist |
#define EXFUN(name, proto) name proto |
#define DEFUN(name, arglist, args) name(args) |
#define DEFUN_VOID(name) name(void) |
#define AND , |
#define DOTS , ... |
#define NOARGS void |
#endif /* ! IN_GCC */ |
#else /* Not ANSI C. */ |
#undef ANSI_PROTOTYPES |
#define PTR char * |
#define PTRCONST PTR |
#define LONG_DOUBLE double |
#define PARAMS(args) () |
#define VPARAMS(args) (va_alist) va_dcl |
#define VA_START(va_list, var) va_start(va_list) |
#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP); { struct Qdmy |
#define VA_CLOSE(AP) } va_end(AP); } |
#define VA_FIXEDARG(AP, TYPE, NAME) TYPE NAME = va_arg(AP, TYPE) |
/* some systems define these in header files for non-ansi mode */ |
#undef const |
#undef volatile |
#undef signed |
#undef inline |
#define const |
#define volatile |
#define signed |
#define inline |
#ifndef IN_GCC |
#define CONST |
#define VOLATILE |
#define SIGNED |
#define PROTO(type, name, arglist) type name () |
#define EXFUN(name, proto) name() |
#define DEFUN(name, arglist, args) name arglist args; |
#define DEFUN_VOID(name) name() |
#define AND ; |
#define DOTS |
#define NOARGS |
#endif /* ! IN_GCC */ |
#endif /* ANSI C. */ |
/* Define macros for some gcc attributes. This permits us to use the |
macros freely, and know that they will come into play for the |
version of gcc in which they are supported. */ |
#if (GCC_VERSION < 2007) |
# define __attribute__(x) |
#endif |
/* Attribute __malloc__ on functions was valid as of gcc 2.96. */ |
#ifndef ATTRIBUTE_MALLOC |
# if (GCC_VERSION >= 2096) |
# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) |
# else |
# define ATTRIBUTE_MALLOC |
# endif /* GNUC >= 2.96 */ |
#endif /* ATTRIBUTE_MALLOC */ |
/* Attributes on labels were valid as of gcc 2.93 and g++ 4.5. For |
g++ an attribute on a label must be followed by a semicolon. */ |
#ifndef ATTRIBUTE_UNUSED_LABEL |
# ifndef __cplusplus |
# if GCC_VERSION >= 2093 |
# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED |
# else |
# define ATTRIBUTE_UNUSED_LABEL |
# endif |
# else |
# if GCC_VERSION >= 4005 |
# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED ; |
# else |
# define ATTRIBUTE_UNUSED_LABEL |
# endif |
# endif |
#endif |
#ifndef ATTRIBUTE_UNUSED |
#define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) |
#endif /* ATTRIBUTE_UNUSED */ |
/* Before GCC 3.4, the C++ frontend couldn't parse attributes placed after the |
identifier name. */ |
#if ! defined(__cplusplus) || (GCC_VERSION >= 3004) |
# define ARG_UNUSED(NAME) NAME ATTRIBUTE_UNUSED |
#else /* !__cplusplus || GNUC >= 3.4 */ |
# define ARG_UNUSED(NAME) NAME |
#endif /* !__cplusplus || GNUC >= 3.4 */ |
#ifndef ATTRIBUTE_NORETURN |
#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) |
#endif /* ATTRIBUTE_NORETURN */ |
/* Attribute `nonnull' was valid as of gcc 3.3. */ |
#ifndef ATTRIBUTE_NONNULL |
# if (GCC_VERSION >= 3003) |
# define ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m))) |
# else |
# define ATTRIBUTE_NONNULL(m) |
# endif /* GNUC >= 3.3 */ |
#endif /* ATTRIBUTE_NONNULL */ |
/* Attribute `pure' was valid as of gcc 3.0. */ |
#ifndef ATTRIBUTE_PURE |
# if (GCC_VERSION >= 3000) |
# define ATTRIBUTE_PURE __attribute__ ((__pure__)) |
# else |
# define ATTRIBUTE_PURE |
# endif /* GNUC >= 3.0 */ |
#endif /* ATTRIBUTE_PURE */ |
/* Use ATTRIBUTE_PRINTF when the format specifier must not be NULL. |
This was the case for the `printf' format attribute by itself |
before GCC 3.3, but as of 3.3 we need to add the `nonnull' |
attribute to retain this behavior. */ |
#ifndef ATTRIBUTE_PRINTF |
#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) ATTRIBUTE_NONNULL(m) |
#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2) |
#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3) |
#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4) |
#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5) |
#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6) |
#endif /* ATTRIBUTE_PRINTF */ |
/* Use ATTRIBUTE_FPTR_PRINTF when the format attribute is to be set on |
a function pointer. Format attributes were allowed on function |
pointers as of gcc 3.1. */ |
#ifndef ATTRIBUTE_FPTR_PRINTF |
# if (GCC_VERSION >= 3001) |
# define ATTRIBUTE_FPTR_PRINTF(m, n) ATTRIBUTE_PRINTF(m, n) |
# else |
# define ATTRIBUTE_FPTR_PRINTF(m, n) |
# endif /* GNUC >= 3.1 */ |
# define ATTRIBUTE_FPTR_PRINTF_1 ATTRIBUTE_FPTR_PRINTF(1, 2) |
# define ATTRIBUTE_FPTR_PRINTF_2 ATTRIBUTE_FPTR_PRINTF(2, 3) |
# define ATTRIBUTE_FPTR_PRINTF_3 ATTRIBUTE_FPTR_PRINTF(3, 4) |
# define ATTRIBUTE_FPTR_PRINTF_4 ATTRIBUTE_FPTR_PRINTF(4, 5) |
# define ATTRIBUTE_FPTR_PRINTF_5 ATTRIBUTE_FPTR_PRINTF(5, 6) |
#endif /* ATTRIBUTE_FPTR_PRINTF */ |
/* Use ATTRIBUTE_NULL_PRINTF when the format specifier may be NULL. A |
NULL format specifier was allowed as of gcc 3.3. */ |
#ifndef ATTRIBUTE_NULL_PRINTF |
# if (GCC_VERSION >= 3003) |
# define ATTRIBUTE_NULL_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) |
# else |
# define ATTRIBUTE_NULL_PRINTF(m, n) |
# endif /* GNUC >= 3.3 */ |
# define ATTRIBUTE_NULL_PRINTF_1 ATTRIBUTE_NULL_PRINTF(1, 2) |
# define ATTRIBUTE_NULL_PRINTF_2 ATTRIBUTE_NULL_PRINTF(2, 3) |
# define ATTRIBUTE_NULL_PRINTF_3 ATTRIBUTE_NULL_PRINTF(3, 4) |
# define ATTRIBUTE_NULL_PRINTF_4 ATTRIBUTE_NULL_PRINTF(4, 5) |
# define ATTRIBUTE_NULL_PRINTF_5 ATTRIBUTE_NULL_PRINTF(5, 6) |
#endif /* ATTRIBUTE_NULL_PRINTF */ |
/* Attribute `sentinel' was valid as of gcc 3.5. */ |
#ifndef ATTRIBUTE_SENTINEL |
# if (GCC_VERSION >= 3005) |
# define ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__)) |
# else |
# define ATTRIBUTE_SENTINEL |
# endif /* GNUC >= 3.5 */ |
#endif /* ATTRIBUTE_SENTINEL */ |
#ifndef ATTRIBUTE_ALIGNED_ALIGNOF |
# if (GCC_VERSION >= 3000) |
# define ATTRIBUTE_ALIGNED_ALIGNOF(m) __attribute__ ((__aligned__ (__alignof__ (m)))) |
# else |
# define ATTRIBUTE_ALIGNED_ALIGNOF(m) |
# endif /* GNUC >= 3.0 */ |
#endif /* ATTRIBUTE_ALIGNED_ALIGNOF */ |
/* Useful for structures whose layout must much some binary specification |
regardless of the alignment and padding qualities of the compiler. */ |
#ifndef ATTRIBUTE_PACKED |
# define ATTRIBUTE_PACKED __attribute__ ((packed)) |
#endif |
/* Attribute `hot' and `cold' was valid as of gcc 4.3. */ |
#ifndef ATTRIBUTE_COLD |
# if (GCC_VERSION >= 4003) |
# define ATTRIBUTE_COLD __attribute__ ((__cold__)) |
# else |
# define ATTRIBUTE_COLD |
# endif /* GNUC >= 4.3 */ |
#endif /* ATTRIBUTE_COLD */ |
#ifndef ATTRIBUTE_HOT |
# if (GCC_VERSION >= 4003) |
# define ATTRIBUTE_HOT __attribute__ ((__hot__)) |
# else |
# define ATTRIBUTE_HOT |
# endif /* GNUC >= 4.3 */ |
#endif /* ATTRIBUTE_HOT */ |
/* We use __extension__ in some places to suppress -pedantic warnings |
about GCC extensions. This feature didn't work properly before |
gcc 2.8. */ |
#if GCC_VERSION < 2008 |
#define __extension__ |
#endif |
/* This is used to declare a const variable which should be visible |
outside of the current compilation unit. Use it as |
EXPORTED_CONST int i = 1; |
This is because the semantics of const are different in C and C++. |
"extern const" is permitted in C but it looks strange, and gcc |
warns about it when -Wc++-compat is not used. */ |
#ifdef __cplusplus |
#define EXPORTED_CONST extern const |
#else |
#define EXPORTED_CONST const |
#endif |
#ifdef __cplusplus |
} |
#endif |
#endif /* ansidecl.h */ |
/contrib/sdk/sources/gcc_eh/auto-host.h |
---|
0,0 → 1,1911 |
/* auto-host.h. Generated from config.in by configure. */ |
/* config.in. Generated from configure.ac by autoheader. */ |
/* Define if building universal (internal helper macro) */ |
#ifndef USED_FOR_TARGET |
/* #undef AC_APPLE_UNIVERSAL_BUILD */ |
#endif |
/* Define as the number of bits in a byte, if `limits.h' doesn't. */ |
#ifndef USED_FOR_TARGET |
/* #undef CHAR_BIT */ |
#endif |
/* Define 0/1 to force the choice for exception handling model. */ |
#ifndef USED_FOR_TARGET |
#define CONFIG_SJLJ_EXCEPTIONS 0 |
#endif |
/* Define to enable the use of a default assembler. */ |
#ifndef USED_FOR_TARGET |
/* #undef DEFAULT_ASSEMBLER */ |
#endif |
/* Define to enable the use of a default linker. */ |
#ifndef USED_FOR_TARGET |
/* #undef DEFAULT_LINKER */ |
#endif |
/* Define if you want to use __cxa_atexit, rather than atexit, to register C++ |
destructors for local statics and global objects. This is essential for |
fully standards-compliant handling of destructors, but requires |
__cxa_atexit in libc. */ |
#ifndef USED_FOR_TARGET |
#define DEFAULT_USE_CXA_ATEXIT 2 |
#endif |
/* Define if you want assertions enabled. This is a cheap check. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_ASSERT_CHECKING 1 |
#endif |
/* Define if you want more run-time sanity checks. This one gets a grab bag of |
miscellaneous but relatively cheap checks. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_CHECKING 1 |
#endif |
/* Define to 1 to specify that we are using the BID decimal floating point |
format instead of DPD */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_DECIMAL_BID_FORMAT 0 |
#endif |
/* Define to 1 to enable decimal float extension to C. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_DECIMAL_FLOAT 0 |
#endif |
/* Define if you want more run-time sanity checks for dataflow. */ |
#ifndef USED_FOR_TARGET |
/* #undef ENABLE_DF_CHECKING */ |
#endif |
/* Define to 1 to enable fixed-point arithmetic extension to C. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_FIXED_POINT 0 |
#endif |
/* Define if you want fold checked that it never destructs its argument. This |
is quite expensive. */ |
#ifndef USED_FOR_TARGET |
/* #undef ENABLE_FOLD_CHECKING */ |
#endif |
/* Define if you want the garbage collector to operate in maximally paranoid |
mode, validating the entire heap and collecting garbage at every |
opportunity. This is extremely expensive. */ |
#ifndef USED_FOR_TARGET |
/* #undef ENABLE_GC_ALWAYS_COLLECT */ |
#endif |
/* Define if you want the garbage collector to do object poisoning and other |
memory allocation checks. This is quite expensive. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_GC_CHECKING 1 |
#endif |
/* Define if you want operations on GIMPLE (the basic data structure of the |
high-level optimizers) to be checked for dynamic type safety at runtime. |
This is moderately expensive. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_GIMPLE_CHECKING 1 |
#endif |
/* Define if gcc should always pass --build-id to linker. */ |
#ifndef USED_FOR_TARGET |
/* #undef ENABLE_LD_BUILDID */ |
#endif |
/* Define to enable LTO support. */ |
#ifndef USED_FOR_TARGET |
/* #undef ENABLE_LTO */ |
#endif |
/* Define to 1 if translation of program messages to the user's native |
language is requested. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_NLS 1 |
#endif |
/* Define to enable plugin support. */ |
#ifndef USED_FOR_TARGET |
/* #undef ENABLE_PLUGIN */ |
#endif |
/* Define if you want all operations on RTL (the basic data structure of the |
optimizer and back end) to be checked for dynamic type safety at runtime. |
This is quite expensive. */ |
#ifndef USED_FOR_TARGET |
/* #undef ENABLE_RTL_CHECKING */ |
#endif |
/* Define if you want RTL flag accesses to be checked against the RTL codes |
that are supported for each access macro. This is relatively cheap. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_RTL_FLAG_CHECKING 1 |
#endif |
/* Define if you want runtime assertions enabled. This is a cheap check. */ |
#define ENABLE_RUNTIME_CHECKING 1 |
/* Define if you want all operations on trees (the basic data structure of the |
front ends) to be checked for dynamic type safety at runtime. This is |
moderately expensive. The tree browser debugging routines will also be |
enabled by this option. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_TREE_CHECKING 1 |
#endif |
/* Define if you want all gimple types to be verified after gimplifiation. |
This is cheap. */ |
#ifndef USED_FOR_TARGET |
#define ENABLE_TYPES_CHECKING 1 |
#endif |
/* Define if you want to run subprograms and generated programs through |
valgrind (a memory checker). This is extremely expensive. */ |
#ifndef USED_FOR_TARGET |
/* #undef ENABLE_VALGRIND_CHECKING */ |
#endif |
/* Define to 1 if installation paths should be looked up in the Windows |
Registry. Ignored on non-Windows hosts. */ |
#ifndef USED_FOR_TARGET |
/* #undef ENABLE_WIN32_REGISTRY */ |
#endif |
/* Define to the name of a file containing a list of extra machine modes for |
this architecture. */ |
#ifndef USED_FOR_TARGET |
#define EXTRA_MODES_FILE "config/i386/i386-modes.def" |
#endif |
/* Define to enable detailed memory allocation stats gathering. */ |
#ifndef USED_FOR_TARGET |
/* #undef GATHER_STATISTICS */ |
#endif |
/* Define if the zone collector is in use */ |
#ifndef USED_FOR_TARGET |
/* #undef GGC_ZONE */ |
#endif |
/* mcontext_t fields start with __ */ |
#ifndef USED_FOR_TARGET |
/* #undef HAS_MCONTEXT_T_UNDERSCORES */ |
#endif |
/* Define if your assembler supports cmpb. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_CMPB */ |
#endif |
/* Define if your assembler supports the DCI/ICI instructions. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_DCI */ |
#endif |
/* Define if your assembler supports the --debug-prefix-map option. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_DEBUG_PREFIX_MAP 1 |
#endif |
/* Define if your assembler supports DFP instructions. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_DFP */ |
#endif |
/* Define if your assembler supports .dtprelword. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_DTPRELWORD */ |
#endif |
/* Define if your assembler supports dwarf2 .file/.loc directives, and |
preserves file table indices exactly as given. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_DWARF2_DEBUG_LINE 1 |
#endif |
/* Define if your assembler supports explicit relocations. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_EXPLICIT_RELOCS */ |
#endif |
/* Define if your assembler supports fprnd. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_FPRND */ |
#endif |
/* Define if your assembler supports the --gdwarf2 option. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_GDWARF2_DEBUG_FLAG 1 |
#endif |
/* Define if your assembler supports .gnu_attribute. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_GNU_ATTRIBUTE */ |
#endif |
/* Define true if the assembler supports '.long foo@GOTOFF'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_GOTOFF_IN_DATA 1 |
#endif |
/* Define if your assembler supports the --gstabs option. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_GSTABS_DEBUG_FLAG 1 |
#endif |
/* Define if your assembler supports the Sun syntax for cmov. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_IX86_CMOV_SUN_SYNTAX */ |
#endif |
/* Define if your assembler supports the subtraction of symbols in different |
sections. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_IX86_DIFF_SECT_DELTA 1 |
#endif |
/* Define if your assembler supports the ffreep mnemonic. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_IX86_FFREEP 1 |
#endif |
/* Define if your assembler uses fildq and fistq mnemonics. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_IX86_FILDQ 1 |
#endif |
/* Define if your assembler uses filds and fists mnemonics. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_IX86_FILDS 1 |
#endif |
/* Define if your assembler supports the .quad directive. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_IX86_QUAD 1 |
#endif |
/* Define true if the assembler supports 'rep <insn>, lock <insn>'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_IX86_REP_LOCK_PREFIX 1 |
#endif |
/* Define if your assembler supports the sahf mnemonic in 64bit mode. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_IX86_SAHF 1 |
#endif |
/* Define if your assembler supports the swap suffix. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_IX86_SWAP 1 |
#endif |
/* Define if your assembler supports the lituse_jsrdirect relocation. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_JSRDIRECT_RELOCS */ |
#endif |
/* Define if your assembler supports .sleb128 and .uleb128. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_LEB128 1 |
#endif |
/* Define if the assembler won't complain about a line such as # 0 "" 2. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_AS_LINE_ZERO 1 |
#endif |
/* Define if your assembler supports ltoffx and ldxmov relocations. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_LTOFFX_LDXMOV_RELOCS */ |
#endif |
/* Define if your assembler supports LWSYNC instructions. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_LWSYNC */ |
#endif |
/* Define if your assembler supports mfcr field. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_MFCRF */ |
#endif |
/* Define if your assembler supports mffgpr and mftgpr. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_MFPGPR */ |
#endif |
/* Define if your assembler supports the -no-mul-bug-abort option. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_NO_MUL_BUG_ABORT_OPTION */ |
#endif |
/* Define if the assembler understands -mno-shared. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_NO_SHARED */ |
#endif |
/* Define if your assembler supports offsetable %lo(). */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_OFFSETABLE_LO10 */ |
#endif |
/* Define if your assembler supports popcntb field. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_POPCNTB */ |
#endif |
/* Define if your assembler supports POPCNTD instructions. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_POPCNTD */ |
#endif |
/* Define if your assembler supports .ref */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_REF */ |
#endif |
/* Define if your assembler supports .register. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ |
#endif |
/* Define if your assembler supports R_PPC_REL16 relocs. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_REL16 */ |
#endif |
/* Define if your assembler supports -relax option. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_RELAX_OPTION */ |
#endif |
/* Define if your assembler and linker support GOTDATA_OP relocs. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_SPARC_GOTDATA_OP */ |
#endif |
/* Define if your assembler and linker support unaligned PC relative relocs. |
*/ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_SPARC_UA_PCREL */ |
#endif |
/* Define if your assembler and linker support unaligned PC relative relocs |
against hidden symbols. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_SPARC_UA_PCREL_HIDDEN */ |
#endif |
/* Define if your assembler supports thread-local storage. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_TLS */ |
#endif |
/* Define if your assembler supports arg info for __tls_get_addr. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_TLS_MARKERS */ |
#endif |
/* Define if your assembler supports VSX instructions. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_AS_VSX */ |
#endif |
/* Define to 1 if you have the `atoll' function. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_ATOLL 1 |
#endif |
/* Define to 1 if you have the `atoq' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_ATOQ */ |
#endif |
/* Define to 1 if you have the `clearerr_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_CLEARERR_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `clock' function. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_CLOCK 1 |
#endif |
/* Define if <time.h> defines clock_t. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_CLOCK_T 1 |
#endif |
/* Define 0/1 if your assembler and linker support COMDAT groups. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_COMDAT_GROUP 0 |
#endif |
/* Define to 1 if we found a declaration for 'abort', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_ABORT 1 |
#endif |
/* Define to 1 if we found a declaration for 'asprintf', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_ASPRINTF 0 |
#endif |
/* Define to 1 if we found a declaration for 'atof', otherwise define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_ATOF 1 |
#endif |
/* Define to 1 if we found a declaration for 'atol', otherwise define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_ATOL 1 |
#endif |
/* Define to 1 if we found a declaration for 'basename', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_BASENAME 0 |
#endif |
/* Define to 1 if we found a declaration for 'calloc', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_CALLOC 1 |
#endif |
/* Define to 1 if we found a declaration for 'clearerr_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_CLEARERR_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'clock', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_CLOCK 1 |
#endif |
/* Define to 1 if we found a declaration for 'errno', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_ERRNO 1 |
#endif |
/* Define to 1 if we found a declaration for 'feof_unlocked', otherwise define |
to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FEOF_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'ferror_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FERROR_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'fflush_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FFLUSH_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'fgetc_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FGETC_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'fgets_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FGETS_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'fileno_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FILENO_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'fprintf_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FPRINTF_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'fputc_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FPUTC_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'fputs_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FPUTS_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'fread_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FREAD_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'free', otherwise define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FREE 1 |
#endif |
/* Define to 1 if we found a declaration for 'fwrite_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_FWRITE_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'getchar_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_GETCHAR_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'getcwd', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_GETCWD 1 |
#endif |
/* Define to 1 if we found a declaration for 'getc_unlocked', otherwise define |
to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_GETC_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'getenv', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_GETENV 1 |
#endif |
/* Define to 1 if we found a declaration for 'getopt', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_GETOPT 0 |
#endif |
/* Define to 1 if we found a declaration for 'getpagesize', otherwise define |
to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_GETPAGESIZE 0 |
#endif |
/* Define to 1 if we found a declaration for 'getrlimit', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_GETRLIMIT 0 |
#endif |
/* Define to 1 if we found a declaration for 'getrusage', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_GETRUSAGE 0 |
#endif |
/* Define to 1 if we found a declaration for 'getwd', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_GETWD 0 |
#endif |
/* Define to 1 if we found a declaration for 'ldgetname', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_LDGETNAME 0 |
#endif |
/* Define to 1 if we found a declaration for 'malloc', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_MALLOC 1 |
#endif |
/* Define to 1 if we found a declaration for 'putchar_unlocked', otherwise |
define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_PUTCHAR_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'putc_unlocked', otherwise define |
to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_PUTC_UNLOCKED 0 |
#endif |
/* Define to 1 if we found a declaration for 'realloc', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_REALLOC 1 |
#endif |
/* Define to 1 if we found a declaration for 'sbrk', otherwise define to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_SBRK 0 |
#endif |
/* Define to 1 if we found a declaration for 'setrlimit', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_SETRLIMIT 0 |
#endif |
/* Define to 1 if we found a declaration for 'sigaltstack', otherwise define |
to 0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_SIGALTSTACK 0 |
#endif |
/* Define to 1 if we found a declaration for 'snprintf', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_SNPRINTF 1 |
#endif |
/* Define to 1 if we found a declaration for 'strsignal', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_STRSIGNAL 1 |
#endif |
/* Define to 1 if we found a declaration for 'strstr', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_STRSTR 1 |
#endif |
/* Define to 1 if we found a declaration for 'strverscmp', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_STRVERSCMP 0 |
#endif |
/* Define to 1 if we found a declaration for 'times', otherwise define to 0. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_TIMES 0 |
#endif |
/* Define to 1 if we found a declaration for 'vasprintf', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_VASPRINTF 0 |
#endif |
/* Define to 1 if we found a declaration for 'vsnprintf', otherwise define to |
0. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DECL_VSNPRINTF 1 |
#endif |
/* Define to 1 if you have the <direct.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_DIRECT_H 1 |
#endif |
/* Define to 1 if you have the <dlfcn.h> header file. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_DLFCN_H */ |
#endif |
/* Define to 1 if you have the `elf_getshdrstrndx' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_ELF_GETSHDRSTRNDX */ |
#endif |
/* Define to 1 if you have the `elf_getshstrndx' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_ELF_GETSHSTRNDX */ |
#endif |
/* Define if elf_getshstrndx has gABI conformant return values. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_ELF_GETSHSTRNDX_GABI */ |
#endif |
/* Define to 1 if you have the <fcntl.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_FCNTL_H 1 |
#endif |
/* Define to 1 if you have the `feof_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FEOF_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `ferror_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FERROR_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `fflush_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FFLUSH_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `fgetc_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FGETC_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `fgets_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FGETS_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `fileno_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FILENO_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `fork' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FORK */ |
#endif |
/* Define to 1 if you have the `fprintf_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FPRINTF_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `fputc_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FPUTC_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `fputs_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FPUTS_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `fread_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FREAD_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `fwrite_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_FWRITE_UNLOCKED */ |
#endif |
/* Define if your assembler supports specifying the alignment of objects |
allocated using the GAS .comm command. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_ALIGNED_COMM 1 |
#endif |
/* Define if your assembler supports .balign and .p2align. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_BALIGN_AND_P2ALIGN 1 |
#endif |
/* Define 0/1 if your assembler supports CFI directives. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_CFI_DIRECTIVE 0 |
#endif |
/* Define 0/1 if your assembler supports .cfi_personality. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_CFI_PERSONALITY_DIRECTIVE 1 |
#endif |
/* Define 0/1 if your assembler supports .cfi_sections. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_CFI_SECTIONS_DIRECTIVE 1 |
#endif |
/* Define if your assembler supports the .loc discriminator sub-directive. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_DISCRIMINATOR 1 |
#endif |
/* Define if your assembler supports @gnu_unique_object. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_GAS_GNU_UNIQUE_OBJECT */ |
#endif |
/* Define if your assembler and linker support .hidden. */ |
/* #undef HAVE_GAS_HIDDEN */ |
/* Define if your assembler supports .lcomm with an alignment field. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_LCOMM_WITH_ALIGNMENT 1 |
#endif |
/* Define if your assembler supports .literal16. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_GAS_LITERAL16 */ |
#endif |
/* Define if your assembler supports specifying the maximum number of bytes to |
skip when using the GAS .p2align command. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_MAX_SKIP_P2ALIGN 1 |
#endif |
/* Define if your assembler supports .nsubspa comdat option. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_GAS_NSUBSPA_COMDAT */ |
#endif |
/* Define if your assembler and linker support 32-bit section relative relocs |
via '.secrel32 label'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_PE_SECREL32_RELOC 1 |
#endif |
/* Define 0/1 if your assembler supports marking sections with SHF_MERGE flag. |
*/ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_SHF_MERGE 0 |
#endif |
/* Define if your assembler supports .subsection and .subsection -1 starts |
emitting at the beginning of your section. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_GAS_SUBSECTION_ORDERING */ |
#endif |
/* Define if your assembler supports .weak. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_WEAK 1 |
#endif |
/* Define if your assembler supports .weakref. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GAS_WEAKREF 1 |
#endif |
/* Define to 1 if you have the `getchar_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_GETCHAR_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `getc_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_GETC_UNLOCKED */ |
#endif |
/* Define if _Unwind_GetIPInfo is available. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GETIPINFO 1 |
#endif |
/* Define to 1 if you have the `getrlimit' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_GETRLIMIT */ |
#endif |
/* Define to 1 if you have the `getrusage' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_GETRUSAGE */ |
#endif |
/* Define to 1 if you have the `gettimeofday' function. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GETTIMEOFDAY 1 |
#endif |
/* Define if using GNU as. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GNU_AS 0 |
#endif |
/* Define if using GNU ld. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_GNU_LD 0 |
#endif |
/* Define if you have the iconv() function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_ICONV */ |
#endif |
/* Define to 1 if you have the <iconv.h> header file. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_ICONV_H */ |
#endif |
/* Define .init_array/.fini_array sections are available and working. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_INITFINI_ARRAY 1 |
#endif |
/* Define to 1 if the system has the type `intmax_t'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_INTMAX_T 1 |
#endif |
/* Define to 1 if the system has the type `intptr_t'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_INTPTR_T 1 |
#endif |
/* Define if you have a working <inttypes.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_INTTYPES_H 1 |
#endif |
/* Define to 1 if you have the `kill' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_KILL */ |
#endif |
/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LANGINFO_CODESET */ |
#endif |
/* Define to 1 if you have the <langinfo.h> header file. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LANGINFO_H */ |
#endif |
/* Define if your <locale.h> file defines LC_MESSAGES. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LC_MESSAGES */ |
#endif |
/* Define to 1 if you have the <ldfcn.h> header file. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LDFCN_H */ |
#endif |
/* Define if your linker supports --as-needed and --no-as-needed options. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_LD_AS_NEEDED 1 |
#endif |
/* Define if your linker supports --build-id. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LD_BUILDID */ |
#endif |
/* Define if your linker supports --demangle option. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LD_DEMANGLE */ |
#endif |
/* Define if your linker supports --eh-frame-hdr option. */ |
/* #undef HAVE_LD_EH_FRAME_HDR */ |
/* Define if your linker supports garbage collection of sections in presence |
of EH frames. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LD_EH_GC_SECTIONS */ |
#endif |
/* Define if your PowerPC64 linker only needs function descriptor syms. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LD_NO_DOT_SYMS */ |
#endif |
/* Define if your linker can relax absolute .eh_frame personality pointers |
into PC-relative form. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LD_PERSONALITY_RELAXATION */ |
#endif |
/* Define if your linker supports -pie option. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_LD_PIE 1 |
#endif |
/* Define if your linker links a mix of read-only and read-write sections into |
a read-write section. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LD_RO_RW_SECTION_MIXING */ |
#endif |
/* Define if your linker supports the *_sol2 emulations. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_LD_SOL2_EMULATION */ |
#endif |
/* Define if your linker supports -Bstatic/-Bdynamic option. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_LD_STATIC_DYNAMIC 1 |
#endif |
/* Define if your linker supports --sysroot. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_LD_SYSROOT 1 |
#endif |
/* Define to 1 if you have the <limits.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_LIMITS_H 1 |
#endif |
/* Define to 1 if you have the <locale.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_LOCALE_H 1 |
#endif |
/* Define to 1 if the system has the type `long long'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_LONG_LONG 1 |
#endif |
/* Define to 1 if the system has the type `long long int'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_LONG_LONG_INT 1 |
#endif |
/* Define to 1 if you have the <malloc.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_MALLOC_H 1 |
#endif |
/* Define to 1 if you have the `mbstowcs' function. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_MBSTOWCS 1 |
#endif |
/* Define if valgrind's memcheck.h header is installed. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_MEMCHECK_H */ |
#endif |
/* Define to 1 if you have the <memory.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_MEMORY_H 1 |
#endif |
/* Define to 1 if you have the `mincore' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_MINCORE */ |
#endif |
/* Define to 1 if you have the `mmap' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_MMAP */ |
#endif |
/* Define if mmap with MAP_ANON(YMOUS) works. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_MMAP_ANON */ |
#endif |
/* Define if mmap of /dev/zero works. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_MMAP_DEV_ZERO */ |
#endif |
/* Define if read-only mmap of a plain file works. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_MMAP_FILE */ |
#endif |
/* Define to 1 if you have the `nl_langinfo' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_NL_LANGINFO */ |
#endif |
/* Define to 1 if you have the `putchar_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_PUTCHAR_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `putc_unlocked' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_PUTC_UNLOCKED */ |
#endif |
/* Define to 1 if you have the `setlocale' function. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_SETLOCALE 1 |
#endif |
/* Define to 1 if you have the `setrlimit' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_SETRLIMIT */ |
#endif |
/* Define to 1 if you have the <stddef.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_STDDEF_H 1 |
#endif |
/* Define to 1 if you have the <stdint.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_STDINT_H 1 |
#endif |
/* Define to 1 if you have the <stdlib.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_STDLIB_H 1 |
#endif |
/* Define to 1 if you have the <strings.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_STRINGS_H 1 |
#endif |
/* Define to 1 if you have the <string.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_STRING_H 1 |
#endif |
/* Define to 1 if you have the `strsignal' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_STRSIGNAL */ |
#endif |
/* Define if <sys/times.h> defines struct tms. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_STRUCT_TMS */ |
#endif |
/* Define to 1 if you have the `sysconf' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_SYSCONF */ |
#endif |
/* Define to 1 if you have the <sys/file.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_SYS_FILE_H 1 |
#endif |
/* Define to 1 if you have the <sys/mman.h> header file. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_SYS_MMAN_H */ |
#endif |
/* Define to 1 if you have the <sys/param.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_SYS_PARAM_H 1 |
#endif |
/* Define to 1 if you have the <sys/resource.h> header file. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_SYS_RESOURCE_H */ |
#endif |
/* Define to 1 if you have the <sys/stat.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_SYS_STAT_H 1 |
#endif |
/* Define to 1 if you have the <sys/times.h> header file. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_SYS_TIMES_H */ |
#endif |
/* Define to 1 if you have the <sys/time.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_SYS_TIME_H 1 |
#endif |
/* Define to 1 if you have the <sys/types.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_SYS_TYPES_H 1 |
#endif |
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_SYS_WAIT_H */ |
#endif |
/* Define to 1 if you have the `times' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_TIMES */ |
#endif |
/* Define to 1 if you have the <time.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_TIME_H 1 |
#endif |
/* Define to 1 if the system has the type `uintmax_t'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_UINTMAX_T 1 |
#endif |
/* Define to 1 if the system has the type `uintptr_t'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_UINTPTR_T 1 |
#endif |
/* Define to 1 if you have the <unistd.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_UNISTD_H 1 |
#endif |
/* Define to 1 if the system has the type `unsigned long long int'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_UNSIGNED_LONG_LONG_INT 1 |
#endif |
/* Define if valgrind's valgrind/memcheck.h header is installed. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_VALGRIND_MEMCHECK_H */ |
#endif |
/* Define to 1 if you have the `vfork' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_VFORK */ |
#endif |
/* Define to 1 if you have the <vfork.h> header file. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_VFORK_H */ |
#endif |
/* Define to 1 if you have the <wchar.h> header file. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_WCHAR_H 1 |
#endif |
/* Define to 1 if you have the `wcswidth' function. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_WCSWIDTH */ |
#endif |
/* Define to 1 if `fork' works. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_WORKING_FORK */ |
#endif |
/* Define this macro if mbstowcs does not crash when its first argument is |
NULL. */ |
#ifndef USED_FOR_TARGET |
#define HAVE_WORKING_MBSTOWCS 1 |
#endif |
/* Define to 1 if `vfork' works. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_WORKING_VFORK */ |
#endif |
/* Define to 1 if the system has the type `__int64'. */ |
#ifndef USED_FOR_TARGET |
#define HAVE___INT64 1 |
#endif |
/* Define if cloog is in use. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_cloog */ |
#endif |
/* Define if libelf is in use. */ |
#ifndef USED_FOR_TARGET |
/* #undef HAVE_libelf */ |
#endif |
/* Define as const if the declaration of iconv() needs const. */ |
#ifndef USED_FOR_TARGET |
/* #undef ICONV_CONST */ |
#endif |
/* Define to the sub-directory in which libtool stores uninstalled libraries. |
*/ |
#ifndef USED_FOR_TARGET |
#define LT_OBJDIR ".libs/" |
#endif |
/* Define if host mkdir takes a single argument. */ |
#ifndef USED_FOR_TARGET |
#define MKDIR_TAKES_ONE_ARG 1 |
#endif |
/* Define to 1 if HOST_WIDE_INT must be 64 bits wide (see hwint.h). */ |
#ifndef USED_FOR_TARGET |
/* #undef NEED_64BIT_HOST_WIDE_INT */ |
#endif |
/* Define to 1 if your C compiler doesn't accept -c and -o together. */ |
#ifndef USED_FOR_TARGET |
/* #undef NO_MINUS_C_MINUS_O */ |
#endif |
/* Define to the address where bug reports for this package should be sent. */ |
#ifndef USED_FOR_TARGET |
#define PACKAGE_BUGREPORT "" |
#endif |
/* Define to the full name of this package. */ |
#ifndef USED_FOR_TARGET |
#define PACKAGE_NAME "" |
#endif |
/* Define to the full name and version of this package. */ |
#ifndef USED_FOR_TARGET |
#define PACKAGE_STRING "" |
#endif |
/* Define to the one symbol short name of this package. */ |
#ifndef USED_FOR_TARGET |
#define PACKAGE_TARNAME "" |
#endif |
/* Define to the home page for this package. */ |
#ifndef USED_FOR_TARGET |
#define PACKAGE_URL "" |
#endif |
/* Define to the version of this package. */ |
#ifndef USED_FOR_TARGET |
#define PACKAGE_VERSION "" |
#endif |
/* Specify plugin linker */ |
#ifndef USED_FOR_TARGET |
#define PLUGIN_LD "ld" |
#endif |
/* Define to PREFIX/include if cpp should also search that directory. */ |
#ifndef USED_FOR_TARGET |
#define PREFIX_INCLUDE_DIR "/mingw/include" |
#endif |
/* The size of `int', as computed by sizeof. */ |
#ifndef USED_FOR_TARGET |
#define SIZEOF_INT 4 |
#endif |
/* The size of `long', as computed by sizeof. */ |
#ifndef USED_FOR_TARGET |
#define SIZEOF_LONG 4 |
#endif |
/* The size of `long long', as computed by sizeof. */ |
#ifndef USED_FOR_TARGET |
#define SIZEOF_LONG_LONG 8 |
#endif |
/* The size of `short', as computed by sizeof. */ |
#ifndef USED_FOR_TARGET |
#define SIZEOF_SHORT 2 |
#endif |
/* The size of `void *', as computed by sizeof. */ |
#ifndef USED_FOR_TARGET |
#define SIZEOF_VOID_P 4 |
#endif |
/* The size of `__int64', as computed by sizeof. */ |
#ifndef USED_FOR_TARGET |
#define SIZEOF___INT64 8 |
#endif |
/* Define to 1 if you have the ANSI C header files. */ |
#ifndef USED_FOR_TARGET |
#define STDC_HEADERS 1 |
#endif |
/* Define if you can safely include both <string.h> and <strings.h>. */ |
#ifndef USED_FOR_TARGET |
#define STRING_WITH_STRINGS 1 |
#endif |
/* Define if TFmode long double should be the default */ |
#ifndef USED_FOR_TARGET |
/* #undef TARGET_DEFAULT_LONG_DOUBLE_128 */ |
#endif |
/* Define if your target C library provides stack protector support */ |
#ifndef USED_FOR_TARGET |
/* #undef TARGET_LIBC_PROVIDES_SSP */ |
#endif |
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ |
#ifndef USED_FOR_TARGET |
#define TIME_WITH_SYS_TIME 1 |
#endif |
/* Define to the flag used to mark TLS sections if the default (`T') doesn't |
work. */ |
#ifndef USED_FOR_TARGET |
/* #undef TLS_SECTION_ASM_FLAG */ |
#endif |
/* Define if your assembler mis-optimizes .eh_frame data. */ |
#ifndef USED_FOR_TARGET |
/* #undef USE_AS_TRADITIONAL_FORMAT */ |
#endif |
/* Define if you want to generate code by default that assumes that the Cygwin |
DLL exports wrappers to support libstdc++ function replacement. */ |
#ifndef USED_FOR_TARGET |
/* #undef USE_CYGWIN_LIBSTDCXX_WRAPPERS */ |
#endif |
/* Define to 1 if the 'long long' (or '__int64') is wider than 'long' but |
still efficiently supported by the host hardware. */ |
#ifndef USED_FOR_TARGET |
/* #undef USE_LONG_LONG_FOR_WIDEST_FAST_INT */ |
#endif |
/* Define if we should use leading underscore on 64 bit mingw targets */ |
#ifndef USED_FOR_TARGET |
/* #undef USE_MINGW64_LEADING_UNDERSCORES */ |
#endif |
/* Enable extensions on AIX 3, Interix. */ |
#ifndef _ALL_SOURCE |
# define _ALL_SOURCE 1 |
#endif |
/* Enable GNU extensions on systems that have them. */ |
#ifndef _GNU_SOURCE |
# define _GNU_SOURCE 1 |
#endif |
/* Enable threading extensions on Solaris. */ |
#ifndef _POSIX_PTHREAD_SEMANTICS |
# define _POSIX_PTHREAD_SEMANTICS 1 |
#endif |
/* Enable extensions on HP NonStop. */ |
#ifndef _TANDEM_SOURCE |
# define _TANDEM_SOURCE 1 |
#endif |
/* Enable general extensions on Solaris. */ |
#ifndef __EXTENSIONS__ |
# define __EXTENSIONS__ 1 |
#endif |
/* Define to be the last component of the Windows registry key under which to |
look for installation paths. The full key used will be |
HKEY_LOCAL_MACHINE/SOFTWARE/Free Software Foundation/{WIN32_REGISTRY_KEY}. |
The default is the GCC version number. */ |
#ifndef USED_FOR_TARGET |
/* #undef WIN32_REGISTRY_KEY */ |
#endif |
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most |
significant byte first (like Motorola and SPARC, unlike Intel). */ |
#if defined AC_APPLE_UNIVERSAL_BUILD |
# if defined __BIG_ENDIAN__ |
# define WORDS_BIGENDIAN 1 |
# endif |
#else |
# ifndef WORDS_BIGENDIAN |
/* # undef WORDS_BIGENDIAN */ |
# endif |
#endif |
/* Define to 1 if on MINIX. */ |
#ifndef USED_FOR_TARGET |
/* #undef _MINIX */ |
#endif |
/* Define to 2 if the system does not provide POSIX.1 features except with |
this defined. */ |
#ifndef USED_FOR_TARGET |
/* #undef _POSIX_1_SOURCE */ |
#endif |
/* Define to 1 if you need to in order for `stat' and other things to work. */ |
#ifndef USED_FOR_TARGET |
/* #undef _POSIX_SOURCE */ |
#endif |
/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>, |
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the |
#define below would cause a syntax error. */ |
#ifndef USED_FOR_TARGET |
/* #undef _UINT32_T */ |
#endif |
/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>, |
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the |
#define below would cause a syntax error. */ |
#ifndef USED_FOR_TARGET |
/* #undef _UINT64_T */ |
#endif |
/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>, |
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the |
#define below would cause a syntax error. */ |
#ifndef USED_FOR_TARGET |
/* #undef _UINT8_T */ |
#endif |
/* Define to `char *' if <sys/types.h> does not define. */ |
#ifndef USED_FOR_TARGET |
#define caddr_t char * |
#endif |
/* Define to `__inline__' or `__inline' if that's what the C compiler |
calls it, or to nothing if 'inline' is not supported under any name. */ |
#ifndef __cplusplus |
/* #undef inline */ |
#endif |
/* Define to the type of a signed integer type of width exactly 16 bits if |
such a type exists and the standard includes do not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef int16_t */ |
#endif |
/* Define to the type of a signed integer type of width exactly 32 bits if |
such a type exists and the standard includes do not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef int32_t */ |
#endif |
/* Define to the type of a signed integer type of width exactly 64 bits if |
such a type exists and the standard includes do not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef int64_t */ |
#endif |
/* Define to the type of a signed integer type of width exactly 8 bits if such |
a type exists and the standard includes do not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef int8_t */ |
#endif |
/* Define to the widest signed integer type if <stdint.h> and <inttypes.h> do |
not define. */ |
#ifndef USED_FOR_TARGET |
/* #undef intmax_t */ |
#endif |
/* Define to the type of a signed integer type wide enough to hold a pointer, |
if such a type exists, and if the system does not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef intptr_t */ |
#endif |
/* Define to `int' if <sys/types.h> does not define. */ |
#ifndef USED_FOR_TARGET |
/* #undef pid_t */ |
#endif |
/* Define to `long' if <sys/resource.h> doesn't define. */ |
#ifndef USED_FOR_TARGET |
#define rlim_t long |
#endif |
/* Define to `int' if <sys/types.h> does not define. */ |
#ifndef USED_FOR_TARGET |
/* #undef ssize_t */ |
#endif |
/* Define to the type of an unsigned integer type of width exactly 16 bits if |
such a type exists and the standard includes do not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef uint16_t */ |
#endif |
/* Define to the type of an unsigned integer type of width exactly 32 bits if |
such a type exists and the standard includes do not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef uint32_t */ |
#endif |
/* Define to the type of an unsigned integer type of width exactly 64 bits if |
such a type exists and the standard includes do not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef uint64_t */ |
#endif |
/* Define to the type of an unsigned integer type of width exactly 8 bits if |
such a type exists and the standard includes do not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef uint8_t */ |
#endif |
/* Define to the widest unsigned integer type if <stdint.h> and <inttypes.h> |
do not define. */ |
#ifndef USED_FOR_TARGET |
/* #undef uintmax_t */ |
#endif |
/* Define to the type of an unsigned integer type wide enough to hold a |
pointer, if such a type exists, and if the system does not define it. */ |
#ifndef USED_FOR_TARGET |
/* #undef uintptr_t */ |
#endif |
/* Define as `fork' if `vfork' does not work. */ |
#ifndef USED_FOR_TARGET |
#define vfork fork |
#endif |
/contrib/sdk/sources/gcc_eh/config/dbxcoff.h |
---|
0,0 → 1,62 |
/* Definitions needed when using stabs embedded in COFF sections. |
Copyright (C) 1996, 2004, 2007 Free Software Foundation, Inc. |
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/>. */ |
/* This file may be included by any COFF target which wishes to |
support -gstabs generating stabs in sections, as produced by gas |
and understood by gdb. */ |
/* Output DBX (stabs) debugging information if doing -gstabs. */ |
#define DBX_DEBUGGING_INFO 1 |
/* Generate SDB debugging information by default. */ |
#ifndef PREFERRED_DEBUGGING_TYPE |
#define PREFERRED_DEBUGGING_TYPE SDB_DEBUG |
#endif |
/* Be function-relative for block and source line stab directives. */ |
#define DBX_BLOCKS_FUNCTION_RELATIVE 1 |
/* but, to make this work, functions must appear prior to line info. */ |
#define DBX_FUNCTION_FIRST |
/* Generate a blank trailing N_SO to mark the end of the .o file, since |
we can't depend upon the linker to mark .o file boundaries with |
embedded stabs. */ |
#define DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END |
/* Like block addresses, stabs line numbers are relative to the |
current function. */ |
#define DBX_LINES_FUNCTION_RELATIVE 1 |
/* When generating stabs debugging, use N_BINCL entries. */ |
#undef DBX_USE_BINCL |
#define DBX_USE_BINCL |
/* There is no limit to the length of stabs strings. */ |
#ifndef DBX_CONTIN_LENGTH |
#define DBX_CONTIN_LENGTH 0 |
#endif |
/contrib/sdk/sources/gcc_eh/config/i386/bsd.h |
---|
0,0 → 1,100 |
/* Definitions for BSD assembler syntax for Intel 386 |
(actually AT&T syntax for insns and operands, |
adapted to BSD conventions for symbol names and debugging.) |
Copyright (C) 1988, 1996, 2000, 2002, 2007, 2008 |
Free Software Foundation, Inc. |
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/>. */ |
/* Use the Sequent Symmetry assembler syntax. */ |
/* Define the syntax of pseudo-ops, labels and comments. */ |
/* Prefix for internally generated assembler labels. If we aren't using |
underscores, we are using prefix `.'s to identify labels that should |
be ignored, as in `i386/gas.h' --karl@cs.umb.edu */ |
#define LPREFIX "L" |
/* Assembler pseudos to introduce constants of various size. */ |
#define ASM_BYTE "\t.byte\t" |
#define ASM_SHORT "\t.word\t" |
#define ASM_LONG "\t.long\t" |
#define ASM_QUAD "\t.quad\t" /* Should not be used for 32bit compilation. */ |
/* This was suggested, but it shouldn't be right for DBX output. -- RMS |
#define ASM_OUTPUT_SOURCE_FILENAME(FILE, NAME) */ |
/* Define the syntax of labels and symbol definitions/declarations. */ |
/* This is how to output an assembler line |
that says to advance the location counter by SIZE bytes. */ |
#define ASM_OUTPUT_SKIP(FILE,SIZE) \ |
fprintf (FILE, "\t.space "HOST_WIDE_INT_PRINT_UNSIGNED"\n", (SIZE)) |
/* Define the syntax of labels and symbol definitions/declarations. */ |
/* This says how to output an assembler line |
to define a global common symbol. */ |
#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \ |
( fputs (".comm ", (FILE)), \ |
assemble_name ((FILE), (NAME)), \ |
fprintf ((FILE), ",%u\n", (int)(ROUNDED))) |
/* This says how to output an assembler line |
to define a local common symbol. */ |
#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \ |
( fputs (".lcomm ", (FILE)), \ |
assemble_name ((FILE), (NAME)), \ |
fprintf ((FILE), ",%u\n", (int)(ROUNDED))) |
#ifdef HAVE_GAS_LCOMM_WITH_ALIGNMENT |
#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGNMENT) \ |
( fputs (".lcomm ", (FILE)), \ |
assemble_name ((FILE), (NAME)), \ |
fprintf ((FILE), ",%u,%u\n", (int)(SIZE), (int)(ALIGNMENT) / BITS_PER_UNIT)) |
#endif |
/* 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 is how to store into the string BUF |
the symbol_ref name of an internal numbered label where |
PREFIX is the class of label and NUM is the number within the class. |
This is suitable for output with `assemble_name'. */ |
#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ |
sprintf ((BUF), "*%s%ld", (PREFIX), (long)(NUMBER)) |
/* The prefix to add to user-visible assembler symbols. */ |
#define USER_LABEL_PREFIX "_" |
/* Sequent has some changes in the format of DBX symbols. */ |
#define DBX_NO_XREFS 1 |
/* Don't split DBX symbols into continuations. */ |
#define DBX_CONTIN_LENGTH 0 |
/contrib/sdk/sources/gcc_eh/config/i386/cygming.h |
---|
0,0 → 1,448 |
/* Operating system specific defines to be used when targeting GCC for |
hosting on Windows32, using a Unix style C library and tools. |
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, |
2004, 2005, 2007, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
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/>. */ |
#define DBX_DEBUGGING_INFO 1 |
#define SDB_DEBUGGING_INFO 1 |
#if TARGET_64BIT_DEFAULT || defined (HAVE_GAS_PE_SECREL32_RELOC) |
#define DWARF2_DEBUGGING_INFO 1 |
#endif |
#undef PREFERRED_DEBUGGING_TYPE |
#if (DWARF2_DEBUGGING_INFO) |
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG |
#else |
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG |
#endif |
#undef TARGET_64BIT_MS_ABI |
#define TARGET_64BIT_MS_ABI (!cfun ? ix86_abi == MS_ABI : TARGET_64BIT && cfun->machine->call_abi == MS_ABI) |
#undef DEFAULT_ABI |
#define DEFAULT_ABI (TARGET_64BIT ? MS_ABI : SYSV_ABI) |
#if ! defined (USE_MINGW64_LEADING_UNDERSCORES) |
#undef USER_LABEL_PREFIX |
#define USER_LABEL_PREFIX (TARGET_64BIT ? "" : "_") |
#undef LOCAL_LABEL_PREFIX |
#define LOCAL_LABEL_PREFIX (TARGET_64BIT ? "." : "") |
#undef ASM_GENERATE_INTERNAL_LABEL |
#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ |
sprintf ((BUF), "*%s%s%ld", LOCAL_LABEL_PREFIX, \ |
(PREFIX), (long)(NUMBER)) |
#undef LPREFIX |
#define LPREFIX (TARGET_64BIT ? ".L" : "L") |
#endif |
#undef DBX_REGISTER_NUMBER |
#define DBX_REGISTER_NUMBER(n) \ |
(TARGET_64BIT ? dbx64_register_map[n] \ |
: (write_symbols == DWARF2_DEBUG \ |
? svr4_dbx_register_map[n] : dbx_register_map[n])) |
/* Map gcc register number to DWARF 2 CFA column number. For 32 bit |
target, always use the svr4_dbx_register_map for DWARF .eh_frame |
even if we don't use DWARF .debug_frame. */ |
#undef DWARF_FRAME_REGNUM |
#define DWARF_FRAME_REGNUM(n) \ |
(TARGET_64BIT ? dbx64_register_map[(n)] \ |
: svr4_dbx_register_map[(n)]) |
#ifdef HAVE_GAS_PE_SECREL32_RELOC |
/* Use section relative relocations for debugging offsets. Unlike |
other targets that fake this by putting the section VMA at 0, PE |
won't allow it. */ |
#define ASM_OUTPUT_DWARF_OFFSET(FILE, SIZE, LABEL, SECTION) \ |
do { \ |
switch (SIZE) \ |
{ \ |
case 4: \ |
fputs ("\t.secrel32\t", FILE); \ |
assemble_name (FILE, LABEL); \ |
break; \ |
case 8: \ |
/* This is a hack. There is no 64-bit section relative \ |
relocation. However, the COFF format also does not \ |
support 64-bit file offsets; 64-bit applications are \ |
limited to 32-bits of code+data in any one module. \ |
Fake the 64-bit offset by zero-extending it. */ \ |
fputs ("\t.secrel32\t", FILE); \ |
assemble_name (FILE, LABEL); \ |
fputs ("\n\t.long\t0", FILE); \ |
break; \ |
default: \ |
gcc_unreachable (); \ |
} \ |
} while (0) |
#endif |
#define TARGET_EXECUTABLE_SUFFIX ".exe" |
#include <stdio.h> |
#define TARGET_OS_CPP_BUILTINS() \ |
do \ |
{ \ |
if (!TARGET_64BIT) \ |
builtin_define ("_X86_=1"); \ |
builtin_assert ("system=winnt"); \ |
builtin_define ("__stdcall=__attribute__((__stdcall__))"); \ |
builtin_define ("__fastcall=__attribute__((__fastcall__))"); \ |
builtin_define ("__cdecl=__attribute__((__cdecl__))"); \ |
if (!flag_iso) \ |
{ \ |
builtin_define ("_stdcall=__attribute__((__stdcall__))"); \ |
builtin_define ("_fastcall=__attribute__((__fastcall__))"); \ |
builtin_define ("_cdecl=__attribute__((__cdecl__))"); \ |
} \ |
/* Even though linkonce works with static libs, this is needed \ |
to compare typeinfo symbols across dll boundaries. */ \ |
builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \ |
builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0"); \ |
EXTRA_OS_CPP_BUILTINS (); \ |
} \ |
while (0) |
/* Get tree.c to declare a target-specific specialization of |
merge_decl_attributes. */ |
#define TARGET_DLLIMPORT_DECL_ATTRIBUTES 1 |
/* This macro defines names of additional specifications to put in the specs |
that can be used in various specifications like CC1_SPEC. Its definition |
is an initializer with a subgrouping for each command option. |
Each subgrouping contains a string constant, that defines the |
specification name, and a string constant that used by the GCC driver |
program. |
Do not define this macro if it does not need to do anything. */ |
#undef SUBTARGET_EXTRA_SPECS |
#define SUBTARGET_EXTRA_SPECS \ |
{ "mingw_include_path", DEFAULT_TARGET_MACHINE } |
#undef MATH_LIBRARY |
#define MATH_LIBRARY "" |
#define SIZE_TYPE (TARGET_64BIT ? "long long unsigned int" : "unsigned int") |
#define PTRDIFF_TYPE (TARGET_64BIT ? "long long int" : "int") |
#define WCHAR_TYPE_SIZE 16 |
#define WCHAR_TYPE "short unsigned int" |
/* Windows64 continues to use a 32-bit long type. */ |
#undef LONG_TYPE_SIZE |
#define LONG_TYPE_SIZE 32 |
/* Enable parsing of #pragma pack(push,<n>) and #pragma pack(pop). */ |
#define HANDLE_PRAGMA_PACK_PUSH_POP 1 |
union tree_node; |
#define TREE union tree_node * |
#define drectve_section() \ |
(fprintf (asm_out_file, "\t.section .drectve\n"), \ |
in_section = NULL) |
/* Older versions of gas don't handle 'r' as data. |
Explicitly set data flag with 'd'. */ |
#define READONLY_DATA_SECTION_ASM_OP "\t.section .rdata,\"dr\"" |
/* Don't allow flag_pic to propagate since gas may produce invalid code |
otherwise. */ |
#undef SUBTARGET_OVERRIDE_OPTIONS |
#define SUBTARGET_OVERRIDE_OPTIONS \ |
do { \ |
if (TARGET_64BIT && flag_pic != 1) \ |
{ \ |
if (flag_pic > 1) \ |
warning (0, \ |
"-fPIC ignored for target (all code is position independent)"\ |
); \ |
flag_pic = 1; \ |
} \ |
else if (!TARGET_64BIT && flag_pic) \ |
{ \ |
warning (0, "-f%s ignored for target (all code is position independent)",\ |
(flag_pic > 1) ? "PIC" : "pic"); \ |
flag_pic = 0; \ |
} \ |
} while (0) \ |
/* Define this macro if references to a symbol must be treated |
differently depending on something about the variable or |
function named by the symbol (such as what section it is in). |
On i386 running Windows NT, modify the assembler name with a suffix |
consisting of an atsign (@) followed by string of digits that represents |
the number of bytes of arguments passed to the function, if it has the |
attribute STDCALL. |
In addition, we must mark dll symbols specially. Definitions of |
dllexport'd objects install some info in the .drectve section. |
References to dllimport'd objects are fetched indirectly via |
_imp__. If both are declared, dllexport overrides. This is also |
needed to implement one-only vtables: they go into their own |
section and we need to set DECL_SECTION_NAME so we do that here. |
Note that we can be called twice on the same decl. */ |
#define SUBTARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info |
/* Output a common block. */ |
#undef ASM_OUTPUT_ALIGNED_DECL_COMMON |
#define ASM_OUTPUT_ALIGNED_DECL_COMMON \ |
i386_pe_asm_output_aligned_decl_common |
/* Output the label for an initialized variable. */ |
#undef ASM_DECLARE_OBJECT_NAME |
#define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \ |
do { \ |
i386_pe_maybe_record_exported_symbol (DECL, NAME, 1); \ |
ASM_OUTPUT_LABEL ((STREAM), (NAME)); \ |
} while (0) |
/* Output a reference to a label. Fastcall function symbols |
keep their '@' prefix, while other symbols are prefixed |
with user_label_prefix. */ |
#undef ASM_OUTPUT_LABELREF |
#define ASM_OUTPUT_LABELREF(STREAM, NAME) \ |
do { \ |
if ((NAME)[0] != FASTCALL_PREFIX) \ |
fputs (user_label_prefix, (STREAM)); \ |
fputs ((NAME), (STREAM)); \ |
} while (0) |
/* Emit code to check the stack when allocating more than 4000 |
bytes in one go. */ |
#define CHECK_STACK_LIMIT 4000 |
#undef STACK_BOUNDARY |
#define STACK_BOUNDARY (ix86_abi == MS_ABI ? 128 : BITS_PER_WORD) |
/* By default, target has a 80387, uses IEEE compatible arithmetic, |
returns float values in the 387 and needs stack probes. |
We also align doubles to 64-bits for MSVC default compatibility. */ |
#undef TARGET_SUBTARGET_DEFAULT |
#define TARGET_SUBTARGET_DEFAULT \ |
(MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS \ |
| MASK_STACK_PROBE | MASK_ALIGN_DOUBLE) |
#undef TARGET_SUBTARGET64_DEFAULT |
#define TARGET_SUBTARGET64_DEFAULT \ |
MASK_128BIT_LONG_DOUBLE |
/* This is how to output an assembler line |
that says to advance the location counter |
to a multiple of 2**LOG bytes. */ |
#undef ASM_OUTPUT_ALIGN |
#define ASM_OUTPUT_ALIGN(FILE,LOG) \ |
if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", 1<<(LOG)) |
/* Windows uses explicit import from shared libraries. */ |
#define MULTIPLE_SYMBOL_SPACES 1 |
#define TARGET_ASM_UNIQUE_SECTION i386_pe_unique_section |
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section |
#define SUPPORTS_ONE_ONLY 1 |
/* Switch into a generic section. */ |
#define TARGET_ASM_NAMED_SECTION i386_pe_asm_named_section |
/* Select attributes for named sections. */ |
#define TARGET_SECTION_TYPE_FLAGS i386_pe_section_type_flags |
/* Write the extra assembler code needed to declare a function |
properly. If we are generating SDB debugging information, this |
will happen automatically, so we only need to handle other cases. */ |
#undef ASM_DECLARE_FUNCTION_NAME |
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ |
do \ |
{ \ |
i386_pe_maybe_record_exported_symbol (DECL, NAME, 0); \ |
if (write_symbols != SDB_DEBUG) \ |
i386_pe_declare_function_type (FILE, NAME, TREE_PUBLIC (DECL)); \ |
ASM_OUTPUT_LABEL (FILE, NAME); \ |
} \ |
while (0) |
/* Add an external function to the list of functions to be declared at |
the end of the file. */ |
#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ |
do \ |
{ \ |
if (TREE_CODE (DECL) == FUNCTION_DECL) \ |
i386_pe_record_external_function ((DECL), (NAME)); \ |
} \ |
while (0) |
/* Declare the type properly for any external libcall. */ |
#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ |
i386_pe_declare_function_type (FILE, XSTR (FUN, 0), 1) |
/* This says out to put a global symbol in the BSS section. */ |
#undef ASM_OUTPUT_ALIGNED_BSS |
#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ |
asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) |
/* Output function declarations at the end of the file. */ |
#undef TARGET_ASM_FILE_END |
#define TARGET_ASM_FILE_END i386_pe_file_end |
#undef ASM_COMMENT_START |
#define ASM_COMMENT_START " #" |
#ifndef DWARF2_UNWIND_INFO |
/* If configured with --disable-sjlj-exceptions, use DWARF2, else |
default to SJLJ. */ |
#if (defined (CONFIG_SJLJ_EXCEPTIONS) && !CONFIG_SJLJ_EXCEPTIONS) |
/* The logic of this #if must be kept synchronised with the logic |
for selecting the tmake_eh_file fragment in config.gcc. */ |
#define DWARF2_UNWIND_INFO 1 |
/* If multilib is selected break build as sjlj is required. */ |
#if defined (TARGET_BI_ARCH) |
#error For 64-bit windows and 32-bit based multilib version of gcc just SJLJ exceptions are supported. |
#endif |
#else |
#define DWARF2_UNWIND_INFO 0 |
#endif |
#endif |
/* Don't assume anything about the header files. */ |
#define NO_IMPLICIT_EXTERN_C |
#undef PROFILE_HOOK |
#define PROFILE_HOOK(LABEL) \ |
if (MAIN_NAME_P (DECL_NAME (current_function_decl))) \ |
{ \ |
emit_call_insn (gen_rtx_CALL (VOIDmode, \ |
gen_rtx_MEM (FUNCTION_MODE, \ |
gen_rtx_SYMBOL_REF (Pmode, "_monstartup")), \ |
const0_rtx)); \ |
} |
/* Java Native Interface (JNI) methods on Win32 are invoked using the |
stdcall calling convention. */ |
#undef MODIFY_JNI_METHOD_CALL |
#define MODIFY_JNI_METHOD_CALL(MDECL) \ |
build_type_attribute_variant ((MDECL), \ |
build_tree_list (get_identifier ("stdcall"), \ |
NULL)) |
/* For Win32 ABI compatibility */ |
#undef DEFAULT_PCC_STRUCT_RETURN |
#define DEFAULT_PCC_STRUCT_RETURN 0 |
/* MSVC returns aggregate types of up to 8 bytes via registers. |
See i386.c:ix86_return_in_memory. */ |
#undef MS_AGGREGATE_RETURN |
#define MS_AGGREGATE_RETURN 1 |
/* Biggest alignment supported by the object file format of this |
machine. Use this macro to limit the alignment which can be |
specified using the `__attribute__ ((aligned (N)))' construct. If |
not defined, the default value is `BIGGEST_ALIGNMENT'. */ |
/* IMAGE_SCN_ALIGN_8192BYTES is the largest section alignment flag |
specified in the PECOFF60 spec. Native MS compiler also limits |
user-specified alignment to 8192 bytes. */ |
#undef MAX_OFILE_ALIGNMENT |
#define MAX_OFILE_ALIGNMENT (8192 * 8) |
/* BIGGEST_FIELD_ALIGNMENT macro is used directly by libobjc, There, we |
align internal doubles in structures on dword boundaries. Otherwise, |
support vector modes using ADJUST_FIELD_ALIGN, defined in i386.h. */ |
#ifdef IN_TARGET_LIBS |
#undef BIGGEST_FIELD_ALIGNMENT |
#define BIGGEST_FIELD_ALIGNMENT 64 |
#endif |
/* A bit-field declared as `int' forces `int' alignment for the struct. */ |
#undef PCC_BITFIELD_TYPE_MATTERS |
#define PCC_BITFIELD_TYPE_MATTERS 1 |
#define GROUP_BITFIELDS_BY_ALIGN TYPE_NATIVE(rec) |
/* Enable alias attribute support. */ |
#ifndef SET_ASM_OP |
#define SET_ASM_OP "\t.set\t" |
#endif |
/* This implements the `alias' attribute, keeping any stdcall or |
fastcall decoration. */ |
#undef ASM_OUTPUT_DEF_FROM_DECLS |
#define ASM_OUTPUT_DEF_FROM_DECLS(STREAM, DECL, TARGET) \ |
do \ |
{ \ |
const char *alias \ |
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \ |
i386_pe_maybe_record_exported_symbol (DECL, alias, 0); \ |
if (TREE_CODE (DECL) == FUNCTION_DECL) \ |
i386_pe_declare_function_type (STREAM, alias, \ |
TREE_PUBLIC (DECL)); \ |
ASM_OUTPUT_DEF (STREAM, alias, IDENTIFIER_POINTER (TARGET)); \ |
} while (0) |
/* GNU as supports weak symbols on PECOFF. */ |
#ifdef HAVE_GAS_WEAK |
#define ASM_WEAKEN_LABEL(FILE, NAME) \ |
do \ |
{ \ |
fputs ("\t.weak\t", (FILE)); \ |
assemble_name ((FILE), (NAME)); \ |
fputc ('\n', (FILE)); \ |
} \ |
while (0) |
#endif /* HAVE_GAS_WEAK */ |
/* FIXME: SUPPORTS_WEAK && TARGET_HAVE_NAMED_SECTIONS is true, |
but for .jcr section to work we also need crtbegin and crtend |
objects. */ |
#define TARGET_USE_JCR_SECTION 1 |
/* Decide whether it is safe to use a local alias for a virtual function |
when constructing thunks. */ |
#undef TARGET_USE_LOCAL_THUNK_ALIAS_P |
#define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) (!DECL_ONE_ONLY (DECL)) |
#define SUBTARGET_ATTRIBUTE_TABLE \ |
{ "selectany", 0, 0, true, false, false, ix86_handle_selectany_attribute } |
/* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ |
/* mcount() does not need a counter variable. */ |
#undef NO_PROFILE_COUNTERS |
#define NO_PROFILE_COUNTERS 1 |
#define TARGET_VALID_DLLIMPORT_ATTRIBUTE_P i386_pe_valid_dllimport_attribute_p |
#define TARGET_CXX_ADJUST_CLASS_AT_DEFINITION i386_pe_adjust_class_at_definition |
#define TARGET_MANGLE_DECL_ASSEMBLER_NAME i386_pe_mangle_decl_assembler_name |
#undef TREE |
#ifndef BUFSIZ |
# undef FILE |
#endif |
/contrib/sdk/sources/gcc_eh/config/i386/gas.h |
---|
0,0 → 1,124 |
/* Definitions for Intel 386 using GAS. |
Copyright (C) 1988, 1993, 1994, 1996, 2002, 2004, 2007, 2008 |
Free Software Foundation, Inc. |
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/>. */ |
/* Note that i386/seq-gas.h is a GAS configuration that does not use this |
file. */ |
/* Use the bsd assembler syntax. */ |
/* we need to do this because gas is really a bsd style assembler, |
* and so doesn't work well this these att-isms: |
* |
* ASM_OUTPUT_SKIP is .set .,.+N, which isn't implemented in gas |
* ASM_OUTPUT_LOCAL is done with .set .,.+N, but that can't be |
* used to define bss static space |
* |
* Next is the question of whether to uses underscores. RMS didn't |
* like this idea at first, but since it is now obvious that we |
* need this separate tm file for use with gas, at least to get |
* dbx debugging info, I think we should also switch to underscores. |
* We can keep i386v for real att style output, and the few |
* people who want both form will have to compile twice. |
*/ |
/* these come from i386/bsd.h, but are specific to sequent */ |
#undef DBX_NO_XREFS |
#undef DBX_CONTIN_LENGTH |
/* Ask for COFF symbols. */ |
#define SDB_DEBUGGING_INFO 1 |
/* Output #ident as a .ident. */ |
#define ASM_OUTPUT_IDENT(FILE, NAME) fprintf (FILE, "\t.ident \"%s\"\n", NAME); |
/* In the past there was confusion as to what the argument to .align was |
in GAS. For the last several years the rule has been this: for a.out |
file formats that argument is LOG, and for all other file formats the |
argument is 1<<LOG. |
However, GAS now has .p2align and .balign pseudo-ops so to remove any |
doubt or guess work, and since this file is used for both a.out and other |
file formats, we use one of them. */ |
#ifdef HAVE_GAS_BALIGN_AND_P2ALIGN |
#undef ASM_OUTPUT_ALIGN |
#define ASM_OUTPUT_ALIGN(FILE,LOG) \ |
if ((LOG)!=0) fprintf ((FILE), "\t.balign %d\n", 1<<(LOG)) |
#endif |
/* A C statement to output to the stdio stream FILE an assembler |
command to advance the location counter to a multiple of 1<<LOG |
bytes if it is within MAX_SKIP bytes. |
This is used to align code labels according to Intel recommendations. */ |
#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN |
# define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \ |
if ((LOG) != 0) {\ |
if ((MAX_SKIP) == 0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ |
else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \ |
} |
#endif |
/* A C statement or statements which output an assembler instruction |
opcode to the stdio stream STREAM. The macro-operand PTR is a |
variable of type `char *' which points to the opcode name in its |
"internal" form--the form that is written in the machine description. |
GAS version 1.38.1 doesn't understand the `repz' opcode mnemonic. |
So use `repe' instead. */ |
#undef ASM_OUTPUT_OPCODE |
#define ASM_OUTPUT_OPCODE(STREAM, PTR) \ |
{ \ |
if ((PTR)[0] == 'r' \ |
&& (PTR)[1] == 'e' \ |
&& (PTR)[2] == 'p') \ |
{ \ |
if ((PTR)[3] == 'z') \ |
{ \ |
fputs ("repe", (STREAM)); \ |
(PTR) += 4; \ |
} \ |
else if ((PTR)[3] == 'n' && (PTR)[4] == 'z') \ |
{ \ |
fputs ("repne", (STREAM)); \ |
(PTR) += 5; \ |
} \ |
} \ |
else \ |
ASM_OUTPUT_AVX_PREFIX ((STREAM), (PTR)); \ |
} |
/* Define macro used to output shift-double opcodes when the shift |
count is in %cl. Some assemblers require %cl as an argument; |
some don't. |
GAS requires the %cl argument, so override i386/unix.h. */ |
#undef SHIFT_DOUBLE_OMITS_COUNT |
#define SHIFT_DOUBLE_OMITS_COUNT 0 |
/* The comment-starter string as GAS expects it. */ |
#undef ASM_COMMENT_START |
#define ASM_COMMENT_START "#" |
#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true |
/contrib/sdk/sources/gcc_eh/config/i386/i386.h |
---|
0,0 → 1,2499 |
/* Definitions of target machine for GCC for IA-32. |
Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, |
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
/* The purpose of this file is to define the characteristics of the i386, |
independent of assembler syntax or operating system. |
Three other files build on this one to describe a specific assembler syntax: |
bsd386.h, att386.h, and sun386.h. |
The actual tm.h file for a particular system should include |
this file, and then the file for the appropriate assembler syntax. |
Many macros that specify assembler syntax are omitted entirely from |
this file because they really belong in the files for particular |
assemblers. These include RP, IP, LPREFIX, PUT_OP_SIZE, USE_STAR, |
ADDR_BEG, ADDR_END, PRINT_IREG, PRINT_SCALE, PRINT_B_I_S, and many |
that start with ASM_ or end in ASM_OP. */ |
/* Redefines for option macros. */ |
#define TARGET_64BIT OPTION_ISA_64BIT |
#define TARGET_MMX OPTION_ISA_MMX |
#define TARGET_3DNOW OPTION_ISA_3DNOW |
#define TARGET_3DNOW_A OPTION_ISA_3DNOW_A |
#define TARGET_SSE OPTION_ISA_SSE |
#define TARGET_SSE2 OPTION_ISA_SSE2 |
#define TARGET_SSE3 OPTION_ISA_SSE3 |
#define TARGET_SSSE3 OPTION_ISA_SSSE3 |
#define TARGET_SSE4_1 OPTION_ISA_SSE4_1 |
#define TARGET_SSE4_2 OPTION_ISA_SSE4_2 |
#define TARGET_AVX OPTION_ISA_AVX |
#define TARGET_FMA OPTION_ISA_FMA |
#define TARGET_SSE4A OPTION_ISA_SSE4A |
#define TARGET_FMA4 OPTION_ISA_FMA4 |
#define TARGET_XOP OPTION_ISA_XOP |
#define TARGET_LWP OPTION_ISA_LWP |
#define TARGET_ROUND OPTION_ISA_ROUND |
#define TARGET_ABM OPTION_ISA_ABM |
#define TARGET_POPCNT OPTION_ISA_POPCNT |
#define TARGET_SAHF OPTION_ISA_SAHF |
#define TARGET_MOVBE OPTION_ISA_MOVBE |
#define TARGET_CRC32 OPTION_ISA_CRC32 |
#define TARGET_AES OPTION_ISA_AES |
#define TARGET_PCLMUL OPTION_ISA_PCLMUL |
#define TARGET_CMPXCHG16B OPTION_ISA_CX16 |
/* SSE4.1 defines round instructions */ |
#define OPTION_MASK_ISA_ROUND OPTION_MASK_ISA_SSE4_1 |
#define OPTION_ISA_ROUND ((ix86_isa_flags & OPTION_MASK_ISA_ROUND) != 0) |
#include "config/vxworks-dummy.h" |
/* Algorithm to expand string function with. */ |
enum stringop_alg |
{ |
no_stringop, |
libcall, |
rep_prefix_1_byte, |
rep_prefix_4_byte, |
rep_prefix_8_byte, |
loop_1_byte, |
loop, |
unrolled_loop |
}; |
#define NAX_STRINGOP_ALGS 4 |
/* Specify what algorithm to use for stringops on known size. |
When size is unknown, the UNKNOWN_SIZE alg is used. When size is |
known at compile time or estimated via feedback, the SIZE array |
is walked in order until MAX is greater then the estimate (or -1 |
means infinity). Corresponding ALG is used then. |
For example initializer: |
{{256, loop}, {-1, rep_prefix_4_byte}} |
will use loop for blocks smaller or equal to 256 bytes, rep prefix will |
be used otherwise. */ |
struct stringop_algs |
{ |
const enum stringop_alg unknown_size; |
const struct stringop_strategy { |
const int max; |
const enum stringop_alg alg; |
} size [NAX_STRINGOP_ALGS]; |
}; |
/* Define the specific costs for a given cpu */ |
struct processor_costs { |
const int add; /* cost of an add instruction */ |
const int lea; /* cost of a lea instruction */ |
const int shift_var; /* variable shift costs */ |
const int shift_const; /* constant shift costs */ |
const int mult_init[5]; /* cost of starting a multiply |
in QImode, HImode, SImode, DImode, TImode*/ |
const int mult_bit; /* cost of multiply per each bit set */ |
const int divide[5]; /* cost of a divide/mod |
in QImode, HImode, SImode, DImode, TImode*/ |
int movsx; /* The cost of movsx operation. */ |
int movzx; /* The cost of movzx operation. */ |
const int large_insn; /* insns larger than this cost more */ |
const int move_ratio; /* The threshold of number of scalar |
memory-to-memory move insns. */ |
const int movzbl_load; /* cost of loading using movzbl */ |
const int int_load[3]; /* cost of loading integer registers |
in QImode, HImode and SImode relative |
to reg-reg move (2). */ |
const int int_store[3]; /* cost of storing integer register |
in QImode, HImode and SImode */ |
const int fp_move; /* cost of reg,reg fld/fst */ |
const int fp_load[3]; /* cost of loading FP register |
in SFmode, DFmode and XFmode */ |
const int fp_store[3]; /* cost of storing FP register |
in SFmode, DFmode and XFmode */ |
const int mmx_move; /* cost of moving MMX register. */ |
const int mmx_load[2]; /* cost of loading MMX register |
in SImode and DImode */ |
const int mmx_store[2]; /* cost of storing MMX register |
in SImode and DImode */ |
const int sse_move; /* cost of moving SSE register. */ |
const int sse_load[3]; /* cost of loading SSE register |
in SImode, DImode and TImode*/ |
const int sse_store[3]; /* cost of storing SSE register |
in SImode, DImode and TImode*/ |
const int mmxsse_to_integer; /* cost of moving mmxsse register to |
integer and vice versa. */ |
const int l1_cache_size; /* size of l1 cache, in kilobytes. */ |
const int l2_cache_size; /* size of l2 cache, in kilobytes. */ |
const int prefetch_block; /* bytes moved to cache for prefetch. */ |
const int simultaneous_prefetches; /* number of parallel prefetch |
operations. */ |
const int branch_cost; /* Default value for BRANCH_COST. */ |
const int fadd; /* cost of FADD and FSUB instructions. */ |
const int fmul; /* cost of FMUL instruction. */ |
const int fdiv; /* cost of FDIV instruction. */ |
const int fabs; /* cost of FABS instruction. */ |
const int fchs; /* cost of FCHS instruction. */ |
const int fsqrt; /* cost of FSQRT instruction. */ |
/* Specify what algorithm |
to use for stringops on unknown size. */ |
struct stringop_algs memcpy[2], memset[2]; |
const int scalar_stmt_cost; /* Cost of any scalar operation, excluding |
load and store. */ |
const int scalar_load_cost; /* Cost of scalar load. */ |
const int scalar_store_cost; /* Cost of scalar store. */ |
const int vec_stmt_cost; /* Cost of any vector operation, excluding |
load, store, vector-to-scalar and |
scalar-to-vector operation. */ |
const int vec_to_scalar_cost; /* Cost of vect-to-scalar operation. */ |
const int scalar_to_vec_cost; /* Cost of scalar-to-vector operation. */ |
const int vec_align_load_cost; /* Cost of aligned vector load. */ |
const int vec_unalign_load_cost; /* Cost of unaligned vector load. */ |
const int vec_store_cost; /* Cost of vector store. */ |
const int cond_taken_branch_cost; /* Cost of taken branch for vectorizer |
cost model. */ |
const int cond_not_taken_branch_cost;/* Cost of not taken branch for |
vectorizer cost model. */ |
}; |
extern const struct processor_costs *ix86_cost; |
extern const struct processor_costs ix86_size_cost; |
#define ix86_cur_cost() \ |
(optimize_insn_for_size_p () ? &ix86_size_cost: ix86_cost) |
/* Macros used in the machine description to test the flags. */ |
/* configure can arrange to make this 2, to force a 486. */ |
#ifndef TARGET_CPU_DEFAULT |
#define TARGET_CPU_DEFAULT TARGET_CPU_DEFAULT_generic |
#endif |
#ifndef TARGET_FPMATH_DEFAULT |
#define TARGET_FPMATH_DEFAULT \ |
(TARGET_64BIT && TARGET_SSE ? FPMATH_SSE : FPMATH_387) |
#endif |
#define TARGET_FLOAT_RETURNS_IN_80387 TARGET_FLOAT_RETURNS |
/* 64bit Sledgehammer mode. For libgcc2 we make sure this is a |
compile-time constant. */ |
#ifdef IN_LIBGCC2 |
#undef TARGET_64BIT |
#ifdef __x86_64__ |
#define TARGET_64BIT 1 |
#else |
#define TARGET_64BIT 0 |
#endif |
#else |
#ifndef TARGET_BI_ARCH |
#undef TARGET_64BIT |
#if TARGET_64BIT_DEFAULT |
#define TARGET_64BIT 1 |
#else |
#define TARGET_64BIT 0 |
#endif |
#endif |
#endif |
#define HAS_LONG_COND_BRANCH 1 |
#define HAS_LONG_UNCOND_BRANCH 1 |
#define TARGET_386 (ix86_tune == PROCESSOR_I386) |
#define TARGET_486 (ix86_tune == PROCESSOR_I486) |
#define TARGET_PENTIUM (ix86_tune == PROCESSOR_PENTIUM) |
#define TARGET_PENTIUMPRO (ix86_tune == PROCESSOR_PENTIUMPRO) |
#define TARGET_GEODE (ix86_tune == PROCESSOR_GEODE) |
#define TARGET_K6 (ix86_tune == PROCESSOR_K6) |
#define TARGET_ATHLON (ix86_tune == PROCESSOR_ATHLON) |
#define TARGET_PENTIUM4 (ix86_tune == PROCESSOR_PENTIUM4) |
#define TARGET_K8 (ix86_tune == PROCESSOR_K8) |
#define TARGET_ATHLON_K8 (TARGET_K8 || TARGET_ATHLON) |
#define TARGET_NOCONA (ix86_tune == PROCESSOR_NOCONA) |
#define TARGET_CORE2 (ix86_tune == PROCESSOR_CORE2) |
#define TARGET_GENERIC32 (ix86_tune == PROCESSOR_GENERIC32) |
#define TARGET_GENERIC64 (ix86_tune == PROCESSOR_GENERIC64) |
#define TARGET_GENERIC (TARGET_GENERIC32 || TARGET_GENERIC64) |
#define TARGET_AMDFAM10 (ix86_tune == PROCESSOR_AMDFAM10) |
#define TARGET_ATOM (ix86_tune == PROCESSOR_ATOM) |
/* Feature tests against the various tunings. */ |
enum ix86_tune_indices { |
X86_TUNE_USE_LEAVE, |
X86_TUNE_PUSH_MEMORY, |
X86_TUNE_ZERO_EXTEND_WITH_AND, |
X86_TUNE_UNROLL_STRLEN, |
X86_TUNE_DEEP_BRANCH_PREDICTION, |
X86_TUNE_BRANCH_PREDICTION_HINTS, |
X86_TUNE_DOUBLE_WITH_ADD, |
X86_TUNE_USE_SAHF, |
X86_TUNE_MOVX, |
X86_TUNE_PARTIAL_REG_STALL, |
X86_TUNE_PARTIAL_FLAG_REG_STALL, |
X86_TUNE_USE_HIMODE_FIOP, |
X86_TUNE_USE_SIMODE_FIOP, |
X86_TUNE_USE_MOV0, |
X86_TUNE_USE_CLTD, |
X86_TUNE_USE_XCHGB, |
X86_TUNE_SPLIT_LONG_MOVES, |
X86_TUNE_READ_MODIFY_WRITE, |
X86_TUNE_READ_MODIFY, |
X86_TUNE_PROMOTE_QIMODE, |
X86_TUNE_FAST_PREFIX, |
X86_TUNE_SINGLE_STRINGOP, |
X86_TUNE_QIMODE_MATH, |
X86_TUNE_HIMODE_MATH, |
X86_TUNE_PROMOTE_QI_REGS, |
X86_TUNE_PROMOTE_HI_REGS, |
X86_TUNE_ADD_ESP_4, |
X86_TUNE_ADD_ESP_8, |
X86_TUNE_SUB_ESP_4, |
X86_TUNE_SUB_ESP_8, |
X86_TUNE_INTEGER_DFMODE_MOVES, |
X86_TUNE_PARTIAL_REG_DEPENDENCY, |
X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY, |
X86_TUNE_SSE_UNALIGNED_MOVE_OPTIMAL, |
X86_TUNE_SSE_SPLIT_REGS, |
X86_TUNE_SSE_TYPELESS_STORES, |
X86_TUNE_SSE_LOAD0_BY_PXOR, |
X86_TUNE_MEMORY_MISMATCH_STALL, |
X86_TUNE_PROLOGUE_USING_MOVE, |
X86_TUNE_EPILOGUE_USING_MOVE, |
X86_TUNE_SHIFT1, |
X86_TUNE_USE_FFREEP, |
X86_TUNE_INTER_UNIT_MOVES, |
X86_TUNE_INTER_UNIT_CONVERSIONS, |
X86_TUNE_FOUR_JUMP_LIMIT, |
X86_TUNE_SCHEDULE, |
X86_TUNE_USE_BT, |
X86_TUNE_USE_INCDEC, |
X86_TUNE_PAD_RETURNS, |
X86_TUNE_EXT_80387_CONSTANTS, |
X86_TUNE_SHORTEN_X87_SSE, |
X86_TUNE_AVOID_VECTOR_DECODE, |
X86_TUNE_PROMOTE_HIMODE_IMUL, |
X86_TUNE_SLOW_IMUL_IMM32_MEM, |
X86_TUNE_SLOW_IMUL_IMM8, |
X86_TUNE_MOVE_M1_VIA_OR, |
X86_TUNE_NOT_UNPAIRABLE, |
X86_TUNE_NOT_VECTORMODE, |
X86_TUNE_USE_VECTOR_FP_CONVERTS, |
X86_TUNE_USE_VECTOR_CONVERTS, |
X86_TUNE_FUSE_CMP_AND_BRANCH, |
X86_TUNE_OPT_AGU, |
X86_TUNE_LAST |
}; |
extern unsigned char ix86_tune_features[X86_TUNE_LAST]; |
#define TARGET_USE_LEAVE ix86_tune_features[X86_TUNE_USE_LEAVE] |
#define TARGET_PUSH_MEMORY ix86_tune_features[X86_TUNE_PUSH_MEMORY] |
#define TARGET_ZERO_EXTEND_WITH_AND \ |
ix86_tune_features[X86_TUNE_ZERO_EXTEND_WITH_AND] |
#define TARGET_UNROLL_STRLEN ix86_tune_features[X86_TUNE_UNROLL_STRLEN] |
#define TARGET_DEEP_BRANCH_PREDICTION \ |
ix86_tune_features[X86_TUNE_DEEP_BRANCH_PREDICTION] |
#define TARGET_BRANCH_PREDICTION_HINTS \ |
ix86_tune_features[X86_TUNE_BRANCH_PREDICTION_HINTS] |
#define TARGET_DOUBLE_WITH_ADD ix86_tune_features[X86_TUNE_DOUBLE_WITH_ADD] |
#define TARGET_USE_SAHF ix86_tune_features[X86_TUNE_USE_SAHF] |
#define TARGET_MOVX ix86_tune_features[X86_TUNE_MOVX] |
#define TARGET_PARTIAL_REG_STALL ix86_tune_features[X86_TUNE_PARTIAL_REG_STALL] |
#define TARGET_PARTIAL_FLAG_REG_STALL \ |
ix86_tune_features[X86_TUNE_PARTIAL_FLAG_REG_STALL] |
#define TARGET_USE_HIMODE_FIOP ix86_tune_features[X86_TUNE_USE_HIMODE_FIOP] |
#define TARGET_USE_SIMODE_FIOP ix86_tune_features[X86_TUNE_USE_SIMODE_FIOP] |
#define TARGET_USE_MOV0 ix86_tune_features[X86_TUNE_USE_MOV0] |
#define TARGET_USE_CLTD ix86_tune_features[X86_TUNE_USE_CLTD] |
#define TARGET_USE_XCHGB ix86_tune_features[X86_TUNE_USE_XCHGB] |
#define TARGET_SPLIT_LONG_MOVES ix86_tune_features[X86_TUNE_SPLIT_LONG_MOVES] |
#define TARGET_READ_MODIFY_WRITE ix86_tune_features[X86_TUNE_READ_MODIFY_WRITE] |
#define TARGET_READ_MODIFY ix86_tune_features[X86_TUNE_READ_MODIFY] |
#define TARGET_PROMOTE_QImode ix86_tune_features[X86_TUNE_PROMOTE_QIMODE] |
#define TARGET_FAST_PREFIX ix86_tune_features[X86_TUNE_FAST_PREFIX] |
#define TARGET_SINGLE_STRINGOP ix86_tune_features[X86_TUNE_SINGLE_STRINGOP] |
#define TARGET_QIMODE_MATH ix86_tune_features[X86_TUNE_QIMODE_MATH] |
#define TARGET_HIMODE_MATH ix86_tune_features[X86_TUNE_HIMODE_MATH] |
#define TARGET_PROMOTE_QI_REGS ix86_tune_features[X86_TUNE_PROMOTE_QI_REGS] |
#define TARGET_PROMOTE_HI_REGS ix86_tune_features[X86_TUNE_PROMOTE_HI_REGS] |
#define TARGET_ADD_ESP_4 ix86_tune_features[X86_TUNE_ADD_ESP_4] |
#define TARGET_ADD_ESP_8 ix86_tune_features[X86_TUNE_ADD_ESP_8] |
#define TARGET_SUB_ESP_4 ix86_tune_features[X86_TUNE_SUB_ESP_4] |
#define TARGET_SUB_ESP_8 ix86_tune_features[X86_TUNE_SUB_ESP_8] |
#define TARGET_INTEGER_DFMODE_MOVES \ |
ix86_tune_features[X86_TUNE_INTEGER_DFMODE_MOVES] |
#define TARGET_PARTIAL_REG_DEPENDENCY \ |
ix86_tune_features[X86_TUNE_PARTIAL_REG_DEPENDENCY] |
#define TARGET_SSE_PARTIAL_REG_DEPENDENCY \ |
ix86_tune_features[X86_TUNE_SSE_PARTIAL_REG_DEPENDENCY] |
#define TARGET_SSE_UNALIGNED_MOVE_OPTIMAL \ |
ix86_tune_features[X86_TUNE_SSE_UNALIGNED_MOVE_OPTIMAL] |
#define TARGET_SSE_SPLIT_REGS ix86_tune_features[X86_TUNE_SSE_SPLIT_REGS] |
#define TARGET_SSE_TYPELESS_STORES \ |
ix86_tune_features[X86_TUNE_SSE_TYPELESS_STORES] |
#define TARGET_SSE_LOAD0_BY_PXOR ix86_tune_features[X86_TUNE_SSE_LOAD0_BY_PXOR] |
#define TARGET_MEMORY_MISMATCH_STALL \ |
ix86_tune_features[X86_TUNE_MEMORY_MISMATCH_STALL] |
#define TARGET_PROLOGUE_USING_MOVE \ |
ix86_tune_features[X86_TUNE_PROLOGUE_USING_MOVE] |
#define TARGET_EPILOGUE_USING_MOVE \ |
ix86_tune_features[X86_TUNE_EPILOGUE_USING_MOVE] |
#define TARGET_SHIFT1 ix86_tune_features[X86_TUNE_SHIFT1] |
#define TARGET_USE_FFREEP ix86_tune_features[X86_TUNE_USE_FFREEP] |
#define TARGET_INTER_UNIT_MOVES ix86_tune_features[X86_TUNE_INTER_UNIT_MOVES] |
#define TARGET_INTER_UNIT_CONVERSIONS\ |
ix86_tune_features[X86_TUNE_INTER_UNIT_CONVERSIONS] |
#define TARGET_FOUR_JUMP_LIMIT ix86_tune_features[X86_TUNE_FOUR_JUMP_LIMIT] |
#define TARGET_SCHEDULE ix86_tune_features[X86_TUNE_SCHEDULE] |
#define TARGET_USE_BT ix86_tune_features[X86_TUNE_USE_BT] |
#define TARGET_USE_INCDEC ix86_tune_features[X86_TUNE_USE_INCDEC] |
#define TARGET_PAD_RETURNS ix86_tune_features[X86_TUNE_PAD_RETURNS] |
#define TARGET_EXT_80387_CONSTANTS \ |
ix86_tune_features[X86_TUNE_EXT_80387_CONSTANTS] |
#define TARGET_SHORTEN_X87_SSE ix86_tune_features[X86_TUNE_SHORTEN_X87_SSE] |
#define TARGET_AVOID_VECTOR_DECODE \ |
ix86_tune_features[X86_TUNE_AVOID_VECTOR_DECODE] |
#define TARGET_TUNE_PROMOTE_HIMODE_IMUL \ |
ix86_tune_features[X86_TUNE_PROMOTE_HIMODE_IMUL] |
#define TARGET_SLOW_IMUL_IMM32_MEM \ |
ix86_tune_features[X86_TUNE_SLOW_IMUL_IMM32_MEM] |
#define TARGET_SLOW_IMUL_IMM8 ix86_tune_features[X86_TUNE_SLOW_IMUL_IMM8] |
#define TARGET_MOVE_M1_VIA_OR ix86_tune_features[X86_TUNE_MOVE_M1_VIA_OR] |
#define TARGET_NOT_UNPAIRABLE ix86_tune_features[X86_TUNE_NOT_UNPAIRABLE] |
#define TARGET_NOT_VECTORMODE ix86_tune_features[X86_TUNE_NOT_VECTORMODE] |
#define TARGET_USE_VECTOR_FP_CONVERTS \ |
ix86_tune_features[X86_TUNE_USE_VECTOR_FP_CONVERTS] |
#define TARGET_USE_VECTOR_CONVERTS \ |
ix86_tune_features[X86_TUNE_USE_VECTOR_CONVERTS] |
#define TARGET_FUSE_CMP_AND_BRANCH \ |
ix86_tune_features[X86_TUNE_FUSE_CMP_AND_BRANCH] |
#define TARGET_OPT_AGU ix86_tune_features[X86_TUNE_OPT_AGU] |
/* Feature tests against the various architecture variations. */ |
enum ix86_arch_indices { |
X86_ARCH_CMOVE, /* || TARGET_SSE */ |
X86_ARCH_CMPXCHG, |
X86_ARCH_CMPXCHG8B, |
X86_ARCH_XADD, |
X86_ARCH_BSWAP, |
X86_ARCH_LAST |
}; |
extern unsigned char ix86_arch_features[X86_ARCH_LAST]; |
#define TARGET_CMOVE ix86_arch_features[X86_ARCH_CMOVE] |
#define TARGET_CMPXCHG ix86_arch_features[X86_ARCH_CMPXCHG] |
#define TARGET_CMPXCHG8B ix86_arch_features[X86_ARCH_CMPXCHG8B] |
#define TARGET_XADD ix86_arch_features[X86_ARCH_XADD] |
#define TARGET_BSWAP ix86_arch_features[X86_ARCH_BSWAP] |
#define TARGET_FISTTP (TARGET_SSE3 && TARGET_80387) |
extern int x86_prefetch_sse; |
#define TARGET_PREFETCH_SSE x86_prefetch_sse |
#define ASSEMBLER_DIALECT (ix86_asm_dialect) |
#define TARGET_SSE_MATH ((ix86_fpmath & FPMATH_SSE) != 0) |
#define TARGET_MIX_SSE_I387 \ |
((ix86_fpmath & (FPMATH_SSE | FPMATH_387)) == (FPMATH_SSE | FPMATH_387)) |
#define TARGET_GNU_TLS (ix86_tls_dialect == TLS_DIALECT_GNU) |
#define TARGET_GNU2_TLS (ix86_tls_dialect == TLS_DIALECT_GNU2) |
#define TARGET_ANY_GNU_TLS (TARGET_GNU_TLS || TARGET_GNU2_TLS) |
#define TARGET_SUN_TLS 0 |
extern int ix86_isa_flags; |
#ifndef TARGET_64BIT_DEFAULT |
#define TARGET_64BIT_DEFAULT 0 |
#endif |
#ifndef TARGET_TLS_DIRECT_SEG_REFS_DEFAULT |
#define TARGET_TLS_DIRECT_SEG_REFS_DEFAULT 0 |
#endif |
/* Fence to use after loop using storent. */ |
extern tree x86_mfence; |
#define FENCE_FOLLOWING_MOVNT x86_mfence |
/* Once GDB has been enhanced to deal with functions without frame |
pointers, we can change this to allow for elimination of |
the frame pointer in leaf functions. */ |
#define TARGET_DEFAULT 0 |
/* Extra bits to force. */ |
#define TARGET_SUBTARGET_DEFAULT 0 |
#define TARGET_SUBTARGET_ISA_DEFAULT 0 |
/* Extra bits to force on w/ 32-bit mode. */ |
#define TARGET_SUBTARGET32_DEFAULT 0 |
#define TARGET_SUBTARGET32_ISA_DEFAULT 0 |
/* Extra bits to force on w/ 64-bit mode. */ |
#define TARGET_SUBTARGET64_DEFAULT 0 |
#define TARGET_SUBTARGET64_ISA_DEFAULT 0 |
/* This is not really a target flag, but is done this way so that |
it's analogous to similar code for Mach-O on PowerPC. darwin.h |
redefines this to 1. */ |
#define TARGET_MACHO 0 |
/* Likewise, for the Windows 64-bit ABI. */ |
#define TARGET_64BIT_MS_ABI (TARGET_64BIT && ix86_cfun_abi () == MS_ABI) |
/* Available call abi. */ |
enum calling_abi |
{ |
SYSV_ABI = 0, |
MS_ABI = 1 |
}; |
/* The abi used by target. */ |
extern enum calling_abi ix86_abi; |
/* The default abi used by target. */ |
#define DEFAULT_ABI SYSV_ABI |
/* Subtargets may reset this to 1 in order to enable 96-bit long double |
with the rounding mode forced to 53 bits. */ |
#define TARGET_96_ROUND_53_LONG_DOUBLE 0 |
/* Sometimes certain combinations of command options do not make |
sense on a particular target machine. You can define a macro |
`OVERRIDE_OPTIONS' to take account of this. This macro, if |
defined, is executed once just after all the command options have |
been parsed. |
Don't use this macro to turn on various extra optimizations for |
`-O'. That is what `OPTIMIZATION_OPTIONS' is for. */ |
#define OVERRIDE_OPTIONS override_options (true) |
/* Define this to change the optimizations performed by default. */ |
#define OPTIMIZATION_OPTIONS(LEVEL, SIZE) \ |
optimization_options ((LEVEL), (SIZE)) |
/* -march=native handling only makes sense with compiler running on |
an x86 or x86_64 chip. If changing this condition, also change |
the condition in driver-i386.c. */ |
#if defined(__i386__) || defined(__x86_64__) |
/* In driver-i386.c. */ |
extern const char *host_detect_local_cpu (int argc, const char **argv); |
#define EXTRA_SPEC_FUNCTIONS \ |
{ "local_cpu_detect", host_detect_local_cpu }, |
#define HAVE_LOCAL_CPU_DETECT |
#endif |
#if TARGET_64BIT_DEFAULT |
#define OPT_ARCH64 "!m32" |
#define OPT_ARCH32 "m32" |
#else |
#define OPT_ARCH64 "m64" |
#define OPT_ARCH32 "!m64" |
#endif |
/* Support for configure-time defaults of some command line options. |
The order here is important so that -march doesn't squash the |
tune or cpu values. */ |
#define OPTION_DEFAULT_SPECS \ |
{"tune", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}" }, \ |
{"tune_32", "%{" OPT_ARCH32 ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}" }, \ |
{"tune_64", "%{" OPT_ARCH64 ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}" }, \ |
{"cpu", "%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}" }, \ |
{"cpu_32", "%{" OPT_ARCH32 ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}" }, \ |
{"cpu_64", "%{" OPT_ARCH64 ":%{!mtune=*:%{!mcpu=*:%{!march=*:-mtune=%(VALUE)}}}}" }, \ |
{"arch", "%{!march=*:-march=%(VALUE)}"}, \ |
{"arch_32", "%{" OPT_ARCH32 ":%{!march=*:-march=%(VALUE)}}"}, \ |
{"arch_64", "%{" OPT_ARCH64 ":%{!march=*:-march=%(VALUE)}}"}, |
/* Specs for the compiler proper */ |
#ifndef CC1_CPU_SPEC |
#define CC1_CPU_SPEC_1 "\ |
%{mcpu=*:-mtune=%* \ |
%n`-mcpu=' is deprecated. Use `-mtune=' or '-march=' instead.\n} \ |
%<mcpu=* \ |
%{mintel-syntax:-masm=intel \ |
%n`-mintel-syntax' is deprecated. Use `-masm=intel' instead.\n} \ |
%{msse5:-mavx \ |
%n'-msse5' was removed.\n} \ |
%{mno-intel-syntax:-masm=att \ |
%n`-mno-intel-syntax' is deprecated. Use `-masm=att' instead.\n}" |
#ifndef HAVE_LOCAL_CPU_DETECT |
#define CC1_CPU_SPEC CC1_CPU_SPEC_1 |
#else |
#define CC1_CPU_SPEC CC1_CPU_SPEC_1 \ |
"%{march=native:%<march=native %:local_cpu_detect(arch) \ |
%{!mtune=*:%<mtune=native %:local_cpu_detect(tune)}} \ |
%{mtune=native:%<mtune=native %:local_cpu_detect(tune)}" |
#endif |
#endif |
/* Target CPU builtins. */ |
#define TARGET_CPU_CPP_BUILTINS() ix86_target_macros () |
/* Target Pragmas. */ |
#define REGISTER_TARGET_PRAGMAS() ix86_register_pragmas () |
enum target_cpu_default |
{ |
TARGET_CPU_DEFAULT_generic = 0, |
TARGET_CPU_DEFAULT_i386, |
TARGET_CPU_DEFAULT_i486, |
TARGET_CPU_DEFAULT_pentium, |
TARGET_CPU_DEFAULT_pentium_mmx, |
TARGET_CPU_DEFAULT_pentiumpro, |
TARGET_CPU_DEFAULT_pentium2, |
TARGET_CPU_DEFAULT_pentium3, |
TARGET_CPU_DEFAULT_pentium4, |
TARGET_CPU_DEFAULT_pentium_m, |
TARGET_CPU_DEFAULT_prescott, |
TARGET_CPU_DEFAULT_nocona, |
TARGET_CPU_DEFAULT_core2, |
TARGET_CPU_DEFAULT_atom, |
TARGET_CPU_DEFAULT_geode, |
TARGET_CPU_DEFAULT_k6, |
TARGET_CPU_DEFAULT_k6_2, |
TARGET_CPU_DEFAULT_k6_3, |
TARGET_CPU_DEFAULT_athlon, |
TARGET_CPU_DEFAULT_athlon_sse, |
TARGET_CPU_DEFAULT_k8, |
TARGET_CPU_DEFAULT_amdfam10, |
TARGET_CPU_DEFAULT_max |
}; |
#ifndef CC1_SPEC |
#define CC1_SPEC "%(cc1_cpu) " |
#endif |
/* This macro defines names of additional specifications to put in the |
specs that can be used in various specifications like CC1_SPEC. Its |
definition is an initializer with a subgrouping for each command option. |
Each subgrouping contains a string constant, that defines the |
specification name, and a string constant that used by the GCC driver |
program. |
Do not define this macro if it does not need to do anything. */ |
#ifndef SUBTARGET_EXTRA_SPECS |
#define SUBTARGET_EXTRA_SPECS |
#endif |
#define EXTRA_SPECS \ |
{ "cc1_cpu", CC1_CPU_SPEC }, \ |
SUBTARGET_EXTRA_SPECS |
/* Set the value of FLT_EVAL_METHOD in float.h. When using only the |
FPU, assume that the fpcw is set to extended precision; when using |
only SSE, rounding is correct; when using both SSE and the FPU, |
the rounding precision is indeterminate, since either may be chosen |
apparently at random. */ |
#define TARGET_FLT_EVAL_METHOD \ |
(TARGET_MIX_SSE_I387 ? -1 : TARGET_SSE_MATH ? 0 : 2) |
/* Whether to allow x87 floating-point arithmetic on MODE (one of |
SFmode, DFmode and XFmode) in the current excess precision |
configuration. */ |
#define X87_ENABLE_ARITH(MODE) \ |
(flag_excess_precision == EXCESS_PRECISION_FAST || (MODE) == XFmode) |
/* Likewise, whether to allow direct conversions from integer mode |
IMODE (HImode, SImode or DImode) to MODE. */ |
#define X87_ENABLE_FLOAT(MODE, IMODE) \ |
(flag_excess_precision == EXCESS_PRECISION_FAST \ |
|| (MODE) == XFmode \ |
|| ((MODE) == DFmode && (IMODE) == SImode) \ |
|| (IMODE) == HImode) |
/* target machine storage layout */ |
#define SHORT_TYPE_SIZE 16 |
#define INT_TYPE_SIZE 32 |
#define FLOAT_TYPE_SIZE 32 |
#define LONG_TYPE_SIZE BITS_PER_WORD |
#define DOUBLE_TYPE_SIZE 64 |
#define LONG_LONG_TYPE_SIZE 64 |
#define LONG_DOUBLE_TYPE_SIZE 80 |
#define WIDEST_HARDWARE_FP_SIZE LONG_DOUBLE_TYPE_SIZE |
#if defined (TARGET_BI_ARCH) || TARGET_64BIT_DEFAULT |
#define MAX_BITS_PER_WORD 64 |
#else |
#define MAX_BITS_PER_WORD 32 |
#endif |
/* Define this if most significant byte of a word is the lowest numbered. */ |
/* That is true on the 80386. */ |
#define BITS_BIG_ENDIAN 0 |
/* Define this if most significant byte of a word is the lowest numbered. */ |
/* That is not true on the 80386. */ |
#define BYTES_BIG_ENDIAN 0 |
/* Define this if most significant word of a multiword number is the lowest |
numbered. */ |
/* Not true for 80386 */ |
#define WORDS_BIG_ENDIAN 0 |
/* Width of a word, in units (bytes). */ |
#define UNITS_PER_WORD (TARGET_64BIT ? 8 : 4) |
#ifdef IN_LIBGCC2 |
#define MIN_UNITS_PER_WORD (TARGET_64BIT ? 8 : 4) |
#else |
#define MIN_UNITS_PER_WORD 4 |
#endif |
/* Allocation boundary (in *bits*) for storing arguments in argument list. */ |
#define PARM_BOUNDARY BITS_PER_WORD |
/* Boundary (in *bits*) on which stack pointer should be aligned. */ |
#define STACK_BOUNDARY \ |
(TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD) |
/* Stack boundary of the main function guaranteed by OS. */ |
#define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32) |
/* Minimum stack boundary. */ |
#define MIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32) |
/* Boundary (in *bits*) on which the stack pointer prefers to be |
aligned; the compiler cannot rely on having this alignment. */ |
#define PREFERRED_STACK_BOUNDARY ix86_preferred_stack_boundary |
/* It should be MIN_STACK_BOUNDARY. But we set it to 128 bits for |
both 32bit and 64bit, to support codes that need 128 bit stack |
alignment for SSE instructions, but can't realign the stack. */ |
#define PREFERRED_STACK_BOUNDARY_DEFAULT 128 |
/* 1 if -mstackrealign should be turned on by default. It will |
generate an alternate prologue and epilogue that realigns the |
runtime stack if nessary. This supports mixing codes that keep a |
4-byte aligned stack, as specified by i386 psABI, with codes that |
need a 16-byte aligned stack, as required by SSE instructions. */ |
#define STACK_REALIGN_DEFAULT 0 |
/* Boundary (in *bits*) on which the incoming stack is aligned. */ |
#define INCOMING_STACK_BOUNDARY ix86_incoming_stack_boundary |
/* Target OS keeps a vector-aligned (128-bit, 16-byte) stack. This is |
mandatory for the 64-bit ABI, and may or may not be true for other |
operating systems. */ |
#define TARGET_KEEPS_VECTOR_ALIGNED_STACK TARGET_64BIT |
/* Minimum allocation boundary for the code of a function. */ |
#define FUNCTION_BOUNDARY 8 |
/* C++ stores the virtual bit in the lowest bit of function pointers. */ |
#define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_pfn |
/* Alignment of field after `int : 0' in a structure. */ |
#define EMPTY_FIELD_BOUNDARY BITS_PER_WORD |
/* Minimum size in bits of the largest boundary to which any |
and all fundamental data types supported by the hardware |
might need to be aligned. No data type wants to be aligned |
rounder than this. |
Pentium+ prefers DFmode values to be aligned to 64 bit boundary |
and Pentium Pro XFmode values at 128 bit boundaries. */ |
#define BIGGEST_ALIGNMENT (TARGET_AVX ? 256: 128) |
/* Maximum stack alignment. */ |
#define MAX_STACK_ALIGNMENT MAX_OFILE_ALIGNMENT |
/* Alignment value for attribute ((aligned)). It is a constant since |
it is the part of the ABI. We shouldn't change it with -mavx. */ |
#define ATTRIBUTE_ALIGNED_VALUE 128 |
/* Decide whether a variable of mode MODE should be 128 bit aligned. */ |
#define ALIGN_MODE_128(MODE) \ |
((MODE) == XFmode || SSE_REG_MODE_P (MODE)) |
/* The published ABIs say that doubles should be aligned on word |
boundaries, so lower the alignment for structure fields unless |
-malign-double is set. */ |
/* ??? Blah -- this macro is used directly by libobjc. Since it |
supports no vector modes, cut out the complexity and fall back |
on BIGGEST_FIELD_ALIGNMENT. */ |
#ifdef IN_TARGET_LIBS |
#ifdef __x86_64__ |
#define BIGGEST_FIELD_ALIGNMENT 128 |
#else |
#define BIGGEST_FIELD_ALIGNMENT 32 |
#endif |
#else |
#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ |
x86_field_alignment (FIELD, COMPUTED) |
#endif |
/* If defined, a C expression to compute the alignment given to a |
constant that is being placed in memory. EXP is the constant |
and ALIGN is the alignment that the object would ordinarily have. |
The value of this macro is used instead of that alignment to align |
the object. |
If this macro is not defined, then ALIGN is used. |
The typical use of this macro is to increase alignment for string |
constants to be word aligned so that `strcpy' calls that copy |
constants can be done inline. */ |
#define CONSTANT_ALIGNMENT(EXP, ALIGN) ix86_constant_alignment ((EXP), (ALIGN)) |
/* If defined, a C expression to compute the alignment for a static |
variable. TYPE is the data type, and ALIGN is the alignment that |
the object would ordinarily have. The value of this macro is used |
instead of that alignment to align the object. |
If this macro is not defined, then ALIGN is used. |
One use of this macro is to increase alignment of medium-size |
data to make it all fit in fewer cache lines. Another is to |
cause character arrays to be word-aligned so that `strcpy' calls |
that copy constants to character arrays can be done inline. */ |
#define DATA_ALIGNMENT(TYPE, ALIGN) ix86_data_alignment ((TYPE), (ALIGN)) |
/* If defined, a C expression to compute the alignment for a local |
variable. TYPE is the data type, and ALIGN is the alignment that |
the object would ordinarily have. The value of this macro is used |
instead of that alignment to align the object. |
If this macro is not defined, then ALIGN is used. |
One use of this macro is to increase alignment of medium-size |
data to make it all fit in fewer cache lines. */ |
#define LOCAL_ALIGNMENT(TYPE, ALIGN) \ |
ix86_local_alignment ((TYPE), VOIDmode, (ALIGN)) |
/* If defined, a C expression to compute the alignment for stack slot. |
TYPE is the data type, MODE is the widest mode available, and ALIGN |
is the alignment that the slot would ordinarily have. The value of |
this macro is used instead of that alignment to align the slot. |
If this macro is not defined, then ALIGN is used when TYPE is NULL, |
Otherwise, LOCAL_ALIGNMENT will be used. |
One use of this macro is to set alignment of stack slot to the |
maximum alignment of all possible modes which the slot may have. */ |
#define STACK_SLOT_ALIGNMENT(TYPE, MODE, ALIGN) \ |
ix86_local_alignment ((TYPE), (MODE), (ALIGN)) |
/* If defined, a C expression to compute the alignment for a local |
variable DECL. |
If this macro is not defined, then |
LOCAL_ALIGNMENT (TREE_TYPE (DECL), DECL_ALIGN (DECL)) will be used. |
One use of this macro is to increase alignment of medium-size |
data to make it all fit in fewer cache lines. */ |
#define LOCAL_DECL_ALIGNMENT(DECL) \ |
ix86_local_alignment ((DECL), VOIDmode, DECL_ALIGN (DECL)) |
/* If defined, a C expression to compute the minimum required alignment |
for dynamic stack realignment purposes for EXP (a TYPE or DECL), |
MODE, assuming normal alignment ALIGN. |
If this macro is not defined, then (ALIGN) will be used. */ |
#define MINIMUM_ALIGNMENT(EXP, MODE, ALIGN) \ |
ix86_minimum_alignment (EXP, MODE, ALIGN) |
/* If defined, a C expression that gives the alignment boundary, in |
bits, of an argument with the specified mode and type. If it is |
not defined, `PARM_BOUNDARY' is used for all arguments. */ |
#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \ |
ix86_function_arg_boundary ((MODE), (TYPE)) |
/* Set this nonzero if move instructions will actually fail to work |
when given unaligned data. */ |
#define STRICT_ALIGNMENT 0 |
/* If bit field type is int, don't let it cross an int, |
and give entire struct the alignment of an int. */ |
/* Required on the 386 since it doesn't have bit-field insns. */ |
#define PCC_BITFIELD_TYPE_MATTERS 1 |
/* Standard register usage. */ |
/* This processor has special stack-like registers. See reg-stack.c |
for details. */ |
#define STACK_REGS |
#define IS_STACK_MODE(MODE) \ |
(((MODE) == SFmode && (!TARGET_SSE || !TARGET_SSE_MATH)) \ |
|| ((MODE) == DFmode && (!TARGET_SSE2 || !TARGET_SSE_MATH)) \ |
|| (MODE) == XFmode) |
/* Cover class containing the stack registers. */ |
#define STACK_REG_COVER_CLASS FLOAT_REGS |
/* Number of actual hardware registers. |
The hardware registers are assigned numbers for the compiler |
from 0 to just below FIRST_PSEUDO_REGISTER. |
All registers that the compiler knows about must be given numbers, |
even those that are not normally considered general registers. |
In the 80386 we give the 8 general purpose registers the numbers 0-7. |
We number the floating point registers 8-15. |
Note that registers 0-7 can be accessed as a short or int, |
while only 0-3 may be used with byte `mov' instructions. |
Reg 16 does not correspond to any hardware register, but instead |
appears in the RTL as an argument pointer prior to reload, and is |
eliminated during reloading in favor of either the stack or frame |
pointer. */ |
#define FIRST_PSEUDO_REGISTER 53 |
/* Number of hardware registers that go into the DWARF-2 unwind info. |
If not defined, equals FIRST_PSEUDO_REGISTER. */ |
#define DWARF_FRAME_REGISTERS 17 |
/* 1 for registers that have pervasive standard uses |
and are not available for the register allocator. |
On the 80386, the stack pointer is such, as is the arg pointer. |
The value is zero if the register is not fixed on either 32 or |
64 bit targets, one if the register if fixed on both 32 and 64 |
bit targets, two if it is only fixed on 32bit targets and three |
if its only fixed on 64bit targets. |
Proper values are computed in the CONDITIONAL_REGISTER_USAGE. |
*/ |
#define FIXED_REGISTERS \ |
/*ax,dx,cx,bx,si,di,bp,sp,st,st1,st2,st3,st4,st5,st6,st7*/ \ |
{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ |
/*arg,flags,fpsr,fpcr,frame*/ \ |
1, 1, 1, 1, 1, \ |
/*xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7*/ \ |
0, 0, 0, 0, 0, 0, 0, 0, \ |
/* mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7*/ \ |
0, 0, 0, 0, 0, 0, 0, 0, \ |
/* r8, r9, r10, r11, r12, r13, r14, r15*/ \ |
2, 2, 2, 2, 2, 2, 2, 2, \ |
/*xmm8,xmm9,xmm10,xmm11,xmm12,xmm13,xmm14,xmm15*/ \ |
2, 2, 2, 2, 2, 2, 2, 2 } |
/* 1 for registers not available across function calls. |
These must include the FIXED_REGISTERS and also any |
registers that can be used without being saved. |
The latter must include the registers where values are returned |
and the register where structure-value addresses are passed. |
Aside from that, you can include as many other registers as you like. |
The value is zero if the register is not call used on either 32 or |
64 bit targets, one if the register if call used on both 32 and 64 |
bit targets, two if it is only call used on 32bit targets and three |
if its only call used on 64bit targets. |
Proper values are computed in the CONDITIONAL_REGISTER_USAGE. |
*/ |
#define CALL_USED_REGISTERS \ |
/*ax,dx,cx,bx,si,di,bp,sp,st,st1,st2,st3,st4,st5,st6,st7*/ \ |
{ 1, 1, 1, 0, 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ |
/*arg,flags,fpsr,fpcr,frame*/ \ |
1, 1, 1, 1, 1, \ |
/*xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7*/ \ |
1, 1, 1, 1, 1, 1, 1, 1, \ |
/* mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7*/ \ |
1, 1, 1, 1, 1, 1, 1, 1, \ |
/* r8, r9, r10, r11, r12, r13, r14, r15*/ \ |
1, 1, 1, 1, 2, 2, 2, 2, \ |
/*xmm8,xmm9,xmm10,xmm11,xmm12,xmm13,xmm14,xmm15*/ \ |
1, 1, 1, 1, 1, 1, 1, 1 } |
/* Order in which to allocate registers. Each register must be |
listed once, even those in FIXED_REGISTERS. List frame pointer |
late and fixed registers last. Note that, in general, we prefer |
registers listed in CALL_USED_REGISTERS, keeping the others |
available for storage of persistent values. |
The ORDER_REGS_FOR_LOCAL_ALLOC actually overwrite the order, |
so this is just empty initializer for array. */ |
#define REG_ALLOC_ORDER \ |
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\ |
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, \ |
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, \ |
48, 49, 50, 51, 52 } |
/* ORDER_REGS_FOR_LOCAL_ALLOC is a macro which permits reg_alloc_order |
to be rearranged based on a particular function. When using sse math, |
we want to allocate SSE before x87 registers and vice versa. */ |
#define ORDER_REGS_FOR_LOCAL_ALLOC x86_order_regs_for_local_alloc () |
#define OVERRIDE_ABI_FORMAT(FNDECL) ix86_call_abi_override (FNDECL) |
/* Macro to conditionally modify fixed_regs/call_used_regs. */ |
#define CONDITIONAL_REGISTER_USAGE ix86_conditional_register_usage () |
/* Return number of consecutive hard regs needed starting at reg REGNO |
to hold something of mode MODE. |
This is ordinarily the length in words of a value of mode MODE |
but can be less for certain modes in special long registers. |
Actually there are no two word move instructions for consecutive |
registers. And only registers 0-3 may have mov byte instructions |
applied to them. |
*/ |
#define HARD_REGNO_NREGS(REGNO, MODE) \ |
(FP_REGNO_P (REGNO) || SSE_REGNO_P (REGNO) || MMX_REGNO_P (REGNO) \ |
? (COMPLEX_MODE_P (MODE) ? 2 : 1) \ |
: ((MODE) == XFmode \ |
? (TARGET_64BIT ? 2 : 3) \ |
: (MODE) == XCmode \ |
? (TARGET_64BIT ? 4 : 6) \ |
: ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))) |
#define HARD_REGNO_NREGS_HAS_PADDING(REGNO, MODE) \ |
((TARGET_128BIT_LONG_DOUBLE && !TARGET_64BIT) \ |
? (FP_REGNO_P (REGNO) || SSE_REGNO_P (REGNO) || MMX_REGNO_P (REGNO) \ |
? 0 \ |
: ((MODE) == XFmode || (MODE) == XCmode)) \ |
: 0) |
#define HARD_REGNO_NREGS_WITH_PADDING(REGNO, MODE) ((MODE) == XFmode ? 4 : 8) |
#define VALID_AVX256_REG_MODE(MODE) \ |
((MODE) == V32QImode || (MODE) == V16HImode || (MODE) == V8SImode \ |
|| (MODE) == V4DImode || (MODE) == V8SFmode || (MODE) == V4DFmode) |
#define VALID_SSE2_REG_MODE(MODE) \ |
((MODE) == V16QImode || (MODE) == V8HImode || (MODE) == V2DFmode \ |
|| (MODE) == V2DImode || (MODE) == DFmode) |
#define VALID_SSE_REG_MODE(MODE) \ |
((MODE) == V1TImode || (MODE) == TImode \ |
|| (MODE) == V4SFmode || (MODE) == V4SImode \ |
|| (MODE) == SFmode || (MODE) == TFmode) |
#define VALID_MMX_REG_MODE_3DNOW(MODE) \ |
((MODE) == V2SFmode || (MODE) == SFmode) |
#define VALID_MMX_REG_MODE(MODE) \ |
((MODE == V1DImode) || (MODE) == DImode \ |
|| (MODE) == V2SImode || (MODE) == SImode \ |
|| (MODE) == V4HImode || (MODE) == V8QImode) |
/* ??? No autovectorization into MMX or 3DNOW until we can reliably |
place emms and femms instructions. |
FIXME: AVX has 32byte floating point vector operations and 16byte |
integer vector operations. But vectorizer doesn't support |
different sizes for integer and floating point vectors. We limit |
vector size to 16byte. */ |
#define UNITS_PER_SIMD_WORD(MODE) \ |
(TARGET_AVX ? (((MODE) == DFmode || (MODE) == SFmode) ? 16 : 16) \ |
: (TARGET_SSE ? 16 : UNITS_PER_WORD)) |
#define VALID_DFP_MODE_P(MODE) \ |
((MODE) == SDmode || (MODE) == DDmode || (MODE) == TDmode) |
#define VALID_FP_MODE_P(MODE) \ |
((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode \ |
|| (MODE) == SCmode || (MODE) == DCmode || (MODE) == XCmode) \ |
#define VALID_INT_MODE_P(MODE) \ |
((MODE) == QImode || (MODE) == HImode || (MODE) == SImode \ |
|| (MODE) == DImode \ |
|| (MODE) == CQImode || (MODE) == CHImode || (MODE) == CSImode \ |
|| (MODE) == CDImode \ |
|| (TARGET_64BIT && ((MODE) == TImode || (MODE) == CTImode \ |
|| (MODE) == TFmode || (MODE) == TCmode))) |
/* Return true for modes passed in SSE registers. */ |
#define SSE_REG_MODE_P(MODE) \ |
((MODE) == V1TImode || (MODE) == TImode || (MODE) == V16QImode \ |
|| (MODE) == TFmode || (MODE) == V8HImode || (MODE) == V2DFmode \ |
|| (MODE) == V2DImode || (MODE) == V4SFmode || (MODE) == V4SImode \ |
|| (MODE) == V32QImode || (MODE) == V16HImode || (MODE) == V8SImode \ |
|| (MODE) == V4DImode || (MODE) == V8SFmode || (MODE) == V4DFmode) |
/* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. */ |
#define HARD_REGNO_MODE_OK(REGNO, MODE) \ |
ix86_hard_regno_mode_ok ((REGNO), (MODE)) |
/* Value is 1 if it is a good idea to tie two pseudo registers |
when one has mode MODE1 and one has mode MODE2. |
If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2, |
for any hard reg, then this must be 0 for correct output. */ |
#define MODES_TIEABLE_P(MODE1, MODE2) ix86_modes_tieable_p (MODE1, MODE2) |
/* It is possible to write patterns to move flags; but until someone |
does it, */ |
#define AVOID_CCMODE_COPIES |
/* Specify the modes required to caller save a given hard regno. |
We do this on i386 to prevent flags from being saved at all. |
Kill any attempts to combine saving of modes. */ |
#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \ |
(CC_REGNO_P (REGNO) ? VOIDmode \ |
: (MODE) == VOIDmode && (NREGS) != 1 ? VOIDmode \ |
: (MODE) == VOIDmode ? choose_hard_reg_mode ((REGNO), (NREGS), false) \ |
: (MODE) == HImode && !TARGET_PARTIAL_REG_STALL ? SImode \ |
: (MODE) == QImode && (REGNO) > BX_REG && !TARGET_64BIT ? SImode \ |
: (MODE)) |
/* Specify the registers used for certain standard purposes. |
The values of these macros are register numbers. */ |
/* on the 386 the pc register is %eip, and is not usable as a general |
register. The ordinary mov instructions won't work */ |
/* #define PC_REGNUM */ |
/* Register to use for pushing function arguments. */ |
#define STACK_POINTER_REGNUM 7 |
/* Base register for access to local variables of the function. */ |
#define HARD_FRAME_POINTER_REGNUM 6 |
/* Base register for access to local variables of the function. */ |
#define FRAME_POINTER_REGNUM 20 |
/* First floating point reg */ |
#define FIRST_FLOAT_REG 8 |
/* First & last stack-like regs */ |
#define FIRST_STACK_REG FIRST_FLOAT_REG |
#define LAST_STACK_REG (FIRST_FLOAT_REG + 7) |
#define FIRST_SSE_REG (FRAME_POINTER_REGNUM + 1) |
#define LAST_SSE_REG (FIRST_SSE_REG + 7) |
#define FIRST_MMX_REG (LAST_SSE_REG + 1) |
#define LAST_MMX_REG (FIRST_MMX_REG + 7) |
#define FIRST_REX_INT_REG (LAST_MMX_REG + 1) |
#define LAST_REX_INT_REG (FIRST_REX_INT_REG + 7) |
#define FIRST_REX_SSE_REG (LAST_REX_INT_REG + 1) |
#define LAST_REX_SSE_REG (FIRST_REX_SSE_REG + 7) |
/* Override this in other tm.h files to cope with various OS lossage |
requiring a frame pointer. */ |
#ifndef SUBTARGET_FRAME_POINTER_REQUIRED |
#define SUBTARGET_FRAME_POINTER_REQUIRED 0 |
#endif |
/* Make sure we can access arbitrary call frames. */ |
#define SETUP_FRAME_ADDRESSES() ix86_setup_frame_addresses () |
/* Base register for access to arguments of the function. */ |
#define ARG_POINTER_REGNUM 16 |
/* Register to hold the addressing base for position independent |
code access to data items. We don't use PIC pointer for 64bit |
mode. Define the regnum to dummy value to prevent gcc from |
pessimizing code dealing with EBX. |
To avoid clobbering a call-saved register unnecessarily, we renumber |
the pic register when possible. The change is visible after the |
prologue has been emitted. */ |
#define REAL_PIC_OFFSET_TABLE_REGNUM BX_REG |
#define PIC_OFFSET_TABLE_REGNUM \ |
((TARGET_64BIT && ix86_cmodel == CM_SMALL_PIC) \ |
|| !flag_pic ? INVALID_REGNUM \ |
: reload_completed ? REGNO (pic_offset_table_rtx) \ |
: REAL_PIC_OFFSET_TABLE_REGNUM) |
#define GOT_SYMBOL_NAME "_GLOBAL_OFFSET_TABLE_" |
/* This is overridden by <cygwin.h>. */ |
#define MS_AGGREGATE_RETURN 0 |
/* This is overridden by <netware.h>. */ |
#define KEEP_AGGREGATE_RETURN_POINTER 0 |
/* Define the classes of registers for register constraints in the |
machine description. Also define ranges of constants. |
One of the classes must always be named ALL_REGS and include all hard regs. |
If there is more than one class, another class must be named NO_REGS |
and contain no registers. |
The name GENERAL_REGS must be the name of a class (or an alias for |
another name such as ALL_REGS). This is the class of registers |
that is allowed by "g" or "r" in a register constraint. |
Also, registers outside this class are allocated only when |
instructions express preferences for them. |
The classes must be numbered in nondecreasing order; that is, |
a larger-numbered class must never be contained completely |
in a smaller-numbered class. |
For any two classes, it is very desirable that there be another |
class that represents their union. |
It might seem that class BREG is unnecessary, since no useful 386 |
opcode needs reg %ebx. But some systems pass args to the OS in ebx, |
and the "b" register constraint is useful in asms for syscalls. |
The flags, fpsr and fpcr registers are in no class. */ |
enum reg_class |
{ |
NO_REGS, |
AREG, DREG, CREG, BREG, SIREG, DIREG, |
AD_REGS, /* %eax/%edx for DImode */ |
CLOBBERED_REGS, /* call-clobbered integers */ |
Q_REGS, /* %eax %ebx %ecx %edx */ |
NON_Q_REGS, /* %esi %edi %ebp %esp */ |
INDEX_REGS, /* %eax %ebx %ecx %edx %esi %edi %ebp */ |
LEGACY_REGS, /* %eax %ebx %ecx %edx %esi %edi %ebp %esp */ |
GENERAL_REGS, /* %eax %ebx %ecx %edx %esi %edi %ebp %esp %r8 - %r15*/ |
FP_TOP_REG, FP_SECOND_REG, /* %st(0) %st(1) */ |
FLOAT_REGS, |
SSE_FIRST_REG, |
SSE_REGS, |
MMX_REGS, |
FP_TOP_SSE_REGS, |
FP_SECOND_SSE_REGS, |
FLOAT_SSE_REGS, |
FLOAT_INT_REGS, |
INT_SSE_REGS, |
FLOAT_INT_SSE_REGS, |
ALL_REGS, LIM_REG_CLASSES |
}; |
#define N_REG_CLASSES ((int) LIM_REG_CLASSES) |
#define INTEGER_CLASS_P(CLASS) \ |
reg_class_subset_p ((CLASS), GENERAL_REGS) |
#define FLOAT_CLASS_P(CLASS) \ |
reg_class_subset_p ((CLASS), FLOAT_REGS) |
#define SSE_CLASS_P(CLASS) \ |
reg_class_subset_p ((CLASS), SSE_REGS) |
#define MMX_CLASS_P(CLASS) \ |
((CLASS) == MMX_REGS) |
#define MAYBE_INTEGER_CLASS_P(CLASS) \ |
reg_classes_intersect_p ((CLASS), GENERAL_REGS) |
#define MAYBE_FLOAT_CLASS_P(CLASS) \ |
reg_classes_intersect_p ((CLASS), FLOAT_REGS) |
#define MAYBE_SSE_CLASS_P(CLASS) \ |
reg_classes_intersect_p (SSE_REGS, (CLASS)) |
#define MAYBE_MMX_CLASS_P(CLASS) \ |
reg_classes_intersect_p (MMX_REGS, (CLASS)) |
#define Q_CLASS_P(CLASS) \ |
reg_class_subset_p ((CLASS), Q_REGS) |
/* Give names of register classes as strings for dump file. */ |
#define REG_CLASS_NAMES \ |
{ "NO_REGS", \ |
"AREG", "DREG", "CREG", "BREG", \ |
"SIREG", "DIREG", \ |
"AD_REGS", \ |
"CLOBBERED_REGS", \ |
"Q_REGS", "NON_Q_REGS", \ |
"INDEX_REGS", \ |
"LEGACY_REGS", \ |
"GENERAL_REGS", \ |
"FP_TOP_REG", "FP_SECOND_REG", \ |
"FLOAT_REGS", \ |
"SSE_FIRST_REG", \ |
"SSE_REGS", \ |
"MMX_REGS", \ |
"FP_TOP_SSE_REGS", \ |
"FP_SECOND_SSE_REGS", \ |
"FLOAT_SSE_REGS", \ |
"FLOAT_INT_REGS", \ |
"INT_SSE_REGS", \ |
"FLOAT_INT_SSE_REGS", \ |
"ALL_REGS" } |
/* Define which registers fit in which classes. This is an initializer |
for a vector of HARD_REG_SET of length N_REG_CLASSES. |
Note that the default setting of CLOBBERED_REGS is for 32-bit; this |
is adjusted by CONDITIONAL_REGISTER_USAGE for the 64-bit ABI in effect. */ |
#define REG_CLASS_CONTENTS \ |
{ { 0x00, 0x0 }, \ |
{ 0x01, 0x0 }, { 0x02, 0x0 }, /* AREG, DREG */ \ |
{ 0x04, 0x0 }, { 0x08, 0x0 }, /* CREG, BREG */ \ |
{ 0x10, 0x0 }, { 0x20, 0x0 }, /* SIREG, DIREG */ \ |
{ 0x03, 0x0 }, /* AD_REGS */ \ |
{ 0x07, 0x0 }, /* CLOBBERED_REGS */ \ |
{ 0x0f, 0x0 }, /* Q_REGS */ \ |
{ 0x1100f0, 0x1fe0 }, /* NON_Q_REGS */ \ |
{ 0x7f, 0x1fe0 }, /* INDEX_REGS */ \ |
{ 0x1100ff, 0x0 }, /* LEGACY_REGS */ \ |
{ 0x1100ff, 0x1fe0 }, /* GENERAL_REGS */ \ |
{ 0x100, 0x0 }, { 0x0200, 0x0 },/* FP_TOP_REG, FP_SECOND_REG */\ |
{ 0xff00, 0x0 }, /* FLOAT_REGS */ \ |
{ 0x200000, 0x0 }, /* SSE_FIRST_REG */ \ |
{ 0x1fe00000,0x1fe000 }, /* SSE_REGS */ \ |
{ 0xe0000000, 0x1f }, /* MMX_REGS */ \ |
{ 0x1fe00100,0x1fe000 }, /* FP_TOP_SSE_REG */ \ |
{ 0x1fe00200,0x1fe000 }, /* FP_SECOND_SSE_REG */ \ |
{ 0x1fe0ff00,0x3fe000 }, /* FLOAT_SSE_REGS */ \ |
{ 0x1ffff, 0x1fe0 }, /* FLOAT_INT_REGS */ \ |
{ 0x1fe100ff,0x1fffe0 }, /* INT_SSE_REGS */ \ |
{ 0x1fe1ffff,0x1fffe0 }, /* FLOAT_INT_SSE_REGS */ \ |
{ 0xffffffff,0x1fffff } \ |
} |
/* The same information, inverted: |
Return the class number of the smallest class containing |
reg number REGNO. This could be a conditional expression |
or could index an array. */ |
#define REGNO_REG_CLASS(REGNO) (regclass_map[REGNO]) |
/* When defined, the compiler allows registers explicitly used in the |
rtl to be used as spill registers but prevents the compiler from |
extending the lifetime of these registers. */ |
#define SMALL_REGISTER_CLASSES 1 |
#define QI_REG_P(X) (REG_P (X) && REGNO (X) <= BX_REG) |
#define GENERAL_REGNO_P(N) \ |
((N) <= STACK_POINTER_REGNUM || REX_INT_REGNO_P (N)) |
#define GENERAL_REG_P(X) \ |
(REG_P (X) && GENERAL_REGNO_P (REGNO (X))) |
#define ANY_QI_REG_P(X) (TARGET_64BIT ? GENERAL_REG_P(X) : QI_REG_P (X)) |
#define REX_INT_REGNO_P(N) \ |
IN_RANGE ((N), FIRST_REX_INT_REG, LAST_REX_INT_REG) |
#define REX_INT_REG_P(X) (REG_P (X) && REX_INT_REGNO_P (REGNO (X))) |
#define FP_REG_P(X) (REG_P (X) && FP_REGNO_P (REGNO (X))) |
#define FP_REGNO_P(N) IN_RANGE ((N), FIRST_STACK_REG, LAST_STACK_REG) |
#define ANY_FP_REG_P(X) (REG_P (X) && ANY_FP_REGNO_P (REGNO (X))) |
#define ANY_FP_REGNO_P(N) (FP_REGNO_P (N) || SSE_REGNO_P (N)) |
#define X87_FLOAT_MODE_P(MODE) \ |
(TARGET_80387 && ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode)) |
#define SSE_REG_P(N) (REG_P (N) && SSE_REGNO_P (REGNO (N))) |
#define SSE_REGNO_P(N) \ |
(IN_RANGE ((N), FIRST_SSE_REG, LAST_SSE_REG) \ |
|| REX_SSE_REGNO_P (N)) |
#define REX_SSE_REGNO_P(N) \ |
IN_RANGE ((N), FIRST_REX_SSE_REG, LAST_REX_SSE_REG) |
#define SSE_REGNO(N) \ |
((N) < 8 ? FIRST_SSE_REG + (N) : FIRST_REX_SSE_REG + (N) - 8) |
#define SSE_FLOAT_MODE_P(MODE) \ |
((TARGET_SSE && (MODE) == SFmode) || (TARGET_SSE2 && (MODE) == DFmode)) |
#define SSE_VEC_FLOAT_MODE_P(MODE) \ |
((TARGET_SSE && (MODE) == V4SFmode) || (TARGET_SSE2 && (MODE) == V2DFmode)) |
#define AVX_FLOAT_MODE_P(MODE) \ |
(TARGET_AVX && ((MODE) == SFmode || (MODE) == DFmode)) |
#define AVX128_VEC_FLOAT_MODE_P(MODE) \ |
(TARGET_AVX && ((MODE) == V4SFmode || (MODE) == V2DFmode)) |
#define AVX256_VEC_FLOAT_MODE_P(MODE) \ |
(TARGET_AVX && ((MODE) == V8SFmode || (MODE) == V4DFmode)) |
#define AVX_VEC_FLOAT_MODE_P(MODE) \ |
(TARGET_AVX && ((MODE) == V4SFmode || (MODE) == V2DFmode \ |
|| (MODE) == V8SFmode || (MODE) == V4DFmode)) |
#define FMA4_VEC_FLOAT_MODE_P(MODE) \ |
(TARGET_FMA4 && ((MODE) == V4SFmode || (MODE) == V2DFmode \ |
|| (MODE) == V8SFmode || (MODE) == V4DFmode)) |
#define MMX_REG_P(XOP) (REG_P (XOP) && MMX_REGNO_P (REGNO (XOP))) |
#define MMX_REGNO_P(N) IN_RANGE ((N), FIRST_MMX_REG, LAST_MMX_REG) |
#define STACK_REG_P(XOP) (REG_P (XOP) && STACK_REGNO_P (REGNO (XOP))) |
#define STACK_REGNO_P(N) IN_RANGE ((N), FIRST_STACK_REG, LAST_STACK_REG) |
#define STACK_TOP_P(XOP) (REG_P (XOP) && REGNO (XOP) == FIRST_STACK_REG) |
#define CC_REG_P(X) (REG_P (X) && CC_REGNO_P (REGNO (X))) |
#define CC_REGNO_P(X) ((X) == FLAGS_REG || (X) == FPSR_REG) |
/* The class value for index registers, and the one for base regs. */ |
#define INDEX_REG_CLASS INDEX_REGS |
#define BASE_REG_CLASS GENERAL_REGS |
/* Place additional restrictions on the register class to use when it |
is necessary to be able to hold a value of mode MODE in a reload |
register for which class CLASS would ordinarily be used. */ |
#define LIMIT_RELOAD_CLASS(MODE, CLASS) \ |
((MODE) == QImode && !TARGET_64BIT \ |
&& ((CLASS) == ALL_REGS || (CLASS) == GENERAL_REGS \ |
|| (CLASS) == LEGACY_REGS || (CLASS) == INDEX_REGS) \ |
? Q_REGS : (CLASS)) |
/* Given an rtx X being reloaded into a reg required to be |
in class CLASS, return the class of reg to actually use. |
In general this is just CLASS; but on some machines |
in some cases it is preferable to use a more restrictive class. |
On the 80386 series, we prevent floating constants from being |
reloaded into floating registers (since no move-insn can do that) |
and we ensure that QImodes aren't reloaded into the esi or edi reg. */ |
/* Put float CONST_DOUBLE in the constant pool instead of fp regs. |
QImode must go into class Q_REGS. |
Narrow ALL_REGS to GENERAL_REGS. This supports allowing movsf and |
movdf to do mem-to-mem moves through integer regs. */ |
#define PREFERRED_RELOAD_CLASS(X, CLASS) \ |
ix86_preferred_reload_class ((X), (CLASS)) |
/* Discourage putting floating-point values in SSE registers unless |
SSE math is being used, and likewise for the 387 registers. */ |
#define PREFERRED_OUTPUT_RELOAD_CLASS(X, CLASS) \ |
ix86_preferred_output_reload_class ((X), (CLASS)) |
/* If we are copying between general and FP registers, we need a memory |
location. The same is true for SSE and MMX registers. */ |
#define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, MODE) \ |
ix86_secondary_memory_needed ((CLASS1), (CLASS2), (MODE), 1) |
/* Get_secondary_mem widens integral modes to BITS_PER_WORD. |
There is no need to emit full 64 bit move on 64 bit targets |
for integral modes that can be moved using 32 bit move. */ |
#define SECONDARY_MEMORY_NEEDED_MODE(MODE) \ |
(GET_MODE_BITSIZE (MODE) < 32 && INTEGRAL_MODE_P (MODE) \ |
? mode_for_size (32, GET_MODE_CLASS (MODE), 0) \ |
: MODE) |
/* Return the maximum number of consecutive registers |
needed to represent mode MODE in a register of class CLASS. */ |
/* On the 80386, this is the size of MODE in words, |
except in the FP regs, where a single reg is always enough. */ |
#define CLASS_MAX_NREGS(CLASS, MODE) \ |
(!MAYBE_INTEGER_CLASS_P (CLASS) \ |
? (COMPLEX_MODE_P (MODE) ? 2 : 1) \ |
: (((((MODE) == XFmode ? 12 : GET_MODE_SIZE (MODE))) \ |
+ UNITS_PER_WORD - 1) / UNITS_PER_WORD)) |
/* A C expression whose value is nonzero if pseudos that have been |
assigned to registers of class CLASS would likely be spilled |
because registers of CLASS are needed for spill registers. |
The default value of this macro returns 1 if CLASS has exactly one |
register and zero otherwise. On most machines, this default |
should be used. Only define this macro to some other expression |
if pseudo allocated by `local-alloc.c' end up in memory because |
their hard registers were needed for spill registers. If this |
macro returns nonzero for those classes, those pseudos will only |
be allocated by `global.c', which knows how to reallocate the |
pseudo to another register. If there would not be another |
register available for reallocation, you should not change the |
definition of this macro since the only effect of such a |
definition would be to slow down register allocation. */ |
#define CLASS_LIKELY_SPILLED_P(CLASS) \ |
(((CLASS) == AREG) \ |
|| ((CLASS) == DREG) \ |
|| ((CLASS) == CREG) \ |
|| ((CLASS) == BREG) \ |
|| ((CLASS) == AD_REGS) \ |
|| ((CLASS) == SIREG) \ |
|| ((CLASS) == DIREG) \ |
|| ((CLASS) == SSE_FIRST_REG) \ |
|| ((CLASS) == FP_TOP_REG) \ |
|| ((CLASS) == FP_SECOND_REG)) |
/* Return a class of registers that cannot change FROM mode to TO mode. */ |
#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \ |
ix86_cannot_change_mode_class (FROM, TO, CLASS) |
/* Stack layout; function entry, exit and calling. */ |
/* Define this if pushing a word on the stack |
makes the stack pointer a smaller address. */ |
#define STACK_GROWS_DOWNWARD |
/* Define this to nonzero if the nominal address of the stack frame |
is at the high-address end of the local variables; |
that is, each additional local variable allocated |
goes at a more negative offset in the frame. */ |
#define FRAME_GROWS_DOWNWARD 1 |
/* Offset within stack frame to start allocating local variables at. |
If FRAME_GROWS_DOWNWARD, this is the offset to the END of the |
first local allocated. Otherwise, it is the offset to the BEGINNING |
of the first local allocated. */ |
#define STARTING_FRAME_OFFSET 0 |
/* If we generate an insn to push BYTES bytes, |
this says how many the stack pointer really advances by. |
On 386, we have pushw instruction that decrements by exactly 2 no |
matter what the position was, there is no pushb. |
But as CIE data alignment factor on this arch is -4, we need to make |
sure all stack pointer adjustments are in multiple of 4. |
For 64bit ABI we round up to 8 bytes. |
*/ |
#define PUSH_ROUNDING(BYTES) \ |
(TARGET_64BIT \ |
? (((BYTES) + 7) & (-8)) \ |
: (((BYTES) + 3) & (-4))) |
/* If defined, the maximum amount of space required for outgoing arguments will |
be computed and placed into the variable |
`crtl->outgoing_args_size'. No space will be pushed onto the |
stack for each call; instead, the function prologue should increase the stack |
frame size by this amount. |
MS ABI seem to require 16 byte alignment everywhere except for function |
prologue and apilogue. This is not possible without |
ACCUMULATE_OUTGOING_ARGS. */ |
#define ACCUMULATE_OUTGOING_ARGS \ |
(TARGET_ACCUMULATE_OUTGOING_ARGS || ix86_cfun_abi () == MS_ABI) |
/* If defined, a C expression whose value is nonzero when we want to use PUSH |
instructions to pass outgoing arguments. */ |
#define PUSH_ARGS (TARGET_PUSH_ARGS && !ACCUMULATE_OUTGOING_ARGS) |
/* We want the stack and args grow in opposite directions, even if |
PUSH_ARGS is 0. */ |
#define PUSH_ARGS_REVERSED 1 |
/* Offset of first parameter from the argument pointer register value. */ |
#define FIRST_PARM_OFFSET(FNDECL) 0 |
/* Define this macro if functions should assume that stack space has been |
allocated for arguments even when their values are passed in registers. |
The value of this macro is the size, in bytes, of the area reserved for |
arguments passed in registers for the function represented by FNDECL. |
This space can be allocated by the caller, or be a part of the |
machine-dependent stack frame: `OUTGOING_REG_PARM_STACK_SPACE' says |
which. */ |
#define REG_PARM_STACK_SPACE(FNDECL) ix86_reg_parm_stack_space (FNDECL) |
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) \ |
(ix86_function_type_abi (FNTYPE) == MS_ABI) |
/* Value is the number of bytes of arguments automatically |
popped when returning from a subroutine call. |
FUNDECL is the declaration node of the function (as a tree), |
FUNTYPE is the data type of the function (as a tree), |
or for a library call it is an identifier node for the subroutine name. |
SIZE is the number of bytes of arguments passed on the stack. |
On the 80386, the RTD insn may be used to pop them if the number |
of args is fixed, but if the number is variable then the caller |
must pop them all. RTD can't be used for library calls now |
because the library is compiled with the Unix compiler. |
Use of RTD is a selectable option, since it is incompatible with |
standard Unix calling sequences. If the option is not selected, |
the caller must always pop the args. |
The attribute stdcall is equivalent to RTD on a per module basis. */ |
#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) \ |
ix86_return_pops_args ((FUNDECL), (FUNTYPE), (SIZE)) |
#define FUNCTION_VALUE_REGNO_P(N) ix86_function_value_regno_p (N) |
/* Define how to find the value returned by a library function |
assuming the value has mode MODE. */ |
#define LIBCALL_VALUE(MODE) ix86_libcall_value (MODE) |
/* Define the size of the result block used for communication between |
untyped_call and untyped_return. The block contains a DImode value |
followed by the block used by fnsave and frstor. */ |
#define APPLY_RESULT_SIZE (8+108) |
/* 1 if N is a possible register number for function argument passing. */ |
#define FUNCTION_ARG_REGNO_P(N) ix86_function_arg_regno_p (N) |
/* Define a data type for recording info about an argument list |
during the scan of that argument list. This data type should |
hold all necessary information about the function itself |
and about the args processed so far, enough to enable macros |
such as FUNCTION_ARG to determine where the next arg should go. */ |
typedef struct ix86_args { |
int words; /* # words passed so far */ |
int nregs; /* # registers available for passing */ |
int regno; /* next available register number */ |
int fastcall; /* fastcall calling convention is used */ |
int sse_words; /* # sse words passed so far */ |
int sse_nregs; /* # sse registers available for passing */ |
int warn_avx; /* True when we want to warn about AVX ABI. */ |
int warn_sse; /* True when we want to warn about SSE ABI. */ |
int warn_mmx; /* True when we want to warn about MMX ABI. */ |
int sse_regno; /* next available sse register number */ |
int mmx_words; /* # mmx words passed so far */ |
int mmx_nregs; /* # mmx registers available for passing */ |
int mmx_regno; /* next available mmx register number */ |
int maybe_vaarg; /* true for calls to possibly vardic fncts. */ |
int float_in_sse; /* 1 if in 32-bit mode SFmode (2 for DFmode) should |
be passed in SSE registers. Otherwise 0. */ |
enum calling_abi call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise |
MS_ABI for ms abi. */ |
} CUMULATIVE_ARGS; |
/* Initialize a variable CUM of type CUMULATIVE_ARGS |
for a call to a function whose data type is FNTYPE. |
For a library call, FNTYPE is 0. */ |
#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ |
init_cumulative_args (&(CUM), (FNTYPE), (LIBNAME), (FNDECL)) |
/* Update the data in CUM to advance over an argument |
of mode MODE and data type TYPE. |
(TYPE is null for libcalls where that information may not be available.) */ |
#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ |
function_arg_advance (&(CUM), (MODE), (TYPE), (NAMED)) |
/* Define where to put the arguments to a function. |
Value is zero to push the argument on the stack, |
or a hard register in which to store the argument. |
MODE is the argument's machine mode. |
TYPE is the data type of the argument (as a tree). |
This is null for libcalls where that information may |
not be available. |
CUM is a variable of type CUMULATIVE_ARGS which gives info about |
the preceding args and about the function being called. |
NAMED is nonzero if this argument is a named parameter |
(otherwise it is an extra parameter matching an ellipsis). */ |
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ |
function_arg (&(CUM), (MODE), (TYPE), (NAMED)) |
/* Output assembler code to FILE to increment profiler label # LABELNO |
for profiling a function entry. */ |
#define FUNCTION_PROFILER(FILE, LABELNO) x86_function_profiler (FILE, LABELNO) |
#define MCOUNT_NAME "_mcount" |
#define PROFILE_COUNT_REGISTER "edx" |
/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function, |
the stack pointer does not matter. The value is tested only in |
functions that have frame pointers. |
No definition is equivalent to always zero. */ |
/* Note on the 386 it might be more efficient not to define this since |
we have to restore it ourselves from the frame pointer, in order to |
use pop */ |
#define EXIT_IGNORE_STACK 1 |
/* Output assembler code for a block containing the constant parts |
of a trampoline, leaving space for the variable parts. */ |
/* On the 386, the trampoline contains two instructions: |
mov #STATIC,ecx |
jmp FUNCTION |
The trampoline is generated entirely at runtime. The operand of JMP |
is the address of FUNCTION relative to the instruction following the |
JMP (which is 5 bytes long). */ |
/* Length in units of the trampoline for entering a nested function. */ |
#define TRAMPOLINE_SIZE (TARGET_64BIT ? 24 : 10) |
/* Definitions for register eliminations. |
This is an array of structures. Each structure initializes one pair |
of eliminable registers. The "from" register number is given first, |
followed by "to". Eliminations of the same "from" register are listed |
in order of preference. |
There are two registers that can always be eliminated on the i386. |
The frame pointer and the arg pointer can be replaced by either the |
hard frame pointer or to the stack pointer, depending upon the |
circumstances. The hard frame pointer is not used before reload and |
so it is not eligible for elimination. */ |
#define ELIMINABLE_REGS \ |
{{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ |
{ ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \ |
{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ |
{ FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}} \ |
/* Define the offset between two registers, one to be eliminated, and the other |
its replacement, at the start of a routine. */ |
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ |
((OFFSET) = ix86_initial_elimination_offset ((FROM), (TO))) |
/* Addressing modes, and classification of registers for them. */ |
/* Macros to check register numbers against specific register classes. */ |
/* These assume that REGNO is a hard or pseudo reg number. |
They give nonzero only if REGNO is a hard reg of the suitable class |
or a pseudo reg currently allocated to a suitable hard reg. |
Since they use reg_renumber, they are safe only once reg_renumber |
has been allocated, which happens in local-alloc.c. */ |
#define REGNO_OK_FOR_INDEX_P(REGNO) \ |
((REGNO) < STACK_POINTER_REGNUM \ |
|| REX_INT_REGNO_P (REGNO) \ |
|| (unsigned) reg_renumber[(REGNO)] < STACK_POINTER_REGNUM \ |
|| REX_INT_REGNO_P ((unsigned) reg_renumber[(REGNO)])) |
#define REGNO_OK_FOR_BASE_P(REGNO) \ |
(GENERAL_REGNO_P (REGNO) \ |
|| (REGNO) == ARG_POINTER_REGNUM \ |
|| (REGNO) == FRAME_POINTER_REGNUM \ |
|| GENERAL_REGNO_P ((unsigned) reg_renumber[(REGNO)])) |
/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx |
and check its validity for a certain class. |
We have two alternate definitions for each of them. |
The usual definition accepts all pseudo regs; the other rejects |
them unless they have been allocated suitable hard regs. |
The symbol REG_OK_STRICT causes the latter definition to be used. |
Most source files want to accept pseudo regs in the hope that |
they will get allocated to the class that the insn wants them to be in. |
Source files for reload pass need to be strict. |
After reload, it makes no difference, since pseudo regs have |
been eliminated by then. */ |
/* Non strict versions, pseudos are ok. */ |
#define REG_OK_FOR_INDEX_NONSTRICT_P(X) \ |
(REGNO (X) < STACK_POINTER_REGNUM \ |
|| REX_INT_REGNO_P (REGNO (X)) \ |
|| REGNO (X) >= FIRST_PSEUDO_REGISTER) |
#define REG_OK_FOR_BASE_NONSTRICT_P(X) \ |
(GENERAL_REGNO_P (REGNO (X)) \ |
|| REGNO (X) == ARG_POINTER_REGNUM \ |
|| REGNO (X) == FRAME_POINTER_REGNUM \ |
|| REGNO (X) >= FIRST_PSEUDO_REGISTER) |
/* Strict versions, hard registers only */ |
#define REG_OK_FOR_INDEX_STRICT_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X)) |
#define REG_OK_FOR_BASE_STRICT_P(X) REGNO_OK_FOR_BASE_P (REGNO (X)) |
#ifndef REG_OK_STRICT |
#define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_INDEX_NONSTRICT_P (X) |
#define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_NONSTRICT_P (X) |
#else |
#define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_INDEX_STRICT_P (X) |
#define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_STRICT_P (X) |
#endif |
/* TARGET_LEGITIMATE_ADDRESS_P recognizes an RTL expression |
that is a valid memory address for an instruction. |
The MODE argument is the machine mode for the MEM expression |
that wants to use this address. |
The other macros defined here are used only in TARGET_LEGITIMATE_ADDRESS_P, |
except for CONSTANT_ADDRESS_P which is usually machine-independent. |
See legitimize_pic_address in i386.c for details as to what |
constitutes a legitimate address when -fpic is used. */ |
#define MAX_REGS_PER_ADDRESS 2 |
#define CONSTANT_ADDRESS_P(X) constant_address_p (X) |
/* Nonzero if the constant value X is a legitimate general operand. |
It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE. */ |
#define LEGITIMATE_CONSTANT_P(X) legitimate_constant_p (X) |
/* If defined, a C expression to determine the base term of address X. |
This macro is used in only one place: `find_base_term' in alias.c. |
It is always safe for this macro to not be defined. It exists so |
that alias analysis can understand machine-dependent addresses. |
The typical use of this macro is to handle addresses containing |
a label_ref or symbol_ref within an UNSPEC. */ |
#define FIND_BASE_TERM(X) ix86_find_base_term (X) |
/* Nonzero if the constant value X is a legitimate general operand |
when generating PIC code. It is given that flag_pic is on and |
that X satisfies CONSTANT_P or is a CONST_DOUBLE. */ |
#define LEGITIMATE_PIC_OPERAND_P(X) legitimate_pic_operand_p (X) |
#define SYMBOLIC_CONST(X) \ |
(GET_CODE (X) == SYMBOL_REF \ |
|| GET_CODE (X) == LABEL_REF \ |
|| (GET_CODE (X) == CONST && symbolic_reference_mentioned_p (X))) |
/* Max number of args passed in registers. If this is more than 3, we will |
have problems with ebx (register #4), since it is a caller save register and |
is also used as the pic register in ELF. So for now, don't allow more than |
3 registers to be passed in registers. */ |
/* Abi specific values for REGPARM_MAX and SSE_REGPARM_MAX */ |
#define X86_64_REGPARM_MAX 6 |
#define X86_64_MS_REGPARM_MAX 4 |
#define X86_32_REGPARM_MAX 3 |
#define REGPARM_MAX \ |
(TARGET_64BIT ? (TARGET_64BIT_MS_ABI ? X86_64_MS_REGPARM_MAX \ |
: X86_64_REGPARM_MAX) \ |
: X86_32_REGPARM_MAX) |
#define X86_64_SSE_REGPARM_MAX 8 |
#define X86_64_MS_SSE_REGPARM_MAX 4 |
#define X86_32_SSE_REGPARM_MAX (TARGET_SSE ? (TARGET_MACHO ? 4 : 3) : 0) |
#define SSE_REGPARM_MAX \ |
(TARGET_64BIT ? (TARGET_64BIT_MS_ABI ? X86_64_MS_SSE_REGPARM_MAX \ |
: X86_64_SSE_REGPARM_MAX) \ |
: X86_32_SSE_REGPARM_MAX) |
#define MMX_REGPARM_MAX (TARGET_64BIT ? 0 : (TARGET_MMX ? 3 : 0)) |
/* Specify the machine mode that this machine uses |
for the index in the tablejump instruction. */ |
#define CASE_VECTOR_MODE \ |
(!TARGET_64BIT || (flag_pic && ix86_cmodel != CM_LARGE_PIC) ? SImode : DImode) |
/* Define this as 1 if `char' should by default be signed; else as 0. */ |
#define DEFAULT_SIGNED_CHAR 1 |
/* Max number of bytes we can move from memory to memory |
in one reasonably fast instruction. */ |
#define MOVE_MAX 16 |
/* MOVE_MAX_PIECES is the number of bytes at a time which we can |
move efficiently, as opposed to MOVE_MAX which is the maximum |
number of bytes we can move with a single instruction. */ |
#define MOVE_MAX_PIECES (TARGET_64BIT ? 8 : 4) |
/* If a memory-to-memory move would take MOVE_RATIO or more simple |
move-instruction pairs, we will do a movmem or libcall instead. |
Increasing the value will always make code faster, but eventually |
incurs high cost in increased code size. |
If you don't define this, a reasonable default is used. */ |
#define MOVE_RATIO(speed) ((speed) ? ix86_cost->move_ratio : 3) |
/* If a clear memory operation would take CLEAR_RATIO or more simple |
move-instruction sequences, we will do a clrmem or libcall instead. */ |
#define CLEAR_RATIO(speed) ((speed) ? MIN (6, ix86_cost->move_ratio) : 2) |
/* Define if shifts truncate the shift count |
which implies one can omit a sign-extension or zero-extension |
of a shift count. */ |
/* On i386, shifts do truncate the count. But bit opcodes don't. */ |
/* #define SHIFT_COUNT_TRUNCATED */ |
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits |
is done just by pretending it is already truncated. */ |
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 |
/* A macro to update M and UNSIGNEDP when an object whose type is |
TYPE and which has the specified mode and signedness is to be |
stored in a register. This macro is only called when TYPE is a |
scalar type. |
On i386 it is sometimes useful to promote HImode and QImode |
quantities to SImode. The choice depends on target type. */ |
#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \ |
do { \ |
if (((MODE) == HImode && TARGET_PROMOTE_HI_REGS) \ |
|| ((MODE) == QImode && TARGET_PROMOTE_QI_REGS)) \ |
(MODE) = SImode; \ |
} while (0) |
/* Specify the machine mode that pointers have. |
After generation of rtl, the compiler makes no further distinction |
between pointers and any other objects of this machine mode. */ |
#define Pmode (TARGET_64BIT ? DImode : SImode) |
/* A function address in a call instruction |
is a byte address (for indexing purposes) |
so give the MEM rtx a byte's mode. */ |
#define FUNCTION_MODE QImode |
/* A C expression for the cost of moving data from a register in class FROM to |
one in class TO. The classes are expressed using the enumeration values |
such as `GENERAL_REGS'. A value of 2 is the default; other values are |
interpreted relative to that. |
It is not required that the cost always equal 2 when FROM is the same as TO; |
on some machines it is expensive to move between registers if they are not |
general registers. */ |
#define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \ |
ix86_register_move_cost ((MODE), (CLASS1), (CLASS2)) |
/* A C expression for the cost of moving data of mode M between a |
register and memory. A value of 2 is the default; this cost is |
relative to those in `REGISTER_MOVE_COST'. |
If moving between registers and memory is more expensive than |
between two registers, you should define this macro to express the |
relative cost. */ |
#define MEMORY_MOVE_COST(MODE, CLASS, IN) \ |
ix86_memory_move_cost ((MODE), (CLASS), (IN)) |
/* A C expression for the cost of a branch instruction. A value of 1 |
is the default; other values are interpreted relative to that. */ |
#define BRANCH_COST(speed_p, predictable_p) \ |
(!(speed_p) ? 2 : (predictable_p) ? 0 : ix86_branch_cost) |
/* Define this macro as a C expression which is nonzero if accessing |
less than a word of memory (i.e. a `char' or a `short') is no |
faster than accessing a word of memory, i.e., if such access |
require more than one instruction or if there is no difference in |
cost between byte and (aligned) word loads. |
When this macro is not defined, the compiler will access a field by |
finding the smallest containing object; when it is defined, a |
fullword load will be used if alignment permits. Unless bytes |
accesses are faster than word accesses, using word accesses is |
preferable since it may eliminate subsequent memory access if |
subsequent accesses occur to other fields in the same word of the |
structure, but to different bytes. */ |
#define SLOW_BYTE_ACCESS 0 |
/* Nonzero if access to memory by shorts is slow and undesirable. */ |
#define SLOW_SHORT_ACCESS 0 |
/* Define this macro to be the value 1 if unaligned accesses have a |
cost many times greater than aligned accesses, for example if they |
are emulated in a trap handler. |
When this macro is nonzero, the compiler will act as if |
`STRICT_ALIGNMENT' were nonzero when generating code for block |
moves. This can cause significantly more instructions to be |
produced. Therefore, do not set this macro nonzero if unaligned |
accesses only add a cycle or two to the time for a memory access. |
If the value of this macro is always zero, it need not be defined. */ |
/* #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) 0 */ |
/* Define this macro if it is as good or better to call a constant |
function address than to call an address kept in a register. |
Desirable on the 386 because a CALL with a constant address is |
faster than one with a register address. */ |
#define NO_FUNCTION_CSE |
/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE, |
return the mode to be used for the comparison. |
For floating-point equality comparisons, CCFPEQmode should be used. |
VOIDmode should be used in all other cases. |
For integer comparisons against zero, reduce to CCNOmode or CCZmode if |
possible, to allow for more combinations. */ |
#define SELECT_CC_MODE(OP, X, Y) ix86_cc_mode ((OP), (X), (Y)) |
/* Return nonzero if MODE implies a floating point inequality can be |
reversed. */ |
#define REVERSIBLE_CC_MODE(MODE) 1 |
/* A C expression whose value is reversed condition code of the CODE for |
comparison done in CC_MODE mode. */ |
#define REVERSE_CONDITION(CODE, MODE) ix86_reverse_condition ((CODE), (MODE)) |
/* Control the assembler format that we output, to the extent |
this does not vary between assemblers. */ |
/* How to refer to registers in assembler output. |
This sequence is indexed by compiler's hard-register-number (see above). */ |
/* In order to refer to the first 8 regs as 32-bit regs, prefix an "e". |
For non floating point regs, the following are the HImode names. |
For float regs, the stack top is sometimes referred to as "%st(0)" |
instead of just "%st". PRINT_OPERAND handles this with the "y" code. */ |
#define HI_REGISTER_NAMES \ |
{"ax","dx","cx","bx","si","di","bp","sp", \ |
"st","st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)", \ |
"argp", "flags", "fpsr", "fpcr", "frame", \ |
"xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7", \ |
"mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", \ |
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", \ |
"xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"} |
#define REGISTER_NAMES HI_REGISTER_NAMES |
/* Table of additional register names to use in user input. */ |
#define ADDITIONAL_REGISTER_NAMES \ |
{ { "eax", 0 }, { "edx", 1 }, { "ecx", 2 }, { "ebx", 3 }, \ |
{ "esi", 4 }, { "edi", 5 }, { "ebp", 6 }, { "esp", 7 }, \ |
{ "rax", 0 }, { "rdx", 1 }, { "rcx", 2 }, { "rbx", 3 }, \ |
{ "rsi", 4 }, { "rdi", 5 }, { "rbp", 6 }, { "rsp", 7 }, \ |
{ "al", 0 }, { "dl", 1 }, { "cl", 2 }, { "bl", 3 }, \ |
{ "ah", 0 }, { "dh", 1 }, { "ch", 2 }, { "bh", 3 } } |
/* Note we are omitting these since currently I don't know how |
to get gcc to use these, since they want the same but different |
number as al, and ax. |
*/ |
#define QI_REGISTER_NAMES \ |
{"al", "dl", "cl", "bl", "sil", "dil", "bpl", "spl",} |
/* These parallel the array above, and can be used to access bits 8:15 |
of regs 0 through 3. */ |
#define QI_HIGH_REGISTER_NAMES \ |
{"ah", "dh", "ch", "bh", } |
/* How to renumber registers for dbx and gdb. */ |
#define DBX_REGISTER_NUMBER(N) \ |
(TARGET_64BIT ? dbx64_register_map[(N)] : dbx_register_map[(N)]) |
extern int const dbx_register_map[FIRST_PSEUDO_REGISTER]; |
extern int const dbx64_register_map[FIRST_PSEUDO_REGISTER]; |
extern int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER]; |
/* Before the prologue, RA is at 0(%esp). */ |
#define INCOMING_RETURN_ADDR_RTX \ |
gen_rtx_MEM (VOIDmode, gen_rtx_REG (VOIDmode, STACK_POINTER_REGNUM)) |
/* After the prologue, RA is at -4(AP) in the current frame. */ |
#define RETURN_ADDR_RTX(COUNT, FRAME) \ |
((COUNT) == 0 \ |
? gen_rtx_MEM (Pmode, plus_constant (arg_pointer_rtx, -UNITS_PER_WORD)) \ |
: gen_rtx_MEM (Pmode, plus_constant (FRAME, UNITS_PER_WORD))) |
/* PC is dbx register 8; let's use that column for RA. */ |
#define DWARF_FRAME_RETURN_COLUMN (TARGET_64BIT ? 16 : 8) |
/* Before the prologue, the top of the frame is at 4(%esp). */ |
#define INCOMING_FRAME_SP_OFFSET UNITS_PER_WORD |
/* Describe how we implement __builtin_eh_return. */ |
#define EH_RETURN_DATA_REGNO(N) ((N) < 2 ? (N) : INVALID_REGNUM) |
#define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 2) |
/* 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. |
??? All x86 object file formats are capable of representing this. |
After all, the relocation needed is the same as for the call insn. |
Whether or not a particular assembler allows us to enter such, I |
guess we'll have to see. */ |
#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ |
asm_preferred_eh_data_format ((CODE), (GLOBAL)) |
/* This is how to output an insn to push a register on the stack. |
It need not be very fast code. */ |
#define ASM_OUTPUT_REG_PUSH(FILE, REGNO) \ |
do { \ |
if (TARGET_64BIT) \ |
asm_fprintf ((FILE), "\tpush{q}\t%%r%s\n", \ |
reg_names[(REGNO)] + (REX_INT_REGNO_P (REGNO) != 0)); \ |
else \ |
asm_fprintf ((FILE), "\tpush{l}\t%%e%s\n", reg_names[(REGNO)]); \ |
} while (0) |
/* This is how to output an insn to pop a register from the stack. |
It need not be very fast code. */ |
#define ASM_OUTPUT_REG_POP(FILE, REGNO) \ |
do { \ |
if (TARGET_64BIT) \ |
asm_fprintf ((FILE), "\tpop{q}\t%%r%s\n", \ |
reg_names[(REGNO)] + (REX_INT_REGNO_P (REGNO) != 0)); \ |
else \ |
asm_fprintf ((FILE), "\tpop{l}\t%%e%s\n", reg_names[(REGNO)]); \ |
} while (0) |
/* This is how to output an element of a case-vector that is absolute. */ |
#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ |
ix86_output_addr_vec_elt ((FILE), (VALUE)) |
/* This is how to output an element of a case-vector that is relative. */ |
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ |
ix86_output_addr_diff_elt ((FILE), (VALUE), (REL)) |
/* When we see %v, we will print the 'v' prefix if TARGET_AVX is |
true. */ |
#define ASM_OUTPUT_AVX_PREFIX(STREAM, PTR) \ |
{ \ |
if ((PTR)[0] == '%' && (PTR)[1] == 'v') \ |
{ \ |
if (TARGET_AVX) \ |
(PTR) += 1; \ |
else \ |
(PTR) += 2; \ |
} \ |
} |
/* A C statement or statements which output an assembler instruction |
opcode to the stdio stream STREAM. The macro-operand PTR is a |
variable of type `char *' which points to the opcode name in |
its "internal" form--the form that is written in the machine |
description. */ |
#define ASM_OUTPUT_OPCODE(STREAM, PTR) \ |
ASM_OUTPUT_AVX_PREFIX ((STREAM), (PTR)) |
/* A C statement to output to the stdio stream FILE an assembler |
command to pad the location counter to a multiple of 1<<LOG |
bytes if it is within MAX_SKIP bytes. */ |
#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN |
#undef ASM_OUTPUT_MAX_SKIP_PAD |
#define ASM_OUTPUT_MAX_SKIP_PAD(FILE, LOG, MAX_SKIP) \ |
if ((LOG) != 0) \ |
{ \ |
if ((MAX_SKIP) == 0) \ |
fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ |
else \ |
fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \ |
} |
#endif |
/* Under some conditions we need jump tables in the text section, |
because the assembler cannot handle label differences between |
sections. This is the case for x86_64 on Mach-O for example. */ |
#define JUMP_TABLES_IN_TEXT_SECTION \ |
(flag_pic && ((TARGET_MACHO && TARGET_64BIT) \ |
|| (!TARGET_64BIT && !HAVE_AS_GOTOFF_IN_DATA))) |
/* Switch to init or fini section via SECTION_OP, emit a call to FUNC, |
and switch back. For x86 we do this only to save a few bytes that |
would otherwise be unused in the text section. */ |
#define CRT_MKSTR2(VAL) #VAL |
#define CRT_MKSTR(x) CRT_MKSTR2(x) |
#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ |
asm (SECTION_OP "\n\t" \ |
"call " CRT_MKSTR(__USER_LABEL_PREFIX__) #FUNC "\n" \ |
TEXT_SECTION_ASM_OP); |
/* Print operand X (an rtx) in assembler syntax to file FILE. |
CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified. |
Effect of various CODE letters is described in i386.c near |
print_operand function. */ |
#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \ |
((CODE) == '*' || (CODE) == '+' || (CODE) == '&' || (CODE) == ';') |
#define PRINT_OPERAND(FILE, X, CODE) \ |
print_operand ((FILE), (X), (CODE)) |
#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \ |
print_operand_address ((FILE), (ADDR)) |
#define OUTPUT_ADDR_CONST_EXTRA(FILE, X, FAIL) \ |
do { \ |
if (! output_addr_const_extra (FILE, (X))) \ |
goto FAIL; \ |
} while (0); |
/* Which processor to schedule for. The cpu attribute defines a list that |
mirrors this list, so changes to i386.md must be made at the same time. */ |
enum processor_type |
{ |
PROCESSOR_I386 = 0, /* 80386 */ |
PROCESSOR_I486, /* 80486DX, 80486SX, 80486DX[24] */ |
PROCESSOR_PENTIUM, |
PROCESSOR_PENTIUMPRO, |
PROCESSOR_GEODE, |
PROCESSOR_K6, |
PROCESSOR_ATHLON, |
PROCESSOR_PENTIUM4, |
PROCESSOR_K8, |
PROCESSOR_NOCONA, |
PROCESSOR_CORE2, |
PROCESSOR_GENERIC32, |
PROCESSOR_GENERIC64, |
PROCESSOR_AMDFAM10, |
PROCESSOR_ATOM, |
PROCESSOR_max |
}; |
extern enum processor_type ix86_tune; |
extern enum processor_type ix86_arch; |
enum fpmath_unit |
{ |
FPMATH_387 = 1, |
FPMATH_SSE = 2 |
}; |
extern enum fpmath_unit ix86_fpmath; |
enum tls_dialect |
{ |
TLS_DIALECT_GNU, |
TLS_DIALECT_GNU2, |
TLS_DIALECT_SUN |
}; |
extern enum tls_dialect ix86_tls_dialect; |
enum cmodel { |
CM_32, /* The traditional 32-bit ABI. */ |
CM_SMALL, /* Assumes all code and data fits in the low 31 bits. */ |
CM_KERNEL, /* Assumes all code and data fits in the high 31 bits. */ |
CM_MEDIUM, /* Assumes code fits in the low 31 bits; data unlimited. */ |
CM_LARGE, /* No assumptions. */ |
CM_SMALL_PIC, /* Assumes code+data+got/plt fits in a 31 bit region. */ |
CM_MEDIUM_PIC,/* Assumes code+got/plt fits in a 31 bit region. */ |
CM_LARGE_PIC /* No assumptions. */ |
}; |
extern enum cmodel ix86_cmodel; |
/* Size of the RED_ZONE area. */ |
#define RED_ZONE_SIZE 128 |
/* Reserved area of the red zone for temporaries. */ |
#define RED_ZONE_RESERVE 8 |
enum asm_dialect { |
ASM_ATT, |
ASM_INTEL |
}; |
extern enum asm_dialect ix86_asm_dialect; |
extern unsigned int ix86_preferred_stack_boundary; |
extern unsigned int ix86_incoming_stack_boundary; |
extern int ix86_branch_cost, ix86_section_threshold; |
/* Smallest class containing REGNO. */ |
extern enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER]; |
extern rtx ix86_compare_op0; /* operand 0 for comparisons */ |
extern rtx ix86_compare_op1; /* operand 1 for comparisons */ |
enum ix86_fpcmp_strategy { |
IX86_FPCMP_SAHF, |
IX86_FPCMP_COMI, |
IX86_FPCMP_ARITH |
}; |
/* To properly truncate FP values into integers, we need to set i387 control |
word. We can't emit proper mode switching code before reload, as spills |
generated by reload may truncate values incorrectly, but we still can avoid |
redundant computation of new control word by the mode switching pass. |
The fldcw instructions are still emitted redundantly, but this is probably |
not going to be noticeable problem, as most CPUs do have fast path for |
the sequence. |
The machinery is to emit simple truncation instructions and split them |
before reload to instructions having USEs of two memory locations that |
are filled by this code to old and new control word. |
Post-reload pass may be later used to eliminate the redundant fildcw if |
needed. */ |
enum ix86_entity |
{ |
I387_TRUNC = 0, |
I387_FLOOR, |
I387_CEIL, |
I387_MASK_PM, |
MAX_386_ENTITIES |
}; |
enum ix86_stack_slot |
{ |
SLOT_VIRTUAL = 0, |
SLOT_TEMP, |
SLOT_CW_STORED, |
SLOT_CW_TRUNC, |
SLOT_CW_FLOOR, |
SLOT_CW_CEIL, |
SLOT_CW_MASK_PM, |
MAX_386_STACK_LOCALS |
}; |
/* Define this macro if the port needs extra instructions inserted |
for mode switching in an optimizing compilation. */ |
#define OPTIMIZE_MODE_SWITCHING(ENTITY) \ |
ix86_optimize_mode_switching[(ENTITY)] |
/* If you define `OPTIMIZE_MODE_SWITCHING', you have to define this as |
initializer for an array of integers. Each initializer element N |
refers to an entity that needs mode switching, and specifies the |
number of different modes that might need to be set for this |
entity. The position of the initializer in the initializer - |
starting counting at zero - determines the integer that is used to |
refer to the mode-switched entity in question. */ |
#define NUM_MODES_FOR_MODE_SWITCHING \ |
{ I387_CW_ANY, I387_CW_ANY, I387_CW_ANY, I387_CW_ANY } |
/* ENTITY is an integer specifying a mode-switched entity. If |
`OPTIMIZE_MODE_SWITCHING' is defined, you must define this macro to |
return an integer value not larger than the corresponding element |
in `NUM_MODES_FOR_MODE_SWITCHING', to denote the mode that ENTITY |
must be switched into prior to the execution of INSN. */ |
#define MODE_NEEDED(ENTITY, I) ix86_mode_needed ((ENTITY), (I)) |
/* This macro specifies the order in which modes for ENTITY are |
processed. 0 is the highest priority. */ |
#define MODE_PRIORITY_TO_MODE(ENTITY, N) (N) |
/* Generate one or more insns to set ENTITY to MODE. HARD_REG_LIVE |
is the set of hard registers live at the point where the insn(s) |
are to be inserted. */ |
#define EMIT_MODE_SET(ENTITY, MODE, HARD_REGS_LIVE) \ |
((MODE) != I387_CW_ANY && (MODE) != I387_CW_UNINITIALIZED \ |
? emit_i387_cw_initialization (MODE), 0 \ |
: 0) |
/* Avoid renaming of stack registers, as doing so in combination with |
scheduling just increases amount of live registers at time and in |
the turn amount of fxch instructions needed. |
??? Maybe Pentium chips benefits from renaming, someone can try.... */ |
#define HARD_REGNO_RENAME_OK(SRC, TARGET) \ |
(! IN_RANGE ((SRC), FIRST_STACK_REG, LAST_STACK_REG)) |
#define FASTCALL_PREFIX '@' |
/* Machine specific CFA tracking during prologue/epilogue generation. */ |
#ifndef USED_FOR_TARGET |
struct GTY(()) machine_cfa_state |
{ |
rtx reg; |
HOST_WIDE_INT offset; |
}; |
struct GTY(()) machine_function { |
struct stack_local_entry *stack_locals; |
const char *some_ld_name; |
int varargs_gpr_size; |
int varargs_fpr_size; |
int optimize_mode_switching[MAX_386_ENTITIES]; |
/* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE |
has been computed for. */ |
int use_fast_prologue_epilogue_nregs; |
/* The CFA state at the end of the prologue. */ |
struct machine_cfa_state cfa; |
/* This value is used for amd64 targets and specifies the current abi |
to be used. MS_ABI means ms abi. Otherwise SYSV_ABI means sysv abi. */ |
enum calling_abi call_abi; |
/* Nonzero if the function accesses a previous frame. */ |
BOOL_BITFIELD accesses_prev_frame : 1; |
/* Nonzero if the function requires a CLD in the prologue. */ |
BOOL_BITFIELD needs_cld : 1; |
/* Set by ix86_compute_frame_layout and used by prologue/epilogue |
expander to determine the style used. */ |
BOOL_BITFIELD use_fast_prologue_epilogue : 1; |
/* If true, the current function needs the default PIC register, not |
an alternate register (on x86) and must not use the red zone (on |
x86_64), even if it's a leaf function. We don't want the |
function to be regarded as non-leaf because TLS calls need not |
affect register allocation. This flag is set when a TLS call |
instruction is expanded within a function, and never reset, even |
if all such instructions are optimized away. Use the |
ix86_current_function_calls_tls_descriptor macro for a better |
approximation. */ |
BOOL_BITFIELD tls_descriptor_call_expanded_p : 1; |
/* If true, the current function has a STATIC_CHAIN is placed on the |
stack below the return address. */ |
BOOL_BITFIELD static_chain_on_stack : 1; |
}; |
#endif |
#define ix86_stack_locals (cfun->machine->stack_locals) |
#define ix86_varargs_gpr_size (cfun->machine->varargs_gpr_size) |
#define ix86_varargs_fpr_size (cfun->machine->varargs_fpr_size) |
#define ix86_optimize_mode_switching (cfun->machine->optimize_mode_switching) |
#define ix86_current_function_needs_cld (cfun->machine->needs_cld) |
#define ix86_tls_descriptor_calls_expanded_in_cfun \ |
(cfun->machine->tls_descriptor_call_expanded_p) |
/* Since tls_descriptor_call_expanded is not cleared, even if all TLS |
calls are optimized away, we try to detect cases in which it was |
optimized away. Since such instructions (use (reg REG_SP)), we can |
verify whether there's any such instruction live by testing that |
REG_SP is live. */ |
#define ix86_current_function_calls_tls_descriptor \ |
(ix86_tls_descriptor_calls_expanded_in_cfun && df_regs_ever_live_p (SP_REG)) |
#define ix86_cfa_state (&cfun->machine->cfa) |
#define ix86_static_chain_on_stack (cfun->machine->static_chain_on_stack) |
/* Control behavior of x86_file_start. */ |
#define X86_FILE_START_VERSION_DIRECTIVE false |
#define X86_FILE_START_FLTUSED false |
/* Flag to mark data that is in the large address area. */ |
#define SYMBOL_FLAG_FAR_ADDR (SYMBOL_FLAG_MACH_DEP << 0) |
#define SYMBOL_REF_FAR_ADDR_P(X) \ |
((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_FAR_ADDR) != 0) |
/* Flags to mark dllimport/dllexport. Used by PE ports, but handy to |
have defined always, to avoid ifdefing. */ |
#define SYMBOL_FLAG_DLLIMPORT (SYMBOL_FLAG_MACH_DEP << 1) |
#define SYMBOL_REF_DLLIMPORT_P(X) \ |
((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_DLLIMPORT) != 0) |
#define SYMBOL_FLAG_DLLEXPORT (SYMBOL_FLAG_MACH_DEP << 2) |
#define SYMBOL_REF_DLLEXPORT_P(X) \ |
((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_DLLEXPORT) != 0) |
/* Model costs for vectorizer. */ |
/* Cost of conditional branch. */ |
#undef TARG_COND_BRANCH_COST |
#define TARG_COND_BRANCH_COST ix86_cost->branch_cost |
/* Enum through the target specific extra va_list types. |
Please, do not iterate the base va_list type name. */ |
#define TARGET_ENUM_VA_LIST(IDX, PNAME, PTYPE) \ |
(TARGET_64BIT ? ix86_enum_va_list (IDX, PNAME, PTYPE) : 0) |
/* Cost of any scalar operation, excluding load and store. */ |
#undef TARG_SCALAR_STMT_COST |
#define TARG_SCALAR_STMT_COST ix86_cost->scalar_stmt_cost |
/* Cost of scalar load. */ |
#undef TARG_SCALAR_LOAD_COST |
#define TARG_SCALAR_LOAD_COST ix86_cost->scalar_load_cost |
/* Cost of scalar store. */ |
#undef TARG_SCALAR_STORE_COST |
#define TARG_SCALAR_STORE_COST ix86_cost->scalar_store_cost |
/* Cost of any vector operation, excluding load, store or vector to scalar |
operation. */ |
#undef TARG_VEC_STMT_COST |
#define TARG_VEC_STMT_COST ix86_cost->vec_stmt_cost |
/* Cost of vector to scalar operation. */ |
#undef TARG_VEC_TO_SCALAR_COST |
#define TARG_VEC_TO_SCALAR_COST ix86_cost->vec_to_scalar_cost |
/* Cost of scalar to vector operation. */ |
#undef TARG_SCALAR_TO_VEC_COST |
#define TARG_SCALAR_TO_VEC_COST ix86_cost->scalar_to_vec_cost |
/* Cost of aligned vector load. */ |
#undef TARG_VEC_LOAD_COST |
#define TARG_VEC_LOAD_COST ix86_cost->vec_align_load_cost |
/* Cost of misaligned vector load. */ |
#undef TARG_VEC_UNALIGNED_LOAD_COST |
#define TARG_VEC_UNALIGNED_LOAD_COST ix86_cost->vec_unalign_load_cost |
/* Cost of vector store. */ |
#undef TARG_VEC_STORE_COST |
#define TARG_VEC_STORE_COST ix86_cost->vec_store_cost |
/* Cost of conditional taken branch for vectorizer cost model. */ |
#undef TARG_COND_TAKEN_BRANCH_COST |
#define TARG_COND_TAKEN_BRANCH_COST ix86_cost->cond_taken_branch_cost |
/* Cost of conditional not taken branch for vectorizer cost model. */ |
#undef TARG_COND_NOT_TAKEN_BRANCH_COST |
#define TARG_COND_NOT_TAKEN_BRANCH_COST ix86_cost->cond_not_taken_branch_cost |
/* |
Local variables: |
version-control: t |
End: |
*/ |
/contrib/sdk/sources/gcc_eh/config/i386/mingw-stdint.h |
---|
0,0 → 1,50 |
/* Definitions for <stdint.h> types on systems using mingw. |
Copyright (C) 2009 Free Software Foundation, Inc. |
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/>. */ |
#define SIG_ATOMIC_TYPE "int" |
#define INT8_TYPE "signed char" |
#define INT16_TYPE "short int" |
#define INT32_TYPE "int" |
#define INT64_TYPE "long long int" |
#define UINT8_TYPE "unsigned char" |
#define UINT16_TYPE "short unsigned int" |
#define UINT32_TYPE "unsigned int" |
#define UINT64_TYPE "long long unsigned int" |
#define INT_LEAST8_TYPE "signed char" |
#define INT_LEAST16_TYPE "short int" |
#define INT_LEAST32_TYPE "int" |
#define INT_LEAST64_TYPE "long long int" |
#define UINT_LEAST8_TYPE "unsigned char" |
#define UINT_LEAST16_TYPE "short unsigned int" |
#define UINT_LEAST32_TYPE "unsigned int" |
#define UINT_LEAST64_TYPE "long long unsigned int" |
#define INT_FAST8_TYPE "signed char" |
#define INT_FAST16_TYPE "short int" |
#define INT_FAST32_TYPE "int" |
#define INT_FAST64_TYPE "long long int" |
#define UINT_FAST8_TYPE "unsigned char" |
#define UINT_FAST16_TYPE "short unsigned int" |
#define UINT_FAST32_TYPE "unsigned int" |
#define UINT_FAST64_TYPE "long long unsigned int" |
#define INTPTR_TYPE (TARGET_64BIT ? "long long int" : "int") |
#define UINTPTR_TYPE (TARGET_64BIT ? "long long unsigned int" : "unsigned int") |
/contrib/sdk/sources/gcc_eh/config/i386/mingw32.h |
---|
0,0 → 1,249 |
/* Operating system specific defines to be used when targeting GCC for |
hosting on Windows32, using GNU tools and the Windows32 API Library. |
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, |
2009, 2010 Free Software Foundation, Inc. |
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 TARGET_VERSION |
#if TARGET_64BIT_DEFAULT |
#define TARGET_VERSION fprintf (stderr,"(x86_64 MinGW"); |
#else |
#define TARGET_VERSION fprintf (stderr," (x86 MinGW)"); |
#endif |
/* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS |
is for compatibility with native compiler. */ |
#define EXTRA_OS_CPP_BUILTINS() \ |
do \ |
{ \ |
builtin_define ("__MSVCRT__"); \ |
builtin_define ("__MINGW32__"); \ |
builtin_define ("_WIN32"); \ |
builtin_define_std ("WIN32"); \ |
builtin_define_std ("WINNT"); \ |
builtin_define_with_int_value ("_INTEGRAL_MAX_BITS", \ |
TYPE_PRECISION (intmax_type_node));\ |
if (TARGET_64BIT && ix86_abi == MS_ABI) \ |
{ \ |
builtin_define ("__MINGW64__"); \ |
builtin_define_std ("WIN64"); \ |
builtin_define_std ("_WIN64"); \ |
} \ |
} \ |
while (0) |
#undef SUB_LINK_ENTRY32 |
#undef SUB_LINK_ENTRY64 |
#define SUB_LINK_ENTRY32 "-e _DllMainCRTStartup@12" |
#if defined(USE_MINGW64_LEADING_UNDERSCORES) |
#define SUB_LINK_ENTRY64 "-e _DllMainCRTStartup" |
#else |
#define SUB_LINK_ENTRY64 "-e DllMainCRTStartup" |
#endif |
#undef SUB_LINK_ENTRY |
#if TARGET_64BIT_DEFAULT |
#define SUB_LINK_ENTRY SUB_LINK_ENTRY64 |
#else |
#define SUB_LINK_ENTRY SUB_LINK_ENTRY32 |
#endif |
/* Override the standard choice of /usr/include as the default prefix |
to try when searching for header files. */ |
#undef STANDARD_INCLUDE_DIR |
#define STANDARD_INCLUDE_DIR "/mingw/include" |
#undef STANDARD_INCLUDE_COMPONENT |
#define STANDARD_INCLUDE_COMPONENT "MINGW" |
#undef CPP_SPEC |
#define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT}" |
/* For Windows applications, include more libraries, but always include |
kernel32. */ |
#undef LIB_SPEC |
#define LIB_SPEC "%{pg:-lgmon} %{mwindows:-lgdi32 -lcomdlg32} \ |
-luser32 -lkernel32 -ladvapi32 -lshell32" |
/* Weak symbols do not get resolved if using a Windows dll import lib. |
Make the unwind registration references strong undefs. */ |
#if DWARF2_UNWIND_INFO |
/* DW2-unwind is just available for 32-bit mode. */ |
#if TARGET_64BIT_DEFAULT |
#error DW2 unwind is not available for 64-bit. |
#endif |
#define SHARED_LIBGCC_UNDEFS_SPEC \ |
"%{shared-libgcc: -u ___register_frame_info -u ___deregister_frame_info}" |
#else |
#define SHARED_LIBGCC_UNDEFS_SPEC "" |
#endif |
#undef SUBTARGET_EXTRA_SPECS |
#define SUBTARGET_EXTRA_SPECS \ |
{ "shared_libgcc_undefs", SHARED_LIBGCC_UNDEFS_SPEC } |
#define LINK_SPEC "%{mwindows:--subsystem windows} \ |
%{mconsole:--subsystem console} \ |
%{shared: %{mdll: %eshared and mdll are not compatible}} \ |
%{shared: --shared} %{mdll:--dll} \ |
%{static:-Bstatic} %{!static:-Bdynamic} \ |
%{shared|mdll: " SUB_LINK_ENTRY " --enable-auto-image-base} \ |
%(shared_libgcc_undefs)" |
/* Include in the mingw32 libraries with libgcc */ |
#ifdef ENABLE_SHARED_LIBGCC |
#define SHARED_LIBGCC_SPEC "%{shared-libgcc:-lgcc_s} %{!shared-libgcc:-lgcc_eh}" |
#else |
#define SHARED_LIBGCC_SPEC /*empty*/ |
#endif |
#undef REAL_LIBGCC_SPEC |
#define REAL_LIBGCC_SPEC \ |
"%{mthreads:-lmingwthrd} -lmingw32 \ |
"SHARED_LIBGCC_SPEC" \ |
-lgcc \ |
-lmoldname -lmingwex -lmsvcrt" |
#undef STARTFILE_SPEC |
#define STARTFILE_SPEC "%{shared|mdll:dllcrt2%O%s} \ |
%{!shared:%{!mdll:crt2%O%s}} %{pg:gcrt2%O%s} \ |
crtbegin.o%s" |
#undef ENDFILE_SPEC |
#define ENDFILE_SPEC \ |
"%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \ |
crtend.o%s" |
/* Override startfile prefix defaults. */ |
#ifndef STANDARD_STARTFILE_PREFIX_1 |
#define STANDARD_STARTFILE_PREFIX_1 "/mingw/lib/" |
#endif |
#ifndef STANDARD_STARTFILE_PREFIX_2 |
#define STANDARD_STARTFILE_PREFIX_2 "" |
#endif |
/* Put all *tf routines in libgcc. */ |
#undef LIBGCC2_HAS_TF_MODE |
#define LIBGCC2_HAS_TF_MODE 1 |
#undef LIBGCC2_TF_CEXT |
#define LIBGCC2_TF_CEXT q |
#undef TF_SIZE |
#define TF_SIZE 113 |
/* Output STRING, a string representing a filename, to FILE. |
We canonicalize it to be in Unix format (backslashes are replaced |
forward slashes. */ |
#undef OUTPUT_QUOTED_STRING |
#define OUTPUT_QUOTED_STRING(FILE, STRING) \ |
do { \ |
char c; \ |
\ |
putc ('\"', asm_file); \ |
\ |
while ((c = *string++) != 0) \ |
{ \ |
if (c == '\\') \ |
c = '/'; \ |
\ |
if (ISPRINT (c)) \ |
{ \ |
if (c == '\"') \ |
putc ('\\', asm_file); \ |
putc (c, asm_file); \ |
} \ |
else \ |
fprintf (asm_file, "\\%03o", (unsigned char) c); \ |
} \ |
\ |
putc ('\"', asm_file); \ |
} while (0) |
/* Define as short unsigned for compatibility with MS runtime. */ |
#undef WINT_TYPE |
#define WINT_TYPE "short unsigned int" |
/* mingw32 uses the -mthreads option to enable thread support. */ |
#undef GOMP_SELF_SPECS |
#define GOMP_SELF_SPECS "%{fopenmp: -mthreads}" |
/* mingw32 atexit function is safe to use in shared libraries. Use it |
to register C++ static destructors. */ |
#define TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT hook_bool_void_true |
/* Contains a pointer to type target_ovr_attr defining the target specific |
overrides of format attributes. See c-format.h for structure |
definition. */ |
#undef TARGET_OVERRIDES_FORMAT_ATTRIBUTES |
#define TARGET_OVERRIDES_FORMAT_ATTRIBUTES mingw_format_attribute_overrides |
/* Specify the count of elements in TARGET_OVERRIDES_ATTRIBUTE. */ |
#undef TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT |
#define TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT 3 |
/* Custom initialization for warning -Wpedantic-ms-format for c-format. */ |
#undef TARGET_OVERRIDES_FORMAT_INIT |
#define TARGET_OVERRIDES_FORMAT_INIT msformat_init |
/* MS specific format attributes for ms_printf, ms_scanf, ms_strftime. */ |
#undef TARGET_FORMAT_TYPES |
#define TARGET_FORMAT_TYPES mingw_format_attributes |
#undef TARGET_N_FORMAT_TYPES |
#define TARGET_N_FORMAT_TYPES 3 |
/* Let defaults.h definition of TARGET_USE_JCR_SECTION apply. */ |
#undef TARGET_USE_JCR_SECTION |
#undef MINGW_ENABLE_EXECUTE_STACK |
#define MINGW_ENABLE_EXECUTE_STACK \ |
extern void __enable_execute_stack (void *); \ |
void \ |
__enable_execute_stack (void *addr) \ |
{ \ |
MEMORY_BASIC_INFORMATION b; \ |
if (!VirtualQuery (addr, &b, sizeof(b))) \ |
abort (); \ |
VirtualProtect (b.BaseAddress, b.RegionSize, PAGE_EXECUTE_READWRITE, \ |
&b.Protect); \ |
} |
#undef ENABLE_EXECUTE_STACK |
#define ENABLE_EXECUTE_STACK MINGW_ENABLE_EXECUTE_STACK |
#undef CHECK_EXECUTE_STACK_ENABLED |
#define CHECK_EXECUTE_STACK_ENABLED flag_setstackexecutable |
#ifdef IN_LIBGCC2 |
#include <windows.h> |
#endif |
/* For 64-bit Windows we can't use DW2 unwind info. Also for multilib |
builds we can't use it, too. */ |
#if !TARGET_64BIT_DEFAULT && !defined (TARGET_BI_ARCH) |
#define MD_UNWIND_SUPPORT "config/i386/w32-unwind.h" |
#endif |
/* This matches SHLIB_SONAME and SHLIB_SOVERSION in t-cygming. */ |
/* This matches SHLIB_SONAME and SHLIB_SOVERSION in t-cygwin. */ |
#if DWARF2_UNWIND_INFO |
#define LIBGCC_EH_EXTN "_dw2" |
#else |
#define LIBGCC_EH_EXTN "_sjlj" |
#endif |
#define LIBGCC_SONAME "libgcc_s" LIBGCC_EH_EXTN "-1.dll" |
/* We should find a way to not have to update this manually. */ |
#define LIBGCJ_SONAME "libgcj" /*LIBGCC_EH_EXTN*/ "-11.dll" |
/contrib/sdk/sources/gcc_eh/config/i386/unix.h |
---|
0,0 → 1,81 |
/* Definitions for Unix assembler syntax for the Intel 80386. |
Copyright (C) 1988, 1994, 1999, 2000, 2001, 2002, 2007, 2009 |
Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
/* This file defines the aspects of assembler syntax |
that are the same for all the i386 Unix systems |
(though they may differ in non-Unix systems). */ |
/* Define macro used to output shift-double opcodes when the shift |
count is in %cl. Some assemblers require %cl as an argument; |
some don't. This macro controls what to do: by default, don't |
print %cl. */ |
#define SHIFT_DOUBLE_OMITS_COUNT 1 |
/* Define the syntax of pseudo-ops, labels and comments. */ |
/* String containing the assembler's comment-starter. |
Note the trailing space is necessary in case the character |
that immediately follows the comment is '*'. If this happens |
and the space is not there the assembler will interpret this |
as the start of a C-like slash-star comment and complain when |
there is no terminator. */ |
#define ASM_COMMENT_START "/ " |
/* Output to assembler file text saying following lines |
may contain character constants, extra white space, comments, etc. */ |
#define ASM_APP_ON "/APP\n" |
/* Output to assembler file text saying following lines |
no longer contain unusual constructs. */ |
#define ASM_APP_OFF "/NO_APP\n" |
/* Output before read-only data. */ |
#define TEXT_SECTION_ASM_OP "\t.text" |
/* Output before writable (initialized) data. */ |
#define DATA_SECTION_ASM_OP "\t.data" |
/* Output before writable (uninitialized) data. */ |
#define BSS_SECTION_ASM_OP "\t.bss" |
/* Globalizing directive for a label. */ |
#define GLOBAL_ASM_OP ".globl " |
/* By default, target has a 80387, uses IEEE compatible arithmetic, |
and returns float values in the 387. */ |
#undef TARGET_SUBTARGET_DEFAULT |
#define TARGET_SUBTARGET_DEFAULT \ |
(MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS) |
/* By default, 64-bit mode uses 128-bit long double. */ |
#undef TARGET_SUBTARGET64_DEFAULT |
#define TARGET_SUBTARGET64_DEFAULT \ |
MASK_128BIT_LONG_DOUBLE |
/contrib/sdk/sources/gcc_eh/config/i386/w32-unwind.h |
---|
0,0 → 1,212 |
/* Definitions for Dwarf2 EH unwind support for Windows32 targets |
Copyright (C) 2007, 2009 |
Free Software Foundation, Inc. |
Contributed by Pascal Obry <obry@adacore.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 |
<http://www.gnu.org/licenses/>. */ |
/* This file implements the md_fallback_frame_state_for routine for |
Windows, triggered when the GCC table based unwinding process hits a |
frame for which no unwind info has been registered. This typically |
occurs when raising an exception from a signal handler, because the |
handler is actually called from the OS kernel. |
The basic idea is to detect that we are indeed trying to unwind past a |
signal handler and to fill out the GCC internal unwinding structures for |
the OS kernel frame as if it had been directly called from the |
interrupted context. |
This is all assuming that the code to set the handler asked the kernel |
to pass a pointer to such context information. |
There is three main parts. |
1) The first thing to do is to check if we are in a signal context. If |
not we can just return as there is nothing to do. We are probably on |
some foreign code for which no unwind frame can be found. If this is |
a call from the Windows signal handler, then: |
2) We must get the signal context information. |
* With the standard exception filter: |
This is on Windows pointed to by an EXCEPTION_POINTERS. We know that |
the signal handle will call an UnhandledExceptionFilter with this |
parameter. The spec for this routine is: |
LONG WINAPI UnhandledExceptionFilter(struct _EXCEPTION_POINTERS*); |
So the pointer to struct _EXCEPTION_POINTERS must be somewhere on the |
stack. |
This was found experimentally to always be at offset 0 of the context |
frame in all cases handled by this implementation. |
* With the SEH exception handler: |
In this case the signal context is directly on the stack as the SEH |
exception handler has the following prototype: |
DWORD |
SEH_error_handler (PEXCEPTION_RECORD ExceptionRecord, |
PVOID EstablisherFrame, |
PCONTEXT ContextRecord, |
PVOID DispatcherContext) |
This was found experimentally to always be at offset 56 of the |
context frame in all cases handled by this implementation. |
3) When we have the signal context we just have to save some registers |
and set the return address based on the program counter (Eip). |
Note that this implementation follows closely the same principles as the |
GNU/Linux and OSF ones. */ |
#define WIN32_MEAN_AND_LEAN |
#include <windows.h> |
/* Patterns found experimentally to be on a Windows signal handler */ |
/* In a standard exception filter */ |
#define SIG_PAT1 \ |
(pc_[-2] == 0xff && pc_[-1] == 0xd0 /* call %eax */ \ |
&& pc_[0] == 0x83 && pc_[1] == 0xf8) /* cmp 0xdepl,%eax */ |
#define SIG_PAT2 \ |
(pc_[-5] == 0xe8 && pc_[-4] == 0x68 /* call (depl16) */ \ |
&& pc_[0] == 0xc3) /* ret */ |
/* In a Win32 SEH handler */ |
#define SIG_SEH1 \ |
(pc_[-5] == 0xe8 /* call addr */ \ |
&& pc_[0] == 0x83 && pc_[1] == 0xc4 /* add 0xval,%esp */ \ |
&& pc_[3] == 0xb8) /* mov 0xval,%eax */ |
#define SIG_SEH2 \ |
(pc_[-5] == 0x8b && pc_[-4] == 0x4d /* mov depl(%ebp),%ecx */ \ |
&& pc_[0] == 0x64 && pc_[1] == 0x8b) /* mov %fs:(0),<reg> */ \ |
/* In the GCC alloca (stack probing) */ |
#define SIG_ALLOCA \ |
(pc_[-1] == 0x83 /* orl $0x0,(%ecx) */ \ |
&& pc_[0] == 0x9 && pc_[1] == 0 \ |
&& pc_[2] == 0x2d && pc_[3] == 0 /* subl $0x1000,%eax */ \ |
&& pc_[4] == 0x10 && pc_[5] == 0) |
#define MD_FALLBACK_FRAME_STATE_FOR i386_w32_fallback_frame_state |
static _Unwind_Reason_Code |
i386_w32_fallback_frame_state (struct _Unwind_Context *context, |
_Unwind_FrameState *fs) |
{ |
void * ctx_ra_ = (void *)(context->ra); /* return address */ |
void * ctx_cfa_ = (void *)(context->cfa); /* context frame address */ |
unsigned char * pc_ = (unsigned char *) ctx_ra_; |
/* In the test below we look for two specific patterns found |
experimentally to be in the Windows signal handler. */ |
if (SIG_PAT1 || SIG_PAT2 || SIG_SEH1 || SIG_SEH2) |
{ |
PEXCEPTION_POINTERS weinfo_; |
PCONTEXT proc_ctx_; |
long new_cfa_; |
if (SIG_SEH1) |
proc_ctx_ = (PCONTEXT) (*(int*)(ctx_cfa_ + 56)); |
else if (SIG_SEH2) |
proc_ctx_ = (PCONTEXT) (*(int*)(ctx_cfa_ + 8)); |
else |
{ |
weinfo_ = (PEXCEPTION_POINTERS) (*(int*)ctx_cfa_); |
proc_ctx_ = weinfo_->ContextRecord; |
} |
/* The new context frame address is the stack pointer. */ |
new_cfa_ = proc_ctx_->Esp; |
fs->regs.cfa_how = CFA_REG_OFFSET; |
fs->regs.cfa_reg = __builtin_dwarf_sp_column(); |
fs->regs.cfa_offset = new_cfa_ - (long) ctx_cfa_; |
/* Save some registers. */ |
fs->regs.reg[0].how = REG_SAVED_OFFSET; |
fs->regs.reg[0].loc.offset = (long)&proc_ctx_->Eax - new_cfa_; |
fs->regs.reg[3].how = REG_SAVED_OFFSET; |
fs->regs.reg[3].loc.offset = (long)&proc_ctx_->Ebx - new_cfa_; |
fs->regs.reg[1].how = REG_SAVED_OFFSET; |
fs->regs.reg[1].loc.offset = (long)&proc_ctx_->Ecx - new_cfa_; |
fs->regs.reg[2].how = REG_SAVED_OFFSET; |
fs->regs.reg[2].loc.offset = (long)&proc_ctx_->Edx - new_cfa_; |
fs->regs.reg[6].how = REG_SAVED_OFFSET; |
fs->regs.reg[6].loc.offset = (long)&proc_ctx_->Esi - new_cfa_; |
fs->regs.reg[7].how = REG_SAVED_OFFSET; |
fs->regs.reg[7].loc.offset = (long)&proc_ctx_->Edi - new_cfa_; |
fs->regs.reg[9].how = REG_SAVED_OFFSET; |
fs->regs.reg[9].loc.offset = (long)&proc_ctx_->Eip - new_cfa_; |
fs->regs.reg[4].how = REG_SAVED_OFFSET; |
fs->regs.reg[4].loc.offset = (long)&proc_ctx_->Ebp - new_cfa_; |
/* Set the return address to Eip + 1. As we can be called multiple |
times we use another register for this. */ |
proc_ctx_->Dr0 = proc_ctx_->Eip + 1; |
fs->regs.reg[8].how = REG_SAVED_OFFSET; |
fs->regs.reg[8].loc.offset = (long)&proc_ctx_->Dr0 - new_cfa_; |
fs->retaddr_column = 8; |
return _URC_NO_REASON; |
} |
/* Unwinding through _alloca, propagating from a trap triggered by |
one of it's probes prior to the real SP adjustment. The only |
operations of interest performed is "pushl %ecx", followed by |
ecx clobbering. */ |
else if (SIG_ALLOCA) |
{ |
/* Only one push between entry in _alloca and the probe trap. */ |
long new_cfa_ = (long) ctx_cfa_ + 4; |
fs->regs.cfa_how = CFA_REG_OFFSET; |
fs->regs.cfa_reg = __builtin_dwarf_sp_column(); |
fs->regs.cfa_offset = new_cfa_ - (long) ctx_cfa_; |
/* The saved value of %ecx is at CFA - 4 */ |
fs->regs.reg[1].how = REG_SAVED_OFFSET; |
fs->regs.reg[1].loc.offset = -4; |
/* and what is stored at the CFA is the return address. */ |
fs->retaddr_column = 8; |
fs->regs.reg[8].how = REG_SAVED_OFFSET; |
fs->regs.reg[8].loc.offset = 0; |
return _URC_NO_REASON; |
} |
else |
return _URC_END_OF_STACK; |
} |
/contrib/sdk/sources/gcc_eh/config/tm-dwarf2.h |
---|
0,0 → 1,4 |
/* Enable Dwarf2 debugging and make it the default */ |
#define DWARF2_DEBUGGING_INFO 1 |
#undef PREFERRED_DEBUGGING_TYPE |
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG |
/contrib/sdk/sources/gcc_eh/config/vxworks-dummy.h |
---|
0,0 → 1,40 |
/* Dummy definitions of VxWorks-related macros |
Copyright (C) 2007, 2009 Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
/* True if we're targetting VxWorks. */ |
#ifndef TARGET_VXWORKS |
#define TARGET_VXWORKS 0 |
#endif |
/* True if generating code for a VxWorks RTP. */ |
#ifndef TARGET_VXWORKS_RTP |
#define TARGET_VXWORKS_RTP false |
#endif |
/* The symbol that points to an RTP's table of GOTs. */ |
#define VXWORKS_GOTT_BASE (gcc_unreachable (), "") |
/* The symbol that holds the index of the current module's GOT in |
VXWORKS_GOTT_BASE. */ |
#define VXWORKS_GOTT_INDEX (gcc_unreachable (), "") |
/contrib/sdk/sources/gcc_eh/coretypes.h |
---|
0,0 → 1,128 |
/* GCC core type declarations. |
Copyright (C) 2002, 2004, 2007, 2008, 2009 Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
/* Provide forward declarations of core types which are referred to by |
most of the compiler. This allows header files to use these types |
(e.g. in function prototypes) without concern for whether the full |
definitions are visible. Some other declarations that need to be |
universally visible are here, too. |
In the context of tconfig.h, most of these have special definitions |
which prevent them from being used except in further type |
declarations. This is a kludge; the right thing is to avoid |
including the "tm.h" header set in the context of tconfig.h, but |
we're not there yet. */ |
#ifndef GCC_CORETYPES_H |
#define GCC_CORETYPES_H |
#ifndef GTY |
#define GTY(x) /* nothing - marker for gengtype */ |
#endif |
#ifndef USED_FOR_TARGET |
struct bitmap_head_def; |
typedef struct bitmap_head_def *bitmap; |
typedef const struct bitmap_head_def *const_bitmap; |
struct rtx_def; |
typedef struct rtx_def *rtx; |
typedef const struct rtx_def *const_rtx; |
struct rtvec_def; |
typedef struct rtvec_def *rtvec; |
typedef const struct rtvec_def *const_rtvec; |
union tree_node; |
typedef union tree_node *tree; |
union gimple_statement_d; |
typedef union gimple_statement_d *gimple; |
typedef const union tree_node *const_tree; |
typedef const union gimple_statement_d *const_gimple; |
union section; |
typedef union section section; |
struct cl_target_option; |
struct cl_optimization; |
struct gimple_seq_d; |
typedef struct gimple_seq_d *gimple_seq; |
typedef const struct gimple_seq_d *const_gimple_seq; |
struct gimple_seq_node_d; |
typedef struct gimple_seq_node_d *gimple_seq_node; |
typedef const struct gimple_seq_node_d *const_gimple_seq_node; |
/* Address space number for named address space support. */ |
typedef unsigned char addr_space_t; |
/* The value of addr_space_t that represents the generic address space. */ |
#define ADDR_SPACE_GENERIC 0 |
#define ADDR_SPACE_GENERIC_P(AS) ((AS) == ADDR_SPACE_GENERIC) |
/* The major intermediate representations of GCC. */ |
enum ir_type { |
IR_GIMPLE, |
IR_RTL_CFGRTL, |
IR_RTL_CFGLAYOUT |
}; |
/* Provide forward struct declaration so that we don't have to include |
all of cpplib.h whenever a random prototype includes a pointer. |
Note that the cpp_reader and cpp_token typedefs remain part of |
cpplib.h. */ |
struct cpp_reader; |
struct cpp_token; |
/* The thread-local storage model associated with a given VAR_DECL |
or SYMBOL_REF. This isn't used much, but both trees and RTL refer |
to it, so it's here. */ |
enum tls_model { |
TLS_MODEL_NONE, |
TLS_MODEL_EMULATED, |
TLS_MODEL_REAL, |
TLS_MODEL_GLOBAL_DYNAMIC = TLS_MODEL_REAL, |
TLS_MODEL_LOCAL_DYNAMIC, |
TLS_MODEL_INITIAL_EXEC, |
TLS_MODEL_LOCAL_EXEC |
}; |
struct edge_def; |
typedef struct edge_def *edge; |
typedef const struct edge_def *const_edge; |
struct basic_block_def; |
typedef struct basic_block_def *basic_block; |
typedef const struct basic_block_def *const_basic_block; |
#else |
struct _dont_use_rtx_here_; |
struct _dont_use_rtvec_here_; |
union _dont_use_tree_here_; |
#define rtx struct _dont_use_rtx_here_ * |
#define const_rtx struct _dont_use_rtx_here_ * |
#define rtvec struct _dont_use_rtvec_here * |
#define const_rtvec struct _dont_use_rtvec_here * |
#define tree union _dont_use_tree_here_ * |
#define const_tree union _dont_use_tree_here_ * |
#endif |
#endif /* coretypes.h */ |
/contrib/sdk/sources/gcc_eh/defaults.h |
---|
0,0 → 1,1168 |
/* Definitions of various defaults for tm.h macros. |
Copyright (C) 1992, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, |
2005, 2007, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
Contributed by Ron Guilmette (rfg@monkeys.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 |
<http://www.gnu.org/licenses/>. */ |
#ifndef GCC_DEFAULTS_H |
#define GCC_DEFAULTS_H |
#ifndef GET_ENVIRONMENT |
#define GET_ENVIRONMENT(VALUE, NAME) do { (VALUE) = getenv (NAME); } while (0) |
#endif |
#define obstack_chunk_alloc ((void *(*) (long)) xmalloc) |
#define obstack_chunk_free ((void (*) (void *)) free) |
#define OBSTACK_CHUNK_SIZE 0 |
#define gcc_obstack_init(OBSTACK) \ |
_obstack_begin ((OBSTACK), OBSTACK_CHUNK_SIZE, 0, \ |
obstack_chunk_alloc, \ |
obstack_chunk_free) |
/* Store in OUTPUT a string (made with alloca) containing an |
assembler-name for a local static variable or function named NAME. |
LABELNO is an integer which is different for each call. */ |
#ifndef ASM_PN_FORMAT |
# ifndef NO_DOT_IN_LABEL |
# define ASM_PN_FORMAT "%s.%lu" |
# else |
# ifndef NO_DOLLAR_IN_LABEL |
# define ASM_PN_FORMAT "%s$%lu" |
# else |
# define ASM_PN_FORMAT "__%s_%lu" |
# endif |
# endif |
#endif /* ! ASM_PN_FORMAT */ |
#ifndef ASM_FORMAT_PRIVATE_NAME |
# define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \ |
do { const char *const name_ = (NAME); \ |
char *const output_ = (OUTPUT) = \ |
(char *) alloca (strlen (name_) + 32); \ |
sprintf (output_, ASM_PN_FORMAT, name_, (unsigned long)(LABELNO)); \ |
} while (0) |
#endif |
/* Choose a reasonable default for ASM_OUTPUT_ASCII. */ |
#ifndef ASM_OUTPUT_ASCII |
#define ASM_OUTPUT_ASCII(MYFILE, MYSTRING, MYLENGTH) \ |
do { \ |
FILE *_hide_asm_out_file = (MYFILE); \ |
const unsigned char *_hide_p = (const unsigned char *) (MYSTRING); \ |
int _hide_thissize = (MYLENGTH); \ |
{ \ |
FILE *asm_out_file = _hide_asm_out_file; \ |
const unsigned char *p = _hide_p; \ |
int thissize = _hide_thissize; \ |
int i; \ |
fprintf (asm_out_file, "\t.ascii \""); \ |
\ |
for (i = 0; i < thissize; i++) \ |
{ \ |
int c = p[i]; \ |
if (c == '\"' || c == '\\') \ |
putc ('\\', asm_out_file); \ |
if (ISPRINT(c)) \ |
putc (c, asm_out_file); \ |
else \ |
{ \ |
fprintf (asm_out_file, "\\%o", c); \ |
/* After an octal-escape, if a digit follows, \ |
terminate one string constant and start another. \ |
The VAX assembler fails to stop reading the escape \ |
after three digits, so this is the only way we \ |
can get it to parse the data properly. */ \ |
if (i < thissize - 1 && ISDIGIT(p[i + 1])) \ |
fprintf (asm_out_file, "\"\n\t.ascii \""); \ |
} \ |
} \ |
fprintf (asm_out_file, "\"\n"); \ |
} \ |
} \ |
while (0) |
#endif |
/* This is how we tell the assembler to equate two values. */ |
#ifdef SET_ASM_OP |
#ifndef ASM_OUTPUT_DEF |
#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \ |
do { fprintf ((FILE), "%s", SET_ASM_OP); \ |
assemble_name (FILE, LABEL1); \ |
fprintf (FILE, ","); \ |
assemble_name (FILE, LABEL2); \ |
fprintf (FILE, "\n"); \ |
} while (0) |
#endif |
#endif |
#ifndef TLS_COMMON_ASM_OP |
#define TLS_COMMON_ASM_OP ".tls_common" |
#endif |
#if defined (HAVE_AS_TLS) && !defined (ASM_OUTPUT_TLS_COMMON) |
#define ASM_OUTPUT_TLS_COMMON(FILE, DECL, NAME, SIZE) \ |
do \ |
{ \ |
fprintf ((FILE), "\t%s\t", TLS_COMMON_ASM_OP); \ |
assemble_name ((FILE), (NAME)); \ |
fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", \ |
(SIZE), DECL_ALIGN (DECL) / BITS_PER_UNIT); \ |
} \ |
while (0) |
#endif |
/* Decide whether to defer emitting the assembler output for an equate |
of two values. The default is to not defer output. */ |
#ifndef TARGET_DEFERRED_OUTPUT_DEFS |
#define TARGET_DEFERRED_OUTPUT_DEFS(DECL,TARGET) false |
#endif |
/* This is how to output the definition of a user-level label named |
NAME, such as the label on a static function or variable NAME. */ |
#ifndef ASM_OUTPUT_LABEL |
#define ASM_OUTPUT_LABEL(FILE,NAME) \ |
do { assemble_name ((FILE), (NAME)); fputs (":\n", (FILE)); } while (0) |
#endif |
/* Output the definition of a compiler-generated label named NAME. */ |
#ifndef ASM_OUTPUT_INTERNAL_LABEL |
#define ASM_OUTPUT_INTERNAL_LABEL(FILE,NAME) \ |
do { \ |
assemble_name_raw ((FILE), (NAME)); \ |
fputs (":\n", (FILE)); \ |
} while (0) |
#endif |
/* This is how to output a reference to a user-level label named NAME. */ |
#ifndef ASM_OUTPUT_LABELREF |
#define ASM_OUTPUT_LABELREF(FILE,NAME) asm_fprintf ((FILE), "%U%s", (NAME)) |
#endif |
/* Allow target to print debug info labels specially. This is useful for |
VLIW targets, since debug info labels should go into the middle of |
instruction bundles instead of breaking them. */ |
#ifndef ASM_OUTPUT_DEBUG_LABEL |
#define ASM_OUTPUT_DEBUG_LABEL(FILE, PREFIX, NUM) \ |
(*targetm.asm_out.internal_label) (FILE, PREFIX, NUM) |
#endif |
/* This is how we tell the assembler that a symbol is weak. */ |
#ifndef ASM_OUTPUT_WEAK_ALIAS |
#if defined (ASM_WEAKEN_LABEL) && defined (ASM_OUTPUT_DEF) |
#define ASM_OUTPUT_WEAK_ALIAS(STREAM, NAME, VALUE) \ |
do \ |
{ \ |
ASM_WEAKEN_LABEL (STREAM, NAME); \ |
if (VALUE) \ |
ASM_OUTPUT_DEF (STREAM, NAME, VALUE); \ |
} \ |
while (0) |
#endif |
#endif |
/* This is how we tell the assembler that a symbol is a weak alias to |
another symbol that doesn't require the other symbol to be defined. |
Uses of the former will turn into weak uses of the latter, i.e., |
uses that, in case the latter is undefined, will not cause errors, |
and will add it to the symbol table as weak undefined. However, if |
the latter is referenced directly, a strong reference prevails. */ |
#ifndef ASM_OUTPUT_WEAKREF |
#if defined HAVE_GAS_WEAKREF |
#define ASM_OUTPUT_WEAKREF(FILE, DECL, NAME, VALUE) \ |
do \ |
{ \ |
fprintf ((FILE), "\t.weakref\t"); \ |
assemble_name ((FILE), (NAME)); \ |
fprintf ((FILE), ","); \ |
assemble_name ((FILE), (VALUE)); \ |
fprintf ((FILE), "\n"); \ |
} \ |
while (0) |
#endif |
#endif |
/* How to emit a .type directive. */ |
#ifndef ASM_OUTPUT_TYPE_DIRECTIVE |
#if defined TYPE_ASM_OP && defined TYPE_OPERAND_FMT |
#define ASM_OUTPUT_TYPE_DIRECTIVE(STREAM, NAME, TYPE) \ |
do \ |
{ \ |
fputs (TYPE_ASM_OP, STREAM); \ |
assemble_name (STREAM, NAME); \ |
fputs (", ", STREAM); \ |
fprintf (STREAM, TYPE_OPERAND_FMT, TYPE); \ |
putc ('\n', STREAM); \ |
} \ |
while (0) |
#endif |
#endif |
/* How to emit a .size directive. */ |
#ifndef ASM_OUTPUT_SIZE_DIRECTIVE |
#ifdef SIZE_ASM_OP |
#define ASM_OUTPUT_SIZE_DIRECTIVE(STREAM, NAME, SIZE) \ |
do \ |
{ \ |
HOST_WIDE_INT size_ = (SIZE); \ |
fputs (SIZE_ASM_OP, STREAM); \ |
assemble_name (STREAM, NAME); \ |
fprintf (STREAM, ", " HOST_WIDE_INT_PRINT_DEC "\n", size_); \ |
} \ |
while (0) |
#define ASM_OUTPUT_MEASURED_SIZE(STREAM, NAME) \ |
do \ |
{ \ |
fputs (SIZE_ASM_OP, STREAM); \ |
assemble_name (STREAM, NAME); \ |
fputs (", .-", STREAM); \ |
assemble_name (STREAM, NAME); \ |
putc ('\n', STREAM); \ |
} \ |
while (0) |
#endif |
#endif |
/* This determines whether or not we support weak symbols. */ |
#ifndef SUPPORTS_WEAK |
#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL) |
#define SUPPORTS_WEAK 1 |
#else |
#define SUPPORTS_WEAK 0 |
#endif |
#endif |
/* This determines whether or not we support the discriminator |
attribute in the .loc directive. */ |
#ifndef SUPPORTS_DISCRIMINATOR |
#ifdef HAVE_GAS_DISCRIMINATOR |
#define SUPPORTS_DISCRIMINATOR 1 |
#else |
#define SUPPORTS_DISCRIMINATOR 0 |
#endif |
#endif |
/* This determines whether or not we support link-once semantics. */ |
#ifndef SUPPORTS_ONE_ONLY |
#ifdef MAKE_DECL_ONE_ONLY |
#define SUPPORTS_ONE_ONLY 1 |
#else |
#define SUPPORTS_ONE_ONLY 0 |
#endif |
#endif |
/* This determines whether weak symbols must be left out of a static |
archive's table of contents. Defining this macro to be nonzero has |
the consequence that certain symbols will not be made weak that |
otherwise would be. The C++ ABI requires this macro to be zero; |
see the documentation. */ |
#ifndef TARGET_WEAK_NOT_IN_ARCHIVE_TOC |
#define TARGET_WEAK_NOT_IN_ARCHIVE_TOC 0 |
#endif |
/* This determines whether or not we need linkonce unwind information. */ |
#ifndef TARGET_USES_WEAK_UNWIND_INFO |
#define TARGET_USES_WEAK_UNWIND_INFO 0 |
#endif |
/* By default, there is no prefix on user-defined symbols. */ |
#ifndef USER_LABEL_PREFIX |
#define USER_LABEL_PREFIX "" |
#endif |
/* If the target supports weak symbols, define TARGET_ATTRIBUTE_WEAK to |
provide a weak attribute. Else define it to nothing. |
This would normally belong in ansidecl.h, but SUPPORTS_WEAK is |
not available at that time. |
Note, this is only for use by target files which we know are to be |
compiled by GCC. */ |
#ifndef TARGET_ATTRIBUTE_WEAK |
# if SUPPORTS_WEAK |
# define TARGET_ATTRIBUTE_WEAK __attribute__ ((weak)) |
# else |
# define TARGET_ATTRIBUTE_WEAK |
# endif |
#endif |
/* Determines whether we may use common symbols to represent one-only |
semantics (a.k.a. "vague linkage"). */ |
#ifndef USE_COMMON_FOR_ONE_ONLY |
# define USE_COMMON_FOR_ONE_ONLY 1 |
#endif |
/* By default we can assume that all global symbols are in one namespace, |
across all shared libraries. */ |
#ifndef MULTIPLE_SYMBOL_SPACES |
# define MULTIPLE_SYMBOL_SPACES 0 |
#endif |
/* If the target supports init_priority C++ attribute, give |
SUPPORTS_INIT_PRIORITY a nonzero value. */ |
#ifndef SUPPORTS_INIT_PRIORITY |
#define SUPPORTS_INIT_PRIORITY 1 |
#endif /* SUPPORTS_INIT_PRIORITY */ |
/* If duplicate library search directories can be removed from a |
linker command without changing the linker's semantics, give this |
symbol a nonzero. */ |
#ifndef LINK_ELIMINATE_DUPLICATE_LDIRECTORIES |
#define LINK_ELIMINATE_DUPLICATE_LDIRECTORIES 0 |
#endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */ |
/* If we have a definition of INCOMING_RETURN_ADDR_RTX, assume that |
the rest of the DWARF 2 frame unwind support is also provided. */ |
#if !defined (DWARF2_UNWIND_INFO) && defined (INCOMING_RETURN_ADDR_RTX) \ |
&& !defined (TARGET_UNWIND_INFO) |
#define DWARF2_UNWIND_INFO 1 |
#endif |
/* If we have named sections, and we're using crtstuff to run ctors, |
use them for registering eh frame information. */ |
#if defined (TARGET_ASM_NAMED_SECTION) && DWARF2_UNWIND_INFO \ |
&& !defined(EH_FRAME_IN_DATA_SECTION) |
#ifndef EH_FRAME_SECTION_NAME |
#define EH_FRAME_SECTION_NAME ".eh_frame" |
#endif |
#endif |
/* On many systems, different EH table encodings are used under |
difference circumstances. Some will require runtime relocations; |
some will not. For those that do not require runtime relocations, |
we would like to make the table read-only. However, since the |
read-only tables may need to be combined with read-write tables |
that do require runtime relocation, it is not safe to make the |
tables read-only unless the linker will merge read-only and |
read-write sections into a single read-write section. If your |
linker does not have this ability, but your system is such that no |
encoding used with non-PIC code will ever require a runtime |
relocation, then you can define EH_TABLES_CAN_BE_READ_ONLY to 1 in |
your target configuration file. */ |
#ifndef EH_TABLES_CAN_BE_READ_ONLY |
#ifdef HAVE_LD_RO_RW_SECTION_MIXING |
#define EH_TABLES_CAN_BE_READ_ONLY 1 |
#else |
#define EH_TABLES_CAN_BE_READ_ONLY 0 |
#endif |
#endif |
/* If we have named section and we support weak symbols, then use the |
.jcr section for recording java classes which need to be registered |
at program start-up time. */ |
#if defined (TARGET_ASM_NAMED_SECTION) && SUPPORTS_WEAK |
#ifndef JCR_SECTION_NAME |
#define JCR_SECTION_NAME ".jcr" |
#endif |
#endif |
/* This decision to use a .jcr section can be overridden by defining |
USE_JCR_SECTION to 0 in target file. This is necessary if target |
can define JCR_SECTION_NAME but does not have crtstuff or |
linker support for .jcr section. */ |
#ifndef TARGET_USE_JCR_SECTION |
#ifdef JCR_SECTION_NAME |
#define TARGET_USE_JCR_SECTION 1 |
#else |
#define TARGET_USE_JCR_SECTION 0 |
#endif |
#endif |
/* Number of hardware registers that go into the DWARF-2 unwind info. |
If not defined, equals FIRST_PSEUDO_REGISTER */ |
#ifndef DWARF_FRAME_REGISTERS |
#define DWARF_FRAME_REGISTERS FIRST_PSEUDO_REGISTER |
#endif |
/* How to renumber registers for dbx and gdb. If not defined, assume |
no renumbering is necessary. */ |
#ifndef DBX_REGISTER_NUMBER |
#define DBX_REGISTER_NUMBER(REGNO) (REGNO) |
#endif |
/* Default sizes for base C types. If the sizes are different for |
your target, you should override these values by defining the |
appropriate symbols in your tm.h file. */ |
#ifndef BITS_PER_UNIT |
#define BITS_PER_UNIT 8 |
#endif |
#ifndef BITS_PER_WORD |
#define BITS_PER_WORD (BITS_PER_UNIT * UNITS_PER_WORD) |
#endif |
#ifndef CHAR_TYPE_SIZE |
#define CHAR_TYPE_SIZE BITS_PER_UNIT |
#endif |
#ifndef BOOL_TYPE_SIZE |
/* `bool' has size and alignment `1', on almost all platforms. */ |
#define BOOL_TYPE_SIZE CHAR_TYPE_SIZE |
#endif |
#ifndef SHORT_TYPE_SIZE |
#define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2)) |
#endif |
#ifndef INT_TYPE_SIZE |
#define INT_TYPE_SIZE BITS_PER_WORD |
#endif |
#ifndef LONG_TYPE_SIZE |
#define LONG_TYPE_SIZE BITS_PER_WORD |
#endif |
#ifndef LONG_LONG_TYPE_SIZE |
#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2) |
#endif |
#ifndef WCHAR_TYPE_SIZE |
#define WCHAR_TYPE_SIZE INT_TYPE_SIZE |
#endif |
#ifndef FLOAT_TYPE_SIZE |
#define FLOAT_TYPE_SIZE BITS_PER_WORD |
#endif |
#ifndef DOUBLE_TYPE_SIZE |
#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2) |
#endif |
#ifndef LONG_DOUBLE_TYPE_SIZE |
#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2) |
#endif |
#ifndef DECIMAL32_TYPE_SIZE |
#define DECIMAL32_TYPE_SIZE 32 |
#endif |
#ifndef DECIMAL64_TYPE_SIZE |
#define DECIMAL64_TYPE_SIZE 64 |
#endif |
#ifndef DECIMAL128_TYPE_SIZE |
#define DECIMAL128_TYPE_SIZE 128 |
#endif |
#ifndef SHORT_FRACT_TYPE_SIZE |
#define SHORT_FRACT_TYPE_SIZE BITS_PER_UNIT |
#endif |
#ifndef FRACT_TYPE_SIZE |
#define FRACT_TYPE_SIZE (BITS_PER_UNIT * 2) |
#endif |
#ifndef LONG_FRACT_TYPE_SIZE |
#define LONG_FRACT_TYPE_SIZE (BITS_PER_UNIT * 4) |
#endif |
#ifndef LONG_LONG_FRACT_TYPE_SIZE |
#define LONG_LONG_FRACT_TYPE_SIZE (BITS_PER_UNIT * 8) |
#endif |
#ifndef SHORT_ACCUM_TYPE_SIZE |
#define SHORT_ACCUM_TYPE_SIZE (SHORT_FRACT_TYPE_SIZE * 2) |
#endif |
#ifndef ACCUM_TYPE_SIZE |
#define ACCUM_TYPE_SIZE (FRACT_TYPE_SIZE * 2) |
#endif |
#ifndef LONG_ACCUM_TYPE_SIZE |
#define LONG_ACCUM_TYPE_SIZE (LONG_FRACT_TYPE_SIZE * 2) |
#endif |
#ifndef LONG_LONG_ACCUM_TYPE_SIZE |
#define LONG_LONG_ACCUM_TYPE_SIZE (LONG_LONG_FRACT_TYPE_SIZE * 2) |
#endif |
/* We let tm.h override the types used here, to handle trivial differences |
such as the choice of unsigned int or long unsigned int for size_t. |
When machines start needing nontrivial differences in the size type, |
it would be best to do something here to figure out automatically |
from other information what type to use. */ |
#ifndef SIZE_TYPE |
#define SIZE_TYPE "long unsigned int" |
#endif |
#ifndef PID_TYPE |
#define PID_TYPE "int" |
#endif |
/* If GCC knows the exact uint_least16_t and uint_least32_t types from |
<stdint.h>, use them for char16_t and char32_t. Otherwise, use |
these guesses; getting the wrong type of a given width will not |
affect C++ name mangling because in C++ these are distinct types |
not typedefs. */ |
#ifdef UINT_LEAST16_TYPE |
#define CHAR16_TYPE UINT_LEAST16_TYPE |
#else |
#define CHAR16_TYPE "short unsigned int" |
#endif |
#ifdef UINT_LEAST32_TYPE |
#define CHAR32_TYPE UINT_LEAST32_TYPE |
#else |
#define CHAR32_TYPE "unsigned int" |
#endif |
#ifndef WCHAR_TYPE |
#define WCHAR_TYPE "int" |
#endif |
/* WCHAR_TYPE gets overridden by -fshort-wchar. */ |
#define MODIFIED_WCHAR_TYPE \ |
(flag_short_wchar ? "short unsigned int" : WCHAR_TYPE) |
#ifndef PTRDIFF_TYPE |
#define PTRDIFF_TYPE "long int" |
#endif |
#ifndef WINT_TYPE |
#define WINT_TYPE "unsigned int" |
#endif |
#ifndef INTMAX_TYPE |
#define INTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \ |
? "int" \ |
: ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \ |
? "long int" \ |
: "long long int")) |
#endif |
#ifndef UINTMAX_TYPE |
#define UINTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \ |
? "unsigned int" \ |
: ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \ |
? "long unsigned int" \ |
: "long long unsigned int")) |
#endif |
/* There are no default definitions of these <stdint.h> types. */ |
#ifndef SIG_ATOMIC_TYPE |
#define SIG_ATOMIC_TYPE ((const char *) NULL) |
#endif |
#ifndef INT8_TYPE |
#define INT8_TYPE ((const char *) NULL) |
#endif |
#ifndef INT16_TYPE |
#define INT16_TYPE ((const char *) NULL) |
#endif |
#ifndef INT32_TYPE |
#define INT32_TYPE ((const char *) NULL) |
#endif |
#ifndef INT64_TYPE |
#define INT64_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT8_TYPE |
#define UINT8_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT16_TYPE |
#define UINT16_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT32_TYPE |
#define UINT32_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT64_TYPE |
#define UINT64_TYPE ((const char *) NULL) |
#endif |
#ifndef INT_LEAST8_TYPE |
#define INT_LEAST8_TYPE ((const char *) NULL) |
#endif |
#ifndef INT_LEAST16_TYPE |
#define INT_LEAST16_TYPE ((const char *) NULL) |
#endif |
#ifndef INT_LEAST32_TYPE |
#define INT_LEAST32_TYPE ((const char *) NULL) |
#endif |
#ifndef INT_LEAST64_TYPE |
#define INT_LEAST64_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT_LEAST8_TYPE |
#define UINT_LEAST8_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT_LEAST16_TYPE |
#define UINT_LEAST16_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT_LEAST32_TYPE |
#define UINT_LEAST32_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT_LEAST64_TYPE |
#define UINT_LEAST64_TYPE ((const char *) NULL) |
#endif |
#ifndef INT_FAST8_TYPE |
#define INT_FAST8_TYPE ((const char *) NULL) |
#endif |
#ifndef INT_FAST16_TYPE |
#define INT_FAST16_TYPE ((const char *) NULL) |
#endif |
#ifndef INT_FAST32_TYPE |
#define INT_FAST32_TYPE ((const char *) NULL) |
#endif |
#ifndef INT_FAST64_TYPE |
#define INT_FAST64_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT_FAST8_TYPE |
#define UINT_FAST8_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT_FAST16_TYPE |
#define UINT_FAST16_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT_FAST32_TYPE |
#define UINT_FAST32_TYPE ((const char *) NULL) |
#endif |
#ifndef UINT_FAST64_TYPE |
#define UINT_FAST64_TYPE ((const char *) NULL) |
#endif |
#ifndef INTPTR_TYPE |
#define INTPTR_TYPE ((const char *) NULL) |
#endif |
#ifndef UINTPTR_TYPE |
#define UINTPTR_TYPE ((const char *) NULL) |
#endif |
/* Width in bits of a pointer. Mind the value of the macro `Pmode'. */ |
#ifndef POINTER_SIZE |
#define POINTER_SIZE BITS_PER_WORD |
#endif |
#ifndef PIC_OFFSET_TABLE_REGNUM |
#define PIC_OFFSET_TABLE_REGNUM INVALID_REGNUM |
#endif |
#ifndef TARGET_DLLIMPORT_DECL_ATTRIBUTES |
#define TARGET_DLLIMPORT_DECL_ATTRIBUTES 0 |
#endif |
#ifndef TARGET_DECLSPEC |
#if TARGET_DLLIMPORT_DECL_ATTRIBUTES |
/* If the target supports the "dllimport" attribute, users are |
probably used to the "__declspec" syntax. */ |
#define TARGET_DECLSPEC 1 |
#else |
#define TARGET_DECLSPEC 0 |
#endif |
#endif |
/* By default, the preprocessor should be invoked the same way in C++ |
as in C. */ |
#ifndef CPLUSPLUS_CPP_SPEC |
#ifdef CPP_SPEC |
#define CPLUSPLUS_CPP_SPEC CPP_SPEC |
#endif |
#endif |
#ifndef ACCUMULATE_OUTGOING_ARGS |
#define ACCUMULATE_OUTGOING_ARGS 0 |
#endif |
/* Supply a default definition for PUSH_ARGS. */ |
#ifndef PUSH_ARGS |
#ifdef PUSH_ROUNDING |
#define PUSH_ARGS !ACCUMULATE_OUTGOING_ARGS |
#else |
#define PUSH_ARGS 0 |
#endif |
#endif |
/* Decide whether a function's arguments should be processed |
from first to last or from last to first. |
They should if the stack and args grow in opposite directions, but |
only if we have push insns. */ |
#ifdef PUSH_ROUNDING |
#ifndef PUSH_ARGS_REVERSED |
#if defined (STACK_GROWS_DOWNWARD) != defined (ARGS_GROW_DOWNWARD) |
#define PUSH_ARGS_REVERSED PUSH_ARGS |
#endif |
#endif |
#endif |
#ifndef PUSH_ARGS_REVERSED |
#define PUSH_ARGS_REVERSED 0 |
#endif |
/* Default value for the alignment (in bits) a C conformant malloc has to |
provide. This default is intended to be safe and always correct. */ |
#ifndef MALLOC_ABI_ALIGNMENT |
#define MALLOC_ABI_ALIGNMENT BITS_PER_WORD |
#endif |
/* If PREFERRED_STACK_BOUNDARY is not defined, set it to STACK_BOUNDARY. |
STACK_BOUNDARY is required. */ |
#ifndef PREFERRED_STACK_BOUNDARY |
#define PREFERRED_STACK_BOUNDARY STACK_BOUNDARY |
#endif |
/* Set INCOMING_STACK_BOUNDARY to PREFERRED_STACK_BOUNDARY if it is not |
defined. */ |
#ifndef INCOMING_STACK_BOUNDARY |
#define INCOMING_STACK_BOUNDARY PREFERRED_STACK_BOUNDARY |
#endif |
#ifndef TARGET_DEFAULT_PACK_STRUCT |
#define TARGET_DEFAULT_PACK_STRUCT 0 |
#endif |
/* By default, the C++ compiler will use function addresses in the |
vtable entries. Setting this nonzero tells the compiler to use |
function descriptors instead. The value of this macro says how |
many words wide the descriptor is (normally 2). It is assumed |
that the address of a function descriptor may be treated as a |
pointer to a function. */ |
#ifndef TARGET_VTABLE_USES_DESCRIPTORS |
#define TARGET_VTABLE_USES_DESCRIPTORS 0 |
#endif |
/* By default, the vtable entries are void pointers, the so the alignment |
is the same as pointer alignment. The value of this macro specifies |
the alignment of the vtable entry in bits. It should be defined only |
when special alignment is necessary. */ |
#ifndef TARGET_VTABLE_ENTRY_ALIGN |
#define TARGET_VTABLE_ENTRY_ALIGN POINTER_SIZE |
#endif |
/* There are a few non-descriptor entries in the vtable at offsets below |
zero. If these entries must be padded (say, to preserve the alignment |
specified by TARGET_VTABLE_ENTRY_ALIGN), set this to the number of |
words in each data entry. */ |
#ifndef TARGET_VTABLE_DATA_ENTRY_DISTANCE |
#define TARGET_VTABLE_DATA_ENTRY_DISTANCE 1 |
#endif |
/* Decide whether it is safe to use a local alias for a virtual function |
when constructing thunks. */ |
#ifndef TARGET_USE_LOCAL_THUNK_ALIAS_P |
#ifdef ASM_OUTPUT_DEF |
#define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) 1 |
#else |
#define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) 0 |
#endif |
#endif |
/* Select a format to encode pointers in exception handling data. We |
prefer those that result in fewer dynamic relocations. Assume no |
special support here and encode direct references. */ |
#ifndef ASM_PREFERRED_EH_DATA_FORMAT |
#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) DW_EH_PE_absptr |
#endif |
/* By default, the C++ compiler will use the lowest bit of the pointer |
to function to indicate a pointer-to-member-function points to a |
virtual member function. However, if FUNCTION_BOUNDARY indicates |
function addresses aren't always even, the lowest bit of the delta |
field will be used. */ |
#ifndef TARGET_PTRMEMFUNC_VBIT_LOCATION |
#define TARGET_PTRMEMFUNC_VBIT_LOCATION \ |
(FUNCTION_BOUNDARY >= 2 * BITS_PER_UNIT \ |
? ptrmemfunc_vbit_in_pfn : ptrmemfunc_vbit_in_delta) |
#endif |
#ifndef DEFAULT_GDB_EXTENSIONS |
#define DEFAULT_GDB_EXTENSIONS 1 |
#endif |
/* If more than one debugging type is supported, you must define |
PREFERRED_DEBUGGING_TYPE to choose the default. */ |
#if 1 < (defined (DBX_DEBUGGING_INFO) + defined (SDB_DEBUGGING_INFO) \ |
+ defined (DWARF2_DEBUGGING_INFO) + defined (XCOFF_DEBUGGING_INFO) \ |
+ defined (VMS_DEBUGGING_INFO)) |
#ifndef PREFERRED_DEBUGGING_TYPE |
#error You must define PREFERRED_DEBUGGING_TYPE |
#endif /* no PREFERRED_DEBUGGING_TYPE */ |
/* If only one debugging format is supported, define PREFERRED_DEBUGGING_TYPE |
here so other code needn't care. */ |
#elif defined DBX_DEBUGGING_INFO |
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG |
#elif defined SDB_DEBUGGING_INFO |
#define PREFERRED_DEBUGGING_TYPE SDB_DEBUG |
#elif defined DWARF2_DEBUGGING_INFO |
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG |
#elif defined VMS_DEBUGGING_INFO |
#define PREFERRED_DEBUGGING_TYPE VMS_AND_DWARF2_DEBUG |
#elif defined XCOFF_DEBUGGING_INFO |
#define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG |
#else |
/* No debugging format is supported by this target. */ |
#define PREFERRED_DEBUGGING_TYPE NO_DEBUG |
#endif |
#ifndef LARGEST_EXPONENT_IS_NORMAL |
#define LARGEST_EXPONENT_IS_NORMAL(SIZE) 0 |
#endif |
#ifndef ROUND_TOWARDS_ZERO |
#define ROUND_TOWARDS_ZERO 0 |
#endif |
#ifndef FLOAT_LIB_COMPARE_RETURNS_BOOL |
#define FLOAT_LIB_COMPARE_RETURNS_BOOL(MODE, COMPARISON) false |
#endif |
/* True if the targets integer-comparison functions return { 0, 1, 2 |
} to indicate { <, ==, > }. False if { -1, 0, 1 } is used |
instead. The libgcc routines are biased. */ |
#ifndef TARGET_LIB_INT_CMP_BIASED |
#define TARGET_LIB_INT_CMP_BIASED (true) |
#endif |
/* If FLOAT_WORDS_BIG_ENDIAN is not defined in the header files, |
then the word-endianness is the same as for integers. */ |
#ifndef FLOAT_WORDS_BIG_ENDIAN |
#define FLOAT_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN |
#endif |
#ifdef TARGET_FLT_EVAL_METHOD |
#define TARGET_FLT_EVAL_METHOD_NON_DEFAULT 1 |
#else |
#define TARGET_FLT_EVAL_METHOD 0 |
#define TARGET_FLT_EVAL_METHOD_NON_DEFAULT 0 |
#endif |
#ifndef TARGET_DEC_EVAL_METHOD |
#define TARGET_DEC_EVAL_METHOD 2 |
#endif |
#ifndef HOT_TEXT_SECTION_NAME |
#define HOT_TEXT_SECTION_NAME ".text.hot" |
#endif |
#ifndef UNLIKELY_EXECUTED_TEXT_SECTION_NAME |
#define UNLIKELY_EXECUTED_TEXT_SECTION_NAME ".text.unlikely" |
#endif |
#ifndef HAS_LONG_COND_BRANCH |
#define HAS_LONG_COND_BRANCH 0 |
#endif |
#ifndef HAS_LONG_UNCOND_BRANCH |
#define HAS_LONG_UNCOND_BRANCH 0 |
#endif |
/* By default, only attempt to parallelize bitwise operations, and |
possibly adds/subtracts using bit-twiddling. */ |
#ifndef UNITS_PER_SIMD_WORD |
#define UNITS_PER_SIMD_WORD(MODE) UNITS_PER_WORD |
#endif |
/* Determine whether __cxa_atexit, rather than atexit, is used to |
register C++ destructors for local statics and global objects. */ |
#ifndef DEFAULT_USE_CXA_ATEXIT |
#define DEFAULT_USE_CXA_ATEXIT 0 |
#endif |
/* If none of these macros are defined, the port must use the new |
technique of defining constraints in the machine description. |
tm_p.h will define those macros that machine-independent code |
still uses. */ |
#if !defined CONSTRAINT_LEN \ |
&& !defined REG_CLASS_FROM_LETTER \ |
&& !defined REG_CLASS_FROM_CONSTRAINT \ |
&& !defined CONST_OK_FOR_LETTER_P \ |
&& !defined CONST_OK_FOR_CONSTRAINT_P \ |
&& !defined CONST_DOUBLE_OK_FOR_LETTER_P \ |
&& !defined CONST_DOUBLE_OK_FOR_CONSTRAINT_P \ |
&& !defined EXTRA_CONSTRAINT \ |
&& !defined EXTRA_CONSTRAINT_STR \ |
&& !defined EXTRA_MEMORY_CONSTRAINT \ |
&& !defined EXTRA_ADDRESS_CONSTRAINT |
#define USE_MD_CONSTRAINTS |
#if GCC_VERSION >= 3000 && defined IN_GCC |
/* These old constraint macros shouldn't appear anywhere in a |
configuration using MD constraint definitions. */ |
#pragma GCC poison REG_CLASS_FROM_LETTER CONST_OK_FOR_LETTER_P \ |
CONST_DOUBLE_OK_FOR_LETTER_P EXTRA_CONSTRAINT |
#endif |
#else /* old constraint mechanism in use */ |
/* Determine whether extra constraint letter should be handled |
via address reload (like 'o'). */ |
#ifndef EXTRA_MEMORY_CONSTRAINT |
#define EXTRA_MEMORY_CONSTRAINT(C,STR) 0 |
#endif |
/* Determine whether extra constraint letter should be handled |
as an address (like 'p'). */ |
#ifndef EXTRA_ADDRESS_CONSTRAINT |
#define EXTRA_ADDRESS_CONSTRAINT(C,STR) 0 |
#endif |
/* When a port defines CONSTRAINT_LEN, it should use DEFAULT_CONSTRAINT_LEN |
for all the characters that it does not want to change, so things like the |
'length' of a digit in a matching constraint is an implementation detail, |
and not part of the interface. */ |
#define DEFAULT_CONSTRAINT_LEN(C,STR) 1 |
#ifndef CONSTRAINT_LEN |
#define CONSTRAINT_LEN(C,STR) DEFAULT_CONSTRAINT_LEN (C, STR) |
#endif |
#if defined (CONST_OK_FOR_LETTER_P) && ! defined (CONST_OK_FOR_CONSTRAINT_P) |
#define CONST_OK_FOR_CONSTRAINT_P(VAL,C,STR) CONST_OK_FOR_LETTER_P (VAL, C) |
#endif |
#if defined (CONST_DOUBLE_OK_FOR_LETTER_P) && ! defined (CONST_DOUBLE_OK_FOR_CONSTRAINT_P) |
#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(OP,C,STR) \ |
CONST_DOUBLE_OK_FOR_LETTER_P (OP, C) |
#endif |
#ifndef REG_CLASS_FROM_CONSTRAINT |
#define REG_CLASS_FROM_CONSTRAINT(C,STR) REG_CLASS_FROM_LETTER (C) |
#endif |
#if defined (EXTRA_CONSTRAINT) && ! defined (EXTRA_CONSTRAINT_STR) |
#define EXTRA_CONSTRAINT_STR(OP, C,STR) EXTRA_CONSTRAINT (OP, C) |
#endif |
#endif /* old constraint mechanism in use */ |
#ifndef REGISTER_MOVE_COST |
#define REGISTER_MOVE_COST(m, x, y) 2 |
#endif |
/* Determine whether the entire c99 runtime |
is present in the runtime library. */ |
#ifndef TARGET_C99_FUNCTIONS |
#define TARGET_C99_FUNCTIONS 0 |
#endif |
/* Determine whether the target runtime library has |
a sincos implementation following the GNU extension. */ |
#ifndef TARGET_HAS_SINCOS |
#define TARGET_HAS_SINCOS 0 |
#endif |
/* Indicate that CLZ and CTZ are undefined at zero. */ |
#ifndef CLZ_DEFINED_VALUE_AT_ZERO |
#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) 0 |
#endif |
#ifndef CTZ_DEFINED_VALUE_AT_ZERO |
#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) 0 |
#endif |
/* Provide a default value for STORE_FLAG_VALUE. */ |
#ifndef STORE_FLAG_VALUE |
#define STORE_FLAG_VALUE 1 |
#endif |
/* This macro is used to determine what the largest unit size that |
move_by_pieces can use is. */ |
/* MOVE_MAX_PIECES is the number of bytes at a time which we can |
move efficiently, as opposed to MOVE_MAX which is the maximum |
number of bytes we can move with a single instruction. */ |
#ifndef MOVE_MAX_PIECES |
#define MOVE_MAX_PIECES MOVE_MAX |
#endif |
#ifndef STACK_POINTER_OFFSET |
#define STACK_POINTER_OFFSET 0 |
#endif |
#ifndef LOCAL_REGNO |
#define LOCAL_REGNO(REGNO) 0 |
#endif |
/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function, |
the stack pointer does not matter. The value is tested only in |
functions that have frame pointers. */ |
#ifndef EXIT_IGNORE_STACK |
#define EXIT_IGNORE_STACK 0 |
#endif |
/* Assume that case vectors are not pc-relative. */ |
#ifndef CASE_VECTOR_PC_RELATIVE |
#define CASE_VECTOR_PC_RELATIVE 0 |
#endif |
/* Assume that trampolines need function alignment. */ |
#ifndef TRAMPOLINE_ALIGNMENT |
#define TRAMPOLINE_ALIGNMENT FUNCTION_BOUNDARY |
#endif |
/* Register mappings for target machines without register windows. */ |
#ifndef INCOMING_REGNO |
#define INCOMING_REGNO(N) (N) |
#endif |
#ifndef OUTGOING_REGNO |
#define OUTGOING_REGNO(N) (N) |
#endif |
#ifndef SHIFT_COUNT_TRUNCATED |
#define SHIFT_COUNT_TRUNCATED 0 |
#endif |
#ifndef LEGITIMATE_PIC_OPERAND_P |
#define LEGITIMATE_PIC_OPERAND_P(X) 1 |
#endif |
#ifndef TARGET_MEM_CONSTRAINT |
#define TARGET_MEM_CONSTRAINT 'm' |
#endif |
#ifndef REVERSIBLE_CC_MODE |
#define REVERSIBLE_CC_MODE(MODE) 0 |
#endif |
/* Biggest alignment supported by the object file format of this machine. */ |
#ifndef MAX_OFILE_ALIGNMENT |
#define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT |
#endif |
#ifndef FRAME_GROWS_DOWNWARD |
#define FRAME_GROWS_DOWNWARD 0 |
#endif |
/* On most machines, the CFA coincides with the first incoming parm. */ |
#ifndef ARG_POINTER_CFA_OFFSET |
#define ARG_POINTER_CFA_OFFSET(FNDECL) \ |
(FIRST_PARM_OFFSET (FNDECL) + crtl->args.pretend_args_size) |
#endif |
/* On most machines, we use the CFA as DW_AT_frame_base. */ |
#ifndef CFA_FRAME_BASE_OFFSET |
#define CFA_FRAME_BASE_OFFSET(FNDECL) 0 |
#endif |
/* The offset from the incoming value of %sp to the top of the stack frame |
for the current function. */ |
#ifndef INCOMING_FRAME_SP_OFFSET |
#define INCOMING_FRAME_SP_OFFSET 0 |
#endif |
#ifndef HARD_REGNO_NREGS_HAS_PADDING |
#define HARD_REGNO_NREGS_HAS_PADDING(REGNO, MODE) 0 |
#define HARD_REGNO_NREGS_WITH_PADDING(REGNO, MODE) -1 |
#endif |
#ifndef OUTGOING_REG_PARM_STACK_SPACE |
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 0 |
#endif |
/* MAX_STACK_ALIGNMENT is the maximum stack alignment guaranteed by |
the backend. MAX_SUPPORTED_STACK_ALIGNMENT is the maximum best |
effort stack alignment supported by the backend. If the backend |
supports stack alignment, MAX_SUPPORTED_STACK_ALIGNMENT and |
MAX_STACK_ALIGNMENT are the same. Otherwise, the incoming stack |
boundary will limit the maximum guaranteed stack alignment. */ |
#ifdef MAX_STACK_ALIGNMENT |
#define MAX_SUPPORTED_STACK_ALIGNMENT MAX_STACK_ALIGNMENT |
#else |
#define MAX_STACK_ALIGNMENT STACK_BOUNDARY |
#define MAX_SUPPORTED_STACK_ALIGNMENT PREFERRED_STACK_BOUNDARY |
#endif |
#define SUPPORTS_STACK_ALIGNMENT (MAX_STACK_ALIGNMENT > STACK_BOUNDARY) |
#ifndef LOCAL_ALIGNMENT |
#define LOCAL_ALIGNMENT(TYPE, ALIGNMENT) ALIGNMENT |
#endif |
#ifndef STACK_SLOT_ALIGNMENT |
#define STACK_SLOT_ALIGNMENT(TYPE,MODE,ALIGN) \ |
((TYPE) ? LOCAL_ALIGNMENT ((TYPE), (ALIGN)) : (ALIGN)) |
#endif |
#ifndef LOCAL_DECL_ALIGNMENT |
#define LOCAL_DECL_ALIGNMENT(DECL) \ |
LOCAL_ALIGNMENT (TREE_TYPE (DECL), DECL_ALIGN (DECL)) |
#endif |
#ifndef MINIMUM_ALIGNMENT |
#define MINIMUM_ALIGNMENT(EXP,MODE,ALIGN) (ALIGN) |
#endif |
/* Alignment value for attribute ((aligned)). */ |
#ifndef ATTRIBUTE_ALIGNED_VALUE |
#define ATTRIBUTE_ALIGNED_VALUE BIGGEST_ALIGNMENT |
#endif |
/* Many ports have no mode-dependent addresses (except possibly autoincrement |
and autodecrement addresses, which are handled by target-independent code |
in recog.c). */ |
#ifndef GO_IF_MODE_DEPENDENT_ADDRESS |
#define GO_IF_MODE_DEPENDENT_ADDRESS(X, WIN) |
#endif |
/* For most ports anything that evaluates to a constant symbolic |
or integer value is acceptable as a constant address. */ |
#ifndef CONSTANT_ADDRESS_P |
#define CONSTANT_ADDRESS_P(X) (CONSTANT_P (X) && GET_CODE (X) != CONST_DOUBLE) |
#endif |
#endif /* ! GCC_DEFAULTS_H */ |
/contrib/sdk/sources/gcc_eh/dwarf2.h |
---|
0,0 → 1,914 |
/* Declarations and definitions of codes relating to the DWARF2 and |
DWARF3 symbolic debugging information formats. |
Copyright (C) 1992, 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002, |
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
Written by Gary Funck (gary@intrepid.com) The Ada Joint Program |
Office (AJPO), Florida State University and Silicon Graphics Inc. |
provided support for this effort -- June 21, 1995. |
Derived from the DWARF 1 implementation written by Ron Guilmette |
(rfg@netcom.com), November 1990. |
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 |
<http://www.gnu.org/licenses/>. */ |
/* This file is derived from the DWARF specification (a public document) |
Revision 2.0.0 (July 27, 1993) developed by the UNIX International |
Programming Languages Special Interest Group (UI/PLSIG) and distributed |
by UNIX International. Copies of this specification are available from |
UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054. |
This file also now contains definitions from the DWARF 3 specification |
published Dec 20, 2005, available from: http://dwarf.freestandards.org. */ |
/* This file is shared between GCC and GDB, and should not contain |
prototypes. */ |
#ifndef _ELF_DWARF2_H |
#define _ELF_DWARF2_H |
/* Structure found in the .debug_line section. */ |
typedef struct |
{ |
unsigned char li_length [4]; |
unsigned char li_version [2]; |
unsigned char li_prologue_length [4]; |
unsigned char li_min_insn_length [1]; |
unsigned char li_default_is_stmt [1]; |
unsigned char li_line_base [1]; |
unsigned char li_line_range [1]; |
unsigned char li_opcode_base [1]; |
} |
DWARF2_External_LineInfo; |
typedef struct |
{ |
unsigned long li_length; |
unsigned short li_version; |
unsigned int li_prologue_length; |
unsigned char li_min_insn_length; |
unsigned char li_max_ops_per_insn; |
unsigned char li_default_is_stmt; |
int li_line_base; |
unsigned char li_line_range; |
unsigned char li_opcode_base; |
} |
DWARF2_Internal_LineInfo; |
/* Structure found in .debug_pubnames section. */ |
typedef struct |
{ |
unsigned char pn_length [4]; |
unsigned char pn_version [2]; |
unsigned char pn_offset [4]; |
unsigned char pn_size [4]; |
} |
DWARF2_External_PubNames; |
typedef struct |
{ |
unsigned long pn_length; |
unsigned short pn_version; |
unsigned long pn_offset; |
unsigned long pn_size; |
} |
DWARF2_Internal_PubNames; |
/* Structure found in .debug_info section. */ |
typedef struct |
{ |
unsigned char cu_length [4]; |
unsigned char cu_version [2]; |
unsigned char cu_abbrev_offset [4]; |
unsigned char cu_pointer_size [1]; |
} |
DWARF2_External_CompUnit; |
typedef struct |
{ |
unsigned long cu_length; |
unsigned short cu_version; |
unsigned long cu_abbrev_offset; |
unsigned char cu_pointer_size; |
} |
DWARF2_Internal_CompUnit; |
typedef struct |
{ |
unsigned char ar_length [4]; |
unsigned char ar_version [2]; |
unsigned char ar_info_offset [4]; |
unsigned char ar_pointer_size [1]; |
unsigned char ar_segment_size [1]; |
} |
DWARF2_External_ARange; |
typedef struct |
{ |
unsigned long ar_length; |
unsigned short ar_version; |
unsigned long ar_info_offset; |
unsigned char ar_pointer_size; |
unsigned char ar_segment_size; |
} |
DWARF2_Internal_ARange; |
/* Tag names and codes. */ |
enum dwarf_tag |
{ |
DW_TAG_padding = 0x00, |
DW_TAG_array_type = 0x01, |
DW_TAG_class_type = 0x02, |
DW_TAG_entry_point = 0x03, |
DW_TAG_enumeration_type = 0x04, |
DW_TAG_formal_parameter = 0x05, |
DW_TAG_imported_declaration = 0x08, |
DW_TAG_label = 0x0a, |
DW_TAG_lexical_block = 0x0b, |
DW_TAG_member = 0x0d, |
DW_TAG_pointer_type = 0x0f, |
DW_TAG_reference_type = 0x10, |
DW_TAG_compile_unit = 0x11, |
DW_TAG_string_type = 0x12, |
DW_TAG_structure_type = 0x13, |
DW_TAG_subroutine_type = 0x15, |
DW_TAG_typedef = 0x16, |
DW_TAG_union_type = 0x17, |
DW_TAG_unspecified_parameters = 0x18, |
DW_TAG_variant = 0x19, |
DW_TAG_common_block = 0x1a, |
DW_TAG_common_inclusion = 0x1b, |
DW_TAG_inheritance = 0x1c, |
DW_TAG_inlined_subroutine = 0x1d, |
DW_TAG_module = 0x1e, |
DW_TAG_ptr_to_member_type = 0x1f, |
DW_TAG_set_type = 0x20, |
DW_TAG_subrange_type = 0x21, |
DW_TAG_with_stmt = 0x22, |
DW_TAG_access_declaration = 0x23, |
DW_TAG_base_type = 0x24, |
DW_TAG_catch_block = 0x25, |
DW_TAG_const_type = 0x26, |
DW_TAG_constant = 0x27, |
DW_TAG_enumerator = 0x28, |
DW_TAG_file_type = 0x29, |
DW_TAG_friend = 0x2a, |
DW_TAG_namelist = 0x2b, |
DW_TAG_namelist_item = 0x2c, |
DW_TAG_packed_type = 0x2d, |
DW_TAG_subprogram = 0x2e, |
DW_TAG_template_type_param = 0x2f, |
DW_TAG_template_value_param = 0x30, |
DW_TAG_thrown_type = 0x31, |
DW_TAG_try_block = 0x32, |
DW_TAG_variant_part = 0x33, |
DW_TAG_variable = 0x34, |
DW_TAG_volatile_type = 0x35, |
/* DWARF 3. */ |
DW_TAG_dwarf_procedure = 0x36, |
DW_TAG_restrict_type = 0x37, |
DW_TAG_interface_type = 0x38, |
DW_TAG_namespace = 0x39, |
DW_TAG_imported_module = 0x3a, |
DW_TAG_unspecified_type = 0x3b, |
DW_TAG_partial_unit = 0x3c, |
DW_TAG_imported_unit = 0x3d, |
DW_TAG_condition = 0x3f, |
DW_TAG_shared_type = 0x40, |
/* DWARF 4. */ |
DW_TAG_type_unit = 0x41, |
DW_TAG_rvalue_reference_type = 0x42, |
DW_TAG_template_alias = 0x43, |
DW_TAG_lo_user = 0x4080, |
DW_TAG_hi_user = 0xffff, |
/* SGI/MIPS Extensions. */ |
DW_TAG_MIPS_loop = 0x4081, |
/* HP extensions. See: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz . */ |
DW_TAG_HP_array_descriptor = 0x4090, |
/* GNU extensions. */ |
DW_TAG_format_label = 0x4101, /* For FORTRAN 77 and Fortran 90. */ |
DW_TAG_function_template = 0x4102, /* For C++. */ |
DW_TAG_class_template = 0x4103, /* For C++. */ |
DW_TAG_GNU_BINCL = 0x4104, |
DW_TAG_GNU_EINCL = 0x4105, |
/* Template template parameter. |
See http://gcc.gnu.org/wiki/TemplateParmsDwarf . */ |
DW_TAG_GNU_template_template_param = 0x4106, |
/* Template parameter pack extension, specified at |
http://wiki.dwarfstd.org/index.php?title=C%2B%2B0x:_Variadic_templates |
The values of these two TAGS are in the DW_TAG_GNU_* space until the tags |
are properly part of DWARF 5. */ |
DW_TAG_GNU_template_parameter_pack = 0x4107, |
DW_TAG_GNU_formal_parameter_pack = 0x4108, |
/* Extensions for UPC. See: http://upc.gwu.edu/~upc. */ |
DW_TAG_upc_shared_type = 0x8765, |
DW_TAG_upc_strict_type = 0x8766, |
DW_TAG_upc_relaxed_type = 0x8767, |
/* PGI (STMicroelectronics) extensions. No documentation available. */ |
DW_TAG_PGI_kanji_type = 0xA000, |
DW_TAG_PGI_interface_block = 0xA020 |
}; |
/* Flag that tells whether entry has a child or not. */ |
#define DW_children_no 0 |
#define DW_children_yes 1 |
/* Form names and codes. */ |
enum dwarf_form |
{ |
DW_FORM_addr = 0x01, |
DW_FORM_block2 = 0x03, |
DW_FORM_block4 = 0x04, |
DW_FORM_data2 = 0x05, |
DW_FORM_data4 = 0x06, |
DW_FORM_data8 = 0x07, |
DW_FORM_string = 0x08, |
DW_FORM_block = 0x09, |
DW_FORM_block1 = 0x0a, |
DW_FORM_data1 = 0x0b, |
DW_FORM_flag = 0x0c, |
DW_FORM_sdata = 0x0d, |
DW_FORM_strp = 0x0e, |
DW_FORM_udata = 0x0f, |
DW_FORM_ref_addr = 0x10, |
DW_FORM_ref1 = 0x11, |
DW_FORM_ref2 = 0x12, |
DW_FORM_ref4 = 0x13, |
DW_FORM_ref8 = 0x14, |
DW_FORM_ref_udata = 0x15, |
DW_FORM_indirect = 0x16, |
/* DWARF 4. */ |
DW_FORM_sec_offset = 0x17, |
DW_FORM_exprloc = 0x18, |
DW_FORM_flag_present = 0x19, |
DW_FORM_ref_sig8 = 0x20 |
#define DW_FORM_sig8 DW_FORM_ref_sig8 /* Note: The use of DW_FORM_sig8 is deprecated. */ |
}; |
/* Attribute names and codes. */ |
enum dwarf_attribute |
{ |
DW_AT_sibling = 0x01, |
DW_AT_location = 0x02, |
DW_AT_name = 0x03, |
DW_AT_ordering = 0x09, |
DW_AT_subscr_data = 0x0a, |
DW_AT_byte_size = 0x0b, |
DW_AT_bit_offset = 0x0c, |
DW_AT_bit_size = 0x0d, |
DW_AT_element_list = 0x0f, |
DW_AT_stmt_list = 0x10, |
DW_AT_low_pc = 0x11, |
DW_AT_high_pc = 0x12, |
DW_AT_language = 0x13, |
DW_AT_member = 0x14, |
DW_AT_discr = 0x15, |
DW_AT_discr_value = 0x16, |
DW_AT_visibility = 0x17, |
DW_AT_import = 0x18, |
DW_AT_string_length = 0x19, |
DW_AT_common_reference = 0x1a, |
DW_AT_comp_dir = 0x1b, |
DW_AT_const_value = 0x1c, |
DW_AT_containing_type = 0x1d, |
DW_AT_default_value = 0x1e, |
DW_AT_inline = 0x20, |
DW_AT_is_optional = 0x21, |
DW_AT_lower_bound = 0x22, |
DW_AT_producer = 0x25, |
DW_AT_prototyped = 0x27, |
DW_AT_return_addr = 0x2a, |
DW_AT_start_scope = 0x2c, |
DW_AT_bit_stride = 0x2e, |
#define DW_AT_stride_size DW_AT_bit_stride /* Note: The use of DW_AT_stride_size is deprecated. */ |
DW_AT_upper_bound = 0x2f, |
DW_AT_abstract_origin = 0x31, |
DW_AT_accessibility = 0x32, |
DW_AT_address_class = 0x33, |
DW_AT_artificial = 0x34, |
DW_AT_base_types = 0x35, |
DW_AT_calling_convention = 0x36, |
DW_AT_count = 0x37, |
DW_AT_data_member_location = 0x38, |
DW_AT_decl_column = 0x39, |
DW_AT_decl_file = 0x3a, |
DW_AT_decl_line = 0x3b, |
DW_AT_declaration = 0x3c, |
DW_AT_discr_list = 0x3d, |
DW_AT_encoding = 0x3e, |
DW_AT_external = 0x3f, |
DW_AT_frame_base = 0x40, |
DW_AT_friend = 0x41, |
DW_AT_identifier_case = 0x42, |
DW_AT_macro_info = 0x43, |
DW_AT_namelist_items = 0x44, |
DW_AT_priority = 0x45, |
DW_AT_segment = 0x46, |
DW_AT_specification = 0x47, |
DW_AT_static_link = 0x48, |
DW_AT_type = 0x49, |
DW_AT_use_location = 0x4a, |
DW_AT_variable_parameter = 0x4b, |
DW_AT_virtuality = 0x4c, |
DW_AT_vtable_elem_location = 0x4d, |
/* DWARF 3 values. */ |
DW_AT_allocated = 0x4e, |
DW_AT_associated = 0x4f, |
DW_AT_data_location = 0x50, |
DW_AT_byte_stride = 0x51, |
#define DW_AT_stride DW_AT_byte_stride /* Note: The use of DW_AT_stride is deprecated. */ |
DW_AT_entry_pc = 0x52, |
DW_AT_use_UTF8 = 0x53, |
DW_AT_extension = 0x54, |
DW_AT_ranges = 0x55, |
DW_AT_trampoline = 0x56, |
DW_AT_call_column = 0x57, |
DW_AT_call_file = 0x58, |
DW_AT_call_line = 0x59, |
DW_AT_description = 0x5a, |
DW_AT_binary_scale = 0x5b, |
DW_AT_decimal_scale = 0x5c, |
DW_AT_small = 0x5d, |
DW_AT_decimal_sign = 0x5e, |
DW_AT_digit_count = 0x5f, |
DW_AT_picture_string = 0x60, |
DW_AT_mutable = 0x61, |
DW_AT_threads_scaled = 0x62, |
DW_AT_explicit = 0x63, |
DW_AT_object_pointer = 0x64, |
DW_AT_endianity = 0x65, |
DW_AT_elemental = 0x66, |
DW_AT_pure = 0x67, |
DW_AT_recursive = 0x68, |
/* DWARF 4. */ |
DW_AT_signature = 0x69, |
DW_AT_main_subprogram = 0x6a, |
DW_AT_data_bit_offset = 0x6b, |
DW_AT_const_expr = 0x6c, |
DW_AT_enum_class = 0x6d, |
DW_AT_linkage_name = 0x6e, |
DW_AT_lo_user = 0x2000, /* Implementation-defined range start. */ |
DW_AT_hi_user = 0x3ff0, /* Implementation-defined range end. */ |
/* SGI/MIPS extensions. */ |
DW_AT_MIPS_fde = 0x2001, |
DW_AT_MIPS_loop_begin = 0x2002, |
DW_AT_MIPS_tail_loop_begin = 0x2003, |
DW_AT_MIPS_epilog_begin = 0x2004, |
DW_AT_MIPS_loop_unroll_factor = 0x2005, |
DW_AT_MIPS_software_pipeline_depth = 0x2006, |
DW_AT_MIPS_linkage_name = 0x2007, |
DW_AT_MIPS_stride = 0x2008, |
DW_AT_MIPS_abstract_name = 0x2009, |
DW_AT_MIPS_clone_origin = 0x200a, |
DW_AT_MIPS_has_inlines = 0x200b, |
/* HP extensions. */ |
DW_AT_HP_block_index = 0x2000, |
DW_AT_HP_unmodifiable = 0x2001, /* Same as DW_AT_MIPS_fde. */ |
DW_AT_HP_actuals_stmt_list = 0x2010, |
DW_AT_HP_proc_per_section = 0x2011, |
DW_AT_HP_raw_data_ptr = 0x2012, |
DW_AT_HP_pass_by_reference = 0x2013, |
DW_AT_HP_opt_level = 0x2014, |
DW_AT_HP_prof_version_id = 0x2015, |
DW_AT_HP_opt_flags = 0x2016, |
DW_AT_HP_cold_region_low_pc = 0x2017, |
DW_AT_HP_cold_region_high_pc = 0x2018, |
DW_AT_HP_all_variables_modifiable = 0x2019, |
DW_AT_HP_linkage_name = 0x201a, |
DW_AT_HP_prof_flags = 0x201b, /* In comp unit of procs_info for -g. */ |
/* GNU extensions. */ |
DW_AT_sf_names = 0x2101, |
DW_AT_src_info = 0x2102, |
DW_AT_mac_info = 0x2103, |
DW_AT_src_coords = 0x2104, |
DW_AT_body_begin = 0x2105, |
DW_AT_body_end = 0x2106, |
DW_AT_GNU_vector = 0x2107, |
/* Thread-safety annotations. |
See http://gcc.gnu.org/wiki/ThreadSafetyAnnotation . */ |
DW_AT_GNU_guarded_by = 0x2108, |
DW_AT_GNU_pt_guarded_by = 0x2109, |
DW_AT_GNU_guarded = 0x210a, |
DW_AT_GNU_pt_guarded = 0x210b, |
DW_AT_GNU_locks_excluded = 0x210c, |
DW_AT_GNU_exclusive_locks_required = 0x210d, |
DW_AT_GNU_shared_locks_required = 0x210e, |
/* One-definition rule violation detection. |
See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo . */ |
DW_AT_GNU_odr_signature = 0x210f, |
/* Template template argument name. |
See http://gcc.gnu.org/wiki/TemplateParmsDwarf . */ |
DW_AT_GNU_template_name = 0x2110, |
/* VMS extensions. */ |
DW_AT_VMS_rtnbeg_pd_address = 0x2201, |
/* GNAT extensions. */ |
/* GNAT descriptive type. |
See http://gcc.gnu.org/wiki/DW_AT_GNAT_descriptive_type . */ |
DW_AT_use_GNAT_descriptive_type = 0x2301, |
DW_AT_GNAT_descriptive_type = 0x2302, |
/* UPC extension. */ |
DW_AT_upc_threads_scaled = 0x3210, |
/* PGI (STMicroelectronics) extensions. */ |
DW_AT_PGI_lbase = 0x3a00, |
DW_AT_PGI_soffset = 0x3a01, |
DW_AT_PGI_lstride = 0x3a02 |
}; |
/* Location atom names and codes. */ |
enum dwarf_location_atom |
{ |
DW_OP_addr = 0x03, |
DW_OP_deref = 0x06, |
DW_OP_const1u = 0x08, |
DW_OP_const1s = 0x09, |
DW_OP_const2u = 0x0a, |
DW_OP_const2s = 0x0b, |
DW_OP_const4u = 0x0c, |
DW_OP_const4s = 0x0d, |
DW_OP_const8u = 0x0e, |
DW_OP_const8s = 0x0f, |
DW_OP_constu = 0x10, |
DW_OP_consts = 0x11, |
DW_OP_dup = 0x12, |
DW_OP_drop = 0x13, |
DW_OP_over = 0x14, |
DW_OP_pick = 0x15, |
DW_OP_swap = 0x16, |
DW_OP_rot = 0x17, |
DW_OP_xderef = 0x18, |
DW_OP_abs = 0x19, |
DW_OP_and = 0x1a, |
DW_OP_div = 0x1b, |
DW_OP_minus = 0x1c, |
DW_OP_mod = 0x1d, |
DW_OP_mul = 0x1e, |
DW_OP_neg = 0x1f, |
DW_OP_not = 0x20, |
DW_OP_or = 0x21, |
DW_OP_plus = 0x22, |
DW_OP_plus_uconst = 0x23, |
DW_OP_shl = 0x24, |
DW_OP_shr = 0x25, |
DW_OP_shra = 0x26, |
DW_OP_xor = 0x27, |
DW_OP_bra = 0x28, |
DW_OP_eq = 0x29, |
DW_OP_ge = 0x2a, |
DW_OP_gt = 0x2b, |
DW_OP_le = 0x2c, |
DW_OP_lt = 0x2d, |
DW_OP_ne = 0x2e, |
DW_OP_skip = 0x2f, |
DW_OP_lit0 = 0x30, |
DW_OP_lit1 = 0x31, |
DW_OP_lit2 = 0x32, |
DW_OP_lit3 = 0x33, |
DW_OP_lit4 = 0x34, |
DW_OP_lit5 = 0x35, |
DW_OP_lit6 = 0x36, |
DW_OP_lit7 = 0x37, |
DW_OP_lit8 = 0x38, |
DW_OP_lit9 = 0x39, |
DW_OP_lit10 = 0x3a, |
DW_OP_lit11 = 0x3b, |
DW_OP_lit12 = 0x3c, |
DW_OP_lit13 = 0x3d, |
DW_OP_lit14 = 0x3e, |
DW_OP_lit15 = 0x3f, |
DW_OP_lit16 = 0x40, |
DW_OP_lit17 = 0x41, |
DW_OP_lit18 = 0x42, |
DW_OP_lit19 = 0x43, |
DW_OP_lit20 = 0x44, |
DW_OP_lit21 = 0x45, |
DW_OP_lit22 = 0x46, |
DW_OP_lit23 = 0x47, |
DW_OP_lit24 = 0x48, |
DW_OP_lit25 = 0x49, |
DW_OP_lit26 = 0x4a, |
DW_OP_lit27 = 0x4b, |
DW_OP_lit28 = 0x4c, |
DW_OP_lit29 = 0x4d, |
DW_OP_lit30 = 0x4e, |
DW_OP_lit31 = 0x4f, |
DW_OP_reg0 = 0x50, |
DW_OP_reg1 = 0x51, |
DW_OP_reg2 = 0x52, |
DW_OP_reg3 = 0x53, |
DW_OP_reg4 = 0x54, |
DW_OP_reg5 = 0x55, |
DW_OP_reg6 = 0x56, |
DW_OP_reg7 = 0x57, |
DW_OP_reg8 = 0x58, |
DW_OP_reg9 = 0x59, |
DW_OP_reg10 = 0x5a, |
DW_OP_reg11 = 0x5b, |
DW_OP_reg12 = 0x5c, |
DW_OP_reg13 = 0x5d, |
DW_OP_reg14 = 0x5e, |
DW_OP_reg15 = 0x5f, |
DW_OP_reg16 = 0x60, |
DW_OP_reg17 = 0x61, |
DW_OP_reg18 = 0x62, |
DW_OP_reg19 = 0x63, |
DW_OP_reg20 = 0x64, |
DW_OP_reg21 = 0x65, |
DW_OP_reg22 = 0x66, |
DW_OP_reg23 = 0x67, |
DW_OP_reg24 = 0x68, |
DW_OP_reg25 = 0x69, |
DW_OP_reg26 = 0x6a, |
DW_OP_reg27 = 0x6b, |
DW_OP_reg28 = 0x6c, |
DW_OP_reg29 = 0x6d, |
DW_OP_reg30 = 0x6e, |
DW_OP_reg31 = 0x6f, |
DW_OP_breg0 = 0x70, |
DW_OP_breg1 = 0x71, |
DW_OP_breg2 = 0x72, |
DW_OP_breg3 = 0x73, |
DW_OP_breg4 = 0x74, |
DW_OP_breg5 = 0x75, |
DW_OP_breg6 = 0x76, |
DW_OP_breg7 = 0x77, |
DW_OP_breg8 = 0x78, |
DW_OP_breg9 = 0x79, |
DW_OP_breg10 = 0x7a, |
DW_OP_breg11 = 0x7b, |
DW_OP_breg12 = 0x7c, |
DW_OP_breg13 = 0x7d, |
DW_OP_breg14 = 0x7e, |
DW_OP_breg15 = 0x7f, |
DW_OP_breg16 = 0x80, |
DW_OP_breg17 = 0x81, |
DW_OP_breg18 = 0x82, |
DW_OP_breg19 = 0x83, |
DW_OP_breg20 = 0x84, |
DW_OP_breg21 = 0x85, |
DW_OP_breg22 = 0x86, |
DW_OP_breg23 = 0x87, |
DW_OP_breg24 = 0x88, |
DW_OP_breg25 = 0x89, |
DW_OP_breg26 = 0x8a, |
DW_OP_breg27 = 0x8b, |
DW_OP_breg28 = 0x8c, |
DW_OP_breg29 = 0x8d, |
DW_OP_breg30 = 0x8e, |
DW_OP_breg31 = 0x8f, |
DW_OP_regx = 0x90, |
DW_OP_fbreg = 0x91, |
DW_OP_bregx = 0x92, |
DW_OP_piece = 0x93, |
DW_OP_deref_size = 0x94, |
DW_OP_xderef_size = 0x95, |
DW_OP_nop = 0x96, |
/* DWARF 3 extensions. */ |
DW_OP_push_object_address = 0x97, |
DW_OP_call2 = 0x98, |
DW_OP_call4 = 0x99, |
DW_OP_call_ref = 0x9a, |
DW_OP_form_tls_address = 0x9b, |
DW_OP_call_frame_cfa = 0x9c, |
DW_OP_bit_piece = 0x9d, |
/* DWARF 4 extensions. */ |
DW_OP_implicit_value = 0x9e, |
DW_OP_stack_value = 0x9f, |
DW_OP_lo_user = 0xe0, /* Implementation-defined range start. */ |
DW_OP_hi_user = 0xff, /* Implementation-defined range end. */ |
/* GNU extensions. */ |
DW_OP_GNU_push_tls_address = 0xe0, |
/* The following is for marking variables that are uninitialized. */ |
DW_OP_GNU_uninit = 0xf0, |
DW_OP_GNU_encoded_addr = 0xf1, |
/* HP extensions. */ |
DW_OP_HP_unknown = 0xe0, /* Ouch, the same as GNU_push_tls_address. */ |
DW_OP_HP_is_value = 0xe1, |
DW_OP_HP_fltconst4 = 0xe2, |
DW_OP_HP_fltconst8 = 0xe3, |
DW_OP_HP_mod_range = 0xe4, |
DW_OP_HP_unmod_range = 0xe5, |
DW_OP_HP_tls = 0xe6, |
/* PGI (STMicroelectronics) extensions. */ |
DW_OP_PGI_omp_thread_num = 0xf8 |
}; |
/* Type encodings. */ |
enum dwarf_type |
{ |
DW_ATE_void = 0x0, |
DW_ATE_address = 0x1, |
DW_ATE_boolean = 0x2, |
DW_ATE_complex_float = 0x3, |
DW_ATE_float = 0x4, |
DW_ATE_signed = 0x5, |
DW_ATE_signed_char = 0x6, |
DW_ATE_unsigned = 0x7, |
DW_ATE_unsigned_char = 0x8, |
/* DWARF 3. */ |
DW_ATE_imaginary_float = 0x9, |
DW_ATE_packed_decimal = 0xa, |
DW_ATE_numeric_string = 0xb, |
DW_ATE_edited = 0xc, |
DW_ATE_signed_fixed = 0xd, |
DW_ATE_unsigned_fixed = 0xe, |
DW_ATE_decimal_float = 0xf, |
DW_ATE_lo_user = 0x80, |
DW_ATE_hi_user = 0xff, |
/* HP extensions. */ |
DW_ATE_HP_float80 = 0x80, /* Floating-point (80 bit). */ |
DW_ATE_HP_complex_float80 = 0x81, /* Complex floating-point (80 bit). */ |
DW_ATE_HP_float128 = 0x82, /* Floating-point (128 bit). */ |
DW_ATE_HP_complex_float128 = 0x83, /* Complex floating-point (128 bit). */ |
DW_ATE_HP_floathpintel = 0x84, /* Floating-point (82 bit IA64). */ |
DW_ATE_HP_imaginary_float80 = 0x85, |
DW_ATE_HP_imaginary_float128 = 0x86 |
}; |
/* Decimal sign encodings. */ |
enum dwarf_decimal_sign_encoding |
{ |
/* DWARF 3. */ |
DW_DS_unsigned = 0x01, |
DW_DS_leading_overpunch = 0x02, |
DW_DS_trailing_overpunch = 0x03, |
DW_DS_leading_separate = 0x04, |
DW_DS_trailing_separate = 0x05 |
}; |
/* Endianity encodings. */ |
enum dwarf_endianity_encoding |
{ |
/* DWARF 3. */ |
DW_END_default = 0x00, |
DW_END_big = 0x01, |
DW_END_little = 0x02, |
DW_END_lo_user = 0x40, |
DW_END_hi_user = 0xff |
}; |
/* Array ordering names and codes. */ |
enum dwarf_array_dim_ordering |
{ |
DW_ORD_row_major = 0, |
DW_ORD_col_major = 1 |
}; |
/* Access attribute. */ |
enum dwarf_access_attribute |
{ |
DW_ACCESS_public = 1, |
DW_ACCESS_protected = 2, |
DW_ACCESS_private = 3 |
}; |
/* Visibility. */ |
enum dwarf_visibility_attribute |
{ |
DW_VIS_local = 1, |
DW_VIS_exported = 2, |
DW_VIS_qualified = 3 |
}; |
/* Virtuality. */ |
enum dwarf_virtuality_attribute |
{ |
DW_VIRTUALITY_none = 0, |
DW_VIRTUALITY_virtual = 1, |
DW_VIRTUALITY_pure_virtual = 2 |
}; |
/* Case sensitivity. */ |
enum dwarf_id_case |
{ |
DW_ID_case_sensitive = 0, |
DW_ID_up_case = 1, |
DW_ID_down_case = 2, |
DW_ID_case_insensitive = 3 |
}; |
/* Calling convention. */ |
enum dwarf_calling_convention |
{ |
DW_CC_normal = 0x1, |
DW_CC_program = 0x2, |
DW_CC_nocall = 0x3, |
DW_CC_lo_user = 0x40, |
DW_CC_hi_user = 0xff, |
DW_CC_GNU_renesas_sh = 0x40, |
DW_CC_GNU_borland_fastcall_i386 = 0x41 |
}; |
/* Inline attribute. */ |
enum dwarf_inline_attribute |
{ |
DW_INL_not_inlined = 0, |
DW_INL_inlined = 1, |
DW_INL_declared_not_inlined = 2, |
DW_INL_declared_inlined = 3 |
}; |
/* Discriminant lists. */ |
enum dwarf_discrim_list |
{ |
DW_DSC_label = 0, |
DW_DSC_range = 1 |
}; |
/* Line number opcodes. */ |
enum dwarf_line_number_ops |
{ |
DW_LNS_extended_op = 0, |
DW_LNS_copy = 1, |
DW_LNS_advance_pc = 2, |
DW_LNS_advance_line = 3, |
DW_LNS_set_file = 4, |
DW_LNS_set_column = 5, |
DW_LNS_negate_stmt = 6, |
DW_LNS_set_basic_block = 7, |
DW_LNS_const_add_pc = 8, |
DW_LNS_fixed_advance_pc = 9, |
/* DWARF 3. */ |
DW_LNS_set_prologue_end = 10, |
DW_LNS_set_epilogue_begin = 11, |
DW_LNS_set_isa = 12 |
}; |
/* Line number extended opcodes. */ |
enum dwarf_line_number_x_ops |
{ |
DW_LNE_end_sequence = 1, |
DW_LNE_set_address = 2, |
DW_LNE_define_file = 3, |
DW_LNE_set_discriminator = 4, |
/* HP extensions. */ |
DW_LNE_HP_negate_is_UV_update = 0x11, |
DW_LNE_HP_push_context = 0x12, |
DW_LNE_HP_pop_context = 0x13, |
DW_LNE_HP_set_file_line_column = 0x14, |
DW_LNE_HP_set_routine_name = 0x15, |
DW_LNE_HP_set_sequence = 0x16, |
DW_LNE_HP_negate_post_semantics = 0x17, |
DW_LNE_HP_negate_function_exit = 0x18, |
DW_LNE_HP_negate_front_end_logical = 0x19, |
DW_LNE_HP_define_proc = 0x20, |
DW_LNE_lo_user = 0x80, |
DW_LNE_hi_user = 0xff |
}; |
/* Call frame information. */ |
enum dwarf_call_frame_info |
{ |
DW_CFA_advance_loc = 0x40, |
DW_CFA_offset = 0x80, |
DW_CFA_restore = 0xc0, |
DW_CFA_nop = 0x00, |
DW_CFA_set_loc = 0x01, |
DW_CFA_advance_loc1 = 0x02, |
DW_CFA_advance_loc2 = 0x03, |
DW_CFA_advance_loc4 = 0x04, |
DW_CFA_offset_extended = 0x05, |
DW_CFA_restore_extended = 0x06, |
DW_CFA_undefined = 0x07, |
DW_CFA_same_value = 0x08, |
DW_CFA_register = 0x09, |
DW_CFA_remember_state = 0x0a, |
DW_CFA_restore_state = 0x0b, |
DW_CFA_def_cfa = 0x0c, |
DW_CFA_def_cfa_register = 0x0d, |
DW_CFA_def_cfa_offset = 0x0e, |
/* DWARF 3. */ |
DW_CFA_def_cfa_expression = 0x0f, |
DW_CFA_expression = 0x10, |
DW_CFA_offset_extended_sf = 0x11, |
DW_CFA_def_cfa_sf = 0x12, |
DW_CFA_def_cfa_offset_sf = 0x13, |
DW_CFA_val_offset = 0x14, |
DW_CFA_val_offset_sf = 0x15, |
DW_CFA_val_expression = 0x16, |
DW_CFA_lo_user = 0x1c, |
DW_CFA_hi_user = 0x3f, |
/* SGI/MIPS specific. */ |
DW_CFA_MIPS_advance_loc8 = 0x1d, |
/* GNU extensions. */ |
DW_CFA_GNU_window_save = 0x2d, |
DW_CFA_GNU_args_size = 0x2e, |
DW_CFA_GNU_negative_offset_extended = 0x2f |
}; |
#define DW_CIE_ID 0xffffffff |
#define DW64_CIE_ID 0xffffffffffffffffULL |
#define DW_CIE_VERSION 1 |
#define DW_CFA_extended 0 |
#define DW_CHILDREN_no 0x00 |
#define DW_CHILDREN_yes 0x01 |
#define DW_ADDR_none 0 |
/* Source language names and codes. */ |
enum dwarf_source_language |
{ |
DW_LANG_C89 = 0x0001, |
DW_LANG_C = 0x0002, |
DW_LANG_Ada83 = 0x0003, |
DW_LANG_C_plus_plus = 0x0004, |
DW_LANG_Cobol74 = 0x0005, |
DW_LANG_Cobol85 = 0x0006, |
DW_LANG_Fortran77 = 0x0007, |
DW_LANG_Fortran90 = 0x0008, |
DW_LANG_Pascal83 = 0x0009, |
DW_LANG_Modula2 = 0x000a, |
/* DWARF 3. */ |
DW_LANG_Java = 0x000b, |
DW_LANG_C99 = 0x000c, |
DW_LANG_Ada95 = 0x000d, |
DW_LANG_Fortran95 = 0x000e, |
DW_LANG_PLI = 0x000f, |
DW_LANG_ObjC = 0x0010, |
DW_LANG_ObjC_plus_plus = 0x0011, |
DW_LANG_UPC = 0x0012, |
DW_LANG_D = 0x0013, |
/* DWARF 4. */ |
DW_LANG_Python = 0x0014, |
DW_LANG_lo_user = 0x8000, /* Implementation-defined range start. */ |
DW_LANG_hi_user = 0xffff, /* Implementation-defined range start. */ |
/* MIPS. */ |
DW_LANG_Mips_Assembler = 0x8001, |
/* UPC. */ |
DW_LANG_Upc = 0x8765 |
}; |
/* Names and codes for macro information. */ |
enum dwarf_macinfo_record_type |
{ |
DW_MACINFO_define = 1, |
DW_MACINFO_undef = 2, |
DW_MACINFO_start_file = 3, |
DW_MACINFO_end_file = 4, |
DW_MACINFO_vendor_ext = 255 |
}; |
/* @@@ For use with GNU frame unwind information. */ |
#define DW_EH_PE_absptr 0x00 |
#define DW_EH_PE_omit 0xff |
#define DW_EH_PE_uleb128 0x01 |
#define DW_EH_PE_udata2 0x02 |
#define DW_EH_PE_udata4 0x03 |
#define DW_EH_PE_udata8 0x04 |
#define DW_EH_PE_sleb128 0x09 |
#define DW_EH_PE_sdata2 0x0A |
#define DW_EH_PE_sdata4 0x0B |
#define DW_EH_PE_sdata8 0x0C |
#define DW_EH_PE_signed 0x08 |
#define DW_EH_PE_pcrel 0x10 |
#define DW_EH_PE_textrel 0x20 |
#define DW_EH_PE_datarel 0x30 |
#define DW_EH_PE_funcrel 0x40 |
#define DW_EH_PE_aligned 0x50 |
#define DW_EH_PE_indirect 0x80 |
#endif /* _ELF_DWARF2_H */ |
/contrib/sdk/sources/gcc_eh/filenames.h |
---|
0,0 → 1,60 |
/* Macros for taking apart, interpreting and processing file names. |
These are here because some non-Posix (a.k.a. DOSish) systems have |
drive letter brain-damage at the beginning of an absolute file name, |
use forward- and back-slash in path names interchangeably, and |
some of them have case-insensitive file names. |
Copyright 2000, 2001, 2007 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program 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 2 of the License, or |
(at your option) any later version. |
This program 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 this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef FILENAMES_H |
#define FILENAMES_H |
#ifdef __cplusplus |
extern "C" { |
#endif |
#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) || defined (__CYGWIN__) |
#ifndef HAVE_DOS_BASED_FILE_SYSTEM |
#define HAVE_DOS_BASED_FILE_SYSTEM 1 |
#endif |
#define IS_DIR_SEPARATOR(c) ((c) == '/' || (c) == '\\') |
/* Note that IS_ABSOLUTE_PATH accepts d:foo as well, although it is |
only semi-absolute. This is because the users of IS_ABSOLUTE_PATH |
want to know whether to prepend the current working directory to |
a file name, which should not be done with a name like d:foo. */ |
#define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0]) || (((f)[0]) && ((f)[1] == ':'))) |
#else /* not DOSish */ |
#define IS_DIR_SEPARATOR(c) ((c) == '/') |
#define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0])) |
#endif /* not DOSish */ |
extern int filename_cmp (const char *s1, const char *s2); |
#define FILENAME_CMP(s1, s2) filename_cmp(s1, s2) |
#ifdef __cplusplus |
} |
#endif |
#endif /* FILENAMES_H */ |
/contrib/sdk/sources/gcc_eh/gthr-single.h |
---|
0,0 → 1,292 |
/* Threads compatibility routines for libgcc2 and libobjc. */ |
/* Compile this one with gcc. */ |
/* Copyright (C) 1997, 1999, 2000, 2004, 2008, 2009 |
Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
#ifndef GCC_GTHR_SINGLE_H |
#define GCC_GTHR_SINGLE_H |
/* Just provide compatibility for mutex handling. */ |
typedef int __gthread_key_t; |
typedef int __gthread_once_t; |
typedef int __gthread_mutex_t; |
typedef int __gthread_recursive_mutex_t; |
#define __GTHREAD_ONCE_INIT 0 |
#define __GTHREAD_MUTEX_INIT 0 |
#define __GTHREAD_RECURSIVE_MUTEX_INIT 0 |
#define UNUSED __attribute__((unused)) |
#ifdef _LIBOBJC |
/* Thread local storage for a single thread */ |
static void *thread_local_storage = NULL; |
/* Backend initialization functions */ |
/* Initialize the threads subsystem. */ |
static inline int |
__gthread_objc_init_thread_system (void) |
{ |
/* No thread support available */ |
return -1; |
} |
/* Close the threads subsystem. */ |
static inline int |
__gthread_objc_close_thread_system (void) |
{ |
/* No thread support available */ |
return -1; |
} |
/* Backend thread functions */ |
/* Create a new thread of execution. */ |
static inline objc_thread_t |
__gthread_objc_thread_detach (void (* func)(void *), void * arg UNUSED) |
{ |
/* No thread support available */ |
return NULL; |
} |
/* Set the current thread's priority. */ |
static inline int |
__gthread_objc_thread_set_priority (int priority UNUSED) |
{ |
/* No thread support available */ |
return -1; |
} |
/* Return the current thread's priority. */ |
static inline int |
__gthread_objc_thread_get_priority (void) |
{ |
return OBJC_THREAD_INTERACTIVE_PRIORITY; |
} |
/* Yield our process time to another thread. */ |
static inline void |
__gthread_objc_thread_yield (void) |
{ |
return; |
} |
/* Terminate the current thread. */ |
static inline int |
__gthread_objc_thread_exit (void) |
{ |
/* No thread support available */ |
/* Should we really exit the program */ |
/* exit (&__objc_thread_exit_status); */ |
return -1; |
} |
/* Returns an integer value which uniquely describes a thread. */ |
static inline objc_thread_t |
__gthread_objc_thread_id (void) |
{ |
/* No thread support, use 1. */ |
return (objc_thread_t) 1; |
} |
/* Sets the thread's local storage pointer. */ |
static inline int |
__gthread_objc_thread_set_data (void *value) |
{ |
thread_local_storage = value; |
return 0; |
} |
/* Returns the thread's local storage pointer. */ |
static inline void * |
__gthread_objc_thread_get_data (void) |
{ |
return thread_local_storage; |
} |
/* Backend mutex functions */ |
/* Allocate a mutex. */ |
static inline int |
__gthread_objc_mutex_allocate (objc_mutex_t mutex UNUSED) |
{ |
return 0; |
} |
/* Deallocate a mutex. */ |
static inline int |
__gthread_objc_mutex_deallocate (objc_mutex_t mutex UNUSED) |
{ |
return 0; |
} |
/* Grab a lock on a mutex. */ |
static inline int |
__gthread_objc_mutex_lock (objc_mutex_t mutex UNUSED) |
{ |
/* There can only be one thread, so we always get the lock */ |
return 0; |
} |
/* Try to grab a lock on a mutex. */ |
static inline int |
__gthread_objc_mutex_trylock (objc_mutex_t mutex UNUSED) |
{ |
/* There can only be one thread, so we always get the lock */ |
return 0; |
} |
/* Unlock the mutex */ |
static inline int |
__gthread_objc_mutex_unlock (objc_mutex_t mutex UNUSED) |
{ |
return 0; |
} |
/* Backend condition mutex functions */ |
/* Allocate a condition. */ |
static inline int |
__gthread_objc_condition_allocate (objc_condition_t condition UNUSED) |
{ |
return 0; |
} |
/* Deallocate a condition. */ |
static inline int |
__gthread_objc_condition_deallocate (objc_condition_t condition UNUSED) |
{ |
return 0; |
} |
/* Wait on the condition */ |
static inline int |
__gthread_objc_condition_wait (objc_condition_t condition UNUSED, |
objc_mutex_t mutex UNUSED) |
{ |
return 0; |
} |
/* Wake up all threads waiting on this condition. */ |
static inline int |
__gthread_objc_condition_broadcast (objc_condition_t condition UNUSED) |
{ |
return 0; |
} |
/* Wake up one thread waiting on this condition. */ |
static inline int |
__gthread_objc_condition_signal (objc_condition_t condition UNUSED) |
{ |
return 0; |
} |
#else /* _LIBOBJC */ |
static inline int |
__gthread_active_p (void) |
{ |
return 0; |
} |
static inline int |
__gthread_once (__gthread_once_t *__once UNUSED, void (*__func) (void) UNUSED) |
{ |
return 0; |
} |
static inline int UNUSED |
__gthread_key_create (__gthread_key_t *__key UNUSED, void (*__func) (void *) UNUSED) |
{ |
return 0; |
} |
static int UNUSED |
__gthread_key_delete (__gthread_key_t __key UNUSED) |
{ |
return 0; |
} |
static inline void * |
__gthread_getspecific (__gthread_key_t __key UNUSED) |
{ |
return 0; |
} |
static inline int |
__gthread_setspecific (__gthread_key_t __key UNUSED, const void *__v UNUSED) |
{ |
return 0; |
} |
static inline int |
__gthread_mutex_destroy (__gthread_mutex_t *__mutex UNUSED) |
{ |
return 0; |
} |
static inline int |
__gthread_mutex_lock (__gthread_mutex_t *__mutex UNUSED) |
{ |
return 0; |
} |
static inline int |
__gthread_mutex_trylock (__gthread_mutex_t *__mutex UNUSED) |
{ |
return 0; |
} |
static inline int |
__gthread_mutex_unlock (__gthread_mutex_t *__mutex UNUSED) |
{ |
return 0; |
} |
static inline int |
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) |
{ |
return __gthread_mutex_lock (__mutex); |
} |
static inline int |
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) |
{ |
return __gthread_mutex_trylock (__mutex); |
} |
static inline int |
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) |
{ |
return __gthread_mutex_unlock (__mutex); |
} |
#endif /* _LIBOBJC */ |
#undef UNUSED |
#endif /* ! GCC_GTHR_SINGLE_H */ |
/contrib/sdk/sources/gcc_eh/gthr.h |
---|
0,0 → 1,173 |
/* Threads compatibility routines for libgcc2. */ |
/* Compile this one with gcc. */ |
/* Copyright (C) 1997, 1998, 2004, 2008, 2009 Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
#ifndef GCC_GTHR_H |
#define GCC_GTHR_H |
#ifndef HIDE_EXPORTS |
#pragma GCC visibility push(default) |
#endif |
/* If this file is compiled with threads support, it must |
#define __GTHREADS 1 |
to indicate that threads support is present. Also it has define |
function |
int __gthread_active_p () |
that returns 1 if thread system is active, 0 if not. |
The threads interface must define the following types: |
__gthread_key_t |
__gthread_once_t |
__gthread_mutex_t |
__gthread_recursive_mutex_t |
The threads interface must define the following macros: |
__GTHREAD_ONCE_INIT |
to initialize __gthread_once_t |
__GTHREAD_MUTEX_INIT |
to initialize __gthread_mutex_t to get a fast |
non-recursive mutex. |
__GTHREAD_MUTEX_INIT_FUNCTION |
some systems can't initialize a mutex without a |
function call. On such systems, define this to a |
function which looks like this: |
void __GTHREAD_MUTEX_INIT_FUNCTION (__gthread_mutex_t *) |
Don't define __GTHREAD_MUTEX_INIT in this case |
__GTHREAD_RECURSIVE_MUTEX_INIT |
__GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION |
as above, but for a recursive mutex. |
The threads interface must define the following static functions: |
int __gthread_once (__gthread_once_t *once, void (*func) ()) |
int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *)) |
int __gthread_key_delete (__gthread_key_t key) |
void *__gthread_getspecific (__gthread_key_t key) |
int __gthread_setspecific (__gthread_key_t key, const void *ptr) |
int __gthread_mutex_destroy (__gthread_mutex_t *mutex); |
int __gthread_mutex_lock (__gthread_mutex_t *mutex); |
int __gthread_mutex_trylock (__gthread_mutex_t *mutex); |
int __gthread_mutex_unlock (__gthread_mutex_t *mutex); |
int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex); |
int __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex); |
int __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex); |
The following are supported in POSIX threads only. They are required to |
fix a deadlock in static initialization inside libsupc++. The header file |
gthr-posix.h defines a symbol __GTHREAD_HAS_COND to signify that these extra |
features are supported. |
Types: |
__gthread_cond_t |
Macros: |
__GTHREAD_COND_INIT |
__GTHREAD_COND_INIT_FUNCTION |
Interface: |
int __gthread_cond_broadcast (__gthread_cond_t *cond); |
int __gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex); |
int __gthread_cond_wait_recursive (__gthread_cond_t *cond, |
__gthread_recursive_mutex_t *mutex); |
All functions returning int should return zero on success or the error |
number. If the operation is not supported, -1 is returned. |
If the following are also defined, you should |
#define __GTHREADS_CXX0X 1 |
to enable the c++0x thread library. |
Types: |
__gthread_t |
__gthread_time_t |
Interface: |
int __gthread_create (__gthread_t *thread, void *(*func) (void*), |
void *args); |
int __gthread_join (__gthread_t thread, void **value_ptr); |
int __gthread_detach (__gthread_t thread); |
int __gthread_equal (__gthread_t t1, __gthread_t t2); |
__gthread_t __gthread_self (void); |
int __gthread_yield (void); |
int __gthread_mutex_timedlock (__gthread_mutex_t *m, |
const __gthread_time_t *abs_timeout); |
int __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *m, |
const __gthread_time_t *abs_time); |
int __gthread_cond_signal (__gthread_cond_t *cond); |
int __gthread_cond_timedwait (__gthread_cond_t *cond, |
__gthread_mutex_t *mutex, |
const __gthread_time_t *abs_timeout); |
int __gthread_cond_timedwait_recursive (__gthread_cond_t *cond, |
__gthread_recursive_mutex_t *mutex, |
const __gthread_time_t *abs_time) |
Currently supported threads packages are |
TPF threads with -D__tpf__ |
POSIX/Unix98 threads with -D_PTHREADS |
POSIX/Unix95 threads with -D_PTHREADS95 |
DCE threads with -D_DCE_THREADS |
Solaris/UI threads with -D_SOLARIS_THREADS |
*/ |
/* Check first for thread specific defines. */ |
#if defined (__tpf__) |
#include "gthr-tpf.h" |
#elif _PTHREADS |
#include "gthr-posix.h" |
#elif _PTHREADS95 |
#include "gthr-posix95.h" |
#elif _DCE_THREADS |
#include "gthr-dce.h" |
#elif _SOLARIS_THREADS |
#include "gthr-solaris.h" |
/* Include GTHREAD_FILE if one is defined. */ |
#elif defined(HAVE_GTHR_DEFAULT) |
#if SUPPORTS_WEAK |
#ifndef GTHREAD_USE_WEAK |
#define GTHREAD_USE_WEAK 1 |
#endif |
#endif |
#include "gthr-default.h" |
/* Fallback to single thread definitions. */ |
#else |
#include "gthr-single.h" |
#endif |
#ifndef HIDE_EXPORTS |
#pragma GCC visibility pop |
#endif |
#endif /* ! GCC_GTHR_H */ |
/contrib/sdk/sources/gcc_eh/options.h |
---|
0,0 → 1,1608 |
/* This file is auto-generated by opth-gen.awk. */ |
#ifndef OPTIONS_H |
#define OPTIONS_H |
extern int target_flags; |
extern int target_flags_explicit; |
extern int extra_warnings; |
extern int warn_abi; |
extern int warn_address; |
extern int warn_aggregate_return; |
extern int warn_array_bounds; |
extern int warn_assign_intercept; |
extern int warn_attributes; |
extern int warn_bad_function_cast; |
extern int warn_cxx_compat; |
extern int warn_cxx0x_compat; |
extern int warn_cast_align; |
extern int warn_cast_qual; |
extern int warn_char_subscripts; |
extern int warn_clobbered; |
extern int warn_conversion; |
extern int warn_conversion_null; |
extern int warn_coverage_mismatch; |
extern int warn_ctor_dtor_privacy; |
extern int warn_declaration_after_statement; |
extern int warn_deprecated; |
extern int warn_deprecated_decl; |
extern int warn_disabled_optimization; |
extern int warn_div_by_zero; |
extern int warn_ecpp; |
extern int warn_empty_body; |
extern int warn_enum_compare; |
extern int warnings_are_errors; |
extern int flag_extraneous_semicolon; |
extern int flag_fatal_errors; |
extern int warn_float_equal; |
extern int warn_format_contains_nul; |
extern int warn_format_extra_args; |
extern int warn_format_nonliteral; |
extern int warn_format_security; |
extern int warn_format_y2k; |
extern int warn_format_zero_length; |
extern int warn_ignored_qualifiers; |
extern int warn_implicit_function_declaration; |
extern int warn_implicit_int; |
extern int warn_init_self; |
extern int warn_inline; |
extern int warn_int_to_pointer_cast; |
extern int warn_invalid_offsetof; |
extern int warn_jump_misses_init; |
extern int warn_logical_op; |
extern int warn_long_long; |
extern int warn_main; |
extern int warn_missing_braces; |
extern int warn_missing_declarations; |
extern int warn_missing_field_initializers; |
extern int warn_missing_format_attribute; |
extern int warn_missing_noreturn; |
extern int warn_missing_parameter_type; |
extern int warn_missing_prototypes; |
extern int warn_mudflap; |
extern int warn_nested_externs; |
extern int warn_nontemplate_friend; |
extern int warn_nonvdtor; |
extern int warn_nonnull; |
extern int warn_old_style_cast; |
extern int warn_old_style_declaration; |
extern int warn_old_style_definition; |
extern int flag_newer; |
extern int warn_overflow; |
extern int warn_overlength_strings; |
extern int warn_overloaded_virtual; |
extern int warn_override_init; |
extern int warn_packed; |
extern int warn_packed_bitfield_compat; |
extern int warn_padded; |
extern int warn_parentheses; |
extern int warn_pedantic_ms_format; |
extern int warn_pmf2ptr; |
extern int warn_pointer_arith; |
extern int warn_pointer_sign; |
extern int warn_pointer_to_int_cast; |
extern int warn_pragmas; |
extern int warn_protocol; |
extern int warn_psabi; |
extern int warn_redundant_decls; |
extern int flag_redundant; |
extern int warn_reorder; |
extern int warn_return_type; |
extern int warn_selector; |
extern int warn_sequence_point; |
extern int warn_shadow; |
extern int warn_sign_compare; |
extern int warn_sign_conversion; |
extern int warn_sign_promo; |
extern int warn_stack_protect; |
extern int warn_strict_aliasing; |
extern int warn_strict_overflow; |
extern int warn_strict_prototypes; |
extern int warn_strict_selector_match; |
extern int warn_switch; |
extern int warn_switch_default; |
extern int warn_switch_enum; |
extern int warn_sync_nand; |
extern int warn_synth; |
extern int warn_system_headers; |
extern int warn_traditional; |
extern int warn_traditional_conversion; |
extern int warn_type_limits; |
extern int warn_undeclared_selector; |
extern int warn_uninitialized; |
extern int warn_unsafe_loop_optimizations; |
extern int warn_unsuffixed_float_constants; |
extern int warn_unused; |
extern int warn_unused_function; |
extern int warn_unused_label; |
extern int warn_unused_parameter; |
extern int warn_unused_result; |
extern int warn_unused_value; |
extern int warn_unused_variable; |
extern int warn_vla; |
extern int warn_volatile_register_var; |
extern int warn_write_strings; |
extern int flag_pic; |
extern int flag_pie; |
extern int flag_abi_version; |
extern int align_functions; |
extern int align_jumps; |
extern int align_labels; |
extern int align_loops; |
extern int flag_argument_noalias; |
extern int flag_assert; |
extern int flag_associative_math; |
extern int flag_asynchronous_unwind_tables; |
extern int flag_auto_inc_dec; |
extern int flag_bootstrap_classes; |
extern int flag_bounds_check; |
extern int flag_branch_on_count_reg; |
extern int flag_branch_probabilities; |
extern int flag_branch_target_load_optimize; |
extern int flag_branch_target_load_optimize2; |
extern int flag_btr_bb_exclusive; |
extern int flag_caller_saves; |
extern int flag_check_data_deps; |
extern int flag_check_references; |
extern int flag_no_common; |
extern int flag_compare_debug; |
extern const char *flag_compare_debug_opt; |
extern int flag_conserve_stack; |
extern int flag_cprop_registers; |
extern int flag_crossjumping; |
extern int flag_cse_follow_jumps; |
extern int flag_cx_fortran_rules; |
extern int flag_cx_limited_range; |
extern int flag_data_sections; |
extern int flag_dce; |
extern int flag_deduce_init_list; |
extern int flag_defer_pop; |
extern int flag_delayed_branch; |
extern int flag_delete_null_pointer_checks; |
extern int flag_dse; |
extern const char *flag_dump_final_insns; |
extern int flag_dump_noaddr; |
extern int flag_dump_unnumbered; |
extern int flag_dump_unnumbered_links; |
extern int flag_dwarf2_cfi_asm; |
extern int flag_early_inlining; |
extern int flag_eliminate_dwarf2_dups; |
extern int flag_debug_only_used_symbols; |
extern int flag_eliminate_unused_debug_types; |
extern int flag_emit_class_debug_always; |
extern int flag_emit_class_files; |
extern int flag_enable_icf_debug; |
extern int flag_exceptions; |
extern int flag_expensive_optimizations; |
extern int flag_filelist_file; |
extern int flag_finite_math_only; |
extern int flag_float_store; |
extern int flag_force_classes_archive_check; |
extern int flag_forward_propagate; |
extern int flag_friend_injection; |
extern int flag_no_function_cse; |
extern int flag_function_sections; |
extern int flag_gcse; |
extern int flag_gcse_after_reload; |
extern int flag_gcse_las; |
extern int flag_gcse_lm; |
extern int flag_gcse_sm; |
extern int flag_gnu89_inline; |
extern int flag_graphite; |
extern int flag_graphite_identity; |
extern int flag_guess_branch_prob; |
extern int flag_hash_synchronization; |
extern int help_flag; |
extern int flag_no_ident; |
extern int flag_if_conversion; |
extern int flag_if_conversion2; |
extern int flag_indirect_classes; |
extern int flag_indirect_dispatch; |
extern int flag_indirect_inlining; |
extern int flag_inhibit_size_directive; |
extern int flag_no_inline; |
extern int flag_inline_functions; |
extern int flag_inline_functions_called_once; |
extern int flag_inline_small_functions; |
extern int flag_instrument_function_entry_exit; |
extern int flag_ipa_cp; |
extern int flag_ipa_cp_clone; |
extern int flag_ipa_matrix_reorg; |
extern int flag_ipa_pta; |
extern int flag_ipa_pure_const; |
extern int flag_ipa_reference; |
extern int flag_ipa_sra; |
extern int flag_ipa_struct_reorg; |
extern int flag_ipa_type_escape; |
extern int flag_ira_coalesce; |
extern int flag_ira_loop_pressure; |
extern int flag_ira_share_save_slots; |
extern int flag_ira_share_spill_slots; |
extern int flag_ivopts; |
extern int flag_jni; |
extern int flag_jump_tables; |
extern int flag_keep_inline_functions; |
extern int flag_keep_static_consts; |
extern int flag_leading_underscore; |
extern int flag_loop_block; |
extern int flag_loop_interchange; |
extern int flag_loop_parallelize_all; |
extern int flag_loop_strip_mine; |
extern int flag_lto; |
extern int flag_lto_compression_level; |
extern int flag_lto_report; |
extern int flag_ltrans; |
extern const char *ltrans_output_list; |
extern int flag_errno_math; |
extern int mem_report; |
extern int flag_merge_constants; |
extern int flag_merge_debug_strings; |
extern int flag_modulo_sched; |
extern int flag_modulo_sched_allow_regmoves; |
extern int flag_move_loop_invariants; |
extern int flag_mudflap; |
extern int flag_mudflap_ignore_reads; |
extern int flag_non_call_exceptions; |
extern int flag_objc_call_cxx_cdtors; |
extern int flag_objc_direct_dispatch; |
extern int flag_objc_exceptions; |
extern int flag_objc_gc; |
extern int flag_objc_sjlj_exceptions; |
extern int flag_omit_frame_pointer; |
extern int flag_openmp; |
extern int flag_regmove; |
extern int flag_optimize_sibling_calls; |
extern int flag_optimize_sci; |
extern int flag_pack_struct; |
extern int flag_pcc_struct_return; |
extern int flag_peel_loops; |
extern int flag_no_peephole; |
extern int flag_peephole2; |
extern int post_ipa_mem_report; |
extern int pre_ipa_mem_report; |
extern int flag_predictive_commoning; |
extern int flag_prefetch_loop_arrays; |
extern int profile_flag; |
extern int profile_arc_flag; |
extern int flag_profile_correction; |
extern int flag_profile_use; |
extern int flag_profile_values; |
extern int flag_reciprocal_math; |
extern int flag_record_gcc_switches; |
extern int flag_reduced_reflection; |
extern int flag_rename_registers; |
extern int flag_reorder_blocks; |
extern int flag_reorder_blocks_and_partition; |
extern int flag_reorder_functions; |
extern int flag_rerun_cse_after_loop; |
extern int flag_resched_modulo_sched; |
extern int flag_rounding_math; |
extern int flag_sched_critical_path_heuristic; |
extern int flag_sched_dep_count_heuristic; |
extern int flag_sched_group_heuristic; |
extern int flag_schedule_interblock; |
extern int flag_sched_last_insn_heuristic; |
extern int flag_sched_pressure; |
extern int flag_sched_rank_heuristic; |
extern int flag_schedule_speculative; |
extern int flag_sched_spec_insn_heuristic; |
extern int flag_schedule_speculative_load; |
extern int flag_schedule_speculative_load_dangerous; |
extern int flag_sched_stalled_insns; |
extern int flag_sched_stalled_insns_dep; |
extern int flag_sched2_use_superblocks; |
extern int flag_schedule_insns; |
extern int flag_schedule_insns_after_reload; |
extern int flag_section_anchors; |
extern int flag_sel_sched_pipelining; |
extern int flag_sel_sched_pipelining_outer_loops; |
extern int flag_sel_sched_reschedule_pipelined; |
extern int flag_selective_scheduling; |
extern int flag_selective_scheduling2; |
extern int flag_setstackexecutable; |
extern int flag_show_column; |
extern int flag_signaling_nans; |
extern int flag_signed_zeros; |
extern int flag_single_precision_constant; |
extern int flag_split_ivs_in_unroller; |
extern int flag_split_wide_types; |
extern int flag_stack_protect; |
extern int flag_store_check; |
extern int flag_strict_aliasing; |
extern int flag_strict_overflow; |
extern int flag_syntax_only; |
extern int flag_test_coverage; |
extern int flag_thread_jumps; |
extern int time_report; |
extern int flag_toplevel_reorder; |
extern int flag_tracer; |
extern int flag_trapping_math; |
extern int flag_trapv; |
extern int flag_tree_builtin_call_dce; |
extern int flag_tree_ccp; |
extern int flag_tree_ch; |
extern int flag_tree_copy_prop; |
extern int flag_tree_copyrename; |
extern int flag_tree_cselim; |
extern int flag_tree_dce; |
extern int flag_tree_dom; |
extern int flag_tree_dse; |
extern int flag_tree_forwprop; |
extern int flag_tree_fre; |
extern int flag_tree_loop_distribution; |
extern int flag_tree_loop_im; |
extern int flag_tree_loop_ivcanon; |
extern int flag_tree_loop_linear; |
extern int flag_tree_loop_optimize; |
extern int flag_tree_live_range_split; |
extern int flag_tree_parallelize_loops; |
extern int flag_tree_phiprop; |
extern int flag_tree_pre; |
extern int flag_tree_pta; |
extern int flag_tree_reassoc; |
extern int flag_tree_scev_cprop; |
extern int flag_tree_sink; |
extern int flag_tree_slp_vectorize; |
extern int flag_tree_sra; |
extern int flag_tree_switch_conversion; |
extern int flag_tree_ter; |
extern int flag_tree_vect_loop_version; |
extern int flag_tree_vectorize; |
extern int flag_tree_vrp; |
extern int flag_unit_at_a_time; |
extern int flag_unroll_all_loops; |
extern int flag_unroll_loops; |
extern int flag_unsafe_loop_optimizations; |
extern int flag_unsafe_math_optimizations; |
extern int flag_unswitch_loops; |
extern int flag_unwind_tables; |
extern int flag_use_atomic_builtins; |
extern int flag_use_boehm_gc; |
extern int flag_use_divide_subroutine; |
extern int flag_var_tracking; |
extern int flag_var_tracking_assignments; |
extern int flag_var_tracking_assignments_toggle; |
extern int flag_var_tracking_uninit; |
extern int flag_variable_expansion_in_unroller; |
extern int flag_vect_cost_model; |
extern int flag_verbose_asm; |
extern int flag_visibility_ms_compat; |
extern int flag_value_profile_transformations; |
extern int flag_web; |
extern int flag_whole_program; |
extern int flag_whopr; |
extern int flag_wpa; |
extern int flag_wrapv; |
extern int flag_zero_initialized_in_bss; |
extern int dwarf_version; |
extern int dwarf_strict; |
extern int flag_gtoggle; |
extern int ix86_isa_flags; |
extern const char *ix86_abi_string; |
extern const char *ix86_align_funcs_string; |
extern const char *ix86_align_jumps_string; |
extern const char *ix86_align_loops_string; |
extern const char *ix86_arch_string; |
extern const char *ix86_asm_string; |
extern const char *ix86_branch_cost_string; |
extern const char *ix86_cmodel_string; |
extern int ix86_force_drap; |
extern const char *ix86_fpmath_string; |
extern const char *ix86_incoming_stack_boundary_string; |
extern const char *ix86_section_threshold_string; |
extern int TARGET_NOP_FUN_DLLIMPORT; |
extern const char *ix87_precision_string; |
extern int use_pe_aligned_common; |
extern const char *ix86_preferred_stack_boundary_string; |
extern const char *ix86_regparm_string; |
extern int ix86_sse2avx; |
extern int ix86_force_align_arg_pointer; |
extern const char *ix86_stringop_string; |
extern const char *ix86_tls_dialect_string; |
extern const char *ix86_tune_string; |
extern const char *ix86_veclibabi_string; |
extern int pedantic; |
extern int quiet_flag; |
extern int version_flag; |
extern int inhibit_warnings; |
#if !defined(GCC_DRIVER) && !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) |
/* Structure to save/restore optimization and target specific options. */ |
struct GTY(()) cl_optimization |
{ |
int align_functions; |
int align_jumps; |
int align_labels; |
int align_loops; |
int flag_sched_stalled_insns; |
int flag_sched_stalled_insns_dep; |
unsigned char optimize; |
unsigned char optimize_size; |
signed char flag_argument_noalias; |
signed char flag_asynchronous_unwind_tables; |
signed char flag_branch_on_count_reg; |
signed char flag_branch_probabilities; |
signed char flag_branch_target_load_optimize; |
signed char flag_branch_target_load_optimize2; |
signed char flag_btr_bb_exclusive; |
signed char flag_caller_saves; |
signed char flag_no_common; |
signed char flag_conserve_stack; |
signed char flag_cprop_registers; |
signed char flag_crossjumping; |
signed char flag_cse_follow_jumps; |
signed char flag_cx_fortran_rules; |
signed char flag_cx_limited_range; |
signed char flag_data_sections; |
signed char flag_dce; |
signed char flag_defer_pop; |
signed char flag_delayed_branch; |
signed char flag_delete_null_pointer_checks; |
signed char flag_dse; |
signed char flag_early_inlining; |
signed char flag_exceptions; |
signed char flag_expensive_optimizations; |
signed char flag_finite_math_only; |
signed char flag_float_store; |
signed char flag_forward_propagate; |
signed char flag_gcse; |
signed char flag_gcse_after_reload; |
signed char flag_gcse_las; |
signed char flag_gcse_lm; |
signed char flag_gcse_sm; |
signed char flag_graphite_identity; |
signed char flag_guess_branch_prob; |
signed char flag_if_conversion; |
signed char flag_if_conversion2; |
signed char flag_inline_functions; |
signed char flag_inline_functions_called_once; |
signed char flag_inline_small_functions; |
signed char flag_ipa_cp; |
signed char flag_ipa_cp_clone; |
signed char flag_ipa_matrix_reorg; |
signed char flag_ipa_pta; |
signed char flag_ipa_pure_const; |
signed char flag_ipa_reference; |
signed char flag_ipa_sra; |
signed char flag_ipa_type_escape; |
signed char flag_ivopts; |
signed char flag_jump_tables; |
signed char flag_loop_block; |
signed char flag_loop_interchange; |
signed char flag_loop_parallelize_all; |
signed char flag_loop_strip_mine; |
signed char flag_lto_report; |
signed char flag_ltrans; |
signed char flag_errno_math; |
signed char flag_merge_constants; |
signed char flag_modulo_sched; |
signed char flag_move_loop_invariants; |
signed char flag_non_call_exceptions; |
signed char flag_omit_frame_pointer; |
signed char flag_regmove; |
signed char flag_optimize_sibling_calls; |
signed char flag_pack_struct; |
signed char flag_peel_loops; |
signed char flag_no_peephole; |
signed char flag_peephole2; |
signed char flag_predictive_commoning; |
signed char flag_prefetch_loop_arrays; |
signed char flag_pcc_struct_return; |
signed char flag_rename_registers; |
signed char flag_reorder_blocks; |
signed char flag_reorder_blocks_and_partition; |
signed char flag_reorder_functions; |
signed char flag_rerun_cse_after_loop; |
signed char flag_resched_modulo_sched; |
signed char flag_rounding_math; |
signed char flag_sched_critical_path_heuristic; |
signed char flag_sched_dep_count_heuristic; |
signed char flag_sched_group_heuristic; |
signed char flag_schedule_interblock; |
signed char flag_sched_last_insn_heuristic; |
signed char flag_sched_pressure; |
signed char flag_sched_rank_heuristic; |
signed char flag_schedule_speculative; |
signed char flag_sched_spec_insn_heuristic; |
signed char flag_schedule_speculative_load; |
signed char flag_schedule_speculative_load_dangerous; |
signed char flag_sched2_use_superblocks; |
signed char flag_schedule_insns; |
signed char flag_schedule_insns_after_reload; |
signed char flag_section_anchors; |
signed char flag_sel_sched_pipelining; |
signed char flag_sel_sched_pipelining_outer_loops; |
signed char flag_sel_sched_reschedule_pipelined; |
signed char flag_selective_scheduling; |
signed char flag_selective_scheduling2; |
signed char flag_setstackexecutable; |
signed char flag_signaling_nans; |
signed char flag_signed_zeros; |
signed char flag_single_precision_constant; |
signed char flag_split_ivs_in_unroller; |
signed char flag_split_wide_types; |
signed char flag_strict_aliasing; |
signed char flag_thread_jumps; |
signed char flag_toplevel_reorder; |
signed char flag_trapping_math; |
signed char flag_trapv; |
signed char flag_tree_builtin_call_dce; |
signed char flag_tree_ccp; |
signed char flag_tree_ch; |
signed char flag_tree_copy_prop; |
signed char flag_tree_copyrename; |
signed char flag_tree_cselim; |
signed char flag_tree_dce; |
signed char flag_tree_dom; |
signed char flag_tree_dse; |
signed char flag_tree_forwprop; |
signed char flag_tree_fre; |
signed char flag_tree_loop_distribution; |
signed char flag_tree_loop_im; |
signed char flag_tree_loop_ivcanon; |
signed char flag_tree_loop_linear; |
signed char flag_tree_loop_optimize; |
signed char flag_tree_live_range_split; |
signed char flag_tree_phiprop; |
signed char flag_tree_pre; |
signed char flag_tree_pta; |
signed char flag_tree_reassoc; |
signed char flag_tree_scev_cprop; |
signed char flag_tree_sink; |
signed char flag_tree_slp_vectorize; |
signed char flag_tree_sra; |
signed char flag_tree_switch_conversion; |
signed char flag_tree_ter; |
signed char flag_tree_vect_loop_version; |
signed char flag_tree_vectorize; |
signed char flag_tree_vrp; |
signed char flag_unit_at_a_time; |
signed char flag_unroll_all_loops; |
signed char flag_unroll_loops; |
signed char flag_unsafe_loop_optimizations; |
signed char flag_unsafe_math_optimizations; |
signed char flag_unswitch_loops; |
signed char flag_unwind_tables; |
signed char flag_var_tracking; |
signed char flag_var_tracking_assignments; |
signed char flag_var_tracking_assignments_toggle; |
signed char flag_var_tracking_uninit; |
signed char flag_variable_expansion_in_unroller; |
signed char flag_vect_cost_model; |
signed char flag_value_profile_transformations; |
signed char flag_web; |
signed char flag_whole_program; |
signed char flag_wpa; |
signed char flag_wrapv; |
}; |
/* Structure to save/restore selected target specific options. */ |
struct GTY(()) cl_target_option |
{ |
int ix86_isa_flags_explicit; |
int target_flags_explicit; |
int target_flags; |
int ix86_isa_flags; |
unsigned char arch; |
unsigned char arch_specified; |
unsigned char branch_cost; |
unsigned char fpmath; |
unsigned char schedule; |
unsigned char tune; |
unsigned char tune_defaulted; |
}; |
/* Save optimization variables into a structure. */ |
extern void cl_optimization_save (struct cl_optimization *); |
/* Restore optimization variables from a structure. */ |
extern void cl_optimization_restore (struct cl_optimization *); |
/* Print optimization variables from a structure. */ |
extern void cl_optimization_print (FILE *, int, struct cl_optimization *); |
/* Save selected option variables into a structure. */ |
extern void cl_target_option_save (struct cl_target_option *); |
/* Restore selected option variables from a structure. */ |
extern void cl_target_option_restore (struct cl_target_option *); |
/* Print target option variables from a structure. */ |
extern void cl_target_option_print (FILE *, int, struct cl_target_option *); |
#endif |
#define MASK_128BIT_LONG_DOUBLE (1 << 0) |
#define OPTION_MASK_ISA_3DNOW (1 << 0) |
#define OPTION_MASK_ISA_3DNOW_A (1 << 1) |
#define OPTION_MASK_ISA_64BIT (1 << 2) |
#define MASK_80387 (1 << 1) |
#define OPTION_MASK_ISA_ABM (1 << 3) |
#define MASK_ACCUMULATE_OUTGOING_ARGS (1 << 2) |
#define OPTION_MASK_ISA_AES (1 << 4) |
#define MASK_ALIGN_DOUBLE (1 << 3) |
#define OPTION_MASK_ISA_AVX (1 << 5) |
#define MASK_CLD (1 << 4) |
#define OPTION_MASK_ISA_CRC32 (1 << 6) |
#define OPTION_MASK_ISA_CX16 (1 << 7) |
#define OPTION_MASK_ISA_FMA (1 << 8) |
#define OPTION_MASK_ISA_FMA4 (1 << 9) |
#define MASK_FLOAT_RETURNS (1 << 5) |
#define MASK_FUSED_MADD (1 << 6) |
#define MASK_IEEE_FP (1 << 7) |
#define MASK_INLINE_ALL_STRINGOPS (1 << 8) |
#define MASK_INLINE_STRINGOPS_DYNAMICALLY (1 << 9) |
#define OPTION_MASK_ISA_LWP (1 << 10) |
#define OPTION_MASK_ISA_MMX (1 << 11) |
#define OPTION_MASK_ISA_MOVBE (1 << 12) |
#define MASK_MS_BITFIELD_LAYOUT (1 << 10) |
#define MASK_NO_ALIGN_STRINGOPS (1 << 11) |
#define MASK_NO_FANCY_MATH_387 (1 << 12) |
#define MASK_NO_PUSH_ARGS (1 << 13) |
#define MASK_NO_RED_ZONE (1 << 14) |
#define MASK_OMIT_LEAF_FRAME_POINTER (1 << 15) |
#define OPTION_MASK_ISA_PCLMUL (1 << 13) |
#define OPTION_MASK_ISA_POPCNT (1 << 14) |
#define MASK_RECIP (1 << 16) |
#define MASK_RTD (1 << 17) |
#define OPTION_MASK_ISA_SAHF (1 << 15) |
#define OPTION_MASK_ISA_SSE (1 << 16) |
#define OPTION_MASK_ISA_SSE2 (1 << 17) |
#define OPTION_MASK_ISA_SSE3 (1 << 18) |
#define OPTION_MASK_ISA_SSE4_1 (1 << 19) |
#define OPTION_MASK_ISA_SSE4_2 (1 << 20) |
#define OPTION_MASK_ISA_SSE4A (1 << 21) |
#define MASK_SSEREGPARM (1 << 18) |
#define OPTION_MASK_ISA_SSSE3 (1 << 22) |
#define MASK_STACK_PROBE (1 << 19) |
#define MASK_TLS_DIRECT_SEG_REFS (1 << 20) |
#define OPTION_MASK_ISA_XOP (1 << 23) |
#define TARGET_128BIT_LONG_DOUBLE ((target_flags & MASK_128BIT_LONG_DOUBLE) != 0) |
#define OPTION_ISA_3DNOW ((ix86_isa_flags & OPTION_MASK_ISA_3DNOW) != 0) |
#define OPTION_ISA_3DNOW_A ((ix86_isa_flags & OPTION_MASK_ISA_3DNOW_A) != 0) |
#define OPTION_ISA_64BIT ((ix86_isa_flags & OPTION_MASK_ISA_64BIT) != 0) |
#define TARGET_80387 ((target_flags & MASK_80387) != 0) |
#define OPTION_ISA_ABM ((ix86_isa_flags & OPTION_MASK_ISA_ABM) != 0) |
#define TARGET_ACCUMULATE_OUTGOING_ARGS ((target_flags & MASK_ACCUMULATE_OUTGOING_ARGS) != 0) |
#define OPTION_ISA_AES ((ix86_isa_flags & OPTION_MASK_ISA_AES) != 0) |
#define TARGET_ALIGN_DOUBLE ((target_flags & MASK_ALIGN_DOUBLE) != 0) |
#define OPTION_ISA_AVX ((ix86_isa_flags & OPTION_MASK_ISA_AVX) != 0) |
#define TARGET_CLD ((target_flags & MASK_CLD) != 0) |
#define OPTION_ISA_CRC32 ((ix86_isa_flags & OPTION_MASK_ISA_CRC32) != 0) |
#define OPTION_ISA_CX16 ((ix86_isa_flags & OPTION_MASK_ISA_CX16) != 0) |
#define OPTION_ISA_FMA ((ix86_isa_flags & OPTION_MASK_ISA_FMA) != 0) |
#define OPTION_ISA_FMA4 ((ix86_isa_flags & OPTION_MASK_ISA_FMA4) != 0) |
#define TARGET_FLOAT_RETURNS ((target_flags & MASK_FLOAT_RETURNS) != 0) |
#define TARGET_FUSED_MADD ((target_flags & MASK_FUSED_MADD) != 0) |
#define TARGET_IEEE_FP ((target_flags & MASK_IEEE_FP) != 0) |
#define TARGET_INLINE_ALL_STRINGOPS ((target_flags & MASK_INLINE_ALL_STRINGOPS) != 0) |
#define TARGET_INLINE_STRINGOPS_DYNAMICALLY ((target_flags & MASK_INLINE_STRINGOPS_DYNAMICALLY) != 0) |
#define OPTION_ISA_LWP ((ix86_isa_flags & OPTION_MASK_ISA_LWP) != 0) |
#define OPTION_ISA_MMX ((ix86_isa_flags & OPTION_MASK_ISA_MMX) != 0) |
#define OPTION_ISA_MOVBE ((ix86_isa_flags & OPTION_MASK_ISA_MOVBE) != 0) |
#define TARGET_MS_BITFIELD_LAYOUT ((target_flags & MASK_MS_BITFIELD_LAYOUT) != 0) |
#define TARGET_NO_ALIGN_STRINGOPS ((target_flags & MASK_NO_ALIGN_STRINGOPS) != 0) |
#define TARGET_NO_FANCY_MATH_387 ((target_flags & MASK_NO_FANCY_MATH_387) != 0) |
#define TARGET_NO_PUSH_ARGS ((target_flags & MASK_NO_PUSH_ARGS) != 0) |
#define TARGET_NO_RED_ZONE ((target_flags & MASK_NO_RED_ZONE) != 0) |
#define TARGET_OMIT_LEAF_FRAME_POINTER ((target_flags & MASK_OMIT_LEAF_FRAME_POINTER) != 0) |
#define OPTION_ISA_PCLMUL ((ix86_isa_flags & OPTION_MASK_ISA_PCLMUL) != 0) |
#define OPTION_ISA_POPCNT ((ix86_isa_flags & OPTION_MASK_ISA_POPCNT) != 0) |
#define TARGET_RECIP ((target_flags & MASK_RECIP) != 0) |
#define TARGET_RTD ((target_flags & MASK_RTD) != 0) |
#define OPTION_ISA_SAHF ((ix86_isa_flags & OPTION_MASK_ISA_SAHF) != 0) |
#define OPTION_ISA_SSE ((ix86_isa_flags & OPTION_MASK_ISA_SSE) != 0) |
#define OPTION_ISA_SSE2 ((ix86_isa_flags & OPTION_MASK_ISA_SSE2) != 0) |
#define OPTION_ISA_SSE3 ((ix86_isa_flags & OPTION_MASK_ISA_SSE3) != 0) |
#define OPTION_ISA_SSE4_1 ((ix86_isa_flags & OPTION_MASK_ISA_SSE4_1) != 0) |
#define OPTION_ISA_SSE4_2 ((ix86_isa_flags & OPTION_MASK_ISA_SSE4_2) != 0) |
#define OPTION_ISA_SSE4A ((ix86_isa_flags & OPTION_MASK_ISA_SSE4A) != 0) |
#define TARGET_SSEREGPARM ((target_flags & MASK_SSEREGPARM) != 0) |
#define OPTION_ISA_SSSE3 ((ix86_isa_flags & OPTION_MASK_ISA_SSSE3) != 0) |
#define TARGET_STACK_PROBE ((target_flags & MASK_STACK_PROBE) != 0) |
#define TARGET_TLS_DIRECT_SEG_REFS ((target_flags & MASK_TLS_DIRECT_SEG_REFS) != 0) |
#define OPTION_ISA_XOP ((ix86_isa_flags & OPTION_MASK_ISA_XOP) != 0) |
#define TARGET_ALIGN_STRINGOPS ((target_flags & MASK_NO_ALIGN_STRINGOPS) == 0) |
#define TARGET_USE_FANCY_MATH_387 ((target_flags & MASK_NO_FANCY_MATH_387) == 0) |
#define TARGET_PUSH_ARGS ((target_flags & MASK_NO_PUSH_ARGS) == 0) |
#define TARGET_RED_ZONE ((target_flags & MASK_NO_RED_ZONE) == 0) |
#define CL_Ada (1 << 0) |
#define CL_C (1 << 1) |
#define CL_CXX (1 << 2) |
#define CL_Fortran (1 << 3) |
#define CL_Java (1 << 4) |
#define CL_LTO (1 << 5) |
#define CL_ObjC (1 << 6) |
#define CL_ObjCXX (1 << 7) |
#define CL_LANG_ALL ((1 << 8) - 1) |
enum opt_code |
{ |
OPT__help, /* --help */ |
OPT__help_, /* --help= */ |
OPT__output_pch_, /* --output-pch= */ |
OPT__param, /* --param */ |
OPT__target_help, /* --target-help */ |
OPT__version, /* --version */ |
OPT_A, /* -A */ |
OPT_C, /* -C */ |
OPT_CC, /* -CC */ |
OPT_D, /* -D */ |
OPT_E, /* -E */ |
OPT_F, /* -F */ |
OPT_G, /* -G */ |
OPT_H, /* -H */ |
OPT_I, /* -I */ |
OPT_J, /* -J */ |
OPT_M, /* -M */ |
OPT_MD, /* -MD */ |
OPT_MD_, /* -MD_ */ |
OPT_MF, /* -MF */ |
OPT_MG, /* -MG */ |
OPT_MM, /* -MM */ |
OPT_MMD, /* -MMD */ |
OPT_MMD_, /* -MMD_ */ |
OPT_MP, /* -MP */ |
OPT_MQ, /* -MQ */ |
OPT_MT, /* -MT */ |
OPT_O, /* -O */ |
OPT_Os, /* -Os */ |
OPT_P, /* -P */ |
OPT_U, /* -U */ |
OPT_W, /* -W */ |
OPT_Wabi, /* -Wabi */ |
OPT_Waddress, /* -Waddress */ |
OPT_Waggregate_return, /* -Waggregate-return */ |
OPT_Waliasing, /* -Waliasing */ |
OPT_Walign_commons, /* -Walign-commons */ |
OPT_Wall, /* -Wall */ |
OPT_Wall_deprecation, /* -Wall-deprecation */ |
OPT_Wall_javadoc, /* -Wall-javadoc */ |
OPT_Wampersand, /* -Wampersand */ |
OPT_Warray_bounds, /* -Warray-bounds */ |
OPT_Warray_temporaries, /* -Warray-temporaries */ |
OPT_Wassert_identifier, /* -Wassert-identifier */ |
OPT_Wassign_intercept, /* -Wassign-intercept */ |
OPT_Wattributes, /* -Wattributes */ |
OPT_Wbad_function_cast, /* -Wbad-function-cast */ |
OPT_Wboxing, /* -Wboxing */ |
OPT_Wbuiltin_macro_redefined, /* -Wbuiltin-macro-redefined */ |
OPT_Wc___compat, /* -Wc++-compat */ |
OPT_Wc__0x_compat, /* -Wc++0x-compat */ |
OPT_Wcast_align, /* -Wcast-align */ |
OPT_Wcast_qual, /* -Wcast-qual */ |
OPT_Wchar_concat, /* -Wchar-concat */ |
OPT_Wchar_subscripts, /* -Wchar-subscripts */ |
OPT_Wcharacter_truncation, /* -Wcharacter-truncation */ |
OPT_Wclobbered, /* -Wclobbered */ |
OPT_Wcomment, /* -Wcomment */ |
OPT_Wcomments, /* -Wcomments */ |
OPT_Wcondition_assign, /* -Wcondition-assign */ |
OPT_Wconstructor_name, /* -Wconstructor-name */ |
OPT_Wconversion, /* -Wconversion */ |
OPT_Wconversion_null, /* -Wconversion-null */ |
OPT_Wcoverage_mismatch, /* -Wcoverage-mismatch */ |
OPT_Wctor_dtor_privacy, /* -Wctor-dtor-privacy */ |
OPT_Wdeclaration_after_statement, /* -Wdeclaration-after-statement */ |
OPT_Wdep_ann, /* -Wdep-ann */ |
OPT_Wdeprecated, /* -Wdeprecated */ |
OPT_Wdeprecated_declarations, /* -Wdeprecated-declarations */ |
OPT_Wdisabled_optimization, /* -Wdisabled-optimization */ |
OPT_Wdiscouraged, /* -Wdiscouraged */ |
OPT_Wdiv_by_zero, /* -Wdiv-by-zero */ |
OPT_Weffc__, /* -Weffc++ */ |
OPT_Wempty_block, /* -Wempty-block */ |
OPT_Wempty_body, /* -Wempty-body */ |
OPT_Wendif_labels, /* -Wendif-labels */ |
OPT_Wenum_compare, /* -Wenum-compare */ |
OPT_Wenum_identifier, /* -Wenum-identifier */ |
OPT_Wenum_switch, /* -Wenum-switch */ |
OPT_Werror, /* -Werror */ |
OPT_Werror_implicit_function_declaration, /* -Werror-implicit-function-declaration */ |
OPT_Werror_, /* -Werror= */ |
OPT_Wextra, /* -Wextra */ |
OPT_Wextraneous_semicolon, /* -Wextraneous-semicolon */ |
OPT_Wfallthrough, /* -Wfallthrough */ |
OPT_Wfatal_errors, /* -Wfatal-errors */ |
OPT_Wfield_hiding, /* -Wfield-hiding */ |
OPT_Wfinal_bound, /* -Wfinal-bound */ |
OPT_Wfinally, /* -Wfinally */ |
OPT_Wfloat_equal, /* -Wfloat-equal */ |
OPT_Wforbidden, /* -Wforbidden */ |
OPT_Wformat, /* -Wformat */ |
OPT_Wformat_contains_nul, /* -Wformat-contains-nul */ |
OPT_Wformat_extra_args, /* -Wformat-extra-args */ |
OPT_Wformat_nonliteral, /* -Wformat-nonliteral */ |
OPT_Wformat_security, /* -Wformat-security */ |
OPT_Wformat_y2k, /* -Wformat-y2k */ |
OPT_Wformat_zero_length, /* -Wformat-zero-length */ |
OPT_Wformat_, /* -Wformat= */ |
OPT_Wframe_larger_than_, /* -Wframe-larger-than= */ |
OPT_Whiding, /* -Whiding */ |
OPT_Wignored_qualifiers, /* -Wignored-qualifiers */ |
OPT_Wimplicit, /* -Wimplicit */ |
OPT_Wimplicit_function_declaration, /* -Wimplicit-function-declaration */ |
OPT_Wimplicit_int, /* -Wimplicit-int */ |
OPT_Wimplicit_interface, /* -Wimplicit-interface */ |
OPT_Wimplicit_procedure, /* -Wimplicit-procedure */ |
OPT_Wimport, /* -Wimport */ |
OPT_Windirect_static, /* -Windirect-static */ |
OPT_Winit_self, /* -Winit-self */ |
OPT_Winline, /* -Winline */ |
OPT_Wint_to_pointer_cast, /* -Wint-to-pointer-cast */ |
OPT_Wintf_annotation, /* -Wintf-annotation */ |
OPT_Wintf_non_inherited, /* -Wintf-non-inherited */ |
OPT_Wintrinsic_shadow, /* -Wintrinsic-shadow */ |
OPT_Wintrinsics_std, /* -Wintrinsics-std */ |
OPT_Winvalid_offsetof, /* -Winvalid-offsetof */ |
OPT_Winvalid_pch, /* -Winvalid-pch */ |
OPT_Wjavadoc, /* -Wjavadoc */ |
OPT_Wjump_misses_init, /* -Wjump-misses-init */ |
OPT_Wlarger_than_, /* -Wlarger-than- */ |
OPT_Wlarger_than_eq, /* -Wlarger-than= */ |
OPT_Wline_truncation, /* -Wline-truncation */ |
OPT_Wlocal_hiding, /* -Wlocal-hiding */ |
OPT_Wlogical_op, /* -Wlogical-op */ |
OPT_Wlong_long, /* -Wlong-long */ |
OPT_Wmain, /* -Wmain */ |
OPT_Wmasked_catch_block, /* -Wmasked-catch-block */ |
OPT_Wmissing_braces, /* -Wmissing-braces */ |
OPT_Wmissing_declarations, /* -Wmissing-declarations */ |
OPT_Wmissing_field_initializers, /* -Wmissing-field-initializers */ |
OPT_Wmissing_format_attribute, /* -Wmissing-format-attribute */ |
OPT_Wmissing_include_dirs, /* -Wmissing-include-dirs */ |
OPT_Wmissing_noreturn, /* -Wmissing-noreturn */ |
OPT_Wmissing_parameter_type, /* -Wmissing-parameter-type */ |
OPT_Wmissing_prototypes, /* -Wmissing-prototypes */ |
OPT_Wmudflap, /* -Wmudflap */ |
OPT_Wmultichar, /* -Wmultichar */ |
OPT_Wnested_externs, /* -Wnested-externs */ |
OPT_Wnls, /* -Wnls */ |
OPT_Wno_effect_assign, /* -Wno-effect-assign */ |
OPT_Wnon_template_friend, /* -Wnon-template-friend */ |
OPT_Wnon_virtual_dtor, /* -Wnon-virtual-dtor */ |
OPT_Wnonnull, /* -Wnonnull */ |
OPT_Wnormalized_, /* -Wnormalized= */ |
OPT_Wnull, /* -Wnull */ |
OPT_Wold_style_cast, /* -Wold-style-cast */ |
OPT_Wold_style_declaration, /* -Wold-style-declaration */ |
OPT_Wold_style_definition, /* -Wold-style-definition */ |
OPT_Wout_of_date, /* -Wout-of-date */ |
OPT_Wover_ann, /* -Wover-ann */ |
OPT_Woverflow, /* -Woverflow */ |
OPT_Woverlength_strings, /* -Woverlength-strings */ |
OPT_Woverloaded_virtual, /* -Woverloaded-virtual */ |
OPT_Woverride_init, /* -Woverride-init */ |
OPT_Wpacked, /* -Wpacked */ |
OPT_Wpacked_bitfield_compat, /* -Wpacked-bitfield-compat */ |
OPT_Wpadded, /* -Wpadded */ |
OPT_Wparam_assign, /* -Wparam-assign */ |
OPT_Wparentheses, /* -Wparentheses */ |
OPT_Wpedantic_ms_format, /* -Wpedantic-ms-format */ |
OPT_Wpkg_default_method, /* -Wpkg-default-method */ |
OPT_Wpmf_conversions, /* -Wpmf-conversions */ |
OPT_Wpointer_arith, /* -Wpointer-arith */ |
OPT_Wpointer_sign, /* -Wpointer-sign */ |
OPT_Wpointer_to_int_cast, /* -Wpointer-to-int-cast */ |
OPT_Wpragmas, /* -Wpragmas */ |
OPT_Wprotocol, /* -Wprotocol */ |
OPT_Wpsabi, /* -Wpsabi */ |
OPT_Wraw, /* -Wraw */ |
OPT_Wredundant_decls, /* -Wredundant-decls */ |
OPT_Wredundant_modifiers, /* -Wredundant-modifiers */ |
OPT_Wreorder, /* -Wreorder */ |
OPT_Wreturn_type, /* -Wreturn-type */ |
OPT_Wselector, /* -Wselector */ |
OPT_Wsequence_point, /* -Wsequence-point */ |
OPT_Wserial, /* -Wserial */ |
OPT_Wshadow, /* -Wshadow */ |
OPT_Wsign_compare, /* -Wsign-compare */ |
OPT_Wsign_conversion, /* -Wsign-conversion */ |
OPT_Wsign_promo, /* -Wsign-promo */ |
OPT_Wspecial_param_hiding, /* -Wspecial-param-hiding */ |
OPT_Wstack_protector, /* -Wstack-protector */ |
OPT_Wstatic_access, /* -Wstatic-access */ |
OPT_Wstatic_receiver, /* -Wstatic-receiver */ |
OPT_Wstrict_aliasing, /* -Wstrict-aliasing */ |
OPT_Wstrict_aliasing_, /* -Wstrict-aliasing= */ |
OPT_Wstrict_null_sentinel, /* -Wstrict-null-sentinel */ |
OPT_Wstrict_overflow, /* -Wstrict-overflow */ |
OPT_Wstrict_overflow_, /* -Wstrict-overflow= */ |
OPT_Wstrict_prototypes, /* -Wstrict-prototypes */ |
OPT_Wstrict_selector_match, /* -Wstrict-selector-match */ |
OPT_Wsuppress, /* -Wsuppress */ |
OPT_Wsurprising, /* -Wsurprising */ |
OPT_Wswitch, /* -Wswitch */ |
OPT_Wswitch_default, /* -Wswitch-default */ |
OPT_Wswitch_enum, /* -Wswitch-enum */ |
OPT_Wsync_nand, /* -Wsync-nand */ |
OPT_Wsynth, /* -Wsynth */ |
OPT_Wsynthetic_access, /* -Wsynthetic-access */ |
OPT_Wsystem_headers, /* -Wsystem-headers */ |
OPT_Wtabs, /* -Wtabs */ |
OPT_Wtasks, /* -Wtasks */ |
OPT_Wtraditional, /* -Wtraditional */ |
OPT_Wtraditional_conversion, /* -Wtraditional-conversion */ |
OPT_Wtrigraphs, /* -Wtrigraphs */ |
OPT_Wtype_hiding, /* -Wtype-hiding */ |
OPT_Wtype_limits, /* -Wtype-limits */ |
OPT_Wuncheck, /* -Wuncheck */ |
OPT_Wundeclared_selector, /* -Wundeclared-selector */ |
OPT_Wundef, /* -Wundef */ |
OPT_Wunderflow, /* -Wunderflow */ |
OPT_Wuninitialized, /* -Wuninitialized */ |
OPT_Wunknown_pragmas, /* -Wunknown-pragmas */ |
OPT_Wunnecessary_else, /* -Wunnecessary-else */ |
OPT_Wunqualified_field, /* -Wunqualified-field */ |
OPT_Wunreachable_code, /* -Wunreachable-code */ |
OPT_Wunsafe_loop_optimizations, /* -Wunsafe-loop-optimizations */ |
OPT_Wunsuffixed_float_constants, /* -Wunsuffixed-float-constants */ |
OPT_Wunused, /* -Wunused */ |
OPT_Wunused_argument, /* -Wunused-argument */ |
OPT_Wunused_function, /* -Wunused-function */ |
OPT_Wunused_import, /* -Wunused-import */ |
OPT_Wunused_label, /* -Wunused-label */ |
OPT_Wunused_local, /* -Wunused-local */ |
OPT_Wunused_macros, /* -Wunused-macros */ |
OPT_Wunused_parameter, /* -Wunused-parameter */ |
OPT_Wunused_private, /* -Wunused-private */ |
OPT_Wunused_result, /* -Wunused-result */ |
OPT_Wunused_thrown, /* -Wunused-thrown */ |
OPT_Wunused_value, /* -Wunused-value */ |
OPT_Wunused_variable, /* -Wunused-variable */ |
OPT_Wuseless_type_check, /* -Wuseless-type-check */ |
OPT_Wvarargs_cast, /* -Wvarargs-cast */ |
OPT_Wvariadic_macros, /* -Wvariadic-macros */ |
OPT_Wvla, /* -Wvla */ |
OPT_Wvolatile_register_var, /* -Wvolatile-register-var */ |
OPT_Wwarning_token, /* -Wwarning-token */ |
OPT_Wwrite_strings, /* -Wwrite-strings */ |
OPT_ansi, /* -ansi */ |
OPT_aux_info, /* -aux-info */ |
OPT_aux_info_, /* -aux-info= */ |
OPT_auxbase, /* -auxbase */ |
OPT_auxbase_strip, /* -auxbase-strip */ |
OPT_cpp, /* -cpp */ |
OPT_d, /* -d */ |
OPT_dumpbase, /* -dumpbase */ |
OPT_dumpdir, /* -dumpdir */ |
OPT_fCLASSPATH_, /* -fCLASSPATH= */ |
OPT_fPIC, /* -fPIC */ |
OPT_fPIE, /* -fPIE */ |
OPT_fRTS_, /* -fRTS= */ |
OPT_fabi_version_, /* -fabi-version= */ |
OPT_faccess_control, /* -faccess-control */ |
OPT_falign_commons, /* -falign-commons */ |
OPT_falign_functions, /* -falign-functions */ |
OPT_falign_functions_, /* -falign-functions= */ |
OPT_falign_jumps, /* -falign-jumps */ |
OPT_falign_jumps_, /* -falign-jumps= */ |
OPT_falign_labels, /* -falign-labels */ |
OPT_falign_labels_, /* -falign-labels= */ |
OPT_falign_loops, /* -falign-loops */ |
OPT_falign_loops_, /* -falign-loops= */ |
OPT_fall_intrinsics, /* -fall-intrinsics */ |
OPT_fall_virtual, /* -fall-virtual */ |
OPT_fallow_leading_underscore, /* -fallow-leading-underscore */ |
OPT_falt_external_templates, /* -falt-external-templates */ |
OPT_fargument_alias, /* -fargument-alias */ |
OPT_fargument_noalias, /* -fargument-noalias */ |
OPT_fargument_noalias_anything, /* -fargument-noalias-anything */ |
OPT_fargument_noalias_global, /* -fargument-noalias-global */ |
OPT_fasm, /* -fasm */ |
OPT_fassert, /* -fassert */ |
OPT_fassociative_math, /* -fassociative-math */ |
OPT_fassume_compiled, /* -fassume-compiled */ |
OPT_fassume_compiled_, /* -fassume-compiled= */ |
OPT_fasynchronous_unwind_tables, /* -fasynchronous-unwind-tables */ |
OPT_fauto_inc_dec, /* -fauto-inc-dec */ |
OPT_fautomatic, /* -fautomatic */ |
OPT_faux_classpath, /* -faux-classpath */ |
OPT_fbackslash, /* -fbackslash */ |
OPT_fbacktrace, /* -fbacktrace */ |
OPT_fblas_matmul_limit_, /* -fblas-matmul-limit= */ |
OPT_fbootclasspath_, /* -fbootclasspath= */ |
OPT_fbootstrap_classes, /* -fbootstrap-classes */ |
OPT_fbounds_check, /* -fbounds-check */ |
OPT_fbranch_count_reg, /* -fbranch-count-reg */ |
OPT_fbranch_probabilities, /* -fbranch-probabilities */ |
OPT_fbranch_target_load_optimize, /* -fbranch-target-load-optimize */ |
OPT_fbranch_target_load_optimize2, /* -fbranch-target-load-optimize2 */ |
OPT_fbtr_bb_exclusive, /* -fbtr-bb-exclusive */ |
OPT_fbuiltin, /* -fbuiltin */ |
OPT_fbuiltin_, /* -fbuiltin- */ |
OPT_fcall_saved_, /* -fcall-saved- */ |
OPT_fcall_used_, /* -fcall-used- */ |
OPT_fcaller_saves, /* -fcaller-saves */ |
OPT_fcheck_array_temporaries, /* -fcheck-array-temporaries */ |
OPT_fcheck_data_deps, /* -fcheck-data-deps */ |
OPT_fcheck_new, /* -fcheck-new */ |
OPT_fcheck_references, /* -fcheck-references */ |
OPT_fcheck_, /* -fcheck= */ |
OPT_fclasspath_, /* -fclasspath= */ |
OPT_fcommon, /* -fcommon */ |
OPT_fcompare_debug_second, /* -fcompare-debug-second */ |
OPT_fcompare_debug_, /* -fcompare-debug= */ |
OPT_fcompile_resource_, /* -fcompile-resource= */ |
OPT_fcond_mismatch, /* -fcond-mismatch */ |
OPT_fconserve_space, /* -fconserve-space */ |
OPT_fconserve_stack, /* -fconserve-stack */ |
OPT_fconstant_string_class_, /* -fconstant-string-class= */ |
OPT_fconvert_big_endian, /* -fconvert=big-endian */ |
OPT_fconvert_little_endian, /* -fconvert=little-endian */ |
OPT_fconvert_native, /* -fconvert=native */ |
OPT_fconvert_swap, /* -fconvert=swap */ |
OPT_fcprop_registers, /* -fcprop-registers */ |
OPT_fcray_pointer, /* -fcray-pointer */ |
OPT_fcrossjumping, /* -fcrossjumping */ |
OPT_fcse_follow_jumps, /* -fcse-follow-jumps */ |
OPT_fcse_skip_blocks, /* -fcse-skip-blocks */ |
OPT_fcx_fortran_rules, /* -fcx-fortran-rules */ |
OPT_fcx_limited_range, /* -fcx-limited-range */ |
OPT_fd_lines_as_code, /* -fd-lines-as-code */ |
OPT_fd_lines_as_comments, /* -fd-lines-as-comments */ |
OPT_fdata_sections, /* -fdata-sections */ |
OPT_fdbg_cnt_list, /* -fdbg-cnt-list */ |
OPT_fdbg_cnt_, /* -fdbg-cnt= */ |
OPT_fdce, /* -fdce */ |
OPT_fdebug_prefix_map_, /* -fdebug-prefix-map= */ |
OPT_fdeduce_init_list, /* -fdeduce-init-list */ |
OPT_fdefault_double_8, /* -fdefault-double-8 */ |
OPT_fdefault_inline, /* -fdefault-inline */ |
OPT_fdefault_integer_8, /* -fdefault-integer-8 */ |
OPT_fdefault_real_8, /* -fdefault-real-8 */ |
OPT_fdefer_pop, /* -fdefer-pop */ |
OPT_fdelayed_branch, /* -fdelayed-branch */ |
OPT_fdelete_null_pointer_checks, /* -fdelete-null-pointer-checks */ |
OPT_fdiagnostics_show_location_, /* -fdiagnostics-show-location= */ |
OPT_fdiagnostics_show_option, /* -fdiagnostics-show-option */ |
OPT_fdirectives_only, /* -fdirectives-only */ |
OPT_fdisable_assertions, /* -fdisable-assertions */ |
OPT_fdisable_assertions_, /* -fdisable-assertions= */ |
OPT_fdollar_ok, /* -fdollar-ok */ |
OPT_fdollars_in_identifiers, /* -fdollars-in-identifiers */ |
OPT_fdse, /* -fdse */ |
OPT_fdump_, /* -fdump- */ |
OPT_fdump_core, /* -fdump-core */ |
OPT_fdump_final_insns_, /* -fdump-final-insns= */ |
OPT_fdump_noaddr, /* -fdump-noaddr */ |
OPT_fdump_parse_tree, /* -fdump-parse-tree */ |
OPT_fdump_unnumbered, /* -fdump-unnumbered */ |
OPT_fdump_unnumbered_links, /* -fdump-unnumbered-links */ |
OPT_fdwarf2_cfi_asm, /* -fdwarf2-cfi-asm */ |
OPT_fearly_inlining, /* -fearly-inlining */ |
OPT_felide_constructors, /* -felide-constructors */ |
OPT_feliminate_dwarf2_dups, /* -feliminate-dwarf2-dups */ |
OPT_feliminate_unused_debug_symbols, /* -feliminate-unused-debug-symbols */ |
OPT_feliminate_unused_debug_types, /* -feliminate-unused-debug-types */ |
OPT_femit_class_debug_always, /* -femit-class-debug-always */ |
OPT_femit_class_file, /* -femit-class-file */ |
OPT_femit_class_files, /* -femit-class-files */ |
OPT_femit_struct_debug_baseonly, /* -femit-struct-debug-baseonly */ |
OPT_femit_struct_debug_detailed_, /* -femit-struct-debug-detailed= */ |
OPT_femit_struct_debug_reduced, /* -femit-struct-debug-reduced */ |
OPT_fenable_assertions, /* -fenable-assertions */ |
OPT_fenable_assertions_, /* -fenable-assertions= */ |
OPT_fenable_icf_debug, /* -fenable-icf-debug */ |
OPT_fencoding_, /* -fencoding= */ |
OPT_fenforce_eh_specs, /* -fenforce-eh-specs */ |
OPT_fenum_int_equiv, /* -fenum-int-equiv */ |
OPT_fexceptions, /* -fexceptions */ |
OPT_fexcess_precision_, /* -fexcess-precision= */ |
OPT_fexec_charset_, /* -fexec-charset= */ |
OPT_fexpensive_optimizations, /* -fexpensive-optimizations */ |
OPT_fextdirs_, /* -fextdirs= */ |
OPT_fextended_identifiers, /* -fextended-identifiers */ |
OPT_fexternal_blas, /* -fexternal-blas */ |
OPT_fexternal_templates, /* -fexternal-templates */ |
OPT_ff2c, /* -ff2c */ |
OPT_ffast_math, /* -ffast-math */ |
OPT_ffilelist_file, /* -ffilelist-file */ |
OPT_ffinite_math_only, /* -ffinite-math-only */ |
OPT_ffixed_, /* -ffixed- */ |
OPT_ffixed_form, /* -ffixed-form */ |
OPT_ffixed_line_length_, /* -ffixed-line-length- */ |
OPT_ffixed_line_length_none, /* -ffixed-line-length-none */ |
OPT_ffloat_store, /* -ffloat-store */ |
OPT_ffor_scope, /* -ffor-scope */ |
OPT_fforce_addr, /* -fforce-addr */ |
OPT_fforce_classes_archive_check, /* -fforce-classes-archive-check */ |
OPT_fforward_propagate, /* -fforward-propagate */ |
OPT_ffpe_trap_, /* -ffpe-trap= */ |
OPT_ffree_form, /* -ffree-form */ |
OPT_ffree_line_length_, /* -ffree-line-length- */ |
OPT_ffree_line_length_none, /* -ffree-line-length-none */ |
OPT_ffreestanding, /* -ffreestanding */ |
OPT_ffriend_injection, /* -ffriend-injection */ |
OPT_ffunction_cse, /* -ffunction-cse */ |
OPT_ffunction_sections, /* -ffunction-sections */ |
OPT_fgcse, /* -fgcse */ |
OPT_fgcse_after_reload, /* -fgcse-after-reload */ |
OPT_fgcse_las, /* -fgcse-las */ |
OPT_fgcse_lm, /* -fgcse-lm */ |
OPT_fgcse_sm, /* -fgcse-sm */ |
OPT_fgnu_keywords, /* -fgnu-keywords */ |
OPT_fgnu_runtime, /* -fgnu-runtime */ |
OPT_fgnu89_inline, /* -fgnu89-inline */ |
OPT_fgraphite, /* -fgraphite */ |
OPT_fgraphite_identity, /* -fgraphite-identity */ |
OPT_fguess_branch_probability, /* -fguess-branch-probability */ |
OPT_fguiding_decls, /* -fguiding-decls */ |
OPT_fhandle_exceptions, /* -fhandle-exceptions */ |
OPT_fhash_synchronization, /* -fhash-synchronization */ |
OPT_fhelp, /* -fhelp */ |
OPT_fhelp_, /* -fhelp= */ |
OPT_fhonor_std, /* -fhonor-std */ |
OPT_fhosted, /* -fhosted */ |
OPT_fhuge_objects, /* -fhuge-objects */ |
OPT_fident, /* -fident */ |
OPT_fif_conversion, /* -fif-conversion */ |
OPT_fif_conversion2, /* -fif-conversion2 */ |
OPT_fimplement_inlines, /* -fimplement-inlines */ |
OPT_fimplicit_inline_templates, /* -fimplicit-inline-templates */ |
OPT_fimplicit_none, /* -fimplicit-none */ |
OPT_fimplicit_templates, /* -fimplicit-templates */ |
OPT_findirect_classes, /* -findirect-classes */ |
OPT_findirect_dispatch, /* -findirect-dispatch */ |
OPT_findirect_inlining, /* -findirect-inlining */ |
OPT_finhibit_size_directive, /* -finhibit-size-directive */ |
OPT_finit_character_, /* -finit-character= */ |
OPT_finit_integer_, /* -finit-integer= */ |
OPT_finit_local_zero, /* -finit-local-zero */ |
OPT_finit_logical_, /* -finit-logical= */ |
OPT_finit_real_, /* -finit-real= */ |
OPT_finline, /* -finline */ |
OPT_finline_functions, /* -finline-functions */ |
OPT_finline_functions_called_once, /* -finline-functions-called-once */ |
OPT_finline_limit_, /* -finline-limit- */ |
OPT_finline_limit_eq, /* -finline-limit= */ |
OPT_finline_small_functions, /* -finline-small-functions */ |
OPT_finput_charset_, /* -finput-charset= */ |
OPT_finstrument_functions, /* -finstrument-functions */ |
OPT_finstrument_functions_exclude_file_list_,/* -finstrument-functions-exclude-file-list= */ |
OPT_finstrument_functions_exclude_function_list_,/* -finstrument-functions-exclude-function-list= */ |
OPT_fintrinsic_modules_path, /* -fintrinsic-modules-path */ |
OPT_fipa_cp, /* -fipa-cp */ |
OPT_fipa_cp_clone, /* -fipa-cp-clone */ |
OPT_fipa_matrix_reorg, /* -fipa-matrix-reorg */ |
OPT_fipa_pta, /* -fipa-pta */ |
OPT_fipa_pure_const, /* -fipa-pure-const */ |
OPT_fipa_reference, /* -fipa-reference */ |
OPT_fipa_sra, /* -fipa-sra */ |
OPT_fipa_struct_reorg, /* -fipa-struct-reorg */ |
OPT_fipa_type_escape, /* -fipa-type-escape */ |
OPT_fira_algorithm_, /* -fira-algorithm= */ |
OPT_fira_coalesce, /* -fira-coalesce */ |
OPT_fira_loop_pressure, /* -fira-loop-pressure */ |
OPT_fira_region_, /* -fira-region= */ |
OPT_fira_share_save_slots, /* -fira-share-save-slots */ |
OPT_fira_share_spill_slots, /* -fira-share-spill-slots */ |
OPT_fira_verbose_, /* -fira-verbose= */ |
OPT_fivopts, /* -fivopts */ |
OPT_fjni, /* -fjni */ |
OPT_fjump_tables, /* -fjump-tables */ |
OPT_fkeep_inline_functions, /* -fkeep-inline-functions */ |
OPT_fkeep_static_consts, /* -fkeep-static-consts */ |
OPT_flabels_ok, /* -flabels-ok */ |
OPT_flax_vector_conversions, /* -flax-vector-conversions */ |
OPT_fleading_underscore, /* -fleading-underscore */ |
OPT_floop_block, /* -floop-block */ |
OPT_floop_interchange, /* -floop-interchange */ |
OPT_floop_optimize, /* -floop-optimize */ |
OPT_floop_parallelize_all, /* -floop-parallelize-all */ |
OPT_floop_strip_mine, /* -floop-strip-mine */ |
OPT_flto, /* -flto */ |
OPT_flto_compression_level_, /* -flto-compression-level= */ |
OPT_flto_report, /* -flto-report */ |
OPT_fltrans, /* -fltrans */ |
OPT_fltrans_output_list_, /* -fltrans-output-list= */ |
OPT_fmath_errno, /* -fmath-errno */ |
OPT_fmax_array_constructor_, /* -fmax-array-constructor= */ |
OPT_fmax_errors_, /* -fmax-errors= */ |
OPT_fmax_identifier_length_, /* -fmax-identifier-length= */ |
OPT_fmax_stack_var_size_, /* -fmax-stack-var-size= */ |
OPT_fmax_subrecord_length_, /* -fmax-subrecord-length= */ |
OPT_fmem_report, /* -fmem-report */ |
OPT_fmerge_all_constants, /* -fmerge-all-constants */ |
OPT_fmerge_constants, /* -fmerge-constants */ |
OPT_fmerge_debug_strings, /* -fmerge-debug-strings */ |
OPT_fmessage_length_, /* -fmessage-length= */ |
OPT_fmodule_private, /* -fmodule-private */ |
OPT_fmodulo_sched, /* -fmodulo-sched */ |
OPT_fmodulo_sched_allow_regmoves, /* -fmodulo-sched-allow-regmoves */ |
OPT_fmove_loop_invariants, /* -fmove-loop-invariants */ |
OPT_fms_extensions, /* -fms-extensions */ |
OPT_fmudflap, /* -fmudflap */ |
OPT_fmudflapir, /* -fmudflapir */ |
OPT_fmudflapth, /* -fmudflapth */ |
OPT_fname_mangling_version_, /* -fname-mangling-version- */ |
OPT_fnew_abi, /* -fnew-abi */ |
OPT_fnext_runtime, /* -fnext-runtime */ |
OPT_fnil_receivers, /* -fnil-receivers */ |
OPT_fnon_call_exceptions, /* -fnon-call-exceptions */ |
OPT_fnonansi_builtins, /* -fnonansi-builtins */ |
OPT_fnonnull_objects, /* -fnonnull-objects */ |
OPT_fobjc_call_cxx_cdtors, /* -fobjc-call-cxx-cdtors */ |
OPT_fobjc_direct_dispatch, /* -fobjc-direct-dispatch */ |
OPT_fobjc_exceptions, /* -fobjc-exceptions */ |
OPT_fobjc_gc, /* -fobjc-gc */ |
OPT_fobjc_sjlj_exceptions, /* -fobjc-sjlj-exceptions */ |
OPT_fomit_frame_pointer, /* -fomit-frame-pointer */ |
OPT_fopenmp, /* -fopenmp */ |
OPT_foperator_names, /* -foperator-names */ |
OPT_foptimize_register_move, /* -foptimize-register-move */ |
OPT_foptimize_sibling_calls, /* -foptimize-sibling-calls */ |
OPT_foptimize_static_class_initialization, /* -foptimize-static-class-initialization */ |
OPT_foptional_diags, /* -foptional-diags */ |
OPT_foutput_class_dir_, /* -foutput-class-dir= */ |
OPT_fpack_derived, /* -fpack-derived */ |
OPT_fpack_struct, /* -fpack-struct */ |
OPT_fpack_struct_, /* -fpack-struct= */ |
OPT_fpcc_struct_return, /* -fpcc-struct-return */ |
OPT_fpch_deps, /* -fpch-deps */ |
OPT_fpch_preprocess, /* -fpch-preprocess */ |
OPT_fpeel_loops, /* -fpeel-loops */ |
OPT_fpeephole, /* -fpeephole */ |
OPT_fpeephole2, /* -fpeephole2 */ |
OPT_fpermissive, /* -fpermissive */ |
OPT_fpic, /* -fpic */ |
OPT_fpie, /* -fpie */ |
OPT_fplugin_arg_, /* -fplugin-arg- */ |
OPT_fplugin_, /* -fplugin= */ |
OPT_fpost_ipa_mem_report, /* -fpost-ipa-mem-report */ |
OPT_fpre_ipa_mem_report, /* -fpre-ipa-mem-report */ |
OPT_fpredictive_commoning, /* -fpredictive-commoning */ |
OPT_fprefetch_loop_arrays, /* -fprefetch-loop-arrays */ |
OPT_fpreprocessed, /* -fpreprocessed */ |
OPT_fpretty_templates, /* -fpretty-templates */ |
OPT_fprofile, /* -fprofile */ |
OPT_fprofile_arcs, /* -fprofile-arcs */ |
OPT_fprofile_correction, /* -fprofile-correction */ |
OPT_fprofile_dir_, /* -fprofile-dir= */ |
OPT_fprofile_generate, /* -fprofile-generate */ |
OPT_fprofile_generate_, /* -fprofile-generate= */ |
OPT_fprofile_use, /* -fprofile-use */ |
OPT_fprofile_use_, /* -fprofile-use= */ |
OPT_fprofile_values, /* -fprofile-values */ |
OPT_fprotect_parens, /* -fprotect-parens */ |
OPT_frandom_seed, /* -frandom-seed */ |
OPT_frandom_seed_, /* -frandom-seed= */ |
OPT_frange_check, /* -frange-check */ |
OPT_freciprocal_math, /* -freciprocal-math */ |
OPT_frecord_gcc_switches, /* -frecord-gcc-switches */ |
OPT_frecord_marker_4, /* -frecord-marker=4 */ |
OPT_frecord_marker_8, /* -frecord-marker=8 */ |
OPT_frecursive, /* -frecursive */ |
OPT_freduced_reflection, /* -freduced-reflection */ |
OPT_freg_struct_return, /* -freg-struct-return */ |
OPT_fregmove, /* -fregmove */ |
OPT_frename_registers, /* -frename-registers */ |
OPT_freorder_blocks, /* -freorder-blocks */ |
OPT_freorder_blocks_and_partition, /* -freorder-blocks-and-partition */ |
OPT_freorder_functions, /* -freorder-functions */ |
OPT_frepack_arrays, /* -frepack-arrays */ |
OPT_freplace_objc_classes, /* -freplace-objc-classes */ |
OPT_frepo, /* -frepo */ |
OPT_frerun_cse_after_loop, /* -frerun-cse-after-loop */ |
OPT_frerun_loop_opt, /* -frerun-loop-opt */ |
OPT_freschedule_modulo_scheduled_loops, /* -freschedule-modulo-scheduled-loops */ |
OPT_fresolution, /* -fresolution */ |
OPT_frounding_math, /* -frounding-math */ |
OPT_frtti, /* -frtti */ |
OPT_fsaw_java_file, /* -fsaw-java-file */ |
OPT_fsched_critical_path_heuristic, /* -fsched-critical-path-heuristic */ |
OPT_fsched_dep_count_heuristic, /* -fsched-dep-count-heuristic */ |
OPT_fsched_group_heuristic, /* -fsched-group-heuristic */ |
OPT_fsched_interblock, /* -fsched-interblock */ |
OPT_fsched_last_insn_heuristic, /* -fsched-last-insn-heuristic */ |
OPT_fsched_pressure, /* -fsched-pressure */ |
OPT_fsched_rank_heuristic, /* -fsched-rank-heuristic */ |
OPT_fsched_spec, /* -fsched-spec */ |
OPT_fsched_spec_insn_heuristic, /* -fsched-spec-insn-heuristic */ |
OPT_fsched_spec_load, /* -fsched-spec-load */ |
OPT_fsched_spec_load_dangerous, /* -fsched-spec-load-dangerous */ |
OPT_fsched_stalled_insns, /* -fsched-stalled-insns */ |
OPT_fsched_stalled_insns_dep, /* -fsched-stalled-insns-dep */ |
OPT_fsched_stalled_insns_dep_, /* -fsched-stalled-insns-dep= */ |
OPT_fsched_stalled_insns_, /* -fsched-stalled-insns= */ |
OPT_fsched_verbose_, /* -fsched-verbose= */ |
OPT_fsched2_use_superblocks, /* -fsched2-use-superblocks */ |
OPT_fsched2_use_traces, /* -fsched2-use-traces */ |
OPT_fschedule_insns, /* -fschedule-insns */ |
OPT_fschedule_insns2, /* -fschedule-insns2 */ |
OPT_fsecond_underscore, /* -fsecond-underscore */ |
OPT_fsection_anchors, /* -fsection-anchors */ |
OPT_fsee, /* -fsee */ |
OPT_fsel_sched_pipelining, /* -fsel-sched-pipelining */ |
OPT_fsel_sched_pipelining_outer_loops, /* -fsel-sched-pipelining-outer-loops */ |
OPT_fsel_sched_reschedule_pipelined, /* -fsel-sched-reschedule-pipelined */ |
OPT_fselective_scheduling, /* -fselective-scheduling */ |
OPT_fselective_scheduling2, /* -fselective-scheduling2 */ |
OPT_fset_stack_executable, /* -fset-stack-executable */ |
OPT_fshort_double, /* -fshort-double */ |
OPT_fshort_enums, /* -fshort-enums */ |
OPT_fshort_wchar, /* -fshort-wchar */ |
OPT_fshow_column, /* -fshow-column */ |
OPT_fsign_zero, /* -fsign-zero */ |
OPT_fsignaling_nans, /* -fsignaling-nans */ |
OPT_fsigned_bitfields, /* -fsigned-bitfields */ |
OPT_fsigned_char, /* -fsigned-char */ |
OPT_fsigned_zeros, /* -fsigned-zeros */ |
OPT_fsingle_precision_constant, /* -fsingle-precision-constant */ |
OPT_fsource_filename_, /* -fsource-filename= */ |
OPT_fsource_, /* -fsource= */ |
OPT_fsplit_ivs_in_unroller, /* -fsplit-ivs-in-unroller */ |
OPT_fsplit_wide_types, /* -fsplit-wide-types */ |
OPT_fsquangle, /* -fsquangle */ |
OPT_fstack_check, /* -fstack-check */ |
OPT_fstack_check_, /* -fstack-check= */ |
OPT_fstack_limit, /* -fstack-limit */ |
OPT_fstack_limit_register_, /* -fstack-limit-register= */ |
OPT_fstack_limit_symbol_, /* -fstack-limit-symbol= */ |
OPT_fstack_protector, /* -fstack-protector */ |
OPT_fstack_protector_all, /* -fstack-protector-all */ |
OPT_fstats, /* -fstats */ |
OPT_fstore_check, /* -fstore-check */ |
OPT_fstrength_reduce, /* -fstrength-reduce */ |
OPT_fstrict_aliasing, /* -fstrict-aliasing */ |
OPT_fstrict_overflow, /* -fstrict-overflow */ |
OPT_fstrict_prototype, /* -fstrict-prototype */ |
OPT_fsyntax_only, /* -fsyntax-only */ |
OPT_ftabstop_, /* -ftabstop= */ |
OPT_ftarget_help, /* -ftarget-help */ |
OPT_ftarget_, /* -ftarget= */ |
OPT_ftemplate_depth_, /* -ftemplate-depth- */ |
OPT_ftemplate_depth_eq, /* -ftemplate-depth= */ |
OPT_ftest_coverage, /* -ftest-coverage */ |
OPT_fthis_is_variable, /* -fthis-is-variable */ |
OPT_fthread_jumps, /* -fthread-jumps */ |
OPT_fthreadsafe_statics, /* -fthreadsafe-statics */ |
OPT_ftime_report, /* -ftime-report */ |
OPT_ftls_model_, /* -ftls-model= */ |
OPT_ftoplevel_reorder, /* -ftoplevel-reorder */ |
OPT_ftracer, /* -ftracer */ |
OPT_ftrapping_math, /* -ftrapping-math */ |
OPT_ftrapv, /* -ftrapv */ |
OPT_ftree_builtin_call_dce, /* -ftree-builtin-call-dce */ |
OPT_ftree_ccp, /* -ftree-ccp */ |
OPT_ftree_ch, /* -ftree-ch */ |
OPT_ftree_copy_prop, /* -ftree-copy-prop */ |
OPT_ftree_copyrename, /* -ftree-copyrename */ |
OPT_ftree_cselim, /* -ftree-cselim */ |
OPT_ftree_dce, /* -ftree-dce */ |
OPT_ftree_dominator_opts, /* -ftree-dominator-opts */ |
OPT_ftree_dse, /* -ftree-dse */ |
OPT_ftree_forwprop, /* -ftree-forwprop */ |
OPT_ftree_fre, /* -ftree-fre */ |
OPT_ftree_loop_distribution, /* -ftree-loop-distribution */ |
OPT_ftree_loop_im, /* -ftree-loop-im */ |
OPT_ftree_loop_ivcanon, /* -ftree-loop-ivcanon */ |
OPT_ftree_loop_linear, /* -ftree-loop-linear */ |
OPT_ftree_loop_optimize, /* -ftree-loop-optimize */ |
OPT_ftree_lrs, /* -ftree-lrs */ |
OPT_ftree_parallelize_loops_, /* -ftree-parallelize-loops= */ |
OPT_ftree_phiprop, /* -ftree-phiprop */ |
OPT_ftree_pre, /* -ftree-pre */ |
OPT_ftree_pta, /* -ftree-pta */ |
OPT_ftree_reassoc, /* -ftree-reassoc */ |
OPT_ftree_salias, /* -ftree-salias */ |
OPT_ftree_scev_cprop, /* -ftree-scev-cprop */ |
OPT_ftree_sink, /* -ftree-sink */ |
OPT_ftree_slp_vectorize, /* -ftree-slp-vectorize */ |
OPT_ftree_sra, /* -ftree-sra */ |
OPT_ftree_store_ccp, /* -ftree-store-ccp */ |
OPT_ftree_store_copy_prop, /* -ftree-store-copy-prop */ |
OPT_ftree_switch_conversion, /* -ftree-switch-conversion */ |
OPT_ftree_ter, /* -ftree-ter */ |
OPT_ftree_vect_loop_version, /* -ftree-vect-loop-version */ |
OPT_ftree_vectorize, /* -ftree-vectorize */ |
OPT_ftree_vectorizer_verbose_, /* -ftree-vectorizer-verbose= */ |
OPT_ftree_vrp, /* -ftree-vrp */ |
OPT_funderscoring, /* -funderscoring */ |
OPT_funit_at_a_time, /* -funit-at-a-time */ |
OPT_funroll_all_loops, /* -funroll-all-loops */ |
OPT_funroll_loops, /* -funroll-loops */ |
OPT_funsafe_loop_optimizations, /* -funsafe-loop-optimizations */ |
OPT_funsafe_math_optimizations, /* -funsafe-math-optimizations */ |
OPT_funsigned_bitfields, /* -funsigned-bitfields */ |
OPT_funsigned_char, /* -funsigned-char */ |
OPT_funswitch_loops, /* -funswitch-loops */ |
OPT_funwind_tables, /* -funwind-tables */ |
OPT_fuse_atomic_builtins, /* -fuse-atomic-builtins */ |
OPT_fuse_boehm_gc, /* -fuse-boehm-gc */ |
OPT_fuse_cxa_atexit, /* -fuse-cxa-atexit */ |
OPT_fuse_cxa_get_exception_ptr, /* -fuse-cxa-get-exception-ptr */ |
OPT_fuse_divide_subroutine, /* -fuse-divide-subroutine */ |
OPT_fuse_linker_plugin, /* -fuse-linker-plugin */ |
OPT_fvar_tracking, /* -fvar-tracking */ |
OPT_fvar_tracking_assignments, /* -fvar-tracking-assignments */ |
OPT_fvar_tracking_assignments_toggle, /* -fvar-tracking-assignments-toggle */ |
OPT_fvar_tracking_uninit, /* -fvar-tracking-uninit */ |
OPT_fvariable_expansion_in_unroller, /* -fvariable-expansion-in-unroller */ |
OPT_fvect_cost_model, /* -fvect-cost-model */ |
OPT_fverbose_asm, /* -fverbose-asm */ |
OPT_fversion, /* -fversion */ |
OPT_fvisibility_inlines_hidden, /* -fvisibility-inlines-hidden */ |
OPT_fvisibility_ms_compat, /* -fvisibility-ms-compat */ |
OPT_fvisibility_, /* -fvisibility= */ |
OPT_fvpt, /* -fvpt */ |
OPT_fvtable_gc, /* -fvtable-gc */ |
OPT_fvtable_thunks, /* -fvtable-thunks */ |
OPT_fweak, /* -fweak */ |
OPT_fweb, /* -fweb */ |
OPT_fwhole_file, /* -fwhole-file */ |
OPT_fwhole_program, /* -fwhole-program */ |
OPT_fwhopr, /* -fwhopr */ |
OPT_fwide_exec_charset_, /* -fwide-exec-charset= */ |
OPT_fworking_directory, /* -fworking-directory */ |
OPT_fwpa, /* -fwpa */ |
OPT_fwrapv, /* -fwrapv */ |
OPT_fxref, /* -fxref */ |
OPT_fzero_initialized_in_bss, /* -fzero-initialized-in-bss */ |
OPT_fzero_link, /* -fzero-link */ |
OPT_g, /* -g */ |
OPT_gant, /* -gant */ |
OPT_gcoff, /* -gcoff */ |
OPT_gdwarfplus, /* -gdwarf+ */ |
OPT_gdwarf_, /* -gdwarf- */ |
OPT_gen_decls, /* -gen-decls */ |
OPT_ggdb, /* -ggdb */ |
OPT_gnat, /* -gnat */ |
OPT_gnatO, /* -gnatO */ |
OPT_gno_strict_dwarf, /* -gno-strict-dwarf */ |
OPT_gstabs, /* -gstabs */ |
OPT_gstabs_, /* -gstabs+ */ |
OPT_gstrict_dwarf, /* -gstrict-dwarf */ |
OPT_gtoggle, /* -gtoggle */ |
OPT_gvms, /* -gvms */ |
OPT_gxcoff, /* -gxcoff */ |
OPT_gxcoff_, /* -gxcoff+ */ |
OPT_idirafter, /* -idirafter */ |
OPT_imacros, /* -imacros */ |
OPT_imultilib, /* -imultilib */ |
OPT_include, /* -include */ |
OPT_iprefix, /* -iprefix */ |
OPT_iquote, /* -iquote */ |
OPT_isysroot, /* -isysroot */ |
OPT_isystem, /* -isystem */ |
OPT_iwithprefix, /* -iwithprefix */ |
OPT_iwithprefixbefore, /* -iwithprefixbefore */ |
OPT_lang_asm, /* -lang-asm */ |
OPT_lang_objc, /* -lang-objc */ |
OPT_m128bit_long_double, /* -m128bit-long-double */ |
OPT_m32, /* -m32 */ |
OPT_m3dnow, /* -m3dnow */ |
OPT_m3dnowa, /* -m3dnowa */ |
OPT_m64, /* -m64 */ |
OPT_m80387, /* -m80387 */ |
OPT_m96bit_long_double, /* -m96bit-long-double */ |
OPT_mabi_, /* -mabi= */ |
OPT_mabm, /* -mabm */ |
OPT_maccumulate_outgoing_args, /* -maccumulate-outgoing-args */ |
OPT_maes, /* -maes */ |
OPT_malign_double, /* -malign-double */ |
OPT_malign_functions_, /* -malign-functions= */ |
OPT_malign_jumps_, /* -malign-jumps= */ |
OPT_malign_loops_, /* -malign-loops= */ |
OPT_malign_stringops, /* -malign-stringops */ |
OPT_march_, /* -march= */ |
OPT_masm_, /* -masm= */ |
OPT_mavx, /* -mavx */ |
OPT_mbranch_cost_, /* -mbranch-cost= */ |
OPT_mcld, /* -mcld */ |
OPT_mcmodel_, /* -mcmodel= */ |
OPT_mconsole, /* -mconsole */ |
OPT_mcrc32, /* -mcrc32 */ |
OPT_mcx16, /* -mcx16 */ |
OPT_mcygwin, /* -mcygwin */ |
OPT_mdll, /* -mdll */ |
OPT_mfancy_math_387, /* -mfancy-math-387 */ |
OPT_mfma, /* -mfma */ |
OPT_mfma4, /* -mfma4 */ |
OPT_mforce_drap, /* -mforce-drap */ |
OPT_mfp_ret_in_387, /* -mfp-ret-in-387 */ |
OPT_mfpmath_, /* -mfpmath= */ |
OPT_mfused_madd, /* -mfused-madd */ |
OPT_mhard_float, /* -mhard-float */ |
OPT_mieee_fp, /* -mieee-fp */ |
OPT_mincoming_stack_boundary_, /* -mincoming-stack-boundary= */ |
OPT_minline_all_stringops, /* -minline-all-stringops */ |
OPT_minline_stringops_dynamically, /* -minline-stringops-dynamically */ |
OPT_mintel_syntax, /* -mintel-syntax */ |
OPT_mlarge_data_threshold_, /* -mlarge-data-threshold= */ |
OPT_mlwp, /* -mlwp */ |
OPT_mmmx, /* -mmmx */ |
OPT_mmovbe, /* -mmovbe */ |
OPT_mms_bitfields, /* -mms-bitfields */ |
OPT_mno_align_stringops, /* -mno-align-stringops */ |
OPT_mno_fancy_math_387, /* -mno-fancy-math-387 */ |
OPT_mno_push_args, /* -mno-push-args */ |
OPT_mno_red_zone, /* -mno-red-zone */ |
OPT_mno_sse4, /* -mno-sse4 */ |
OPT_mnop_fun_dllimport, /* -mnop-fun-dllimport */ |
OPT_momit_leaf_frame_pointer, /* -momit-leaf-frame-pointer */ |
OPT_mpc, /* -mpc */ |
OPT_mpclmul, /* -mpclmul */ |
OPT_mpe_aligned_commons, /* -mpe-aligned-commons */ |
OPT_mpopcnt, /* -mpopcnt */ |
OPT_mpreferred_stack_boundary_, /* -mpreferred-stack-boundary= */ |
OPT_mpush_args, /* -mpush-args */ |
OPT_mrecip, /* -mrecip */ |
OPT_mred_zone, /* -mred-zone */ |
OPT_mregparm_, /* -mregparm= */ |
OPT_mrtd, /* -mrtd */ |
OPT_msahf, /* -msahf */ |
OPT_msoft_float, /* -msoft-float */ |
OPT_msse, /* -msse */ |
OPT_msse2, /* -msse2 */ |
OPT_msse2avx, /* -msse2avx */ |
OPT_msse3, /* -msse3 */ |
OPT_msse4, /* -msse4 */ |
OPT_msse4_1, /* -msse4.1 */ |
OPT_msse4_2, /* -msse4.2 */ |
OPT_msse4a, /* -msse4a */ |
OPT_msseregparm, /* -msseregparm */ |
OPT_mssse3, /* -mssse3 */ |
OPT_mstack_arg_probe, /* -mstack-arg-probe */ |
OPT_mstackrealign, /* -mstackrealign */ |
OPT_mstringop_strategy_, /* -mstringop-strategy= */ |
OPT_mthreads, /* -mthreads */ |
OPT_mtls_dialect_, /* -mtls-dialect= */ |
OPT_mtls_direct_seg_refs, /* -mtls-direct-seg-refs */ |
OPT_mtune_, /* -mtune= */ |
OPT_muse_libstdc_wrappers, /* -muse-libstdc-wrappers */ |
OPT_mveclibabi_, /* -mveclibabi= */ |
OPT_mwin32, /* -mwin32 */ |
OPT_mwindows, /* -mwindows */ |
OPT_mxop, /* -mxop */ |
OPT_nocpp, /* -nocpp */ |
OPT_nostdinc, /* -nostdinc */ |
OPT_nostdinc__, /* -nostdinc++ */ |
OPT_nostdlib, /* -nostdlib */ |
OPT_o, /* -o */ |
OPT_p, /* -p */ |
OPT_pedantic, /* -pedantic */ |
OPT_pedantic_errors, /* -pedantic-errors */ |
OPT_pie, /* -pie */ |
OPT_print_objc_runtime_info, /* -print-objc-runtime-info */ |
OPT_print_pch_checksum, /* -print-pch-checksum */ |
OPT_quiet, /* -quiet */ |
OPT_remap, /* -remap */ |
OPT_shared, /* -shared */ |
OPT_static_libgfortran, /* -static-libgfortran */ |
OPT_std_c__0x, /* -std=c++0x */ |
OPT_std_c__98, /* -std=c++98 */ |
OPT_std_c89, /* -std=c89 */ |
OPT_std_c90, /* -std=c90 */ |
OPT_std_c99, /* -std=c99 */ |
OPT_std_c9x, /* -std=c9x */ |
OPT_std_f2003, /* -std=f2003 */ |
OPT_std_f2008, /* -std=f2008 */ |
OPT_std_f95, /* -std=f95 */ |
OPT_std_gnu, /* -std=gnu */ |
OPT_std_gnu__0x, /* -std=gnu++0x */ |
OPT_std_gnu__98, /* -std=gnu++98 */ |
OPT_std_gnu89, /* -std=gnu89 */ |
OPT_std_gnu90, /* -std=gnu90 */ |
OPT_std_gnu99, /* -std=gnu99 */ |
OPT_std_gnu9x, /* -std=gnu9x */ |
OPT_std_iso9899_1990, /* -std=iso9899:1990 */ |
OPT_std_iso9899_199409, /* -std=iso9899:199409 */ |
OPT_std_iso9899_1999, /* -std=iso9899:1999 */ |
OPT_std_iso9899_199x, /* -std=iso9899:199x */ |
OPT_std_legacy, /* -std=legacy */ |
OPT_traditional_cpp, /* -traditional-cpp */ |
OPT_trigraphs, /* -trigraphs */ |
OPT_undef, /* -undef */ |
OPT_v, /* -v */ |
OPT_version, /* -version */ |
OPT_w, /* -w */ |
N_OPTS |
}; |
#endif /* OPTIONS_H */ |
/contrib/sdk/sources/gcc_eh/tconfig.h |
---|
0,0 → 1,11 |
#ifndef GCC_TCONFIG_H |
#define GCC_TCONFIG_H |
#ifndef USED_FOR_TARGET |
# define USED_FOR_TARGET |
#endif |
#include "auto-host.h" |
#ifdef IN_GCC |
# include "ansidecl.h" |
# include "xm-mingw32.h" |
#endif |
#endif /* GCC_TCONFIG_H */ |
/contrib/sdk/sources/gcc_eh/tm.h |
---|
0,0 → 1,21 |
#ifndef GCC_TM_H |
#define GCC_TM_H |
#ifdef IN_GCC |
# include "options.h" |
# include "config/vxworks-dummy.h" |
# include "config/i386/i386.h" |
# include "config/i386/unix.h" |
# include "config/i386/bsd.h" |
# include "config/i386/gas.h" |
# include "config/dbxcoff.h" |
# include "config/i386/cygming.h" |
# include "config/i386/mingw32.h" |
# include "config/i386/mingw-stdint.h" |
# include "config/tm-dwarf2.h" |
# include "defaults.h" |
#endif |
#if defined IN_GCC && !defined GENERATOR_FILE && !defined USED_FOR_TARGET |
# include "insn-constants.h" |
# include "insn-flags.h" |
#endif |
#endif /* GCC_TM_H */ |
/contrib/sdk/sources/gcc_eh/tsystem.h |
---|
0,0 → 1,134 |
/* Get common system includes and various definitions and declarations |
based on target macros. |
Copyright (C) 2000, 2001, 2004, 2005, 2009 Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
#ifndef GCC_TSYSTEM_H |
#define GCC_TSYSTEM_H |
/* System headers (e.g. stdio.h, stdlib.h, unistd.h) sometimes |
indirectly include getopt.h. Our -I flags will cause gcc's gnu |
getopt.h to be included, not the platform's copy. In the default |
case, gnu getopt.h will provide us with a no-argument prototype |
which will generate -Wstrict-prototypes warnings. None of the |
target files actually use getopt, so it is safe to tell gnu |
getopt.h we never need this prototype. */ |
#ifndef HAVE_DECL_GETOPT |
#define HAVE_DECL_GETOPT 1 |
#endif |
/* We want everything from the glibc headers. */ |
#define _GNU_SOURCE 1 |
/* GCC supplies these headers. */ |
#include <stddef.h> |
#include <float.h> |
#ifdef inhibit_libc |
#ifndef malloc |
extern void *malloc (size_t); |
#endif |
#ifndef free |
extern void free (void *); |
#endif |
#ifndef atexit |
extern int atexit (void (*)(void)); |
#endif |
#ifndef abort |
extern void abort (void) __attribute__ ((__noreturn__)); |
#endif |
#ifndef strlen |
extern size_t strlen (const char *); |
#endif |
#ifndef memcpy |
extern void *memcpy (void *, const void *, size_t); |
#endif |
#ifndef memset |
extern void *memset (void *, int, size_t); |
#endif |
#else /* ! inhibit_libc */ |
/* We disable this when inhibit_libc, so that gcc can still be built without |
needing header files first. */ |
/* ??? This is not a good solution, since prototypes may be required in |
some cases for correct code. */ |
/* GCC supplies this header. */ |
#include <stdarg.h> |
/* All systems have this header. */ |
#include <stdio.h> |
/* All systems have this header. */ |
#include <sys/types.h> |
/* All systems have this header. */ |
#include <errno.h> |
#ifndef errno |
extern int errno; |
#endif |
/* If these system headers do not exist, fixincludes must create them. */ |
#include <string.h> |
#include <stdlib.h> |
#include <unistd.h> |
/* GCC supplies this header. */ |
#include <limits.h> |
/* If these system headers do not exist, fixincludes must create them. */ |
#include <time.h> |
#endif /* inhibit_libc */ |
/* Define a generic NULL if one hasn't already been defined. */ |
#ifndef NULL |
#define NULL 0 |
#endif |
/* GCC always provides __builtin_alloca(x). */ |
#undef alloca |
#define alloca(x) __builtin_alloca(x) |
#ifdef ENABLE_RUNTIME_CHECKING |
#define gcc_assert(EXPR) ((void)(!(EXPR) ? abort (), 0 : 0)) |
#else |
/* Include EXPR, so that unused variable warnings do not occur. */ |
#define gcc_assert(EXPR) ((void)(0 && (EXPR))) |
#endif |
/* Use gcc_unreachable() to mark unreachable locations (like an |
unreachable default case of a switch. Do not use gcc_assert(0). */ |
#define gcc_unreachable() (abort ()) |
/* Filename handling macros. */ |
#include "filenames.h" |
#endif /* ! GCC_TSYSTEM_H */ |
/contrib/sdk/sources/gcc_eh/unwind-c.c |
---|
0,0 → 1,229 |
/* Supporting functions for C exception handling. |
Copyright (C) 2002, 2003, 2009 Free Software Foundation, Inc. |
Contributed by Aldy Hernandez <aldy@quesejoda.com>. |
Shamelessly stolen from the Java front end. |
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 |
<http://www.gnu.org/licenses/>. */ |
#include "tconfig.h" |
#include "tsystem.h" |
#include "unwind.h" |
#define NO_SIZE_OF_ENCODED_VALUE |
#include "unwind-pe.h" |
typedef struct |
{ |
_Unwind_Ptr Start; |
_Unwind_Ptr LPStart; |
_Unwind_Ptr ttype_base; |
const unsigned char *TType; |
const unsigned char *action_table; |
unsigned char ttype_encoding; |
unsigned char call_site_encoding; |
} lsda_header_info; |
static const unsigned char * |
parse_lsda_header (struct _Unwind_Context *context, const unsigned char *p, |
lsda_header_info *info) |
{ |
_uleb128_t tmp; |
unsigned char lpstart_encoding; |
info->Start = (context ? _Unwind_GetRegionStart (context) : 0); |
/* Find @LPStart, the base to which landing pad offsets are relative. */ |
lpstart_encoding = *p++; |
if (lpstart_encoding != DW_EH_PE_omit) |
p = read_encoded_value (context, lpstart_encoding, p, &info->LPStart); |
else |
info->LPStart = info->Start; |
/* Find @TType, the base of the handler and exception spec type data. */ |
info->ttype_encoding = *p++; |
if (info->ttype_encoding != DW_EH_PE_omit) |
{ |
p = read_uleb128 (p, &tmp); |
info->TType = p + tmp; |
} |
else |
info->TType = 0; |
/* The encoding and length of the call-site table; the action table |
immediately follows. */ |
info->call_site_encoding = *p++; |
p = read_uleb128 (p, &tmp); |
info->action_table = p + tmp; |
return p; |
} |
#ifdef __ARM_EABI_UNWINDER__ |
/* ARM EABI personality routines must also unwind the stack. */ |
#define CONTINUE_UNWINDING \ |
do \ |
{ \ |
if (__gnu_unwind_frame (ue_header, context) != _URC_OK) \ |
return _URC_FAILURE; \ |
return _URC_CONTINUE_UNWIND; \ |
} \ |
while (0) |
#else |
#define CONTINUE_UNWINDING return _URC_CONTINUE_UNWIND |
#endif |
#ifdef __USING_SJLJ_EXCEPTIONS__ |
#define PERSONALITY_FUNCTION __gcc_personality_sj0 |
#define __builtin_eh_return_data_regno(x) x |
#else |
#define PERSONALITY_FUNCTION __gcc_personality_v0 |
#endif |
#ifdef __ARM_EABI_UNWINDER__ |
_Unwind_Reason_Code |
PERSONALITY_FUNCTION (_Unwind_State, struct _Unwind_Exception *, |
struct _Unwind_Context *); |
_Unwind_Reason_Code |
PERSONALITY_FUNCTION (_Unwind_State state, |
struct _Unwind_Exception * ue_header, |
struct _Unwind_Context * context) |
#else |
_Unwind_Reason_Code |
PERSONALITY_FUNCTION (int, _Unwind_Action, _Unwind_Exception_Class, |
struct _Unwind_Exception *, struct _Unwind_Context *); |
_Unwind_Reason_Code |
PERSONALITY_FUNCTION (int version, |
_Unwind_Action actions, |
_Unwind_Exception_Class exception_class ATTRIBUTE_UNUSED, |
struct _Unwind_Exception *ue_header, |
struct _Unwind_Context *context) |
#endif |
{ |
lsda_header_info info; |
const unsigned char *language_specific_data, *p; |
_Unwind_Ptr landing_pad, ip; |
int ip_before_insn = 0; |
#ifdef __ARM_EABI_UNWINDER__ |
if ((state & _US_ACTION_MASK) != _US_UNWIND_FRAME_STARTING) |
CONTINUE_UNWINDING; |
/* The dwarf unwinder assumes the context structure holds things like the |
function and LSDA pointers. The ARM implementation caches these in |
the exception header (UCB). To avoid rewriting everything we make the |
virtual IP register point at the UCB. */ |
ip = (_Unwind_Ptr) ue_header; |
_Unwind_SetGR (context, 12, ip); |
#else |
if (version != 1) |
return _URC_FATAL_PHASE1_ERROR; |
/* Currently we only support cleanups for C. */ |
if ((actions & _UA_CLEANUP_PHASE) == 0) |
CONTINUE_UNWINDING; |
#endif |
language_specific_data = (const unsigned char *) |
_Unwind_GetLanguageSpecificData (context); |
/* If no LSDA, then there are no handlers or cleanups. */ |
if (! language_specific_data) |
CONTINUE_UNWINDING; |
/* Parse the LSDA header. */ |
p = parse_lsda_header (context, language_specific_data, &info); |
#ifdef HAVE_GETIPINFO |
ip = _Unwind_GetIPInfo (context, &ip_before_insn); |
#else |
ip = _Unwind_GetIP (context); |
#endif |
if (! ip_before_insn) |
--ip; |
landing_pad = 0; |
#ifdef __USING_SJLJ_EXCEPTIONS__ |
/* The given "IP" is an index into the call-site table, with two |
exceptions -- -1 means no-action, and 0 means terminate. But |
since we're using uleb128 values, we've not got random access |
to the array. */ |
if ((int) ip <= 0) |
return _URC_CONTINUE_UNWIND; |
else |
{ |
_uleb128_t cs_lp, cs_action; |
do |
{ |
p = read_uleb128 (p, &cs_lp); |
p = read_uleb128 (p, &cs_action); |
} |
while (--ip); |
/* Can never have null landing pad for sjlj -- that would have |
been indicated by a -1 call site index. */ |
landing_pad = (_Unwind_Ptr)cs_lp + 1; |
goto found_something; |
} |
#else |
/* Search the call-site table for the action associated with this IP. */ |
while (p < info.action_table) |
{ |
_Unwind_Ptr cs_start, cs_len, cs_lp; |
_uleb128_t cs_action; |
/* Note that all call-site encodings are "absolute" displacements. */ |
p = read_encoded_value (0, info.call_site_encoding, p, &cs_start); |
p = read_encoded_value (0, info.call_site_encoding, p, &cs_len); |
p = read_encoded_value (0, info.call_site_encoding, p, &cs_lp); |
p = read_uleb128 (p, &cs_action); |
/* The table is sorted, so if we've passed the ip, stop. */ |
if (ip < info.Start + cs_start) |
p = info.action_table; |
else if (ip < info.Start + cs_start + cs_len) |
{ |
if (cs_lp) |
landing_pad = info.LPStart + cs_lp; |
goto found_something; |
} |
} |
#endif |
/* IP is not in table. No associated cleanups. */ |
/* ??? This is where C++ calls std::terminate to catch throw |
from a destructor. */ |
CONTINUE_UNWINDING; |
found_something: |
if (landing_pad == 0) |
{ |
/* IP is present, but has a null landing pad. |
No handler to be run. */ |
CONTINUE_UNWINDING; |
} |
_Unwind_SetGR (context, __builtin_eh_return_data_regno (0), |
(_Unwind_Ptr) ue_header); |
_Unwind_SetGR (context, __builtin_eh_return_data_regno (1), 0); |
_Unwind_SetIP (context, landing_pad); |
return _URC_INSTALL_CONTEXT; |
} |
/contrib/sdk/sources/gcc_eh/unwind-dw2-fde.c |
---|
0,0 → 1,1028 |
/* Subroutines needed for unwinding stack frames for exception handling. */ |
/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, |
2009 Free Software Foundation, Inc. |
Contributed by Jason Merrill <jason@cygnus.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 |
<http://www.gnu.org/licenses/>. */ |
#ifndef _Unwind_Find_FDE |
#include "tconfig.h" |
#include "tsystem.h" |
#include "coretypes.h" |
#include "tm.h" |
#include "dwarf2.h" |
#include "unwind.h" |
#define NO_BASE_OF_ENCODED_VALUE |
#include "unwind-pe.h" |
#include "unwind-dw2-fde.h" |
#include "gthr.h" |
#endif |
/* The unseen_objects list contains objects that have been registered |
but not yet categorized in any way. The seen_objects list has had |
its pc_begin and count fields initialized at minimum, and is sorted |
by decreasing value of pc_begin. */ |
static struct object *unseen_objects; |
static struct object *seen_objects; |
#ifdef __GTHREAD_MUTEX_INIT |
static __gthread_mutex_t object_mutex = __GTHREAD_MUTEX_INIT; |
#else |
static __gthread_mutex_t object_mutex; |
#endif |
#ifdef __GTHREAD_MUTEX_INIT_FUNCTION |
static void |
init_object_mutex (void) |
{ |
__GTHREAD_MUTEX_INIT_FUNCTION (&object_mutex); |
} |
static void |
init_object_mutex_once (void) |
{ |
static __gthread_once_t once = __GTHREAD_ONCE_INIT; |
__gthread_once (&once, init_object_mutex); |
} |
#else |
#define init_object_mutex_once() |
#endif |
/* Called from crtbegin.o to register the unwind info for an object. */ |
void |
__register_frame_info_bases (const void *begin, struct object *ob, |
void *tbase, void *dbase) |
{ |
/* If .eh_frame is empty, don't register at all. */ |
if ((const uword *) begin == 0 || *(const uword *) begin == 0) |
return; |
ob->pc_begin = (void *)-1; |
ob->tbase = tbase; |
ob->dbase = dbase; |
ob->u.single = begin; |
ob->s.i = 0; |
ob->s.b.encoding = DW_EH_PE_omit; |
#ifdef DWARF2_OBJECT_END_PTR_EXTENSION |
ob->fde_end = NULL; |
#endif |
init_object_mutex_once (); |
__gthread_mutex_lock (&object_mutex); |
ob->next = unseen_objects; |
unseen_objects = ob; |
__gthread_mutex_unlock (&object_mutex); |
} |
void |
__register_frame_info (const void *begin, struct object *ob) |
{ |
__register_frame_info_bases (begin, ob, 0, 0); |
} |
void |
__register_frame (void *begin) |
{ |
struct object *ob; |
/* If .eh_frame is empty, don't register at all. */ |
if (*(uword *) begin == 0) |
return; |
ob = malloc (sizeof (struct object)); |
__register_frame_info (begin, ob); |
} |
/* Similar, but BEGIN is actually a pointer to a table of unwind entries |
for different translation units. Called from the file generated by |
collect2. */ |
void |
__register_frame_info_table_bases (void *begin, struct object *ob, |
void *tbase, void *dbase) |
{ |
ob->pc_begin = (void *)-1; |
ob->tbase = tbase; |
ob->dbase = dbase; |
ob->u.array = begin; |
ob->s.i = 0; |
ob->s.b.from_array = 1; |
ob->s.b.encoding = DW_EH_PE_omit; |
init_object_mutex_once (); |
__gthread_mutex_lock (&object_mutex); |
ob->next = unseen_objects; |
unseen_objects = ob; |
__gthread_mutex_unlock (&object_mutex); |
} |
void |
__register_frame_info_table (void *begin, struct object *ob) |
{ |
__register_frame_info_table_bases (begin, ob, 0, 0); |
} |
void |
__register_frame_table (void *begin) |
{ |
struct object *ob = malloc (sizeof (struct object)); |
__register_frame_info_table (begin, ob); |
} |
/* Called from crtbegin.o to deregister the unwind info for an object. */ |
/* ??? Glibc has for a while now exported __register_frame_info and |
__deregister_frame_info. If we call __register_frame_info_bases |
from crtbegin (wherein it is declared weak), and this object does |
not get pulled from libgcc.a for other reasons, then the |
invocation of __deregister_frame_info will be resolved from glibc. |
Since the registration did not happen there, we'll die. |
Therefore, declare a new deregistration entry point that does the |
exact same thing, but will resolve to the same library as |
implements __register_frame_info_bases. */ |
void * |
__deregister_frame_info_bases (const void *begin) |
{ |
struct object **p; |
struct object *ob = 0; |
/* If .eh_frame is empty, we haven't registered. */ |
if ((const uword *) begin == 0 || *(const uword *) begin == 0) |
return ob; |
init_object_mutex_once (); |
__gthread_mutex_lock (&object_mutex); |
for (p = &unseen_objects; *p ; p = &(*p)->next) |
if ((*p)->u.single == begin) |
{ |
ob = *p; |
*p = ob->next; |
goto out; |
} |
for (p = &seen_objects; *p ; p = &(*p)->next) |
if ((*p)->s.b.sorted) |
{ |
if ((*p)->u.sort->orig_data == begin) |
{ |
ob = *p; |
*p = ob->next; |
free (ob->u.sort); |
goto out; |
} |
} |
else |
{ |
if ((*p)->u.single == begin) |
{ |
ob = *p; |
*p = ob->next; |
goto out; |
} |
} |
out: |
__gthread_mutex_unlock (&object_mutex); |
gcc_assert (ob); |
return (void *) ob; |
} |
void * |
__deregister_frame_info (const void *begin) |
{ |
return __deregister_frame_info_bases (begin); |
} |
void |
__deregister_frame (void *begin) |
{ |
/* If .eh_frame is empty, we haven't registered. */ |
if (*(uword *) begin != 0) |
free (__deregister_frame_info (begin)); |
} |
/* Like base_of_encoded_value, but take the base from a struct object |
instead of an _Unwind_Context. */ |
static _Unwind_Ptr |
base_from_object (unsigned char encoding, struct object *ob) |
{ |
if (encoding == DW_EH_PE_omit) |
return 0; |
switch (encoding & 0x70) |
{ |
case DW_EH_PE_absptr: |
case DW_EH_PE_pcrel: |
case DW_EH_PE_aligned: |
return 0; |
case DW_EH_PE_textrel: |
return (_Unwind_Ptr) ob->tbase; |
case DW_EH_PE_datarel: |
return (_Unwind_Ptr) ob->dbase; |
default: |
gcc_unreachable (); |
} |
} |
/* Return the FDE pointer encoding from the CIE. */ |
/* ??? This is a subset of extract_cie_info from unwind-dw2.c. */ |
static int |
get_cie_encoding (const struct dwarf_cie *cie) |
{ |
const unsigned char *aug, *p; |
_Unwind_Ptr dummy; |
_uleb128_t utmp; |
_sleb128_t stmp; |
aug = cie->augmentation; |
if (aug[0] != 'z') |
return DW_EH_PE_absptr; |
p = aug + strlen ((const char *)aug) + 1; /* Skip the augmentation string. */ |
p = read_uleb128 (p, &utmp); /* Skip code alignment. */ |
p = read_sleb128 (p, &stmp); /* Skip data alignment. */ |
if (cie->version == 1) /* Skip return address column. */ |
p++; |
else |
p = read_uleb128 (p, &utmp); |
aug++; /* Skip 'z' */ |
p = read_uleb128 (p, &utmp); /* Skip augmentation length. */ |
while (1) |
{ |
/* This is what we're looking for. */ |
if (*aug == 'R') |
return *p; |
/* Personality encoding and pointer. */ |
else if (*aug == 'P') |
{ |
/* ??? Avoid dereferencing indirect pointers, since we're |
faking the base address. Gotta keep DW_EH_PE_aligned |
intact, however. */ |
p = read_encoded_value_with_base (*p & 0x7F, 0, p + 1, &dummy); |
} |
/* LSDA encoding. */ |
else if (*aug == 'L') |
p++; |
/* Otherwise end of string, or unknown augmentation. */ |
else |
return DW_EH_PE_absptr; |
aug++; |
} |
} |
static inline int |
get_fde_encoding (const struct dwarf_fde *f) |
{ |
return get_cie_encoding (get_cie (f)); |
} |
/* Sorting an array of FDEs by address. |
(Ideally we would have the linker sort the FDEs so we don't have to do |
it at run time. But the linkers are not yet prepared for this.) */ |
/* Comparison routines. Three variants of increasing complexity. */ |
static int |
fde_unencoded_compare (struct object *ob __attribute__((unused)), |
const fde *x, const fde *y) |
{ |
_Unwind_Ptr x_ptr, y_ptr; |
memcpy (&x_ptr, x->pc_begin, sizeof (_Unwind_Ptr)); |
memcpy (&y_ptr, y->pc_begin, sizeof (_Unwind_Ptr)); |
if (x_ptr > y_ptr) |
return 1; |
if (x_ptr < y_ptr) |
return -1; |
return 0; |
} |
static int |
fde_single_encoding_compare (struct object *ob, const fde *x, const fde *y) |
{ |
_Unwind_Ptr base, x_ptr, y_ptr; |
base = base_from_object (ob->s.b.encoding, ob); |
read_encoded_value_with_base (ob->s.b.encoding, base, x->pc_begin, &x_ptr); |
read_encoded_value_with_base (ob->s.b.encoding, base, y->pc_begin, &y_ptr); |
if (x_ptr > y_ptr) |
return 1; |
if (x_ptr < y_ptr) |
return -1; |
return 0; |
} |
static int |
fde_mixed_encoding_compare (struct object *ob, const fde *x, const fde *y) |
{ |
int x_encoding, y_encoding; |
_Unwind_Ptr x_ptr, y_ptr; |
x_encoding = get_fde_encoding (x); |
read_encoded_value_with_base (x_encoding, base_from_object (x_encoding, ob), |
x->pc_begin, &x_ptr); |
y_encoding = get_fde_encoding (y); |
read_encoded_value_with_base (y_encoding, base_from_object (y_encoding, ob), |
y->pc_begin, &y_ptr); |
if (x_ptr > y_ptr) |
return 1; |
if (x_ptr < y_ptr) |
return -1; |
return 0; |
} |
typedef int (*fde_compare_t) (struct object *, const fde *, const fde *); |
/* This is a special mix of insertion sort and heap sort, optimized for |
the data sets that actually occur. They look like |
101 102 103 127 128 105 108 110 190 111 115 119 125 160 126 129 130. |
I.e. a linearly increasing sequence (coming from functions in the text |
section), with additionally a few unordered elements (coming from functions |
in gnu_linkonce sections) whose values are higher than the values in the |
surrounding linear sequence (but not necessarily higher than the values |
at the end of the linear sequence!). |
The worst-case total run time is O(N) + O(n log (n)), where N is the |
total number of FDEs and n is the number of erratic ones. */ |
struct fde_accumulator |
{ |
struct fde_vector *linear; |
struct fde_vector *erratic; |
}; |
static inline int |
start_fde_sort (struct fde_accumulator *accu, size_t count) |
{ |
size_t size; |
if (! count) |
return 0; |
size = sizeof (struct fde_vector) + sizeof (const fde *) * count; |
if ((accu->linear = malloc (size))) |
{ |
accu->linear->count = 0; |
if ((accu->erratic = malloc (size))) |
accu->erratic->count = 0; |
return 1; |
} |
else |
return 0; |
} |
static inline void |
fde_insert (struct fde_accumulator *accu, const fde *this_fde) |
{ |
if (accu->linear) |
accu->linear->array[accu->linear->count++] = this_fde; |
} |
/* Split LINEAR into a linear sequence with low values and an erratic |
sequence with high values, put the linear one (of longest possible |
length) into LINEAR and the erratic one into ERRATIC. This is O(N). |
Because the longest linear sequence we are trying to locate within the |
incoming LINEAR array can be interspersed with (high valued) erratic |
entries. We construct a chain indicating the sequenced entries. |
To avoid having to allocate this chain, we overlay it onto the space of |
the ERRATIC array during construction. A final pass iterates over the |
chain to determine what should be placed in the ERRATIC array, and |
what is the linear sequence. This overlay is safe from aliasing. */ |
static inline void |
fde_split (struct object *ob, fde_compare_t fde_compare, |
struct fde_vector *linear, struct fde_vector *erratic) |
{ |
static const fde *marker; |
size_t count = linear->count; |
const fde *const *chain_end = ▮ |
size_t i, j, k; |
/* This should optimize out, but it is wise to make sure this assumption |
is correct. Should these have different sizes, we cannot cast between |
them and the overlaying onto ERRATIC will not work. */ |
gcc_assert (sizeof (const fde *) == sizeof (const fde **)); |
for (i = 0; i < count; i++) |
{ |
const fde *const *probe; |
for (probe = chain_end; |
probe != &marker && fde_compare (ob, linear->array[i], *probe) < 0; |
probe = chain_end) |
{ |
chain_end = (const fde *const*) erratic->array[probe - linear->array]; |
erratic->array[probe - linear->array] = NULL; |
} |
erratic->array[i] = (const fde *) chain_end; |
chain_end = &linear->array[i]; |
} |
/* Each entry in LINEAR which is part of the linear sequence we have |
discovered will correspond to a non-NULL entry in the chain we built in |
the ERRATIC array. */ |
for (i = j = k = 0; i < count; i++) |
if (erratic->array[i]) |
linear->array[j++] = linear->array[i]; |
else |
erratic->array[k++] = linear->array[i]; |
linear->count = j; |
erratic->count = k; |
} |
#define SWAP(x,y) do { const fde * tmp = x; x = y; y = tmp; } while (0) |
/* Convert a semi-heap to a heap. A semi-heap is a heap except possibly |
for the first (root) node; push it down to its rightful place. */ |
static void |
frame_downheap (struct object *ob, fde_compare_t fde_compare, const fde **a, |
int lo, int hi) |
{ |
int i, j; |
for (i = lo, j = 2*i+1; |
j < hi; |
j = 2*i+1) |
{ |
if (j+1 < hi && fde_compare (ob, a[j], a[j+1]) < 0) |
++j; |
if (fde_compare (ob, a[i], a[j]) < 0) |
{ |
SWAP (a[i], a[j]); |
i = j; |
} |
else |
break; |
} |
} |
/* This is O(n log(n)). BSD/OS defines heapsort in stdlib.h, so we must |
use a name that does not conflict. */ |
static void |
frame_heapsort (struct object *ob, fde_compare_t fde_compare, |
struct fde_vector *erratic) |
{ |
/* For a description of this algorithm, see: |
Samuel P. Harbison, Guy L. Steele Jr.: C, a reference manual, 2nd ed., |
p. 60-61. */ |
const fde ** a = erratic->array; |
/* A portion of the array is called a "heap" if for all i>=0: |
If i and 2i+1 are valid indices, then a[i] >= a[2i+1]. |
If i and 2i+2 are valid indices, then a[i] >= a[2i+2]. */ |
size_t n = erratic->count; |
int m; |
/* Expand our heap incrementally from the end of the array, heapifying |
each resulting semi-heap as we go. After each step, a[m] is the top |
of a heap. */ |
for (m = n/2-1; m >= 0; --m) |
frame_downheap (ob, fde_compare, a, m, n); |
/* Shrink our heap incrementally from the end of the array, first |
swapping out the largest element a[0] and then re-heapifying the |
resulting semi-heap. After each step, a[0..m) is a heap. */ |
for (m = n-1; m >= 1; --m) |
{ |
SWAP (a[0], a[m]); |
frame_downheap (ob, fde_compare, a, 0, m); |
} |
#undef SWAP |
} |
/* Merge V1 and V2, both sorted, and put the result into V1. */ |
static inline void |
fde_merge (struct object *ob, fde_compare_t fde_compare, |
struct fde_vector *v1, struct fde_vector *v2) |
{ |
size_t i1, i2; |
const fde * fde2; |
i2 = v2->count; |
if (i2 > 0) |
{ |
i1 = v1->count; |
do |
{ |
i2--; |
fde2 = v2->array[i2]; |
while (i1 > 0 && fde_compare (ob, v1->array[i1-1], fde2) > 0) |
{ |
v1->array[i1+i2] = v1->array[i1-1]; |
i1--; |
} |
v1->array[i1+i2] = fde2; |
} |
while (i2 > 0); |
v1->count += v2->count; |
} |
} |
static inline void |
end_fde_sort (struct object *ob, struct fde_accumulator *accu, size_t count) |
{ |
fde_compare_t fde_compare; |
gcc_assert (!accu->linear || accu->linear->count == count); |
if (ob->s.b.mixed_encoding) |
fde_compare = fde_mixed_encoding_compare; |
else if (ob->s.b.encoding == DW_EH_PE_absptr) |
fde_compare = fde_unencoded_compare; |
else |
fde_compare = fde_single_encoding_compare; |
if (accu->erratic) |
{ |
fde_split (ob, fde_compare, accu->linear, accu->erratic); |
gcc_assert (accu->linear->count + accu->erratic->count == count); |
frame_heapsort (ob, fde_compare, accu->erratic); |
fde_merge (ob, fde_compare, accu->linear, accu->erratic); |
free (accu->erratic); |
} |
else |
{ |
/* We've not managed to malloc an erratic array, |
so heap sort in the linear one. */ |
frame_heapsort (ob, fde_compare, accu->linear); |
} |
} |
/* Update encoding, mixed_encoding, and pc_begin for OB for the |
fde array beginning at THIS_FDE. Return the number of fdes |
encountered along the way. */ |
static size_t |
classify_object_over_fdes (struct object *ob, const fde *this_fde) |
{ |
const struct dwarf_cie *last_cie = 0; |
size_t count = 0; |
int encoding = DW_EH_PE_absptr; |
_Unwind_Ptr base = 0; |
for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde)) |
{ |
const struct dwarf_cie *this_cie; |
_Unwind_Ptr mask, pc_begin; |
/* Skip CIEs. */ |
if (this_fde->CIE_delta == 0) |
continue; |
/* Determine the encoding for this FDE. Note mixed encoded |
objects for later. */ |
this_cie = get_cie (this_fde); |
if (this_cie != last_cie) |
{ |
last_cie = this_cie; |
encoding = get_cie_encoding (this_cie); |
base = base_from_object (encoding, ob); |
if (ob->s.b.encoding == DW_EH_PE_omit) |
ob->s.b.encoding = encoding; |
else if (ob->s.b.encoding != encoding) |
ob->s.b.mixed_encoding = 1; |
} |
read_encoded_value_with_base (encoding, base, this_fde->pc_begin, |
&pc_begin); |
/* Take care to ignore link-once functions that were removed. |
In these cases, the function address will be NULL, but if |
the encoding is smaller than a pointer a true NULL may not |
be representable. Assume 0 in the representable bits is NULL. */ |
mask = size_of_encoded_value (encoding); |
if (mask < sizeof (void *)) |
mask = (((_Unwind_Ptr) 1) << (mask << 3)) - 1; |
else |
mask = -1; |
if ((pc_begin & mask) == 0) |
continue; |
count += 1; |
if ((void *) pc_begin < ob->pc_begin) |
ob->pc_begin = (void *) pc_begin; |
} |
return count; |
} |
static void |
add_fdes (struct object *ob, struct fde_accumulator *accu, const fde *this_fde) |
{ |
const struct dwarf_cie *last_cie = 0; |
int encoding = ob->s.b.encoding; |
_Unwind_Ptr base = base_from_object (ob->s.b.encoding, ob); |
for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde)) |
{ |
const struct dwarf_cie *this_cie; |
/* Skip CIEs. */ |
if (this_fde->CIE_delta == 0) |
continue; |
if (ob->s.b.mixed_encoding) |
{ |
/* Determine the encoding for this FDE. Note mixed encoded |
objects for later. */ |
this_cie = get_cie (this_fde); |
if (this_cie != last_cie) |
{ |
last_cie = this_cie; |
encoding = get_cie_encoding (this_cie); |
base = base_from_object (encoding, ob); |
} |
} |
if (encoding == DW_EH_PE_absptr) |
{ |
_Unwind_Ptr ptr; |
memcpy (&ptr, this_fde->pc_begin, sizeof (_Unwind_Ptr)); |
if (ptr == 0) |
continue; |
} |
else |
{ |
_Unwind_Ptr pc_begin, mask; |
read_encoded_value_with_base (encoding, base, this_fde->pc_begin, |
&pc_begin); |
/* Take care to ignore link-once functions that were removed. |
In these cases, the function address will be NULL, but if |
the encoding is smaller than a pointer a true NULL may not |
be representable. Assume 0 in the representable bits is NULL. */ |
mask = size_of_encoded_value (encoding); |
if (mask < sizeof (void *)) |
mask = (((_Unwind_Ptr) 1) << (mask << 3)) - 1; |
else |
mask = -1; |
if ((pc_begin & mask) == 0) |
continue; |
} |
fde_insert (accu, this_fde); |
} |
} |
/* Set up a sorted array of pointers to FDEs for a loaded object. We |
count up the entries before allocating the array because it's likely to |
be faster. We can be called multiple times, should we have failed to |
allocate a sorted fde array on a previous occasion. */ |
static inline void |
init_object (struct object* ob) |
{ |
struct fde_accumulator accu; |
size_t count; |
count = ob->s.b.count; |
if (count == 0) |
{ |
if (ob->s.b.from_array) |
{ |
fde **p = ob->u.array; |
for (count = 0; *p; ++p) |
count += classify_object_over_fdes (ob, *p); |
} |
else |
count = classify_object_over_fdes (ob, ob->u.single); |
/* The count field we have in the main struct object is somewhat |
limited, but should suffice for virtually all cases. If the |
counted value doesn't fit, re-write a zero. The worst that |
happens is that we re-count next time -- admittedly non-trivial |
in that this implies some 2M fdes, but at least we function. */ |
ob->s.b.count = count; |
if (ob->s.b.count != count) |
ob->s.b.count = 0; |
} |
if (!start_fde_sort (&accu, count)) |
return; |
if (ob->s.b.from_array) |
{ |
fde **p; |
for (p = ob->u.array; *p; ++p) |
add_fdes (ob, &accu, *p); |
} |
else |
add_fdes (ob, &accu, ob->u.single); |
end_fde_sort (ob, &accu, count); |
/* Save the original fde pointer, since this is the key by which the |
DSO will deregister the object. */ |
accu.linear->orig_data = ob->u.single; |
ob->u.sort = accu.linear; |
ob->s.b.sorted = 1; |
} |
/* A linear search through a set of FDEs for the given PC. This is |
used when there was insufficient memory to allocate and sort an |
array. */ |
static const fde * |
linear_search_fdes (struct object *ob, const fde *this_fde, void *pc) |
{ |
const struct dwarf_cie *last_cie = 0; |
int encoding = ob->s.b.encoding; |
_Unwind_Ptr base = base_from_object (ob->s.b.encoding, ob); |
for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde)) |
{ |
const struct dwarf_cie *this_cie; |
_Unwind_Ptr pc_begin, pc_range; |
/* Skip CIEs. */ |
if (this_fde->CIE_delta == 0) |
continue; |
if (ob->s.b.mixed_encoding) |
{ |
/* Determine the encoding for this FDE. Note mixed encoded |
objects for later. */ |
this_cie = get_cie (this_fde); |
if (this_cie != last_cie) |
{ |
last_cie = this_cie; |
encoding = get_cie_encoding (this_cie); |
base = base_from_object (encoding, ob); |
} |
} |
if (encoding == DW_EH_PE_absptr) |
{ |
const _Unwind_Ptr *pc_array = (const _Unwind_Ptr *) this_fde->pc_begin; |
pc_begin = pc_array[0]; |
pc_range = pc_array[1]; |
if (pc_begin == 0) |
continue; |
} |
else |
{ |
_Unwind_Ptr mask; |
const unsigned char *p; |
p = read_encoded_value_with_base (encoding, base, |
this_fde->pc_begin, &pc_begin); |
read_encoded_value_with_base (encoding & 0x0F, 0, p, &pc_range); |
/* Take care to ignore link-once functions that were removed. |
In these cases, the function address will be NULL, but if |
the encoding is smaller than a pointer a true NULL may not |
be representable. Assume 0 in the representable bits is NULL. */ |
mask = size_of_encoded_value (encoding); |
if (mask < sizeof (void *)) |
mask = (((_Unwind_Ptr) 1) << (mask << 3)) - 1; |
else |
mask = -1; |
if ((pc_begin & mask) == 0) |
continue; |
} |
if ((_Unwind_Ptr) pc - pc_begin < pc_range) |
return this_fde; |
} |
return NULL; |
} |
/* Binary search for an FDE containing the given PC. Here are three |
implementations of increasing complexity. */ |
static inline const fde * |
binary_search_unencoded_fdes (struct object *ob, void *pc) |
{ |
struct fde_vector *vec = ob->u.sort; |
size_t lo, hi; |
for (lo = 0, hi = vec->count; lo < hi; ) |
{ |
size_t i = (lo + hi) / 2; |
const fde *const f = vec->array[i]; |
void *pc_begin; |
uaddr pc_range; |
memcpy (&pc_begin, (const void * const *) f->pc_begin, sizeof (void *)); |
memcpy (&pc_range, (const uaddr *) f->pc_begin + 1, sizeof (uaddr)); |
if (pc < pc_begin) |
hi = i; |
else if (pc >= pc_begin + pc_range) |
lo = i + 1; |
else |
return f; |
} |
return NULL; |
} |
static inline const fde * |
binary_search_single_encoding_fdes (struct object *ob, void *pc) |
{ |
struct fde_vector *vec = ob->u.sort; |
int encoding = ob->s.b.encoding; |
_Unwind_Ptr base = base_from_object (encoding, ob); |
size_t lo, hi; |
for (lo = 0, hi = vec->count; lo < hi; ) |
{ |
size_t i = (lo + hi) / 2; |
const fde *f = vec->array[i]; |
_Unwind_Ptr pc_begin, pc_range; |
const unsigned char *p; |
p = read_encoded_value_with_base (encoding, base, f->pc_begin, |
&pc_begin); |
read_encoded_value_with_base (encoding & 0x0F, 0, p, &pc_range); |
if ((_Unwind_Ptr) pc < pc_begin) |
hi = i; |
else if ((_Unwind_Ptr) pc >= pc_begin + pc_range) |
lo = i + 1; |
else |
return f; |
} |
return NULL; |
} |
static inline const fde * |
binary_search_mixed_encoding_fdes (struct object *ob, void *pc) |
{ |
struct fde_vector *vec = ob->u.sort; |
size_t lo, hi; |
for (lo = 0, hi = vec->count; lo < hi; ) |
{ |
size_t i = (lo + hi) / 2; |
const fde *f = vec->array[i]; |
_Unwind_Ptr pc_begin, pc_range; |
const unsigned char *p; |
int encoding; |
encoding = get_fde_encoding (f); |
p = read_encoded_value_with_base (encoding, |
base_from_object (encoding, ob), |
f->pc_begin, &pc_begin); |
read_encoded_value_with_base (encoding & 0x0F, 0, p, &pc_range); |
if ((_Unwind_Ptr) pc < pc_begin) |
hi = i; |
else if ((_Unwind_Ptr) pc >= pc_begin + pc_range) |
lo = i + 1; |
else |
return f; |
} |
return NULL; |
} |
static const fde * |
search_object (struct object* ob, void *pc) |
{ |
/* If the data hasn't been sorted, try to do this now. We may have |
more memory available than last time we tried. */ |
if (! ob->s.b.sorted) |
{ |
init_object (ob); |
/* Despite the above comment, the normal reason to get here is |
that we've not processed this object before. A quick range |
check is in order. */ |
if (pc < ob->pc_begin) |
return NULL; |
} |
if (ob->s.b.sorted) |
{ |
if (ob->s.b.mixed_encoding) |
return binary_search_mixed_encoding_fdes (ob, pc); |
else if (ob->s.b.encoding == DW_EH_PE_absptr) |
return binary_search_unencoded_fdes (ob, pc); |
else |
return binary_search_single_encoding_fdes (ob, pc); |
} |
else |
{ |
/* Long slow laborious linear search, cos we've no memory. */ |
if (ob->s.b.from_array) |
{ |
fde **p; |
for (p = ob->u.array; *p ; p++) |
{ |
const fde *f = linear_search_fdes (ob, *p, pc); |
if (f) |
return f; |
} |
return NULL; |
} |
else |
return linear_search_fdes (ob, ob->u.single, pc); |
} |
} |
const fde * |
_Unwind_Find_FDE (void *pc, struct dwarf_eh_bases *bases) |
{ |
struct object *ob; |
const fde *f = NULL; |
init_object_mutex_once (); |
__gthread_mutex_lock (&object_mutex); |
/* Linear search through the classified objects, to find the one |
containing the pc. Note that pc_begin is sorted descending, and |
we expect objects to be non-overlapping. */ |
for (ob = seen_objects; ob; ob = ob->next) |
if (pc >= ob->pc_begin) |
{ |
f = search_object (ob, pc); |
if (f) |
goto fini; |
break; |
} |
/* Classify and search the objects we've not yet processed. */ |
while ((ob = unseen_objects)) |
{ |
struct object **p; |
unseen_objects = ob->next; |
f = search_object (ob, pc); |
/* Insert the object into the classified list. */ |
for (p = &seen_objects; *p ; p = &(*p)->next) |
if ((*p)->pc_begin < ob->pc_begin) |
break; |
ob->next = *p; |
*p = ob; |
if (f) |
goto fini; |
} |
fini: |
__gthread_mutex_unlock (&object_mutex); |
if (f) |
{ |
int encoding; |
_Unwind_Ptr func; |
bases->tbase = ob->tbase; |
bases->dbase = ob->dbase; |
encoding = ob->s.b.encoding; |
if (ob->s.b.mixed_encoding) |
encoding = get_fde_encoding (f); |
read_encoded_value_with_base (encoding, base_from_object (encoding, ob), |
f->pc_begin, &func); |
bases->func = (void *) func; |
} |
return f; |
} |
/contrib/sdk/sources/gcc_eh/unwind-dw2-fde.h |
---|
0,0 → 1,183 |
/* Subroutines needed for unwinding stack frames for exception handling. */ |
/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2009 |
Free Software Foundation, Inc. |
Contributed by Jason Merrill <jason@cygnus.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 |
<http://www.gnu.org/licenses/>. */ |
#ifndef GCC_UNWIND_DW2_FDE_H |
#define GCC_UNWIND_DW2_FDE_H |
#ifndef HIDE_EXPORTS |
#pragma GCC visibility push(default) |
#endif |
struct fde_vector |
{ |
const void *orig_data; |
size_t count; |
const struct dwarf_fde *array[]; |
}; |
struct object |
{ |
void *pc_begin; |
void *tbase; |
void *dbase; |
union { |
const struct dwarf_fde *single; |
struct dwarf_fde **array; |
struct fde_vector *sort; |
} u; |
union { |
struct { |
unsigned long sorted : 1; |
unsigned long from_array : 1; |
unsigned long mixed_encoding : 1; |
unsigned long encoding : 8; |
/* ??? Wish there was an easy way to detect a 64-bit host here; |
we've got 32 bits left to play with... */ |
unsigned long count : 21; |
} b; |
size_t i; |
} s; |
#ifdef DWARF2_OBJECT_END_PTR_EXTENSION |
char *fde_end; |
#endif |
struct object *next; |
}; |
/* This is the original definition of struct object. While the struct |
itself was opaque to users, they did know how large it was, and |
allocate one statically in crtbegin for each DSO. Keep this around |
so that we're aware of the static size limitations for the new struct. */ |
struct old_object |
{ |
void *pc_begin; |
void *pc_end; |
struct dwarf_fde *fde_begin; |
struct dwarf_fde **fde_array; |
size_t count; |
struct old_object *next; |
}; |
struct dwarf_eh_bases |
{ |
void *tbase; |
void *dbase; |
void *func; |
}; |
extern void __register_frame_info_bases (const void *, struct object *, |
void *, void *); |
extern void __register_frame_info (const void *, struct object *); |
extern void __register_frame (void *); |
extern void __register_frame_info_table_bases (void *, struct object *, |
void *, void *); |
extern void __register_frame_info_table (void *, struct object *); |
extern void __register_frame_table (void *); |
extern void *__deregister_frame_info (const void *); |
extern void *__deregister_frame_info_bases (const void *); |
extern void __deregister_frame (void *); |
typedef int sword __attribute__ ((mode (SI))); |
typedef unsigned int uword __attribute__ ((mode (SI))); |
typedef unsigned int uaddr __attribute__ ((mode (pointer))); |
typedef int saddr __attribute__ ((mode (pointer))); |
typedef unsigned char ubyte; |
/* Terminology: |
CIE - Common Information Element |
FDE - Frame Descriptor Element |
There is one per function, and it describes where the function code |
is located, and what the register lifetimes and stack layout are |
within the function. |
The data structures are defined in the DWARF specification, although |
not in a very readable way (see LITERATURE). |
Every time an exception is thrown, the code needs to locate the FDE |
for the current function, and starts to look for exception regions |
from that FDE. This works in a two-level search: |
a) in a linear search, find the shared image (i.e. DLL) containing |
the PC |
b) using the FDE table for that shared object, locate the FDE using |
binary search (which requires the sorting). */ |
/* The first few fields of a CIE. The CIE_id field is 0 for a CIE, |
to distinguish it from a valid FDE. FDEs are aligned to an addressing |
unit boundary, but the fields within are unaligned. */ |
struct dwarf_cie |
{ |
uword length; |
sword CIE_id; |
ubyte version; |
unsigned char augmentation[]; |
} __attribute__ ((packed, aligned (__alignof__ (void *)))); |
/* The first few fields of an FDE. */ |
struct dwarf_fde |
{ |
uword length; |
sword CIE_delta; |
unsigned char pc_begin[]; |
} __attribute__ ((packed, aligned (__alignof__ (void *)))); |
typedef struct dwarf_fde fde; |
/* Locate the CIE for a given FDE. */ |
static inline const struct dwarf_cie * |
get_cie (const struct dwarf_fde *f) |
{ |
return (const void *)&f->CIE_delta - f->CIE_delta; |
} |
static inline const fde * |
next_fde (const fde *f) |
{ |
return (const fde *) ((const char *) f + f->length + sizeof (f->length)); |
} |
extern const fde * _Unwind_Find_FDE (void *, struct dwarf_eh_bases *); |
static inline int |
last_fde (struct object *obj __attribute__ ((__unused__)), const fde *f) |
{ |
#ifdef DWARF2_OBJECT_END_PTR_EXTENSION |
return (char *)f == obj->fde_end || f->length == 0; |
#else |
return f->length == 0; |
#endif |
} |
#ifndef HIDE_EXPORTS |
#pragma GCC visibility pop |
#endif |
#endif /* unwind-dw2-fde.h */ |
/contrib/sdk/sources/gcc_eh/unwind-dw2.c |
---|
0,0 → 1,1594 |
/* DWARF2 exception handling and frame unwind runtime interface routines. |
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, |
2008, 2009, 2010 Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
#include "tconfig.h" |
#include "tsystem.h" |
#include "coretypes.h" |
#include "tm.h" |
#include "dwarf2.h" |
#include "unwind.h" |
#ifdef __USING_SJLJ_EXCEPTIONS__ |
# define NO_SIZE_OF_ENCODED_VALUE |
#endif |
#include "unwind-pe.h" |
#include "unwind-dw2-fde.h" |
#include "gthr.h" |
#include "unwind-dw2.h" |
#ifndef __USING_SJLJ_EXCEPTIONS__ |
#ifndef STACK_GROWS_DOWNWARD |
#define STACK_GROWS_DOWNWARD 0 |
#else |
#undef STACK_GROWS_DOWNWARD |
#define STACK_GROWS_DOWNWARD 1 |
#endif |
/* Dwarf frame registers used for pre gcc 3.0 compiled glibc. */ |
#ifndef PRE_GCC3_DWARF_FRAME_REGISTERS |
#define PRE_GCC3_DWARF_FRAME_REGISTERS DWARF_FRAME_REGISTERS |
#endif |
#ifndef DWARF_REG_TO_UNWIND_COLUMN |
#define DWARF_REG_TO_UNWIND_COLUMN(REGNO) (REGNO) |
#endif |
/* This is the register and unwind state for a particular frame. This |
provides the information necessary to unwind up past a frame and return |
to its caller. */ |
struct _Unwind_Context |
{ |
void *reg[DWARF_FRAME_REGISTERS+1]; |
void *cfa; |
void *ra; |
void *lsda; |
struct dwarf_eh_bases bases; |
/* Signal frame context. */ |
#define SIGNAL_FRAME_BIT ((~(_Unwind_Word) 0 >> 1) + 1) |
/* Context which has version/args_size/by_value fields. */ |
#define EXTENDED_CONTEXT_BIT ((~(_Unwind_Word) 0 >> 2) + 1) |
_Unwind_Word flags; |
/* 0 for now, can be increased when further fields are added to |
struct _Unwind_Context. */ |
_Unwind_Word version; |
_Unwind_Word args_size; |
char by_value[DWARF_FRAME_REGISTERS+1]; |
}; |
/* Byte size of every register managed by these routines. */ |
static unsigned char dwarf_reg_size_table[DWARF_FRAME_REGISTERS+1]; |
/* Read unaligned data from the instruction buffer. */ |
union unaligned |
{ |
void *p; |
unsigned u2 __attribute__ ((mode (HI))); |
unsigned u4 __attribute__ ((mode (SI))); |
unsigned u8 __attribute__ ((mode (DI))); |
signed s2 __attribute__ ((mode (HI))); |
signed s4 __attribute__ ((mode (SI))); |
signed s8 __attribute__ ((mode (DI))); |
} __attribute__ ((packed)); |
static void uw_update_context (struct _Unwind_Context *, _Unwind_FrameState *); |
static _Unwind_Reason_Code uw_frame_state_for (struct _Unwind_Context *, |
_Unwind_FrameState *); |
static inline void * |
read_pointer (const void *p) { const union unaligned *up = p; return up->p; } |
static inline int |
read_1u (const void *p) { return *(const unsigned char *) p; } |
static inline int |
read_1s (const void *p) { return *(const signed char *) p; } |
static inline int |
read_2u (const void *p) { const union unaligned *up = p; return up->u2; } |
static inline int |
read_2s (const void *p) { const union unaligned *up = p; return up->s2; } |
static inline unsigned int |
read_4u (const void *p) { const union unaligned *up = p; return up->u4; } |
static inline int |
read_4s (const void *p) { const union unaligned *up = p; return up->s4; } |
static inline unsigned long |
read_8u (const void *p) { const union unaligned *up = p; return up->u8; } |
static inline unsigned long |
read_8s (const void *p) { const union unaligned *up = p; return up->s8; } |
static inline _Unwind_Word |
_Unwind_IsSignalFrame (struct _Unwind_Context *context) |
{ |
return (context->flags & SIGNAL_FRAME_BIT) ? 1 : 0; |
} |
static inline void |
_Unwind_SetSignalFrame (struct _Unwind_Context *context, int val) |
{ |
if (val) |
context->flags |= SIGNAL_FRAME_BIT; |
else |
context->flags &= ~SIGNAL_FRAME_BIT; |
} |
static inline _Unwind_Word |
_Unwind_IsExtendedContext (struct _Unwind_Context *context) |
{ |
return context->flags & EXTENDED_CONTEXT_BIT; |
} |
/* Get the value of register INDEX as saved in CONTEXT. */ |
inline _Unwind_Word |
_Unwind_GetGR (struct _Unwind_Context *context, int index) |
{ |
int size; |
void *ptr; |
#ifdef DWARF_ZERO_REG |
if (index == DWARF_ZERO_REG) |
return 0; |
#endif |
index = DWARF_REG_TO_UNWIND_COLUMN (index); |
gcc_assert (index < (int) sizeof(dwarf_reg_size_table)); |
size = dwarf_reg_size_table[index]; |
ptr = context->reg[index]; |
if (_Unwind_IsExtendedContext (context) && context->by_value[index]) |
return (_Unwind_Word) (_Unwind_Internal_Ptr) ptr; |
/* This will segfault if the register hasn't been saved. */ |
if (size == sizeof(_Unwind_Ptr)) |
return * (_Unwind_Ptr *) ptr; |
else |
{ |
gcc_assert (size == sizeof(_Unwind_Word)); |
return * (_Unwind_Word *) ptr; |
} |
} |
static inline void * |
_Unwind_GetPtr (struct _Unwind_Context *context, int index) |
{ |
return (void *)(_Unwind_Ptr) _Unwind_GetGR (context, index); |
} |
/* Get the value of the CFA as saved in CONTEXT. */ |
_Unwind_Word |
_Unwind_GetCFA (struct _Unwind_Context *context) |
{ |
return (_Unwind_Ptr) context->cfa; |
} |
/* Overwrite the saved value for register INDEX in CONTEXT with VAL. */ |
inline void |
_Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word val) |
{ |
int size; |
void *ptr; |
index = DWARF_REG_TO_UNWIND_COLUMN (index); |
gcc_assert (index < (int) sizeof(dwarf_reg_size_table)); |
size = dwarf_reg_size_table[index]; |
if (_Unwind_IsExtendedContext (context) && context->by_value[index]) |
{ |
context->reg[index] = (void *) (_Unwind_Internal_Ptr) val; |
return; |
} |
ptr = context->reg[index]; |
if (size == sizeof(_Unwind_Ptr)) |
* (_Unwind_Ptr *) ptr = val; |
else |
{ |
gcc_assert (size == sizeof(_Unwind_Word)); |
* (_Unwind_Word *) ptr = val; |
} |
} |
/* Get the pointer to a register INDEX as saved in CONTEXT. */ |
static inline void * |
_Unwind_GetGRPtr (struct _Unwind_Context *context, int index) |
{ |
index = DWARF_REG_TO_UNWIND_COLUMN (index); |
if (_Unwind_IsExtendedContext (context) && context->by_value[index]) |
return &context->reg[index]; |
return context->reg[index]; |
} |
/* Set the pointer to a register INDEX as saved in CONTEXT. */ |
static inline void |
_Unwind_SetGRPtr (struct _Unwind_Context *context, int index, void *p) |
{ |
index = DWARF_REG_TO_UNWIND_COLUMN (index); |
if (_Unwind_IsExtendedContext (context)) |
context->by_value[index] = 0; |
context->reg[index] = p; |
} |
/* Overwrite the saved value for register INDEX in CONTEXT with VAL. */ |
static inline void |
_Unwind_SetGRValue (struct _Unwind_Context *context, int index, |
_Unwind_Word val) |
{ |
index = DWARF_REG_TO_UNWIND_COLUMN (index); |
gcc_assert (index < (int) sizeof(dwarf_reg_size_table)); |
gcc_assert (dwarf_reg_size_table[index] == sizeof (_Unwind_Ptr)); |
context->by_value[index] = 1; |
context->reg[index] = (void *) (_Unwind_Internal_Ptr) val; |
} |
/* Return nonzero if register INDEX is stored by value rather than |
by reference. */ |
static inline int |
_Unwind_GRByValue (struct _Unwind_Context *context, int index) |
{ |
index = DWARF_REG_TO_UNWIND_COLUMN (index); |
return context->by_value[index]; |
} |
/* Retrieve the return address for CONTEXT. */ |
inline _Unwind_Ptr |
_Unwind_GetIP (struct _Unwind_Context *context) |
{ |
return (_Unwind_Ptr) context->ra; |
} |
/* Retrieve the return address and flag whether that IP is before |
or after first not yet fully executed instruction. */ |
inline _Unwind_Ptr |
_Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn) |
{ |
*ip_before_insn = _Unwind_IsSignalFrame (context); |
return (_Unwind_Ptr) context->ra; |
} |
/* Overwrite the return address for CONTEXT with VAL. */ |
inline void |
_Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr val) |
{ |
context->ra = (void *) val; |
} |
void * |
_Unwind_GetLanguageSpecificData (struct _Unwind_Context *context) |
{ |
return context->lsda; |
} |
_Unwind_Ptr |
_Unwind_GetRegionStart (struct _Unwind_Context *context) |
{ |
return (_Unwind_Ptr) context->bases.func; |
} |
void * |
_Unwind_FindEnclosingFunction (void *pc) |
{ |
struct dwarf_eh_bases bases; |
const struct dwarf_fde *fde = _Unwind_Find_FDE (pc-1, &bases); |
if (fde) |
return bases.func; |
else |
return NULL; |
} |
#ifndef __ia64__ |
_Unwind_Ptr |
_Unwind_GetDataRelBase (struct _Unwind_Context *context) |
{ |
return (_Unwind_Ptr) context->bases.dbase; |
} |
_Unwind_Ptr |
_Unwind_GetTextRelBase (struct _Unwind_Context *context) |
{ |
return (_Unwind_Ptr) context->bases.tbase; |
} |
#endif |
#ifdef MD_UNWIND_SUPPORT |
#include MD_UNWIND_SUPPORT |
#endif |
/* Extract any interesting information from the CIE for the translation |
unit F belongs to. Return a pointer to the byte after the augmentation, |
or NULL if we encountered an undecipherable augmentation. */ |
static const unsigned char * |
extract_cie_info (const struct dwarf_cie *cie, struct _Unwind_Context *context, |
_Unwind_FrameState *fs) |
{ |
const unsigned char *aug = cie->augmentation; |
const unsigned char *p = aug + strlen ((const char *)aug) + 1; |
const unsigned char *ret = NULL; |
_uleb128_t utmp; |
_sleb128_t stmp; |
/* g++ v2 "eh" has pointer immediately following augmentation string, |
so it must be handled first. */ |
if (aug[0] == 'e' && aug[1] == 'h') |
{ |
fs->eh_ptr = read_pointer (p); |
p += sizeof (void *); |
aug += 2; |
} |
/* Immediately following the augmentation are the code and |
data alignment and return address column. */ |
p = read_uleb128 (p, &utmp); |
fs->code_align = (_Unwind_Word)utmp; |
p = read_sleb128 (p, &stmp); |
fs->data_align = (_Unwind_Sword)stmp; |
if (cie->version == 1) |
fs->retaddr_column = *p++; |
else |
{ |
p = read_uleb128 (p, &utmp); |
fs->retaddr_column = (_Unwind_Word)utmp; |
} |
fs->lsda_encoding = DW_EH_PE_omit; |
/* If the augmentation starts with 'z', then a uleb128 immediately |
follows containing the length of the augmentation field following |
the size. */ |
if (*aug == 'z') |
{ |
p = read_uleb128 (p, &utmp); |
ret = p + utmp; |
fs->saw_z = 1; |
++aug; |
} |
/* Iterate over recognized augmentation subsequences. */ |
while (*aug != '\0') |
{ |
/* "L" indicates a byte showing how the LSDA pointer is encoded. */ |
if (aug[0] == 'L') |
{ |
fs->lsda_encoding = *p++; |
aug += 1; |
} |
/* "R" indicates a byte indicating how FDE addresses are encoded. */ |
else if (aug[0] == 'R') |
{ |
fs->fde_encoding = *p++; |
aug += 1; |
} |
/* "P" indicates a personality routine in the CIE augmentation. */ |
else if (aug[0] == 'P') |
{ |
_Unwind_Ptr personality; |
p = read_encoded_value (context, *p, p + 1, &personality); |
fs->personality = (_Unwind_Personality_Fn) personality; |
aug += 1; |
} |
/* "S" indicates a signal frame. */ |
else if (aug[0] == 'S') |
{ |
fs->signal_frame = 1; |
aug += 1; |
} |
/* Otherwise we have an unknown augmentation string. |
Bail unless we saw a 'z' prefix. */ |
else |
return ret; |
} |
return ret ? ret : p; |
} |
/* Decode a DW_OP stack program. Return the top of stack. Push INITIAL |
onto the stack to start. */ |
static _Unwind_Word |
execute_stack_op (const unsigned char *op_ptr, const unsigned char *op_end, |
struct _Unwind_Context *context, _Unwind_Word initial) |
{ |
_Unwind_Word stack[64]; /* ??? Assume this is enough. */ |
int stack_elt; |
stack[0] = initial; |
stack_elt = 1; |
while (op_ptr < op_end) |
{ |
enum dwarf_location_atom op = *op_ptr++; |
_Unwind_Word result; |
_uleb128_t reg, utmp; |
_sleb128_t offset, stmp; |
switch (op) |
{ |
case DW_OP_lit0: |
case DW_OP_lit1: |
case DW_OP_lit2: |
case DW_OP_lit3: |
case DW_OP_lit4: |
case DW_OP_lit5: |
case DW_OP_lit6: |
case DW_OP_lit7: |
case DW_OP_lit8: |
case DW_OP_lit9: |
case DW_OP_lit10: |
case DW_OP_lit11: |
case DW_OP_lit12: |
case DW_OP_lit13: |
case DW_OP_lit14: |
case DW_OP_lit15: |
case DW_OP_lit16: |
case DW_OP_lit17: |
case DW_OP_lit18: |
case DW_OP_lit19: |
case DW_OP_lit20: |
case DW_OP_lit21: |
case DW_OP_lit22: |
case DW_OP_lit23: |
case DW_OP_lit24: |
case DW_OP_lit25: |
case DW_OP_lit26: |
case DW_OP_lit27: |
case DW_OP_lit28: |
case DW_OP_lit29: |
case DW_OP_lit30: |
case DW_OP_lit31: |
result = op - DW_OP_lit0; |
break; |
case DW_OP_addr: |
result = (_Unwind_Word) (_Unwind_Ptr) read_pointer (op_ptr); |
op_ptr += sizeof (void *); |
break; |
case DW_OP_GNU_encoded_addr: |
{ |
_Unwind_Ptr presult; |
op_ptr = read_encoded_value (context, *op_ptr, op_ptr+1, &presult); |
result = presult; |
} |
break; |
case DW_OP_const1u: |
result = read_1u (op_ptr); |
op_ptr += 1; |
break; |
case DW_OP_const1s: |
result = read_1s (op_ptr); |
op_ptr += 1; |
break; |
case DW_OP_const2u: |
result = read_2u (op_ptr); |
op_ptr += 2; |
break; |
case DW_OP_const2s: |
result = read_2s (op_ptr); |
op_ptr += 2; |
break; |
case DW_OP_const4u: |
result = read_4u (op_ptr); |
op_ptr += 4; |
break; |
case DW_OP_const4s: |
result = read_4s (op_ptr); |
op_ptr += 4; |
break; |
case DW_OP_const8u: |
result = read_8u (op_ptr); |
op_ptr += 8; |
break; |
case DW_OP_const8s: |
result = read_8s (op_ptr); |
op_ptr += 8; |
break; |
case DW_OP_constu: |
op_ptr = read_uleb128 (op_ptr, &utmp); |
result = (_Unwind_Word)utmp; |
break; |
case DW_OP_consts: |
op_ptr = read_sleb128 (op_ptr, &stmp); |
result = (_Unwind_Sword)stmp; |
break; |
case DW_OP_reg0: |
case DW_OP_reg1: |
case DW_OP_reg2: |
case DW_OP_reg3: |
case DW_OP_reg4: |
case DW_OP_reg5: |
case DW_OP_reg6: |
case DW_OP_reg7: |
case DW_OP_reg8: |
case DW_OP_reg9: |
case DW_OP_reg10: |
case DW_OP_reg11: |
case DW_OP_reg12: |
case DW_OP_reg13: |
case DW_OP_reg14: |
case DW_OP_reg15: |
case DW_OP_reg16: |
case DW_OP_reg17: |
case DW_OP_reg18: |
case DW_OP_reg19: |
case DW_OP_reg20: |
case DW_OP_reg21: |
case DW_OP_reg22: |
case DW_OP_reg23: |
case DW_OP_reg24: |
case DW_OP_reg25: |
case DW_OP_reg26: |
case DW_OP_reg27: |
case DW_OP_reg28: |
case DW_OP_reg29: |
case DW_OP_reg30: |
case DW_OP_reg31: |
result = _Unwind_GetGR (context, op - DW_OP_reg0); |
break; |
case DW_OP_regx: |
op_ptr = read_uleb128 (op_ptr, ®); |
result = _Unwind_GetGR (context, reg); |
break; |
case DW_OP_breg0: |
case DW_OP_breg1: |
case DW_OP_breg2: |
case DW_OP_breg3: |
case DW_OP_breg4: |
case DW_OP_breg5: |
case DW_OP_breg6: |
case DW_OP_breg7: |
case DW_OP_breg8: |
case DW_OP_breg9: |
case DW_OP_breg10: |
case DW_OP_breg11: |
case DW_OP_breg12: |
case DW_OP_breg13: |
case DW_OP_breg14: |
case DW_OP_breg15: |
case DW_OP_breg16: |
case DW_OP_breg17: |
case DW_OP_breg18: |
case DW_OP_breg19: |
case DW_OP_breg20: |
case DW_OP_breg21: |
case DW_OP_breg22: |
case DW_OP_breg23: |
case DW_OP_breg24: |
case DW_OP_breg25: |
case DW_OP_breg26: |
case DW_OP_breg27: |
case DW_OP_breg28: |
case DW_OP_breg29: |
case DW_OP_breg30: |
case DW_OP_breg31: |
op_ptr = read_sleb128 (op_ptr, &offset); |
result = _Unwind_GetGR (context, op - DW_OP_breg0) + offset; |
break; |
case DW_OP_bregx: |
op_ptr = read_uleb128 (op_ptr, ®); |
op_ptr = read_sleb128 (op_ptr, &offset); |
result = _Unwind_GetGR (context, reg) + (_Unwind_Word)offset; |
break; |
case DW_OP_dup: |
gcc_assert (stack_elt); |
result = stack[stack_elt - 1]; |
break; |
case DW_OP_drop: |
gcc_assert (stack_elt); |
stack_elt -= 1; |
goto no_push; |
case DW_OP_pick: |
offset = *op_ptr++; |
gcc_assert (offset < stack_elt - 1); |
result = stack[stack_elt - 1 - offset]; |
break; |
case DW_OP_over: |
gcc_assert (stack_elt >= 2); |
result = stack[stack_elt - 2]; |
break; |
case DW_OP_swap: |
{ |
_Unwind_Word t; |
gcc_assert (stack_elt >= 2); |
t = stack[stack_elt - 1]; |
stack[stack_elt - 1] = stack[stack_elt - 2]; |
stack[stack_elt - 2] = t; |
goto no_push; |
} |
case DW_OP_rot: |
{ |
_Unwind_Word t1, t2, t3; |
gcc_assert (stack_elt >= 3); |
t1 = stack[stack_elt - 1]; |
t2 = stack[stack_elt - 2]; |
t3 = stack[stack_elt - 3]; |
stack[stack_elt - 1] = t2; |
stack[stack_elt - 2] = t3; |
stack[stack_elt - 3] = t1; |
goto no_push; |
} |
case DW_OP_deref: |
case DW_OP_deref_size: |
case DW_OP_abs: |
case DW_OP_neg: |
case DW_OP_not: |
case DW_OP_plus_uconst: |
/* Unary operations. */ |
gcc_assert (stack_elt); |
stack_elt -= 1; |
result = stack[stack_elt]; |
switch (op) |
{ |
case DW_OP_deref: |
{ |
void *ptr = (void *) (_Unwind_Ptr) result; |
result = (_Unwind_Ptr) read_pointer (ptr); |
} |
break; |
case DW_OP_deref_size: |
{ |
void *ptr = (void *) (_Unwind_Ptr) result; |
switch (*op_ptr++) |
{ |
case 1: |
result = read_1u (ptr); |
break; |
case 2: |
result = read_2u (ptr); |
break; |
case 4: |
result = read_4u (ptr); |
break; |
case 8: |
result = read_8u (ptr); |
break; |
default: |
gcc_unreachable (); |
} |
} |
break; |
case DW_OP_abs: |
if ((_Unwind_Sword) result < 0) |
result = -result; |
break; |
case DW_OP_neg: |
result = -result; |
break; |
case DW_OP_not: |
result = ~result; |
break; |
case DW_OP_plus_uconst: |
op_ptr = read_uleb128 (op_ptr, &utmp); |
result += (_Unwind_Word)utmp; |
break; |
default: |
gcc_unreachable (); |
} |
break; |
case DW_OP_and: |
case DW_OP_div: |
case DW_OP_minus: |
case DW_OP_mod: |
case DW_OP_mul: |
case DW_OP_or: |
case DW_OP_plus: |
case DW_OP_shl: |
case DW_OP_shr: |
case DW_OP_shra: |
case DW_OP_xor: |
case DW_OP_le: |
case DW_OP_ge: |
case DW_OP_eq: |
case DW_OP_lt: |
case DW_OP_gt: |
case DW_OP_ne: |
{ |
/* Binary operations. */ |
_Unwind_Word first, second; |
gcc_assert (stack_elt >= 2); |
stack_elt -= 2; |
second = stack[stack_elt]; |
first = stack[stack_elt + 1]; |
switch (op) |
{ |
case DW_OP_and: |
result = second & first; |
break; |
case DW_OP_div: |
result = (_Unwind_Sword) second / (_Unwind_Sword) first; |
break; |
case DW_OP_minus: |
result = second - first; |
break; |
case DW_OP_mod: |
result = second % first; |
break; |
case DW_OP_mul: |
result = second * first; |
break; |
case DW_OP_or: |
result = second | first; |
break; |
case DW_OP_plus: |
result = second + first; |
break; |
case DW_OP_shl: |
result = second << first; |
break; |
case DW_OP_shr: |
result = second >> first; |
break; |
case DW_OP_shra: |
result = (_Unwind_Sword) second >> first; |
break; |
case DW_OP_xor: |
result = second ^ first; |
break; |
case DW_OP_le: |
result = (_Unwind_Sword) second <= (_Unwind_Sword) first; |
break; |
case DW_OP_ge: |
result = (_Unwind_Sword) second >= (_Unwind_Sword) first; |
break; |
case DW_OP_eq: |
result = (_Unwind_Sword) second == (_Unwind_Sword) first; |
break; |
case DW_OP_lt: |
result = (_Unwind_Sword) second < (_Unwind_Sword) first; |
break; |
case DW_OP_gt: |
result = (_Unwind_Sword) second > (_Unwind_Sword) first; |
break; |
case DW_OP_ne: |
result = (_Unwind_Sword) second != (_Unwind_Sword) first; |
break; |
default: |
gcc_unreachable (); |
} |
} |
break; |
case DW_OP_skip: |
offset = read_2s (op_ptr); |
op_ptr += 2; |
op_ptr += offset; |
goto no_push; |
case DW_OP_bra: |
gcc_assert (stack_elt); |
stack_elt -= 1; |
offset = read_2s (op_ptr); |
op_ptr += 2; |
if (stack[stack_elt] != 0) |
op_ptr += offset; |
goto no_push; |
case DW_OP_nop: |
goto no_push; |
default: |
gcc_unreachable (); |
} |
/* Most things push a result value. */ |
gcc_assert ((size_t) stack_elt < sizeof(stack)/sizeof(*stack)); |
stack[stack_elt++] = result; |
no_push:; |
} |
/* We were executing this program to get a value. It should be |
at top of stack. */ |
gcc_assert (stack_elt); |
stack_elt -= 1; |
return stack[stack_elt]; |
} |
/* Decode DWARF 2 call frame information. Takes pointers the |
instruction sequence to decode, current register information and |
CIE info, and the PC range to evaluate. */ |
static void |
execute_cfa_program (const unsigned char *insn_ptr, |
const unsigned char *insn_end, |
struct _Unwind_Context *context, |
_Unwind_FrameState *fs) |
{ |
struct frame_state_reg_info *unused_rs = NULL; |
/* Don't allow remember/restore between CIE and FDE programs. */ |
fs->regs.prev = NULL; |
/* The comparison with the return address uses < rather than <= because |
we are only interested in the effects of code before the call; for a |
noreturn function, the return address may point to unrelated code with |
a different stack configuration that we are not interested in. We |
assume that the call itself is unwind info-neutral; if not, or if |
there are delay instructions that adjust the stack, these must be |
reflected at the point immediately before the call insn. |
In signal frames, return address is after last completed instruction, |
so we add 1 to return address to make the comparison <=. */ |
while (insn_ptr < insn_end |
&& fs->pc < context->ra + _Unwind_IsSignalFrame (context)) |
{ |
unsigned char insn = *insn_ptr++; |
_uleb128_t reg, utmp; |
_sleb128_t offset, stmp; |
if ((insn & 0xc0) == DW_CFA_advance_loc) |
fs->pc += (insn & 0x3f) * fs->code_align; |
else if ((insn & 0xc0) == DW_CFA_offset) |
{ |
reg = insn & 0x3f; |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
offset = (_Unwind_Sword) utmp * fs->data_align; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how |
= REG_SAVED_OFFSET; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset; |
} |
else if ((insn & 0xc0) == DW_CFA_restore) |
{ |
reg = insn & 0x3f; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_UNSAVED; |
} |
else switch (insn) |
{ |
case DW_CFA_set_loc: |
{ |
_Unwind_Ptr pc; |
insn_ptr = read_encoded_value (context, fs->fde_encoding, |
insn_ptr, &pc); |
fs->pc = (void *) pc; |
} |
break; |
case DW_CFA_advance_loc1: |
fs->pc += read_1u (insn_ptr) * fs->code_align; |
insn_ptr += 1; |
break; |
case DW_CFA_advance_loc2: |
fs->pc += read_2u (insn_ptr) * fs->code_align; |
insn_ptr += 2; |
break; |
case DW_CFA_advance_loc4: |
fs->pc += read_4u (insn_ptr) * fs->code_align; |
insn_ptr += 4; |
break; |
case DW_CFA_offset_extended: |
insn_ptr = read_uleb128 (insn_ptr, ®); |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
offset = (_Unwind_Sword) utmp * fs->data_align; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how |
= REG_SAVED_OFFSET; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset; |
break; |
case DW_CFA_restore_extended: |
insn_ptr = read_uleb128 (insn_ptr, ®); |
/* FIXME, this is wrong; the CIE might have said that the |
register was saved somewhere. */ |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNSAVED; |
break; |
case DW_CFA_same_value: |
insn_ptr = read_uleb128 (insn_ptr, ®); |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNSAVED; |
break; |
case DW_CFA_undefined: |
insn_ptr = read_uleb128 (insn_ptr, ®); |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNDEFINED; |
break; |
case DW_CFA_nop: |
break; |
case DW_CFA_register: |
{ |
_uleb128_t reg2; |
insn_ptr = read_uleb128 (insn_ptr, ®); |
insn_ptr = read_uleb128 (insn_ptr, ®2); |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_SAVED_REG; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.reg = |
(_Unwind_Word)reg2; |
} |
break; |
case DW_CFA_remember_state: |
{ |
struct frame_state_reg_info *new_rs; |
if (unused_rs) |
{ |
new_rs = unused_rs; |
unused_rs = unused_rs->prev; |
} |
else |
new_rs = alloca (sizeof (struct frame_state_reg_info)); |
*new_rs = fs->regs; |
fs->regs.prev = new_rs; |
} |
break; |
case DW_CFA_restore_state: |
{ |
struct frame_state_reg_info *old_rs = fs->regs.prev; |
fs->regs = *old_rs; |
old_rs->prev = unused_rs; |
unused_rs = old_rs; |
} |
break; |
case DW_CFA_def_cfa: |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
fs->regs.cfa_reg = (_Unwind_Word)utmp; |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
fs->regs.cfa_offset = (_Unwind_Word)utmp; |
fs->regs.cfa_how = CFA_REG_OFFSET; |
break; |
case DW_CFA_def_cfa_register: |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
fs->regs.cfa_reg = (_Unwind_Word)utmp; |
fs->regs.cfa_how = CFA_REG_OFFSET; |
break; |
case DW_CFA_def_cfa_offset: |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
fs->regs.cfa_offset = utmp; |
/* cfa_how deliberately not set. */ |
break; |
case DW_CFA_def_cfa_expression: |
fs->regs.cfa_exp = insn_ptr; |
fs->regs.cfa_how = CFA_EXP; |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
insn_ptr += utmp; |
break; |
case DW_CFA_expression: |
insn_ptr = read_uleb128 (insn_ptr, ®); |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_SAVED_EXP; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.exp = insn_ptr; |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
insn_ptr += utmp; |
break; |
/* Dwarf3. */ |
case DW_CFA_offset_extended_sf: |
insn_ptr = read_uleb128 (insn_ptr, ®); |
insn_ptr = read_sleb128 (insn_ptr, &stmp); |
offset = stmp * fs->data_align; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how |
= REG_SAVED_OFFSET; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset; |
break; |
case DW_CFA_def_cfa_sf: |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
fs->regs.cfa_reg = (_Unwind_Word)utmp; |
insn_ptr = read_sleb128 (insn_ptr, &stmp); |
fs->regs.cfa_offset = (_Unwind_Sword)stmp; |
fs->regs.cfa_how = CFA_REG_OFFSET; |
fs->regs.cfa_offset *= fs->data_align; |
break; |
case DW_CFA_def_cfa_offset_sf: |
insn_ptr = read_sleb128 (insn_ptr, &stmp); |
fs->regs.cfa_offset = (_Unwind_Sword)stmp; |
fs->regs.cfa_offset *= fs->data_align; |
/* cfa_how deliberately not set. */ |
break; |
case DW_CFA_val_offset: |
insn_ptr = read_uleb128 (insn_ptr, ®); |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
offset = (_Unwind_Sword) utmp * fs->data_align; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how |
= REG_SAVED_VAL_OFFSET; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset; |
break; |
case DW_CFA_val_offset_sf: |
insn_ptr = read_uleb128 (insn_ptr, ®); |
insn_ptr = read_sleb128 (insn_ptr, &stmp); |
offset = stmp * fs->data_align; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how |
= REG_SAVED_VAL_OFFSET; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset; |
break; |
case DW_CFA_val_expression: |
insn_ptr = read_uleb128 (insn_ptr, ®); |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how |
= REG_SAVED_VAL_EXP; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.exp = insn_ptr; |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
insn_ptr += utmp; |
break; |
case DW_CFA_GNU_window_save: |
/* ??? Hardcoded for SPARC register window configuration. */ |
for (reg = 16; reg < 32; ++reg) |
{ |
fs->regs.reg[reg].how = REG_SAVED_OFFSET; |
fs->regs.reg[reg].loc.offset = (reg - 16) * sizeof (void *); |
} |
break; |
case DW_CFA_GNU_args_size: |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
context->args_size = (_Unwind_Word)utmp; |
break; |
case DW_CFA_GNU_negative_offset_extended: |
/* Obsoleted by DW_CFA_offset_extended_sf, but used by |
older PowerPC code. */ |
insn_ptr = read_uleb128 (insn_ptr, ®); |
insn_ptr = read_uleb128 (insn_ptr, &utmp); |
offset = (_Unwind_Word) utmp * fs->data_align; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how |
= REG_SAVED_OFFSET; |
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = -offset; |
break; |
default: |
gcc_unreachable (); |
} |
} |
} |
/* Given the _Unwind_Context CONTEXT for a stack frame, look up the FDE for |
its caller and decode it into FS. This function also sets the |
args_size and lsda members of CONTEXT, as they are really information |
about the caller's frame. */ |
static _Unwind_Reason_Code |
uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs) |
{ |
const struct dwarf_fde *fde; |
const struct dwarf_cie *cie; |
const unsigned char *aug, *insn, *end; |
memset (fs, 0, sizeof (*fs)); |
context->args_size = 0; |
context->lsda = 0; |
if (context->ra == 0) |
return _URC_END_OF_STACK; |
fde = _Unwind_Find_FDE (context->ra + _Unwind_IsSignalFrame (context) - 1, |
&context->bases); |
if (fde == NULL) |
{ |
#ifdef MD_FALLBACK_FRAME_STATE_FOR |
/* Couldn't find frame unwind info for this function. Try a |
target-specific fallback mechanism. This will necessarily |
not provide a personality routine or LSDA. */ |
return MD_FALLBACK_FRAME_STATE_FOR (context, fs); |
#else |
return _URC_END_OF_STACK; |
#endif |
} |
fs->pc = context->bases.func; |
cie = get_cie (fde); |
insn = extract_cie_info (cie, context, fs); |
if (insn == NULL) |
/* CIE contained unknown augmentation. */ |
return _URC_FATAL_PHASE1_ERROR; |
/* First decode all the insns in the CIE. */ |
end = (const unsigned char *) next_fde ((const struct dwarf_fde *) cie); |
execute_cfa_program (insn, end, context, fs); |
/* Locate augmentation for the fde. */ |
aug = (const unsigned char *) fde + sizeof (*fde); |
aug += 2 * size_of_encoded_value (fs->fde_encoding); |
insn = NULL; |
if (fs->saw_z) |
{ |
_uleb128_t i; |
aug = read_uleb128 (aug, &i); |
insn = aug + i; |
} |
if (fs->lsda_encoding != DW_EH_PE_omit) |
{ |
_Unwind_Ptr lsda; |
aug = read_encoded_value (context, fs->lsda_encoding, aug, &lsda); |
context->lsda = (void *) lsda; |
} |
/* Then the insns in the FDE up to our target PC. */ |
if (insn == NULL) |
insn = aug; |
end = (const unsigned char *) next_fde (fde); |
execute_cfa_program (insn, end, context, fs); |
return _URC_NO_REASON; |
} |
typedef struct frame_state |
{ |
void *cfa; |
void *eh_ptr; |
long cfa_offset; |
long args_size; |
long reg_or_offset[PRE_GCC3_DWARF_FRAME_REGISTERS+1]; |
unsigned short cfa_reg; |
unsigned short retaddr_column; |
char saved[PRE_GCC3_DWARF_FRAME_REGISTERS+1]; |
} frame_state; |
struct frame_state * __frame_state_for (void *, struct frame_state *); |
/* Called from pre-G++ 3.0 __throw to find the registers to restore for |
a given PC_TARGET. The caller should allocate a local variable of |
`struct frame_state' and pass its address to STATE_IN. */ |
struct frame_state * |
__frame_state_for (void *pc_target, struct frame_state *state_in) |
{ |
struct _Unwind_Context context; |
_Unwind_FrameState fs; |
int reg; |
memset (&context, 0, sizeof (struct _Unwind_Context)); |
context.flags = EXTENDED_CONTEXT_BIT; |
context.ra = pc_target + 1; |
if (uw_frame_state_for (&context, &fs) != _URC_NO_REASON) |
return 0; |
/* We have no way to pass a location expression for the CFA to our |
caller. It wouldn't understand it anyway. */ |
if (fs.regs.cfa_how == CFA_EXP) |
return 0; |
for (reg = 0; reg < PRE_GCC3_DWARF_FRAME_REGISTERS + 1; reg++) |
{ |
state_in->saved[reg] = fs.regs.reg[reg].how; |
switch (state_in->saved[reg]) |
{ |
case REG_SAVED_REG: |
state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.reg; |
break; |
case REG_SAVED_OFFSET: |
state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.offset; |
break; |
default: |
state_in->reg_or_offset[reg] = 0; |
break; |
} |
} |
state_in->cfa_offset = fs.regs.cfa_offset; |
state_in->cfa_reg = fs.regs.cfa_reg; |
state_in->retaddr_column = fs.retaddr_column; |
state_in->args_size = context.args_size; |
state_in->eh_ptr = fs.eh_ptr; |
return state_in; |
} |
typedef union { _Unwind_Ptr ptr; _Unwind_Word word; } _Unwind_SpTmp; |
static inline void |
_Unwind_SetSpColumn (struct _Unwind_Context *context, void *cfa, |
_Unwind_SpTmp *tmp_sp) |
{ |
int size = dwarf_reg_size_table[__builtin_dwarf_sp_column ()]; |
if (size == sizeof(_Unwind_Ptr)) |
tmp_sp->ptr = (_Unwind_Ptr) cfa; |
else |
{ |
gcc_assert (size == sizeof(_Unwind_Word)); |
tmp_sp->word = (_Unwind_Ptr) cfa; |
} |
_Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), tmp_sp); |
} |
static void |
uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs) |
{ |
struct _Unwind_Context orig_context = *context; |
void *cfa; |
long i; |
#ifdef EH_RETURN_STACKADJ_RTX |
/* Special handling here: Many machines do not use a frame pointer, |
and track the CFA only through offsets from the stack pointer from |
one frame to the next. In this case, the stack pointer is never |
stored, so it has no saved address in the context. What we do |
have is the CFA from the previous stack frame. |
In very special situations (such as unwind info for signal return), |
there may be location expressions that use the stack pointer as well. |
Do this conditionally for one frame. This allows the unwind info |
for one frame to save a copy of the stack pointer from the previous |
frame, and be able to use much easier CFA mechanisms to do it. |
Always zap the saved stack pointer value for the next frame; carrying |
the value over from one frame to another doesn't make sense. */ |
_Unwind_SpTmp tmp_sp; |
if (!_Unwind_GetGRPtr (&orig_context, __builtin_dwarf_sp_column ())) |
_Unwind_SetSpColumn (&orig_context, context->cfa, &tmp_sp); |
_Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), NULL); |
#endif |
/* Compute this frame's CFA. */ |
switch (fs->regs.cfa_how) |
{ |
case CFA_REG_OFFSET: |
cfa = _Unwind_GetPtr (&orig_context, fs->regs.cfa_reg); |
cfa += fs->regs.cfa_offset; |
break; |
case CFA_EXP: |
{ |
const unsigned char *exp = fs->regs.cfa_exp; |
_uleb128_t len; |
exp = read_uleb128 (exp, &len); |
cfa = (void *) (_Unwind_Ptr) |
execute_stack_op (exp, exp + len, &orig_context, 0); |
break; |
} |
default: |
gcc_unreachable (); |
} |
context->cfa = cfa; |
/* Compute the addresses of all registers saved in this frame. */ |
for (i = 0; i < DWARF_FRAME_REGISTERS + 1; ++i) |
switch (fs->regs.reg[i].how) |
{ |
case REG_UNSAVED: |
case REG_UNDEFINED: |
break; |
case REG_SAVED_OFFSET: |
_Unwind_SetGRPtr (context, i, |
(void *) (cfa + fs->regs.reg[i].loc.offset)); |
break; |
case REG_SAVED_REG: |
if (_Unwind_GRByValue (&orig_context, fs->regs.reg[i].loc.reg)) |
_Unwind_SetGRValue (context, i, |
_Unwind_GetGR (&orig_context, |
fs->regs.reg[i].loc.reg)); |
else |
_Unwind_SetGRPtr (context, i, |
_Unwind_GetGRPtr (&orig_context, |
fs->regs.reg[i].loc.reg)); |
break; |
case REG_SAVED_EXP: |
{ |
const unsigned char *exp = fs->regs.reg[i].loc.exp; |
_uleb128_t len; |
_Unwind_Ptr val; |
exp = read_uleb128 (exp, &len); |
val = execute_stack_op (exp, exp + len, &orig_context, |
(_Unwind_Ptr) cfa); |
_Unwind_SetGRPtr (context, i, (void *) val); |
} |
break; |
case REG_SAVED_VAL_OFFSET: |
_Unwind_SetGRValue (context, i, |
(_Unwind_Internal_Ptr) |
(cfa + fs->regs.reg[i].loc.offset)); |
break; |
case REG_SAVED_VAL_EXP: |
{ |
const unsigned char *exp = fs->regs.reg[i].loc.exp; |
_uleb128_t len; |
_Unwind_Ptr val; |
exp = read_uleb128 (exp, &len); |
val = execute_stack_op (exp, exp + len, &orig_context, |
(_Unwind_Ptr) cfa); |
_Unwind_SetGRValue (context, i, val); |
} |
break; |
} |
_Unwind_SetSignalFrame (context, fs->signal_frame); |
#ifdef MD_FROB_UPDATE_CONTEXT |
MD_FROB_UPDATE_CONTEXT (context, fs); |
#endif |
} |
/* CONTEXT describes the unwind state for a frame, and FS describes the FDE |
of its caller. Update CONTEXT to refer to the caller as well. Note |
that the args_size and lsda members are not updated here, but later in |
uw_frame_state_for. */ |
static void |
uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs) |
{ |
uw_update_context_1 (context, fs); |
/* In general this unwinder doesn't make any distinction between |
undefined and same_value rule. Call-saved registers are assumed |
to have same_value rule by default and explicit undefined |
rule is handled like same_value. The only exception is |
DW_CFA_undefined on retaddr_column which is supposed to |
mark outermost frame in DWARF 3. */ |
if (fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (fs->retaddr_column)].how |
== REG_UNDEFINED) |
/* uw_frame_state_for uses context->ra == 0 check to find outermost |
stack frame. */ |
context->ra = 0; |
else |
/* Compute the return address now, since the return address column |
can change from frame to frame. */ |
context->ra = __builtin_extract_return_addr |
(_Unwind_GetPtr (context, fs->retaddr_column)); |
} |
static void |
uw_advance_context (struct _Unwind_Context *context, _Unwind_FrameState *fs) |
{ |
uw_update_context (context, fs); |
} |
/* Fill in CONTEXT for top-of-stack. The only valid registers at this |
level will be the return address and the CFA. */ |
#define uw_init_context(CONTEXT) \ |
do \ |
{ \ |
/* Do any necessary initialization to access arbitrary stack frames. \ |
On the SPARC, this means flushing the register windows. */ \ |
__builtin_unwind_init (); \ |
uw_init_context_1 (CONTEXT, __builtin_dwarf_cfa (), \ |
__builtin_return_address (0)); \ |
} \ |
while (0) |
static inline void |
init_dwarf_reg_size_table (void) |
{ |
__builtin_init_dwarf_reg_size_table (dwarf_reg_size_table); |
} |
static void __attribute__((noinline)) |
uw_init_context_1 (struct _Unwind_Context *context, |
void *outer_cfa, void *outer_ra) |
{ |
void *ra = __builtin_extract_return_addr (__builtin_return_address (0)); |
_Unwind_FrameState fs; |
_Unwind_SpTmp sp_slot; |
_Unwind_Reason_Code code; |
memset (context, 0, sizeof (struct _Unwind_Context)); |
context->ra = ra; |
context->flags = EXTENDED_CONTEXT_BIT; |
code = uw_frame_state_for (context, &fs); |
gcc_assert (code == _URC_NO_REASON); |
#if __GTHREADS |
{ |
static __gthread_once_t once_regsizes = __GTHREAD_ONCE_INIT; |
if (__gthread_once (&once_regsizes, init_dwarf_reg_size_table) != 0 |
&& dwarf_reg_size_table[0] == 0) |
init_dwarf_reg_size_table (); |
} |
#else |
if (dwarf_reg_size_table[0] == 0) |
init_dwarf_reg_size_table (); |
#endif |
/* Force the frame state to use the known cfa value. */ |
_Unwind_SetSpColumn (context, outer_cfa, &sp_slot); |
fs.regs.cfa_how = CFA_REG_OFFSET; |
fs.regs.cfa_reg = __builtin_dwarf_sp_column (); |
fs.regs.cfa_offset = 0; |
uw_update_context_1 (context, &fs); |
/* If the return address column was saved in a register in the |
initialization context, then we can't see it in the given |
call frame data. So have the initialization context tell us. */ |
context->ra = __builtin_extract_return_addr (outer_ra); |
} |
static void _Unwind_DebugHook (void *, void *) |
__attribute__ ((__noinline__, __used__, __noclone__)); |
/* This function is called during unwinding. It is intended as a hook |
for a debugger to intercept exceptions. CFA is the CFA of the |
target frame. HANDLER is the PC to which control will be |
transferred. */ |
static void |
_Unwind_DebugHook (void *cfa __attribute__ ((__unused__)), |
void *handler __attribute__ ((__unused__))) |
{ |
asm (""); |
} |
/* Install TARGET into CURRENT so that we can return to it. This is a |
macro because __builtin_eh_return must be invoked in the context of |
our caller. */ |
#define uw_install_context(CURRENT, TARGET) \ |
do \ |
{ \ |
long offset = uw_install_context_1 ((CURRENT), (TARGET)); \ |
void *handler = __builtin_frob_return_addr ((TARGET)->ra); \ |
_Unwind_DebugHook ((TARGET)->cfa, handler); \ |
__builtin_eh_return (offset, handler); \ |
} \ |
while (0) |
static long |
uw_install_context_1 (struct _Unwind_Context *current, |
struct _Unwind_Context *target) |
{ |
long i; |
_Unwind_SpTmp sp_slot; |
/* If the target frame does not have a saved stack pointer, |
then set up the target's CFA. */ |
if (!_Unwind_GetGRPtr (target, __builtin_dwarf_sp_column ())) |
_Unwind_SetSpColumn (target, target->cfa, &sp_slot); |
for (i = 0; i < DWARF_FRAME_REGISTERS; ++i) |
{ |
void *c = current->reg[i]; |
void *t = target->reg[i]; |
gcc_assert (current->by_value[i] == 0); |
if (target->by_value[i] && c) |
{ |
_Unwind_Word w; |
_Unwind_Ptr p; |
if (dwarf_reg_size_table[i] == sizeof (_Unwind_Word)) |
{ |
w = (_Unwind_Internal_Ptr) t; |
memcpy (c, &w, sizeof (_Unwind_Word)); |
} |
else |
{ |
gcc_assert (dwarf_reg_size_table[i] == sizeof (_Unwind_Ptr)); |
p = (_Unwind_Internal_Ptr) t; |
memcpy (c, &p, sizeof (_Unwind_Ptr)); |
} |
} |
else if (t && c && t != c) |
memcpy (c, t, dwarf_reg_size_table[i]); |
} |
/* If the current frame doesn't have a saved stack pointer, then we |
need to rely on EH_RETURN_STACKADJ_RTX to get our target stack |
pointer value reloaded. */ |
if (!_Unwind_GetGRPtr (current, __builtin_dwarf_sp_column ())) |
{ |
void *target_cfa; |
target_cfa = _Unwind_GetPtr (target, __builtin_dwarf_sp_column ()); |
/* We adjust SP by the difference between CURRENT and TARGET's CFA. */ |
if (STACK_GROWS_DOWNWARD) |
return target_cfa - current->cfa + target->args_size; |
else |
return current->cfa - target_cfa - target->args_size; |
} |
return 0; |
} |
static inline _Unwind_Ptr |
uw_identify_context (struct _Unwind_Context *context) |
{ |
/* The CFA is not sufficient to disambiguate the context of a function |
interrupted by a signal before establishing its frame and the context |
of the signal itself. */ |
if (STACK_GROWS_DOWNWARD) |
return _Unwind_GetCFA (context) - _Unwind_IsSignalFrame (context); |
else |
return _Unwind_GetCFA (context) + _Unwind_IsSignalFrame (context); |
} |
#include "unwind.inc" |
#if defined (USE_GAS_SYMVER) && defined (SHARED) && defined (USE_LIBUNWIND_EXCEPTIONS) |
alias (_Unwind_Backtrace); |
alias (_Unwind_DeleteException); |
alias (_Unwind_FindEnclosingFunction); |
alias (_Unwind_ForcedUnwind); |
alias (_Unwind_GetDataRelBase); |
alias (_Unwind_GetTextRelBase); |
alias (_Unwind_GetCFA); |
alias (_Unwind_GetGR); |
alias (_Unwind_GetIP); |
alias (_Unwind_GetLanguageSpecificData); |
alias (_Unwind_GetRegionStart); |
alias (_Unwind_RaiseException); |
alias (_Unwind_Resume); |
alias (_Unwind_Resume_or_Rethrow); |
alias (_Unwind_SetGR); |
alias (_Unwind_SetIP); |
#endif |
#endif /* !USING_SJLJ_EXCEPTIONS */ |
/contrib/sdk/sources/gcc_eh/unwind-dw2.h |
---|
0,0 → 1,87 |
/* DWARF2 frame unwind data structure. |
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2009 |
Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
/* A target can override (perhaps for backward compatibility) how |
many dwarf2 columns are unwound. */ |
#ifndef DWARF_FRAME_REGISTERS |
#define DWARF_FRAME_REGISTERS FIRST_PSEUDO_REGISTER |
#endif |
/* The result of interpreting the frame unwind info for a frame. |
This is all symbolic at this point, as none of the values can |
be resolved until the target pc is located. */ |
typedef struct |
{ |
/* Each register save state can be described in terms of a CFA slot, |
another register, or a location expression. */ |
struct frame_state_reg_info |
{ |
struct { |
union { |
_Unwind_Word reg; |
_Unwind_Sword offset; |
const unsigned char *exp; |
} loc; |
enum { |
REG_UNSAVED, |
REG_SAVED_OFFSET, |
REG_SAVED_REG, |
REG_SAVED_EXP, |
REG_SAVED_VAL_OFFSET, |
REG_SAVED_VAL_EXP, |
REG_UNDEFINED |
} how; |
} reg[DWARF_FRAME_REGISTERS+1]; |
/* Used to implement DW_CFA_remember_state. */ |
struct frame_state_reg_info *prev; |
/* The CFA can be described in terms of a reg+offset or a |
location expression. */ |
_Unwind_Sword cfa_offset; |
_Unwind_Word cfa_reg; |
const unsigned char *cfa_exp; |
enum { |
CFA_UNSET, |
CFA_REG_OFFSET, |
CFA_EXP |
} cfa_how; |
} regs; |
/* The PC described by the current frame state. */ |
void *pc; |
/* The information we care about from the CIE/FDE. */ |
_Unwind_Personality_Fn personality; |
_Unwind_Sword data_align; |
_Unwind_Word code_align; |
_Unwind_Word retaddr_column; |
unsigned char fde_encoding; |
unsigned char lsda_encoding; |
unsigned char saw_z; |
unsigned char signal_frame; |
void *eh_ptr; |
} _Unwind_FrameState; |
/contrib/sdk/sources/gcc_eh/unwind-pe.h |
---|
0,0 → 1,289 |
/* Exception handling and frame unwind runtime interface routines. |
Copyright (C) 2001, 2002, 2003, 2004, 2008, 2009 Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
/* @@@ Really this should be out of line, but this also causes link |
compatibility problems with the base ABI. This is slightly better |
than duplicating code, however. */ |
#ifndef GCC_UNWIND_PE_H |
#define GCC_UNWIND_PE_H |
/* If using C++, references to abort have to be qualified with std::. */ |
#if __cplusplus |
#define __gxx_abort std::abort |
#else |
#define __gxx_abort abort |
#endif |
/* Pointer encodings, from dwarf2.h. */ |
#define DW_EH_PE_absptr 0x00 |
#define DW_EH_PE_omit 0xff |
#define DW_EH_PE_uleb128 0x01 |
#define DW_EH_PE_udata2 0x02 |
#define DW_EH_PE_udata4 0x03 |
#define DW_EH_PE_udata8 0x04 |
#define DW_EH_PE_sleb128 0x09 |
#define DW_EH_PE_sdata2 0x0A |
#define DW_EH_PE_sdata4 0x0B |
#define DW_EH_PE_sdata8 0x0C |
#define DW_EH_PE_signed 0x08 |
#define DW_EH_PE_pcrel 0x10 |
#define DW_EH_PE_textrel 0x20 |
#define DW_EH_PE_datarel 0x30 |
#define DW_EH_PE_funcrel 0x40 |
#define DW_EH_PE_aligned 0x50 |
#define DW_EH_PE_indirect 0x80 |
#ifndef NO_SIZE_OF_ENCODED_VALUE |
/* Given an encoding, return the number of bytes the format occupies. |
This is only defined for fixed-size encodings, and so does not |
include leb128. */ |
static unsigned int |
size_of_encoded_value (unsigned char encoding) __attribute__ ((unused)); |
static unsigned int |
size_of_encoded_value (unsigned char encoding) |
{ |
if (encoding == DW_EH_PE_omit) |
return 0; |
switch (encoding & 0x07) |
{ |
case DW_EH_PE_absptr: |
return sizeof (void *); |
case DW_EH_PE_udata2: |
return 2; |
case DW_EH_PE_udata4: |
return 4; |
case DW_EH_PE_udata8: |
return 8; |
} |
__gxx_abort (); |
} |
#endif |
#ifndef NO_BASE_OF_ENCODED_VALUE |
/* Given an encoding and an _Unwind_Context, return the base to which |
the encoding is relative. This base may then be passed to |
read_encoded_value_with_base for use when the _Unwind_Context is |
not available. */ |
static _Unwind_Ptr |
base_of_encoded_value (unsigned char encoding, struct _Unwind_Context *context) |
{ |
if (encoding == DW_EH_PE_omit) |
return 0; |
switch (encoding & 0x70) |
{ |
case DW_EH_PE_absptr: |
case DW_EH_PE_pcrel: |
case DW_EH_PE_aligned: |
return 0; |
case DW_EH_PE_textrel: |
return _Unwind_GetTextRelBase (context); |
case DW_EH_PE_datarel: |
return _Unwind_GetDataRelBase (context); |
case DW_EH_PE_funcrel: |
return _Unwind_GetRegionStart (context); |
} |
__gxx_abort (); |
} |
#endif |
/* Read an unsigned leb128 value from P, store the value in VAL, return |
P incremented past the value. We assume that a word is large enough to |
hold any value so encoded; if it is smaller than a pointer on some target, |
pointers should not be leb128 encoded on that target. */ |
static const unsigned char * |
read_uleb128 (const unsigned char *p, _uleb128_t *val) |
{ |
unsigned int shift = 0; |
unsigned char byte; |
_uleb128_t result; |
result = 0; |
do |
{ |
byte = *p++; |
result |= ((_uleb128_t)byte & 0x7f) << shift; |
shift += 7; |
} |
while (byte & 0x80); |
*val = result; |
return p; |
} |
/* Similar, but read a signed leb128 value. */ |
static const unsigned char * |
read_sleb128 (const unsigned char *p, _sleb128_t *val) |
{ |
unsigned int shift = 0; |
unsigned char byte; |
_uleb128_t result; |
result = 0; |
do |
{ |
byte = *p++; |
result |= ((_uleb128_t)byte & 0x7f) << shift; |
shift += 7; |
} |
while (byte & 0x80); |
/* Sign-extend a negative value. */ |
if (shift < 8 * sizeof(result) && (byte & 0x40) != 0) |
result |= -(((_uleb128_t)1L) << shift); |
*val = (_sleb128_t) result; |
return p; |
} |
/* Load an encoded value from memory at P. The value is returned in VAL; |
The function returns P incremented past the value. BASE is as given |
by base_of_encoded_value for this encoding in the appropriate context. */ |
static const unsigned char * |
read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base, |
const unsigned char *p, _Unwind_Ptr *val) |
{ |
union unaligned |
{ |
void *ptr; |
unsigned u2 __attribute__ ((mode (HI))); |
unsigned u4 __attribute__ ((mode (SI))); |
unsigned u8 __attribute__ ((mode (DI))); |
signed s2 __attribute__ ((mode (HI))); |
signed s4 __attribute__ ((mode (SI))); |
signed s8 __attribute__ ((mode (DI))); |
} __attribute__((__packed__)); |
const union unaligned *u = (const union unaligned *) p; |
_Unwind_Internal_Ptr result; |
if (encoding == DW_EH_PE_aligned) |
{ |
_Unwind_Internal_Ptr a = (_Unwind_Internal_Ptr) p; |
a = (a + sizeof (void *) - 1) & - sizeof(void *); |
result = *(_Unwind_Internal_Ptr *) a; |
p = (const unsigned char *) (_Unwind_Internal_Ptr) (a + sizeof (void *)); |
} |
else |
{ |
switch (encoding & 0x0f) |
{ |
case DW_EH_PE_absptr: |
result = (_Unwind_Internal_Ptr) u->ptr; |
p += sizeof (void *); |
break; |
case DW_EH_PE_uleb128: |
{ |
_uleb128_t tmp; |
p = read_uleb128 (p, &tmp); |
result = (_Unwind_Internal_Ptr) tmp; |
} |
break; |
case DW_EH_PE_sleb128: |
{ |
_sleb128_t tmp; |
p = read_sleb128 (p, &tmp); |
result = (_Unwind_Internal_Ptr) tmp; |
} |
break; |
case DW_EH_PE_udata2: |
result = u->u2; |
p += 2; |
break; |
case DW_EH_PE_udata4: |
result = u->u4; |
p += 4; |
break; |
case DW_EH_PE_udata8: |
result = u->u8; |
p += 8; |
break; |
case DW_EH_PE_sdata2: |
result = u->s2; |
p += 2; |
break; |
case DW_EH_PE_sdata4: |
result = u->s4; |
p += 4; |
break; |
case DW_EH_PE_sdata8: |
result = u->s8; |
p += 8; |
break; |
default: |
__gxx_abort (); |
} |
if (result != 0) |
{ |
result += ((encoding & 0x70) == DW_EH_PE_pcrel |
? (_Unwind_Internal_Ptr) u : base); |
if (encoding & DW_EH_PE_indirect) |
result = *(_Unwind_Internal_Ptr *) result; |
} |
} |
*val = result; |
return p; |
} |
#ifndef NO_BASE_OF_ENCODED_VALUE |
/* Like read_encoded_value_with_base, but get the base from the context |
rather than providing it directly. */ |
static inline const unsigned char * |
read_encoded_value (struct _Unwind_Context *context, unsigned char encoding, |
const unsigned char *p, _Unwind_Ptr *val) |
{ |
return read_encoded_value_with_base (encoding, |
base_of_encoded_value (encoding, context), |
p, val); |
} |
#endif |
#endif /* unwind-pe.h */ |
/contrib/sdk/sources/gcc_eh/unwind.inc |
---|
0,0 → 1,307 |
/* Exception handling and frame unwind runtime interface routines. -*- C -*- |
Copyright (C) 2001, 2003, 2008, 2009 Free Software Foundation, Inc. |
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 |
<http://www.gnu.org/licenses/>. */ |
/* This is derived from the C++ ABI for IA-64. Where we diverge |
for cross-architecture compatibility are noted with "@@@". |
This file is included from unwind-dw2.c, unwind-sjlj.c or |
unwind-ia64.c. */ |
/* Subroutine of _Unwind_RaiseException also invoked from _Unwind_Resume. |
Unwind the stack calling the personality routine to find both the |
exception handler and intermediary cleanup code. We'll only locate |
the first such frame here. Cleanup code will call back into |
_Unwind_Resume and we'll continue Phase 2 there. */ |
static _Unwind_Reason_Code |
_Unwind_RaiseException_Phase2(struct _Unwind_Exception *exc, |
struct _Unwind_Context *context) |
{ |
_Unwind_Reason_Code code; |
while (1) |
{ |
_Unwind_FrameState fs; |
int match_handler; |
code = uw_frame_state_for (context, &fs); |
/* Identify when we've reached the designated handler context. */ |
match_handler = (uw_identify_context (context) == exc->private_2 |
? _UA_HANDLER_FRAME : 0); |
if (code != _URC_NO_REASON) |
/* Some error encountered. Usually the unwinder doesn't |
diagnose these and merely crashes. */ |
return _URC_FATAL_PHASE2_ERROR; |
/* Unwind successful. Run the personality routine, if any. */ |
if (fs.personality) |
{ |
code = (*fs.personality) (1, _UA_CLEANUP_PHASE | match_handler, |
exc->exception_class, exc, context); |
if (code == _URC_INSTALL_CONTEXT) |
break; |
if (code != _URC_CONTINUE_UNWIND) |
return _URC_FATAL_PHASE2_ERROR; |
} |
/* Don't let us unwind past the handler context. */ |
gcc_assert (!match_handler); |
uw_update_context (context, &fs); |
} |
return code; |
} |
/* Raise an exception, passing along the given exception object. */ |
_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE |
_Unwind_RaiseException(struct _Unwind_Exception *exc) |
{ |
struct _Unwind_Context this_context, cur_context; |
_Unwind_Reason_Code code; |
/* Set up this_context to describe the current stack frame. */ |
uw_init_context (&this_context); |
cur_context = this_context; |
/* Phase 1: Search. Unwind the stack, calling the personality routine |
with the _UA_SEARCH_PHASE flag set. Do not modify the stack yet. */ |
while (1) |
{ |
_Unwind_FrameState fs; |
/* Set up fs to describe the FDE for the caller of cur_context. The |
first time through the loop, that means __cxa_throw. */ |
code = uw_frame_state_for (&cur_context, &fs); |
if (code == _URC_END_OF_STACK) |
/* Hit end of stack with no handler found. */ |
return _URC_END_OF_STACK; |
if (code != _URC_NO_REASON) |
/* Some error encountered. Usually the unwinder doesn't |
diagnose these and merely crashes. */ |
return _URC_FATAL_PHASE1_ERROR; |
/* Unwind successful. Run the personality routine, if any. */ |
if (fs.personality) |
{ |
code = (*fs.personality) (1, _UA_SEARCH_PHASE, exc->exception_class, |
exc, &cur_context); |
if (code == _URC_HANDLER_FOUND) |
break; |
else if (code != _URC_CONTINUE_UNWIND) |
return _URC_FATAL_PHASE1_ERROR; |
} |
/* Update cur_context to describe the same frame as fs. */ |
uw_update_context (&cur_context, &fs); |
} |
/* Indicate to _Unwind_Resume and associated subroutines that this |
is not a forced unwind. Further, note where we found a handler. */ |
exc->private_1 = 0; |
exc->private_2 = uw_identify_context (&cur_context); |
cur_context = this_context; |
code = _Unwind_RaiseException_Phase2 (exc, &cur_context); |
if (code != _URC_INSTALL_CONTEXT) |
return code; |
uw_install_context (&this_context, &cur_context); |
} |
/* Subroutine of _Unwind_ForcedUnwind also invoked from _Unwind_Resume. */ |
static _Unwind_Reason_Code |
_Unwind_ForcedUnwind_Phase2 (struct _Unwind_Exception *exc, |
struct _Unwind_Context *context) |
{ |
_Unwind_Stop_Fn stop = (_Unwind_Stop_Fn) (_Unwind_Ptr) exc->private_1; |
void *stop_argument = (void *) (_Unwind_Ptr) exc->private_2; |
_Unwind_Reason_Code code, stop_code; |
while (1) |
{ |
_Unwind_FrameState fs; |
int action; |
/* Set up fs to describe the FDE for the caller of cur_context. */ |
code = uw_frame_state_for (context, &fs); |
if (code != _URC_NO_REASON && code != _URC_END_OF_STACK) |
return _URC_FATAL_PHASE2_ERROR; |
/* Unwind successful. */ |
action = _UA_FORCE_UNWIND | _UA_CLEANUP_PHASE; |
if (code == _URC_END_OF_STACK) |
action |= _UA_END_OF_STACK; |
stop_code = (*stop) (1, action, exc->exception_class, exc, |
context, stop_argument); |
if (stop_code != _URC_NO_REASON) |
return _URC_FATAL_PHASE2_ERROR; |
/* Stop didn't want to do anything. Invoke the personality |
handler, if applicable, to run cleanups. */ |
if (code == _URC_END_OF_STACK) |
break; |
if (fs.personality) |
{ |
code = (*fs.personality) (1, _UA_FORCE_UNWIND | _UA_CLEANUP_PHASE, |
exc->exception_class, exc, context); |
if (code == _URC_INSTALL_CONTEXT) |
break; |
if (code != _URC_CONTINUE_UNWIND) |
return _URC_FATAL_PHASE2_ERROR; |
} |
/* Update cur_context to describe the same frame as fs, and discard |
the previous context if necessary. */ |
uw_advance_context (context, &fs); |
} |
return code; |
} |
/* Raise an exception for forced unwinding. */ |
_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE |
_Unwind_ForcedUnwind (struct _Unwind_Exception *exc, |
_Unwind_Stop_Fn stop, void * stop_argument) |
{ |
struct _Unwind_Context this_context, cur_context; |
_Unwind_Reason_Code code; |
uw_init_context (&this_context); |
cur_context = this_context; |
exc->private_1 = (_Unwind_Ptr) stop; |
exc->private_2 = (_Unwind_Ptr) stop_argument; |
code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context); |
if (code != _URC_INSTALL_CONTEXT) |
return code; |
uw_install_context (&this_context, &cur_context); |
} |
/* Resume propagation of an existing exception. This is used after |
e.g. executing cleanup code, and not to implement rethrowing. */ |
void LIBGCC2_UNWIND_ATTRIBUTE |
_Unwind_Resume (struct _Unwind_Exception *exc) |
{ |
struct _Unwind_Context this_context, cur_context; |
_Unwind_Reason_Code code; |
uw_init_context (&this_context); |
cur_context = this_context; |
/* Choose between continuing to process _Unwind_RaiseException |
or _Unwind_ForcedUnwind. */ |
if (exc->private_1 == 0) |
code = _Unwind_RaiseException_Phase2 (exc, &cur_context); |
else |
code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context); |
gcc_assert (code == _URC_INSTALL_CONTEXT); |
uw_install_context (&this_context, &cur_context); |
} |
/* Resume propagation of an FORCE_UNWIND exception, or to rethrow |
a normal exception that was handled. */ |
_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE |
_Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc) |
{ |
struct _Unwind_Context this_context, cur_context; |
_Unwind_Reason_Code code; |
/* Choose between continuing to process _Unwind_RaiseException |
or _Unwind_ForcedUnwind. */ |
if (exc->private_1 == 0) |
return _Unwind_RaiseException (exc); |
uw_init_context (&this_context); |
cur_context = this_context; |
code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context); |
gcc_assert (code == _URC_INSTALL_CONTEXT); |
uw_install_context (&this_context, &cur_context); |
} |
/* A convenience function that calls the exception_cleanup field. */ |
void |
_Unwind_DeleteException (struct _Unwind_Exception *exc) |
{ |
if (exc->exception_cleanup) |
(*exc->exception_cleanup) (_URC_FOREIGN_EXCEPTION_CAUGHT, exc); |
} |
/* Perform stack backtrace through unwind data. */ |
_Unwind_Reason_Code LIBGCC2_UNWIND_ATTRIBUTE |
_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument) |
{ |
struct _Unwind_Context context; |
_Unwind_Reason_Code code; |
uw_init_context (&context); |
while (1) |
{ |
_Unwind_FrameState fs; |
/* Set up fs to describe the FDE for the caller of context. */ |
code = uw_frame_state_for (&context, &fs); |
if (code != _URC_NO_REASON && code != _URC_END_OF_STACK) |
return _URC_FATAL_PHASE1_ERROR; |
/* Call trace function. */ |
if ((*trace) (&context, trace_argument) != _URC_NO_REASON) |
return _URC_FATAL_PHASE1_ERROR; |
/* We're done at end of stack. */ |
if (code == _URC_END_OF_STACK) |
break; |
/* Update context to describe the same frame as fs. */ |
uw_update_context (&context, &fs); |
} |
return code; |
} |
/contrib/sdk/sources/gcc_eh/xm-mingw32.h |
---|
0,0 → 1,35 |
/* Configuration for GCC for hosting on Windows32. |
using GNU tools and the Windows32 API Library. |
Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2007 |
Free Software Foundation, Inc. |
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/>. */ |
#define HOST_EXECUTABLE_SUFFIX ".exe" |
#undef PATH_SEPARATOR |
#define PATH_SEPARATOR ';' |
/* This is the name of the null device on windows. */ |
#define HOST_BIT_BUCKET "nul" |
/* The st_ino field of struct stat is always 0. */ |
#define HOST_LACKS_INODE_NUMBERS |
/* MSVCRT does not support the "ll" format specifier for printing |
"long long" values. Instead, we use "I64". */ |
#define HOST_LONG_LONG_FORMAT "I64" |