00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #define ARM_PE 1
00024
00025 #define ARM_PE_FLAG_CHAR '@'
00026
00027
00028 #undef SUBTARGET_NAME_ENCODING_LENGTHS
00029 #define SUBTARGET_NAME_ENCODING_LENGTHS \
00030 case ARM_PE_FLAG_CHAR: return 3;
00031
00032 #undef USER_LABEL_PREFIX
00033 #define USER_LABEL_PREFIX "_"
00034
00035
00036
00037 #undef TARGET_VERSION
00038 #define TARGET_VERSION fputs (" (ARM/pe)", stderr)
00039
00040
00041
00042 #define TARGET_DLLIMPORT_DECL_ATTRIBUTES
00043
00044
00045
00046
00047
00048
00049
00050
00051 #undef SUBTARGET_CPP_SPEC
00052 #define SUBTARGET_CPP_SPEC "-D__pe__ -D__declspec(x)=__attribute__((x))"
00053
00054
00055
00056
00057 #define TARGET_FLAG_NOP_FUN (1 << 24)
00058
00059 #undef TARGET_NOP_FUN_DLLIMPORT
00060 #define TARGET_NOP_FUN_DLLIMPORT (target_flags & TARGET_FLAG_NOP_FUN)
00061
00062 #undef SUBTARGET_SWITCHES
00063 #define SUBTARGET_SWITCHES \
00064 { "nop-fun-dllimport", TARGET_FLAG_NOP_FUN, \
00065 N_("Ignore dllimport attribute for functions") }, \
00066 { "no-nop-fun-dllimport", - TARGET_FLAG_NOP_FUN, "" },
00067
00068 #undef TARGET_DEFAULT
00069 #define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | TARGET_FLAG_NOP_FUN)
00070
00071
00072 #undef WCHAR_TYPE
00073 #define WCHAR_TYPE "short unsigned int"
00074 #undef WCHAR_TYPE_SIZE
00075 #define WCHAR_TYPE_SIZE 16
00076
00077
00078 #undef FIXED_REGISTERS
00079 #define FIXED_REGISTERS \
00080 { \
00081 0,0,0,0,0,0,0,0, \
00082 0,0,0,1,0,1,0,1, \
00083 0,0,0,0,0,0,0,0, \
00084 1,1,1 \
00085 }
00086
00087
00088 #undef CALL_USED_REGISTERS
00089 #define CALL_USED_REGISTERS \
00090 { \
00091 1,1,1,1,0,0,0,0, \
00092 0,0,0,1,1,1,1,1, \
00093 1,1,1,1,0,0,0,0, \
00094 1,1,1 \
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104 #undef ENCODE_SECTION_INFO
00105 #define ENCODE_SECTION_INFO(DECL) \
00106 arm_pe_encode_section_info (DECL)
00107
00108
00109
00110
00111
00112 #define REDO_SECTION_INFO_P(DECL) 1
00113
00114
00115
00116
00117
00118 #define MULTIPLE_SYMBOL_SPACES
00119
00120 #define UNIQUE_SECTION(DECL, RELOC) arm_pe_unique_section (DECL, RELOC)
00121
00122 #define SUPPORTS_ONE_ONLY 1
00123
00124
00125 #undef TARGET_ASM_NAMED_SECTION
00126 #define TARGET_ASM_NAMED_SECTION default_pe_asm_named_section
00127
00128
00129
00130 #undef ASM_FILE_START
00131 #define ASM_FILE_START(STREAM) \
00132 do \
00133 { \
00134 asm_fprintf (STREAM, "%@ Generated by gcc %s for ARM/pe\n",\
00135 version_string); \
00136 output_file_directive ((STREAM), main_input_filename); \
00137 } \
00138 while (0)
00139
00140
00141 #undef ASM_OUTPUT_LABELREF
00142 #define ASM_OUTPUT_LABELREF(STREAM, NAME) \
00143 asm_fprintf (STREAM, "%U%s", arm_strip_name_encoding (NAME))
00144
00145
00146 #undef ASM_DECLARE_FUNCTION_NAME
00147 #define ASM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL) \
00148 do \
00149 { \
00150 if (arm_dllexport_name_p (NAME)) \
00151 { \
00152 drectve_section (); \
00153 fprintf (STREAM, "\t.ascii \" -export:%s\"\n", \
00154 arm_strip_name_encoding (NAME)); \
00155 function_section (DECL); \
00156 } \
00157 ARM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL); \
00158 if (TARGET_THUMB) \
00159 fprintf (STREAM, "\t.code 16\n"); \
00160 ASM_OUTPUT_LABEL (STREAM, NAME); \
00161 } \
00162 while (0)
00163
00164
00165 #undef ASM_OUTPUT_COMMON
00166 #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \
00167 do \
00168 { \
00169 if (arm_dllexport_name_p (NAME)) \
00170 { \
00171 drectve_section (); \
00172 fprintf ((STREAM), "\t.ascii \" -export:%s\"\n",\
00173 arm_strip_name_encoding (NAME)); \
00174 } \
00175 if (! arm_dllimport_name_p (NAME)) \
00176 { \
00177 fprintf ((STREAM), "\t.comm\t"); \
00178 assemble_name ((STREAM), (NAME)); \
00179 asm_fprintf ((STREAM), ", %d\t%@ %d\n", \
00180 (ROUNDED), (SIZE)); \
00181 } \
00182 } \
00183 while (0)
00184
00185
00186 #undef ASM_DECLARE_OBJECT_NAME
00187 #define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \
00188 do \
00189 { \
00190 if (arm_dllexport_name_p (NAME)) \
00191 { \
00192 enum in_section save_section = in_section; \
00193 drectve_section (); \
00194 fprintf (STREAM, "\t.ascii \" -export:%s\"\n",\
00195 arm_strip_name_encoding (NAME)); \
00196 switch_to_section (save_section, (DECL)); \
00197 } \
00198 ASM_OUTPUT_LABEL ((STREAM), (NAME)); \
00199 } \
00200 while (0)
00201
00202
00203
00204 #define DRECTVE_SECTION_ASM_OP "\t.section .drectve"
00205
00206
00207
00208
00209 #undef SUBTARGET_EXTRA_SECTIONS
00210 #define SUBTARGET_EXTRA_SECTIONS in_drectve,
00211
00212
00213
00214 #undef SUBTARGET_EXTRA_SECTION_FUNCTIONS
00215 #define SUBTARGET_EXTRA_SECTION_FUNCTIONS \
00216 DRECTVE_SECTION_FUNCTION \
00217 SWITCH_TO_SECTION_FUNCTION
00218
00219 #define DRECTVE_SECTION_FUNCTION \
00220 void \
00221 drectve_section () \
00222 { \
00223 if (in_section != in_drectve) \
00224 { \
00225 fprintf (asm_out_file, "%s\n", DRECTVE_SECTION_ASM_OP); \
00226 in_section = in_drectve; \
00227 } \
00228 }
00229
00230
00231
00232
00233
00234
00235
00236 #define SWITCH_TO_SECTION_FUNCTION \
00237 static void switch_to_section PARAMS ((enum in_section, tree)); \
00238 static void \
00239 switch_to_section (section, decl) \
00240 enum in_section section; \
00241 tree decl; \
00242 { \
00243 switch (section) \
00244 { \
00245 case in_text: text_section (); break; \
00246 case in_data: data_section (); break; \
00247 case in_named: named_section (decl, NULL, 0); break; \
00248 case in_rdata: rdata_section (); break; \
00249 case in_ctors: ctors_section (); break; \
00250 case in_dtors: dtors_section (); break; \
00251 case in_drectve: drectve_section (); break; \
00252 default: abort (); break; \
00253 } \
00254 }