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 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 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 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 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 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 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