1 /* Copyright (C) 2007-2015 Free Software Foundation, Inc.
3 This file is part of GCC.
5 GCC is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 3, or (at your option) any later
10 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 You should have received a copy of the GNU General Public License
16 along with GCC; see the file COPYING3. If not see
17 <http://www.gnu.org/licenses/>. */
21 #include "coretypes.h"
28 #include "c-family/c-common.h"
30 #include "target-def.h"
31 #include "c-family/c-pragma.h"
33 /* Output C specific EABI object attributes. These can not be done in
34 arm.c because they require information from the C frontend. */
37 arm_output_c_attributes (void)
39 int wchar_size
= (int)(TYPE_PRECISION (wchar_type_node
) / BITS_PER_UNIT
);
40 arm_emit_eabi_attribute ("Tag_ABI_PCS_wchar_t", 18, wchar_size
);
44 /* Setup so that common code calls arm_output_c_attributes. */
47 arm_lang_object_attributes_init (void)
49 arm_lang_output_object_attributes_hook
= arm_output_c_attributes
;
52 #define builtin_define(TXT) cpp_define (pfile, TXT)
53 #define builtin_assert(TXT) cpp_assert (pfile, TXT)
55 /* Define or undefine macros based on the current target. If the user does
56 #pragma GCC target, we need to adjust the macros dynamically. */
59 def_or_undef_macro(struct cpp_reader
* pfile
, const char *name
, bool def_p
)
62 cpp_define (pfile
, name
);
64 cpp_undef (pfile
, name
);
68 arm_cpu_builtins (struct cpp_reader
* pfile
, int flags
)
70 def_or_undef_macro (pfile
, "__ARM_FEATURE_DSP",
71 TARGET_DSP_MULTIPLY_P (flags
));
72 def_or_undef_macro (pfile
, "__ARM_FEATURE_QBIT",
73 TARGET_ARM_QBIT_P (flags
));
74 def_or_undef_macro (pfile
, "__ARM_FEATURE_SAT",
75 TARGET_ARM_SAT_P (flags
));
77 builtin_define ("__ARM_FEATURE_CRYPTO");
79 builtin_define ("__ARM_FEATURE_UNALIGNED");
81 builtin_define ("__ARM_FEATURE_CRC32");
83 def_or_undef_macro (pfile
, "__ARM_32BIT_STATE", TARGET_32BIT_P (flags
));
85 if (TARGET_ARM_FEATURE_LDREX_P (flags
))
86 builtin_define_with_int_value ("__ARM_FEATURE_LDREX",
87 TARGET_ARM_FEATURE_LDREX_P (flags
));
89 cpp_undef (pfile
, "__ARM_FEATURE_LDREX");
91 def_or_undef_macro (pfile
, "__ARM_FEATURE_CLZ",
92 ((TARGET_ARM_ARCH
>= 5 && !TARGET_THUMB_P (flags
))
93 || TARGET_ARM_ARCH_ISA_THUMB
>=2));
95 def_or_undef_macro (pfile
, "__ARM_FEATURE_SIMD32", TARGET_INT_SIMD_P (flags
));
97 builtin_define_with_int_value ("__ARM_SIZEOF_MINIMAL_ENUM",
98 flag_short_enums
? 1 : 4);
99 builtin_define_type_sizeof ("__ARM_SIZEOF_WCHAR_T", wchar_type_node
);
100 if (TARGET_ARM_ARCH_PROFILE
)
101 builtin_define_with_int_value ("__ARM_ARCH_PROFILE",
102 TARGET_ARM_ARCH_PROFILE
);
104 /* Define __arm__ even when in thumb mode, for
105 consistency with armcc. */
106 builtin_define ("__arm__");
108 builtin_define_with_int_value ("__ARM_ARCH", TARGET_ARM_ARCH
);
110 builtin_define ("__ARM_ARCH_ISA_ARM");
111 builtin_define ("__APCS_32__");
113 def_or_undef_macro (pfile
, "__thumb__", TARGET_THUMB_P (flags
));
114 def_or_undef_macro (pfile
, "__thumb2__", TARGET_THUMB2_P (flags
));
116 def_or_undef_macro (pfile
, "__THUMBEB__", TARGET_THUMB_P (flags
));
118 def_or_undef_macro (pfile
, "__THUMBEL__", TARGET_THUMB_P (flags
));
120 if (TARGET_ARM_ARCH_ISA_THUMB
)
121 builtin_define_with_int_value ("__ARM_ARCH_ISA_THUMB",
122 TARGET_ARM_ARCH_ISA_THUMB
);
126 builtin_define ("__ARMEB__");
127 builtin_define ("__ARM_BIG_ENDIAN");
131 builtin_define ("__ARMEL__");
134 if (TARGET_SOFT_FLOAT
)
135 builtin_define ("__SOFTFP__");
138 builtin_define ("__VFP_FP__");
141 builtin_define_with_int_value ("__ARM_FP", TARGET_ARM_FP
);
142 if (arm_fp16_format
== ARM_FP16_FORMAT_IEEE
)
143 builtin_define ("__ARM_FP16_FORMAT_IEEE");
144 if (arm_fp16_format
== ARM_FP16_FORMAT_ALTERNATIVE
)
145 builtin_define ("__ARM_FP16_FORMAT_ALTERNATIVE");
147 builtin_define ("__ARM_FEATURE_FMA");
151 builtin_define ("__ARM_NEON__");
152 builtin_define ("__ARM_NEON");
155 builtin_define_with_int_value ("__ARM_NEON_FP", TARGET_NEON_FP
);
157 /* Add a define for interworking. Needed when building libgcc.a. */
158 if (arm_cpp_interwork
)
159 builtin_define ("__THUMB_INTERWORK__");
162 builtin_define (arm_arch_name
);
164 builtin_define ("__XSCALE__");
167 builtin_define ("__IWMMXT__");
168 builtin_define ("__ARM_WMMX");
170 if (arm_arch_iwmmxt2
)
171 builtin_define ("__IWMMXT2__");
172 if (TARGET_AAPCS_BASED
)
174 if (arm_pcs_default
== ARM_PCS_AAPCS_VFP
)
175 builtin_define ("__ARM_PCS_VFP");
176 else if (arm_pcs_default
== ARM_PCS_AAPCS
)
177 builtin_define ("__ARM_PCS");
178 builtin_define ("__ARM_EABI__");
181 def_or_undef_macro (pfile
, "__ARM_ARCH_EXT_IDIV__", TARGET_IDIV_P (flags
));
182 def_or_undef_macro (pfile
, "__ARM_FEATURE_IDIV", TARGET_IDIV_P (flags
));
184 def_or_undef_macro (pfile
, "__ARM_ASM_SYNTAX_UNIFIED__", inline_asm_unified
);
188 arm_cpu_cpp_builtins (struct cpp_reader
* pfile
)
190 builtin_assert ("cpu=arm");
191 builtin_assert ("machine=arm");
193 arm_cpu_builtins (pfile
, target_flags
);
196 /* Hook to validate the current #pragma GCC target and set the arch custom
197 mode state. If ARGS is NULL, then POP_TARGET is used to reset
200 arm_pragma_target_parse (tree args
, tree pop_target
)
202 tree prev_tree
= build_target_option_node (&global_options
);
204 struct cl_target_option
*prev_opt
;
205 struct cl_target_option
*cur_opt
;
209 cur_tree
= ((pop_target
) ? pop_target
: target_option_default_node
);
210 cl_target_option_restore (&global_options
,
211 TREE_TARGET_OPTION (cur_tree
));
215 cur_tree
= arm_valid_target_attribute_tree (args
, &global_options
,
216 &global_options_set
);
217 if (cur_tree
== NULL_TREE
)
219 cl_target_option_restore (&global_options
,
220 TREE_TARGET_OPTION (prev_tree
));
225 target_option_current_node
= cur_tree
;
226 arm_reset_previous_fndecl ();
228 /* Figure out the previous mode. */
229 prev_opt
= TREE_TARGET_OPTION (prev_tree
);
230 cur_opt
= TREE_TARGET_OPTION (cur_tree
);
232 gcc_assert (prev_opt
);
233 gcc_assert (cur_opt
);
235 if (cur_opt
->x_target_flags
!= prev_opt
->x_target_flags
)
237 /* For the definitions, ensure all newly defined macros are considered
238 as used for -Wunused-macros. There is no point warning about the
239 compiler predefined macros. */
240 cpp_options
*cpp_opts
= cpp_get_options (parse_in
);
241 unsigned char saved_warn_unused_macros
= cpp_opts
->warn_unused_macros
;
242 cpp_opts
->warn_unused_macros
= 0;
245 arm_cpu_builtins (parse_in
, cur_opt
->x_target_flags
);
247 cpp_opts
->warn_unused_macros
= saved_warn_unused_macros
;
253 /* Register target pragmas. We need to add the hook for parsing #pragma GCC
254 option here rather than in arm.c since it will pull in various preprocessor
255 functions, and those are not present in languages like fortran without a
259 arm_register_target_pragmas (void)
261 /* Update pragma hook to allow parsing #pragma GCC target. */
262 targetm
.target_option
.pragma_parse
= arm_pragma_target_parse
;
264 #ifdef REGISTER_SUBTARGET_PRAGMAS
265 REGISTER_SUBTARGET_PRAGMAS ();