X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fconfig%2Fi386%2Fcygming.h;h=da6f61980e2cead5aa3fbd9d66abca4fcba1560c;hb=3a8a26d5ca7d9b212be22afe419961368bb8d5e2;hp=cb0682010b85ea96c62f254855ecd8c099baae2a;hpb=065efcb175f104e463b1715a38244378d60bcf07;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h index cb0682010b8..da6f61980e2 100644 --- a/gcc/config/i386/cygming.h +++ b/gcc/config/i386/cygming.h @@ -1,13 +1,14 @@ /* 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 + Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, + 2004, 2005, 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 2, or (at your option) +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, @@ -16,33 +17,49 @@ 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 COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +along with GCC; see the file COPYING3. If not see +. */ #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 -#ifdef HAVE_GAS_PE_SECREL32_RELOC -#define DWARF2_DEBUGGING_INFO 1 +#undef TARGET_64BIT_MS_ABI +#define TARGET_64BIT_MS_ABI TARGET_64BIT #undef DBX_REGISTER_NUMBER -#define DBX_REGISTER_NUMBER(n) (write_symbols == DWARF2_DEBUG \ - ? svr4_dbx_register_map[n] \ - : dbx_register_map[n]) +#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) \ - do { \ - if (SIZE != 4) \ - abort (); \ - \ - fputs ("\t.secrel32\t", FILE); \ - assemble_name (FILE, LABEL); \ +#define ASM_OUTPUT_DWARF_OFFSET(FILE, SIZE, LABEL, SECTION) \ + do { \ + if (SIZE != 4) \ + abort (); \ + \ + fputs ("\t.secrel32\t", FILE); \ + assemble_name (FILE, LABEL); \ } while (0) #endif @@ -50,26 +67,6 @@ Boston, MA 02111-1307, USA. */ #include -/* Masks for subtarget switches used by other files. */ -#define MASK_NOP_FUN_DLLIMPORT 0x08000000 /* Ignore dllimport for functions */ - -/* Used in winnt.c. */ -#define TARGET_NOP_FUN_DLLIMPORT (target_flags & MASK_NOP_FUN_DLLIMPORT) - -#undef SUBTARGET_SWITCHES -#define SUBTARGET_SWITCHES \ -{ "cygwin", 0, N_("Use the Cygwin interface") }, \ -{ "no-cygwin", 0, N_("Use the Mingw32 interface") }, \ -{ "windows", 0, N_("Create GUI application") }, \ -{ "no-win32", 0, N_("Don't set Windows defines") }, \ -{ "win32", 0, N_("Set Windows defines") }, \ -{ "console", 0, N_("Create console application") },\ -{ "dll", 0, N_("Generate code for a DLL") }, \ -{ "nop-fun-dllimport", MASK_NOP_FUN_DLLIMPORT, \ - N_("Ignore dllimport for functions") }, \ -{ "no-nop-fun-dllimport", -MASK_NOP_FUN_DLLIMPORT, "" }, \ -{ "threads", 0, N_("Use Mingw-specific thread support") }, - #define MAYBE_UWIN_CPP_BUILTINS() /* Nothing. */ #define TARGET_OS_CPP_BUILTINS() \ @@ -86,6 +83,10 @@ Boston, MA 02111-1307, USA. */ 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"); \ MAYBE_UWIN_CPP_BUILTINS (); \ EXTRA_OS_CPP_BUILTINS (); \ } \ @@ -112,65 +113,44 @@ Boston, MA 02111-1307, USA. */ #undef MATH_LIBRARY #define MATH_LIBRARY "" -#define SIZE_TYPE "unsigned int" -#define PTRDIFF_TYPE "int" +#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 + +#undef REG_PARM_STACK_SPACE +#define REG_PARM_STACK_SPACE(FNDECL) (TARGET_64BIT_MS_ABI ? 32 : 0) + +#undef OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE (TARGET_64BIT_MS_ABI ? 1 : 0) + +#undef REGPARM_MAX +#define REGPARM_MAX (TARGET_64BIT_MS_ABI ? 4 : 3) + +#undef SSE_REGPARM_MAX +#define SSE_REGPARM_MAX (TARGET_64BIT_MS_ABI ? 4 : TARGET_SSE ? 3 : 0) /* Enable parsing of #pragma pack(push,) and #pragma pack(pop). */ #define HANDLE_PRAGMA_PACK_PUSH_POP 1 +/* Enable push_macro & pop_macro */ +#define HANDLE_PRAGMA_PUSH_POP_MACRO 1 union tree_node; #define TREE union tree_node * -#undef EXTRA_SECTIONS -#define EXTRA_SECTIONS in_drectve - -#undef EXTRA_SECTION_FUNCTIONS -#define EXTRA_SECTION_FUNCTIONS \ - DRECTVE_SECTION_FUNCTION \ - SWITCH_TO_SECTION_FUNCTION - -#define DRECTVE_SECTION_FUNCTION \ -void \ -drectve_section (void) \ -{ \ - if (in_section != in_drectve) \ - { \ - fprintf (asm_out_file, "%s\n", "\t.section .drectve\n"); \ - in_section = in_drectve; \ - } \ -} -void drectve_section (void); +#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\"" -/* Switch to SECTION (an `enum in_section'). - - ??? This facility should be provided by GCC proper. - The problem is that we want to temporarily switch sections in - ASM_DECLARE_OBJECT_NAME and then switch back to the original section - afterwards. */ -#define SWITCH_TO_SECTION_FUNCTION \ -void switch_to_section (enum in_section, tree); \ -void \ -switch_to_section (enum in_section section, tree decl) \ -{ \ - switch (section) \ - { \ - case in_text: text_section (); break; \ - case in_unlikely_text_section: unlikely_text_section (); break; \ - case in_data: data_section (); break; \ - case in_readonly_data: readonly_data_section (); break; \ - case in_named: named_section (decl, NULL, 0); break; \ - case in_drectve: drectve_section (); break; \ - default: abort (); break; \ - } \ -} - /* Don't allow flag_pic to propagate since gas may produce invalid code otherwise. */ @@ -179,7 +159,7 @@ switch_to_section (enum in_section section, tree decl) \ do { \ if (flag_pic) \ { \ - warning ("-f%s ignored for target (all code is position independent)",\ + warning (0, "-f%s ignored for target (all code is position independent)",\ (flag_pic > 1) ? "PIC" : "pic"); \ flag_pic = 0; \ } \ @@ -202,53 +182,48 @@ do { \ 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. */ -#undef TARGET_ENCODE_SECTION_INFO -#define TARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info -#undef TARGET_STRIP_NAME_ENCODING -#define TARGET_STRIP_NAME_ENCODING i386_pe_strip_name_encoding_full - -/* Output a reference to a label. */ -#undef ASM_OUTPUT_LABELREF -#define ASM_OUTPUT_LABELREF i386_pe_output_labelref +#define SUBTARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info /* Output a common block. */ -#undef ASM_OUTPUT_COMMON -#define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \ -do { \ - if (i386_pe_dllexport_name_p (NAME)) \ - i386_pe_record_exported_symbol (NAME, 1); \ - if (! i386_pe_dllimport_name_p (NAME)) \ - { \ - fprintf ((STREAM), "\t.comm\t"); \ - assemble_name ((STREAM), (NAME)); \ - fprintf ((STREAM), ", %d\t%s %d\n", \ - (int)(ROUNDED), ASM_COMMENT_START, (int)(SIZE)); \ - } \ -} while (0) +#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 { \ - if (i386_pe_dllexport_name_p (NAME)) \ - i386_pe_record_exported_symbol (NAME, 1); \ + 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 that 4000 +/* 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 (TARGET_64BIT_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) + (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS \ + | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE) /* This is how to output an assembler line that says to advance the location counter @@ -258,13 +233,9 @@ do { \ #define ASM_OUTPUT_ALIGN(FILE,LOG) \ if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", 1<<(LOG)) -/* Define this macro if in some cases global symbols from one translation - unit may not be bound to undefined symbols in another translation unit - without user intervention. For instance, under Microsoft Windows - symbols must be explicitly imported from shared libraries (DLLs). */ -#define MULTIPLE_SYMBOL_SPACES +/* Windows uses explicit import from shared libraries. */ +#define MULTIPLE_SYMBOL_SPACES 1 -extern void i386_pe_unique_section (TREE, int); #define TARGET_ASM_UNIQUE_SECTION i386_pe_unique_section #define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section @@ -283,8 +254,7 @@ extern void i386_pe_unique_section (TREE, int); #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ do \ { \ - if (i386_pe_dllexport_name_p (NAME)) \ - i386_pe_record_exported_symbol (NAME, 0); \ + 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); \ @@ -297,7 +267,7 @@ extern void i386_pe_unique_section (TREE, int); do \ { \ if (TREE_CODE (DECL) == FUNCTION_DECL) \ - i386_pe_record_external_function (NAME); \ + i386_pe_record_external_function ((DECL), (NAME)); \ } \ while (0) @@ -317,10 +287,15 @@ extern void i386_pe_unique_section (TREE, int); #undef ASM_COMMENT_START #define ASM_COMMENT_START " #" -/* DWARF2 Unwinding doesn't work with exception handling yet. To make - it work, we need to build a libgcc_s.dll, and dcrt0.o should be - changed to call __register_frame_info/__deregister_frame_info. */ +#ifndef DWARF2_UNWIND_INFO +/* If configured with --disable-sjlj-exceptions, use DWARF2, else + default to SJLJ. */ +#if (defined (CONFIG_SJLJ_EXCEPTIONS) && !CONFIG_SJLJ_EXCEPTIONS) +#define DWARF2_UNWIND_INFO 1 +#else #define DWARF2_UNWIND_INFO 0 +#endif +#endif /* Don't assume anything about the header files. */ #define NO_IMPLICIT_EXTERN_C @@ -343,15 +318,6 @@ extern void i386_pe_unique_section (TREE, int); build_tree_list (get_identifier ("stdcall"), \ NULL)) -/* External function declarations. */ - -extern void i386_pe_record_external_function (const char *); -extern void i386_pe_declare_function_type (FILE *, const char *, int); -extern void i386_pe_record_exported_symbol (const char *, int); -extern void i386_pe_file_end (void); -extern int i386_pe_dllexport_name_p (const char *); -extern int i386_pe_dllimport_name_p (const char *); - /* For Win32 ABI compatibility */ #undef DEFAULT_PCC_STRUCT_RETURN #define DEFAULT_PCC_STRUCT_RETURN 0 @@ -361,13 +327,23 @@ extern int i386_pe_dllimport_name_p (const char *); #undef MS_AGGREGATE_RETURN #define MS_AGGREGATE_RETURN 1 -/* No data type wants to be aligned rounder than this. */ -#undef BIGGEST_ALIGNMENT -#define BIGGEST_ALIGNMENT 128 - -/* Native complier aligns internal doubles in structures on dword boundaries. */ +/* 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 @@ -378,29 +354,55 @@ extern int i386_pe_dllimport_name_p (const char *); #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) \ +#define ASM_OUTPUT_DEF_FROM_DECLS(STREAM, DECL, TARGET) \ do \ { \ - const char *alias; \ - rtx rtlname = XEXP (DECL_RTL (DECL), 0); \ - if (GET_CODE (rtlname) == SYMBOL_REF) \ - alias = XSTR (rtlname, 0); \ - else \ - abort (); \ + const char *alias \ + = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \ 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 0 + /* 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