2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / config / rs6000 / rs6000-c.c
bloba47afee59b3892127e9f27112a42f004a411b52b
1 /* Subroutines for the C front end on the POWER and PowerPC architectures.
2 Copyright (C) 2002, 2003
3 Free Software Foundation, Inc.
5 Contributed by Zack Weinberg <zack@codesourcery.com>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published
11 by the Free Software Foundation; either version 2, or (at your
12 option) any later version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the
21 Free Software Foundation, 59 Temple Place - Suite 330, Boston,
22 MA 02111-1307, USA. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "cpplib.h"
29 #include "tree.h"
30 #include "c-pragma.h"
31 #include "errors.h"
32 #include "tm_p.h"
34 /* Handle the machine specific pragma longcall. Its syntax is
36 # pragma longcall ( TOGGLE )
38 where TOGGLE is either 0 or 1.
40 rs6000_default_long_calls is set to the value of TOGGLE, changing
41 whether or not new function declarations receive a longcall
42 attribute by default. */
44 #define SYNTAX_ERROR(msgid) do { \
45 warning (msgid); \
46 warning ("ignoring malformed #pragma longcall"); \
47 return; \
48 } while (0)
50 void
51 rs6000_pragma_longcall (cpp_reader *pfile ATTRIBUTE_UNUSED)
53 tree x, n;
55 /* If we get here, generic code has already scanned the directive
56 leader and the word "longcall". */
58 if (c_lex (&x) != CPP_OPEN_PAREN)
59 SYNTAX_ERROR ("missing open paren");
60 if (c_lex (&n) != CPP_NUMBER)
61 SYNTAX_ERROR ("missing number");
62 if (c_lex (&x) != CPP_CLOSE_PAREN)
63 SYNTAX_ERROR ("missing close paren");
65 if (n != integer_zero_node && n != integer_one_node)
66 SYNTAX_ERROR ("number must be 0 or 1");
68 if (c_lex (&x) != CPP_EOF)
69 warning ("junk at end of #pragma longcall");
71 rs6000_default_long_calls = (n == integer_one_node);
74 /* Handle defining many CPP flags based on TARGET_xxx. As a general
75 policy, rather than trying to guess what flags a user might want a
76 #define for, it's better to define a flag for everything. */
78 #define builtin_define(TXT) cpp_define (pfile, TXT)
79 #define builtin_assert(TXT) cpp_assert (pfile, TXT)
81 void
82 rs6000_cpu_cpp_builtins (cpp_reader *pfile)
84 if (TARGET_POWER2)
85 builtin_define ("_ARCH_PWR2");
86 else if (TARGET_POWER)
87 builtin_define ("_ARCH_PWR");
88 if (TARGET_POWERPC)
89 builtin_define ("_ARCH_PPC");
90 if (TARGET_POWERPC64)
91 builtin_define ("_ARCH_PPC64");
92 if (! TARGET_POWER && ! TARGET_POWER2 && ! TARGET_POWERPC)
93 builtin_define ("_ARCH_COM");
94 if (TARGET_ALTIVEC)
95 builtin_define ("__ALTIVEC__");
96 if (TARGET_SPE)
97 builtin_define ("__SPE__");
98 if (TARGET_SOFT_FLOAT)
99 builtin_define ("_SOFT_FLOAT");
100 /* Used by lwarx/stwcx. errata work-around. */
101 if (rs6000_cpu == PROCESSOR_PPC405)
102 builtin_define ("__PPC405__");
104 /* May be overridden by target configuration. */
105 RS6000_CPU_CPP_ENDIAN_BUILTINS();
107 if (TARGET_LONG_DOUBLE_128)
108 builtin_define ("__LONG_DOUBLE_128__");
110 switch (rs6000_current_abi)
112 case ABI_V4:
113 builtin_define ("_CALL_SYSV");
114 break;
115 case ABI_AIX:
116 builtin_define ("_CALL_AIXDESC");
117 builtin_define ("_CALL_AIX");
118 break;
119 case ABI_DARWIN:
120 builtin_define ("_CALL_DARWIN");
121 break;
122 default:
123 break;