OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [cppbuiltin.c] - Blame information for rev 849

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.