Initial revision
[official-gcc.git] / gcc / c-pragma.c
blob886c67b9828eed0f2516d2a7b7f5bb43a48a1c2c
1 /* Handle #pragma, system V.4 style. Supports #pragma weak and #pragma pack.
2 Copyright (C) 1992 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 #include <stdio.h>
22 #include "config.h"
23 #include "tree.h"
24 #include "except.h"
25 #include "function.h"
26 #include "defaults.h"
27 #include "c-pragma.h"
29 #ifdef HANDLE_SYSV_PRAGMA
31 /* When structure field packing is in effect, this variable is the
32 number of bits to use as the maximum alignment. When packing is not
33 in effect, this is zero. */
35 extern int maximum_field_alignment;
37 /* File used for outputting assembler code. */
38 extern FILE *asm_out_file;
40 /* Handle one token of a pragma directive. TOKEN is the
41 current token, and STRING is its printable form. */
43 void
44 handle_pragma_token (string, token)
45 char *string;
46 tree token;
48 static enum pragma_state state = ps_start, type;
49 static char *name;
50 static char *value;
51 static int align;
53 if (string == 0)
55 if (type == ps_pack)
57 if (state == ps_right)
58 maximum_field_alignment = align * 8;
59 else
60 warning ("malformed `#pragma pack'");
62 else if (type == ps_weak)
64 #ifdef HANDLE_PRAGMA_WEAK
65 if (HANDLE_PRAGMA_WEAK)
66 handle_pragma_weak (state, name, value);
68 #endif /* HANDLE_PRAMA_WEAK */
71 type = state = ps_start;
72 return;
75 switch (state)
77 case ps_start:
78 if (token && TREE_CODE (token) == IDENTIFIER_NODE)
80 if (strcmp (IDENTIFIER_POINTER (token), "pack") == 0)
81 type = state = ps_pack;
82 else if (strcmp (IDENTIFIER_POINTER (token), "weak") == 0)
83 type = state = ps_weak;
84 else
85 type = state = ps_done;
87 else
88 type = state = ps_done;
89 break;
91 case ps_weak:
92 if (token && TREE_CODE (token) == IDENTIFIER_NODE)
94 name = IDENTIFIER_POINTER (token);
95 state = ps_name;
97 else
98 state = ps_bad;
99 break;
101 case ps_name:
102 state = (strcmp (string, "=") ? ps_bad : ps_equals);
103 break;
105 case ps_equals:
106 if (token && TREE_CODE (token) == IDENTIFIER_NODE)
108 value = IDENTIFIER_POINTER (token);
109 state = ps_value;
111 else
112 state = ps_bad;
113 break;
115 case ps_value:
116 state = ps_bad;
117 break;
119 case ps_pack:
120 if (strcmp (string, "(") == 0)
121 state = ps_left;
122 else
123 state = ps_bad;
124 break;
126 case ps_left:
127 if (token && TREE_CODE (token) == INTEGER_CST
128 && TREE_INT_CST_HIGH (token) == 0)
129 switch (TREE_INT_CST_LOW (token))
131 case 1:
132 case 2:
133 case 4:
134 align = TREE_INT_CST_LOW (token);
135 state = ps_align;
136 break;
138 default:
139 state = ps_bad;
141 else if (! token && strcmp (string, ")") == 0)
143 align = 0;
144 state = ps_right;
146 else
147 state = ps_bad;
148 break;
150 case ps_align:
151 if (strcmp (string, ")") == 0)
152 state = ps_right;
153 else
154 state = ps_bad;
155 break;
157 case ps_right:
158 state = ps_bad;
159 break;
161 case ps_bad:
162 case ps_done:
163 break;
165 default:
166 abort ();
169 #endif /* HANDLE_SYSV_PRAGMA */