rs6000-c.c revision 117395
1/* Subroutines for the C front end on the POWER and PowerPC architectures.
2   Copyright (C) 2002
3   Free Software Foundation, Inc.
4
5   Contributed by Zack Weinberg <zack@codesourcery.com>
6
7This file is part of GNU CC.
8
9GNU CC is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2, or (at your option)
12any later version.
13
14GNU CC is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with GNU CC; see the file COPYING.  If not, write to
21the Free Software Foundation, 59 Temple Place - Suite 330,
22Boston, MA 02111-1307, USA.  */
23
24#include "config.h"
25#include "system.h"
26#include "cpplib.h"
27#include "tree.h"
28#include "c-pragma.h"
29#include "errors.h"
30#include "tm_p.h"
31
32/* Handle the machine specific pragma longcall.  Its syntax is
33
34   # pragma longcall ( TOGGLE )
35
36   where TOGGLE is either 0 or 1.
37
38   rs6000_default_long_calls is set to the value of TOGGLE, changing
39   whether or not new function declarations receive a longcall
40   attribute by default.  */
41
42#define SYNTAX_ERROR(msgid) do {					\
43  warning (msgid);					\
44  warning ("ignoring malformed #pragma longcall");	\
45  return;						\
46} while (0)
47
48void
49rs6000_pragma_longcall (pfile)
50     cpp_reader *pfile ATTRIBUTE_UNUSED;
51{
52  tree x, n;
53
54  /* If we get here, generic code has already scanned the directive
55     leader and the word "longcall".  */
56
57  if (c_lex (&x) != CPP_OPEN_PAREN)
58    SYNTAX_ERROR ("missing open paren");
59  if (c_lex (&n) != CPP_NUMBER)
60    SYNTAX_ERROR ("missing number");
61  if (c_lex (&x) != CPP_CLOSE_PAREN)
62    SYNTAX_ERROR ("missing close paren");
63
64  if (n != integer_zero_node && n != integer_one_node)
65    SYNTAX_ERROR ("number must be 0 or 1");
66
67  if (c_lex (&x) != CPP_EOF)
68    warning ("junk at end of #pragma longcall");
69
70  rs6000_default_long_calls = (n == integer_one_node);
71}
72
73/* Handle defining many CPP flags based on TARGET_xxx.  As a general
74   policy, rather than trying to guess what flags a user might want a
75   #define for, it's better to define a flag for everything.  */
76
77#define builtin_define(TXT) cpp_define (pfile, TXT)
78#define builtin_assert(TXT) cpp_assert (pfile, TXT)
79
80void
81rs6000_cpu_cpp_builtins (pfile)
82     cpp_reader *pfile;
83{
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__");
103
104  /* May be overridden by target configuration.  */
105  RS6000_CPU_CPP_ENDIAN_BUILTINS();
106
107  if (TARGET_LONG_DOUBLE_128)
108    builtin_define ("__LONG_DOUBLE_128__");
109
110  switch (rs6000_current_abi)
111    {
112    case ABI_V4:
113      builtin_define ("_CALL_SYSV");
114      break;
115    case ABI_AIX_NODESC:
116      builtin_define ("_CALL_AIX");
117      break;
118    case ABI_AIX:
119      builtin_define ("_CALL_AIXDESC");
120      builtin_define ("_CALL_AIX");
121      break;
122    case ABI_DARWIN:
123      builtin_define ("_CALL_DARWIN");
124      break;
125    default:
126      break;
127    }
128}
129