11debfc3dSmrg /* Define builtin-in macros for all front ends that perform preprocessing
2*8feb0f0bSmrg Copyright (C) 2010-2020 Free Software Foundation, Inc.
31debfc3dSmrg
41debfc3dSmrg This file is part of GCC.
51debfc3dSmrg
61debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
71debfc3dSmrg the terms of the GNU General Public License as published by the Free
81debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
91debfc3dSmrg version.
101debfc3dSmrg
111debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
121debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
131debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
141debfc3dSmrg for more details.
151debfc3dSmrg
161debfc3dSmrg You should have received a copy of the GNU General Public License
171debfc3dSmrg along with GCC; see the file COPYING3. If not see
181debfc3dSmrg <http://www.gnu.org/licenses/>. */
191debfc3dSmrg
201debfc3dSmrg #include "config.h"
211debfc3dSmrg #include "system.h"
221debfc3dSmrg #include "coretypes.h"
231debfc3dSmrg #include "memmodel.h"
241debfc3dSmrg #include "target.h"
251debfc3dSmrg #include "tree.h"
261debfc3dSmrg #include "version.h"
271debfc3dSmrg #include "flags.h"
28c0a68be4Smrg #include "cpplib.h"
291debfc3dSmrg #include "cppbuiltin.h"
301debfc3dSmrg
311debfc3dSmrg
321debfc3dSmrg /* Parse a BASEVER version string of the format "major.minor.patchlevel"
331debfc3dSmrg or "major.minor" to extract its components. */
341debfc3dSmrg void
parse_basever(int * major,int * minor,int * patchlevel)351debfc3dSmrg parse_basever (int *major, int *minor, int *patchlevel)
361debfc3dSmrg {
371debfc3dSmrg static int s_major = -1, s_minor, s_patchlevel;
381debfc3dSmrg
391debfc3dSmrg if (s_major == -1)
401debfc3dSmrg if (sscanf (BASEVER, "%d.%d.%d", &s_major, &s_minor, &s_patchlevel) != 3)
411debfc3dSmrg {
421debfc3dSmrg sscanf (BASEVER, "%d.%d", &s_major, &s_minor);
431debfc3dSmrg s_patchlevel = 0;
441debfc3dSmrg }
451debfc3dSmrg
461debfc3dSmrg if (major)
471debfc3dSmrg *major = s_major;
481debfc3dSmrg
491debfc3dSmrg if (minor)
501debfc3dSmrg *minor = s_minor;
511debfc3dSmrg
521debfc3dSmrg if (patchlevel)
531debfc3dSmrg *patchlevel = s_patchlevel;
541debfc3dSmrg }
551debfc3dSmrg
561debfc3dSmrg
571debfc3dSmrg /* Define __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ and __VERSION__. */
581debfc3dSmrg static void
define__GNUC__(cpp_reader * pfile)591debfc3dSmrg define__GNUC__ (cpp_reader *pfile)
601debfc3dSmrg {
611debfc3dSmrg int major, minor, patchlevel;
621debfc3dSmrg
631debfc3dSmrg parse_basever (&major, &minor, &patchlevel);
641debfc3dSmrg cpp_define_formatted (pfile, "__GNUC__=%d", major);
651debfc3dSmrg cpp_define_formatted (pfile, "__GNUC_MINOR__=%d", minor);
661debfc3dSmrg cpp_define_formatted (pfile, "__GNUC_PATCHLEVEL__=%d", patchlevel);
671debfc3dSmrg cpp_define_formatted (pfile, "__VERSION__=\"%s\"", version_string);
681debfc3dSmrg cpp_define_formatted (pfile, "__ATOMIC_RELAXED=%d", MEMMODEL_RELAXED);
691debfc3dSmrg cpp_define_formatted (pfile, "__ATOMIC_SEQ_CST=%d", MEMMODEL_SEQ_CST);
701debfc3dSmrg cpp_define_formatted (pfile, "__ATOMIC_ACQUIRE=%d", MEMMODEL_ACQUIRE);
711debfc3dSmrg cpp_define_formatted (pfile, "__ATOMIC_RELEASE=%d", MEMMODEL_RELEASE);
721debfc3dSmrg cpp_define_formatted (pfile, "__ATOMIC_ACQ_REL=%d", MEMMODEL_ACQ_REL);
731debfc3dSmrg cpp_define_formatted (pfile, "__ATOMIC_CONSUME=%d", MEMMODEL_CONSUME);
741debfc3dSmrg }
751debfc3dSmrg
761debfc3dSmrg
771debfc3dSmrg /* Define various built-in CPP macros that depend on language-independent
781debfc3dSmrg compilation flags. */
791debfc3dSmrg static void
define_builtin_macros_for_compilation_flags(cpp_reader * pfile)801debfc3dSmrg define_builtin_macros_for_compilation_flags (cpp_reader *pfile)
811debfc3dSmrg {
821debfc3dSmrg if (flag_pic)
831debfc3dSmrg {
841debfc3dSmrg cpp_define_formatted (pfile, "__pic__=%d", flag_pic);
851debfc3dSmrg cpp_define_formatted (pfile, "__PIC__=%d", flag_pic);
861debfc3dSmrg }
871debfc3dSmrg if (flag_pie)
881debfc3dSmrg {
891debfc3dSmrg cpp_define_formatted (pfile, "__pie__=%d", flag_pie);
901debfc3dSmrg cpp_define_formatted (pfile, "__PIE__=%d", flag_pie);
911debfc3dSmrg }
921debfc3dSmrg
931debfc3dSmrg if (flag_sanitize & SANITIZE_ADDRESS)
941debfc3dSmrg cpp_define (pfile, "__SANITIZE_ADDRESS__");
951debfc3dSmrg
961debfc3dSmrg if (flag_sanitize & SANITIZE_UNDEFINED)
971debfc3dSmrg cpp_define (pfile, "__SANITIZE_UNDEFINED__");
981debfc3dSmrg
991debfc3dSmrg if (flag_sanitize & SANITIZE_LEAK)
1001debfc3dSmrg cpp_define (pfile, "__SANITIZE_LEAK__");
1011debfc3dSmrg
1021debfc3dSmrg if (flag_sanitize & SANITIZE_THREAD)
1031debfc3dSmrg cpp_define (pfile, "__SANITIZE_THREAD__");
1041debfc3dSmrg
1051debfc3dSmrg if (optimize_size)
1061debfc3dSmrg cpp_define (pfile, "__OPTIMIZE_SIZE__");
1071debfc3dSmrg if (optimize)
1081debfc3dSmrg cpp_define (pfile, "__OPTIMIZE__");
1091debfc3dSmrg
1101debfc3dSmrg if (fast_math_flags_set_p (&global_options))
1111debfc3dSmrg cpp_define (pfile, "__FAST_MATH__");
1121debfc3dSmrg if (flag_signaling_nans)
1131debfc3dSmrg cpp_define (pfile, "__SUPPORT_SNAN__");
1141debfc3dSmrg if (!flag_errno_math)
1151debfc3dSmrg cpp_define (pfile, "__NO_MATH_ERRNO__");
1161debfc3dSmrg
1171debfc3dSmrg cpp_define_formatted (pfile, "__FINITE_MATH_ONLY__=%d",
1181debfc3dSmrg flag_finite_math_only);
1191debfc3dSmrg }
1201debfc3dSmrg
1211debfc3dSmrg
1221debfc3dSmrg /* Define built-in macros for LP64 targets. */
1231debfc3dSmrg static void
define_builtin_macros_for_lp64(cpp_reader * pfile)1241debfc3dSmrg define_builtin_macros_for_lp64 (cpp_reader *pfile)
1251debfc3dSmrg {
1261debfc3dSmrg if (TYPE_PRECISION (long_integer_type_node) == 64
1271debfc3dSmrg && POINTER_SIZE == 64
1281debfc3dSmrg && TYPE_PRECISION (integer_type_node) == 32)
1291debfc3dSmrg {
1301debfc3dSmrg cpp_define (pfile, "_LP64");
1311debfc3dSmrg cpp_define (pfile, "__LP64__");
1321debfc3dSmrg }
1331debfc3dSmrg }
1341debfc3dSmrg
1351debfc3dSmrg
1361debfc3dSmrg /* Define macros for size of basic C types. */
1371debfc3dSmrg static void
define_builtin_macros_for_type_sizes(cpp_reader * pfile)1381debfc3dSmrg define_builtin_macros_for_type_sizes (cpp_reader *pfile)
1391debfc3dSmrg {
1401debfc3dSmrg #define define_type_sizeof(NAME, TYPE) \
1411debfc3dSmrg cpp_define_formatted (pfile, NAME"=" HOST_WIDE_INT_PRINT_DEC, \
1421debfc3dSmrg tree_to_uhwi (TYPE_SIZE_UNIT (TYPE)))
1431debfc3dSmrg
1441debfc3dSmrg define_type_sizeof ("__SIZEOF_INT__", integer_type_node);
1451debfc3dSmrg define_type_sizeof ("__SIZEOF_LONG__", long_integer_type_node);
1461debfc3dSmrg define_type_sizeof ("__SIZEOF_LONG_LONG__", long_long_integer_type_node);
1471debfc3dSmrg define_type_sizeof ("__SIZEOF_SHORT__", short_integer_type_node);
1481debfc3dSmrg define_type_sizeof ("__SIZEOF_FLOAT__", float_type_node);
1491debfc3dSmrg define_type_sizeof ("__SIZEOF_DOUBLE__", double_type_node);
1501debfc3dSmrg define_type_sizeof ("__SIZEOF_LONG_DOUBLE__", long_double_type_node);
1511debfc3dSmrg define_type_sizeof ("__SIZEOF_SIZE_T__", size_type_node);
1521debfc3dSmrg
1531debfc3dSmrg #undef define_type_sizeof
1541debfc3dSmrg
1551debfc3dSmrg cpp_define_formatted (pfile, "__CHAR_BIT__=%u",
1561debfc3dSmrg TYPE_PRECISION (char_type_node));
1571debfc3dSmrg cpp_define_formatted (pfile, "__BIGGEST_ALIGNMENT__=%d",
1581debfc3dSmrg BIGGEST_ALIGNMENT / BITS_PER_UNIT);
1591debfc3dSmrg
1601debfc3dSmrg /* Define constants useful for implementing endian.h. */
1611debfc3dSmrg cpp_define (pfile, "__ORDER_LITTLE_ENDIAN__=1234");
1621debfc3dSmrg cpp_define (pfile, "__ORDER_BIG_ENDIAN__=4321");
1631debfc3dSmrg cpp_define (pfile, "__ORDER_PDP_ENDIAN__=3412");
1641debfc3dSmrg
1651debfc3dSmrg if (WORDS_BIG_ENDIAN == BYTES_BIG_ENDIAN)
1661debfc3dSmrg cpp_define_formatted (pfile, "__BYTE_ORDER__=%s",
1671debfc3dSmrg (WORDS_BIG_ENDIAN
1681debfc3dSmrg ? "__ORDER_BIG_ENDIAN__"
1691debfc3dSmrg : "__ORDER_LITTLE_ENDIAN__"));
1701debfc3dSmrg else
1711debfc3dSmrg {
1721debfc3dSmrg /* Assert that we're only dealing with the PDP11 case. */
1731debfc3dSmrg gcc_assert (!BYTES_BIG_ENDIAN);
1741debfc3dSmrg gcc_assert (WORDS_BIG_ENDIAN);
1751debfc3dSmrg
1761debfc3dSmrg cpp_define (pfile, "__BYTE_ORDER__=__ORDER_PDP_ENDIAN__");
1771debfc3dSmrg }
1781debfc3dSmrg
1791debfc3dSmrg cpp_define_formatted (pfile, "__FLOAT_WORD_ORDER__=%s",
1801debfc3dSmrg (targetm.float_words_big_endian ()
1811debfc3dSmrg ? "__ORDER_BIG_ENDIAN__"
1821debfc3dSmrg : "__ORDER_LITTLE_ENDIAN__"));
1831debfc3dSmrg
1841debfc3dSmrg /* ptr_type_node can't be used here since ptr_mode is only set when
1851debfc3dSmrg toplev calls backend_init which is not done with -E switch. */
1861debfc3dSmrg cpp_define_formatted (pfile, "__SIZEOF_POINTER__=%d",
1871debfc3dSmrg 1 << ceil_log2 ((POINTER_SIZE + BITS_PER_UNIT - 1) / BITS_PER_UNIT));
1881debfc3dSmrg }
1891debfc3dSmrg
1901debfc3dSmrg
1911debfc3dSmrg /* Define macros builtins common to all language performing CPP
1921debfc3dSmrg preprocessing. */
1931debfc3dSmrg void
define_language_independent_builtin_macros(cpp_reader * pfile)1941debfc3dSmrg define_language_independent_builtin_macros (cpp_reader *pfile)
1951debfc3dSmrg {
1961debfc3dSmrg define__GNUC__ (pfile);
1971debfc3dSmrg define_builtin_macros_for_compilation_flags (pfile);
1981debfc3dSmrg define_builtin_macros_for_lp64 (pfile);
1991debfc3dSmrg define_builtin_macros_for_type_sizes (pfile);
2001debfc3dSmrg }
201