xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/cppbuiltin.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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