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