xref: /dflybsd-src/contrib/gcc-4.7/gcc/cppbuiltin.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Define builtin-in macros for all front ends that perform preprocessing
2*e4b17023SJohn Marino    Copyright (C) 2010
3*e4b17023SJohn Marino    Free Software Foundation, Inc.
4*e4b17023SJohn Marino 
5*e4b17023SJohn Marino This file is part of GCC.
6*e4b17023SJohn Marino 
7*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
8*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
9*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
10*e4b17023SJohn Marino version.
11*e4b17023SJohn Marino 
12*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
14*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15*e4b17023SJohn Marino for more details.
16*e4b17023SJohn Marino 
17*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
18*e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
19*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino #include "config.h"
22*e4b17023SJohn Marino #include "system.h"
23*e4b17023SJohn Marino #include "coretypes.h"
24*e4b17023SJohn Marino #include "tm.h"
25*e4b17023SJohn Marino #include "tree.h"
26*e4b17023SJohn Marino #include "version.h"
27*e4b17023SJohn Marino #include "flags.h"
28*e4b17023SJohn Marino #include "cpp-id-data.h"
29*e4b17023SJohn Marino #include "cppbuiltin.h"
30*e4b17023SJohn Marino #include "target.h"
31*e4b17023SJohn Marino 
32*e4b17023SJohn Marino 
33*e4b17023SJohn Marino /* Parse a BASEVER version string of the format "major.minor.patchlevel"
34*e4b17023SJohn Marino    or "major.minor" to extract its components.  */
35*e4b17023SJohn Marino void
parse_basever(int * major,int * minor,int * patchlevel)36*e4b17023SJohn Marino parse_basever (int *major, int *minor, int *patchlevel)
37*e4b17023SJohn Marino {
38*e4b17023SJohn Marino   static int s_major = -1, s_minor, s_patchlevel;
39*e4b17023SJohn Marino 
40*e4b17023SJohn Marino   if (s_major == -1)
41*e4b17023SJohn Marino     if (sscanf (BASEVER, "%d.%d.%d", &s_major, &s_minor, &s_patchlevel) != 3)
42*e4b17023SJohn Marino       {
43*e4b17023SJohn Marino 	sscanf (BASEVER, "%d.%d", &s_major, &s_minor);
44*e4b17023SJohn Marino 	s_patchlevel = 0;
45*e4b17023SJohn Marino       }
46*e4b17023SJohn Marino 
47*e4b17023SJohn Marino   if (major)
48*e4b17023SJohn Marino     *major = s_major;
49*e4b17023SJohn Marino 
50*e4b17023SJohn Marino   if (minor)
51*e4b17023SJohn Marino     *minor = s_minor;
52*e4b17023SJohn Marino 
53*e4b17023SJohn Marino   if (patchlevel)
54*e4b17023SJohn Marino     *patchlevel = s_patchlevel;
55*e4b17023SJohn Marino }
56*e4b17023SJohn Marino 
57*e4b17023SJohn Marino 
58*e4b17023SJohn Marino /* Define __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ and __VERSION__.  */
59*e4b17023SJohn Marino static void
define__GNUC__(cpp_reader * pfile)60*e4b17023SJohn Marino define__GNUC__ (cpp_reader *pfile)
61*e4b17023SJohn Marino {
62*e4b17023SJohn Marino   int major, minor, patchlevel;
63*e4b17023SJohn Marino 
64*e4b17023SJohn Marino   parse_basever (&major, &minor, &patchlevel);
65*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__GNUC__=%d", major);
66*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__GNUC_MINOR__=%d", minor);
67*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__GNUC_PATCHLEVEL__=%d", patchlevel);
68*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__VERSION__=\"%s\"", version_string);
69*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__ATOMIC_RELAXED=%d", MEMMODEL_RELAXED);
70*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__ATOMIC_SEQ_CST=%d", MEMMODEL_SEQ_CST);
71*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__ATOMIC_ACQUIRE=%d", MEMMODEL_ACQUIRE);
72*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__ATOMIC_RELEASE=%d", MEMMODEL_RELEASE);
73*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__ATOMIC_ACQ_REL=%d", MEMMODEL_ACQ_REL);
74*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__ATOMIC_CONSUME=%d", MEMMODEL_CONSUME);
75*e4b17023SJohn Marino }
76*e4b17023SJohn Marino 
77*e4b17023SJohn Marino 
78*e4b17023SJohn Marino /* Define various built-in CPP macros that depend on language-independent
79*e4b17023SJohn Marino    compilation flags.  */
80*e4b17023SJohn Marino static void
define_builtin_macros_for_compilation_flags(cpp_reader * pfile)81*e4b17023SJohn Marino define_builtin_macros_for_compilation_flags (cpp_reader *pfile)
82*e4b17023SJohn Marino {
83*e4b17023SJohn Marino   if (flag_pic)
84*e4b17023SJohn Marino     {
85*e4b17023SJohn Marino       cpp_define_formatted (pfile, "__pic__=%d", flag_pic);
86*e4b17023SJohn Marino       cpp_define_formatted (pfile, "__PIC__=%d", flag_pic);
87*e4b17023SJohn Marino     }
88*e4b17023SJohn Marino   if (flag_pie)
89*e4b17023SJohn Marino     {
90*e4b17023SJohn Marino       cpp_define_formatted (pfile, "__pie__=%d", flag_pie);
91*e4b17023SJohn Marino       cpp_define_formatted (pfile, "__PIE__=%d", flag_pie);
92*e4b17023SJohn Marino     }
93*e4b17023SJohn Marino 
94*e4b17023SJohn Marino   if (optimize_size)
95*e4b17023SJohn Marino     cpp_define (pfile, "__OPTIMIZE_SIZE__");
96*e4b17023SJohn Marino   if (optimize)
97*e4b17023SJohn Marino     cpp_define (pfile, "__OPTIMIZE__");
98*e4b17023SJohn Marino 
99*e4b17023SJohn Marino   if (fast_math_flags_set_p (&global_options))
100*e4b17023SJohn Marino     cpp_define (pfile, "__FAST_MATH__");
101*e4b17023SJohn Marino   if (flag_signaling_nans)
102*e4b17023SJohn Marino     cpp_define (pfile, "__SUPPORT_SNAN__");
103*e4b17023SJohn Marino 
104*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__FINITE_MATH_ONLY__=%d",
105*e4b17023SJohn Marino 			flag_finite_math_only);
106*e4b17023SJohn Marino }
107*e4b17023SJohn Marino 
108*e4b17023SJohn Marino 
109*e4b17023SJohn Marino /* Define built-in macros for LP64 targets. */
110*e4b17023SJohn Marino static void
define_builtin_macros_for_lp64(cpp_reader * pfile)111*e4b17023SJohn Marino define_builtin_macros_for_lp64 (cpp_reader *pfile)
112*e4b17023SJohn Marino {
113*e4b17023SJohn Marino   if (TYPE_PRECISION (long_integer_type_node) == 64
114*e4b17023SJohn Marino       && POINTER_SIZE == 64
115*e4b17023SJohn Marino       && TYPE_PRECISION (integer_type_node) == 32)
116*e4b17023SJohn Marino     {
117*e4b17023SJohn Marino       cpp_define (pfile, "_LP64");
118*e4b17023SJohn Marino       cpp_define (pfile, "__LP64__");
119*e4b17023SJohn Marino     }
120*e4b17023SJohn Marino }
121*e4b17023SJohn Marino 
122*e4b17023SJohn Marino 
123*e4b17023SJohn Marino /* Define macros for size of basic C types.  */
124*e4b17023SJohn Marino static void
define_builtin_macros_for_type_sizes(cpp_reader * pfile)125*e4b17023SJohn Marino define_builtin_macros_for_type_sizes (cpp_reader *pfile)
126*e4b17023SJohn Marino {
127*e4b17023SJohn Marino #define define_type_sizeof(NAME, TYPE)                             \
128*e4b17023SJohn Marino     cpp_define_formatted (pfile, NAME"="HOST_WIDE_INT_PRINT_DEC,   \
129*e4b17023SJohn Marino                           tree_low_cst (TYPE_SIZE_UNIT (TYPE), 1))
130*e4b17023SJohn Marino 
131*e4b17023SJohn Marino   define_type_sizeof ("__SIZEOF_INT__", integer_type_node);
132*e4b17023SJohn Marino   define_type_sizeof ("__SIZEOF_LONG__", long_integer_type_node);
133*e4b17023SJohn Marino   define_type_sizeof ("__SIZEOF_LONG_LONG__", long_long_integer_type_node);
134*e4b17023SJohn Marino   define_type_sizeof ("__SIZEOF_SHORT__", short_integer_type_node);
135*e4b17023SJohn Marino   define_type_sizeof ("__SIZEOF_FLOAT__", float_type_node);
136*e4b17023SJohn Marino   define_type_sizeof ("__SIZEOF_DOUBLE__", double_type_node);
137*e4b17023SJohn Marino   define_type_sizeof ("__SIZEOF_LONG_DOUBLE__", long_double_type_node);
138*e4b17023SJohn Marino   define_type_sizeof ("__SIZEOF_SIZE_T__", size_type_node);
139*e4b17023SJohn Marino 
140*e4b17023SJohn Marino #undef define_type_sizeof
141*e4b17023SJohn Marino 
142*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__CHAR_BIT__=%u",
143*e4b17023SJohn Marino 			TYPE_PRECISION (char_type_node));
144*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__BIGGEST_ALIGNMENT__=%d",
145*e4b17023SJohn Marino 			BIGGEST_ALIGNMENT / BITS_PER_UNIT);
146*e4b17023SJohn Marino 
147*e4b17023SJohn Marino   /* Define constants useful for implementing endian.h.  */
148*e4b17023SJohn Marino   cpp_define (pfile, "__ORDER_LITTLE_ENDIAN__=1234");
149*e4b17023SJohn Marino   cpp_define (pfile, "__ORDER_BIG_ENDIAN__=4321");
150*e4b17023SJohn Marino   cpp_define (pfile, "__ORDER_PDP_ENDIAN__=3412");
151*e4b17023SJohn Marino 
152*e4b17023SJohn Marino   if (WORDS_BIG_ENDIAN == BYTES_BIG_ENDIAN)
153*e4b17023SJohn Marino     cpp_define_formatted (pfile, "__BYTE_ORDER__=%s",
154*e4b17023SJohn Marino 			  (WORDS_BIG_ENDIAN
155*e4b17023SJohn Marino 			   ? "__ORDER_BIG_ENDIAN__"
156*e4b17023SJohn Marino 			   : "__ORDER_LITTLE_ENDIAN__"));
157*e4b17023SJohn Marino   else
158*e4b17023SJohn Marino     {
159*e4b17023SJohn Marino       /* Assert that we're only dealing with the PDP11 case.  */
160*e4b17023SJohn Marino       gcc_assert (!BYTES_BIG_ENDIAN);
161*e4b17023SJohn Marino       gcc_assert (WORDS_BIG_ENDIAN);
162*e4b17023SJohn Marino 
163*e4b17023SJohn Marino       cpp_define (pfile, "__BYTE_ORDER__=__ORDER_PDP_ENDIAN__");
164*e4b17023SJohn Marino     }
165*e4b17023SJohn Marino 
166*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__FLOAT_WORD_ORDER__=%s",
167*e4b17023SJohn Marino                         (targetm.float_words_big_endian ()
168*e4b17023SJohn Marino                          ? "__ORDER_BIG_ENDIAN__"
169*e4b17023SJohn Marino                          : "__ORDER_LITTLE_ENDIAN__"));
170*e4b17023SJohn Marino 
171*e4b17023SJohn Marino   /* ptr_type_node can't be used here since ptr_mode is only set when
172*e4b17023SJohn Marino      toplev calls backend_init which is not done with -E switch.  */
173*e4b17023SJohn Marino   cpp_define_formatted (pfile, "__SIZEOF_POINTER__=%d",
174*e4b17023SJohn Marino 			POINTER_SIZE / BITS_PER_UNIT);
175*e4b17023SJohn Marino }
176*e4b17023SJohn Marino 
177*e4b17023SJohn Marino 
178*e4b17023SJohn Marino /* Define macros builtins common to all language performing CPP
179*e4b17023SJohn Marino    preprocessing.  */
180*e4b17023SJohn Marino void
define_language_independent_builtin_macros(cpp_reader * pfile)181*e4b17023SJohn Marino define_language_independent_builtin_macros (cpp_reader *pfile)
182*e4b17023SJohn Marino {
183*e4b17023SJohn Marino   define__GNUC__ (pfile);
184*e4b17023SJohn Marino   define_builtin_macros_for_compilation_flags (pfile);
185*e4b17023SJohn Marino   define_builtin_macros_for_lp64 (pfile);
186*e4b17023SJohn Marino   define_builtin_macros_for_type_sizes (pfile);
187*e4b17023SJohn Marino }
188