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