00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "config.h"
00024 #include "system.h"
00025 #include "cpplib.h"
00026 #include "tree.h"
00027 #include "c-pragma.h"
00028 #include "c-tree.h"
00029 #include "toplev.h"
00030 #include "tm_p.h"
00031
00032
00033
00034 #define BAD(msgid) do { warning (msgid); return; } while (0)
00035
00036
00037
00038
00039 static void push_field_alignment PARAMS ((int));
00040 static void pop_field_alignment PARAMS ((void));
00041
00042 typedef struct align_stack
00043 {
00044 int alignment;
00045 struct align_stack * prev;
00046 } align_stack;
00047
00048 static struct align_stack * field_align_stack = NULL;
00049
00050 static void
00051 push_field_alignment (bit_alignment)
00052 int bit_alignment;
00053 {
00054 align_stack *entry = (align_stack *) xmalloc (sizeof (align_stack));
00055
00056 entry->alignment = maximum_field_alignment;
00057 entry->prev = field_align_stack;
00058 field_align_stack = entry;
00059
00060 maximum_field_alignment = bit_alignment;
00061 }
00062
00063 static void
00064 pop_field_alignment ()
00065 {
00066 if (field_align_stack)
00067 {
00068 align_stack *entry = field_align_stack;
00069
00070 maximum_field_alignment = entry->alignment;
00071 field_align_stack = entry->prev;
00072 free (entry);
00073 }
00074 else
00075 error ("too many #pragma options align=reset");
00076 }
00077
00078
00079
00080 void
00081 darwin_pragma_ignore (pfile)
00082 cpp_reader *pfile ATTRIBUTE_UNUSED;
00083 {
00084
00085 }
00086
00087
00088
00089 void
00090 darwin_pragma_options (pfile)
00091 cpp_reader *pfile ATTRIBUTE_UNUSED;
00092 {
00093 const char *arg;
00094 tree t, x;
00095
00096 if (c_lex (&t) != CPP_NAME)
00097 BAD ("malformed '#pragma options', ignoring");
00098 arg = IDENTIFIER_POINTER (t);
00099 if (strcmp (arg, "align"))
00100 BAD ("malformed '#pragma options', ignoring");
00101 if (c_lex (&t) != CPP_EQ)
00102 BAD ("malformed '#pragma options', ignoring");
00103 if (c_lex (&t) != CPP_NAME)
00104 BAD ("malformed '#pragma options', ignoring");
00105
00106 if (c_lex (&x) != CPP_EOF)
00107 warning ("junk at end of '#pragma options'");
00108
00109 arg = IDENTIFIER_POINTER (t);
00110 if (!strcmp (arg, "mac68k"))
00111 push_field_alignment (16);
00112 else if (!strcmp (arg, "power"))
00113 push_field_alignment (0);
00114 else if (!strcmp (arg, "reset"))
00115 pop_field_alignment ();
00116 else
00117 warning ("malformed '#pragma options align={mac68k|power|reset}', ignoring");
00118 }
00119
00120
00121
00122 void
00123 darwin_pragma_unused (pfile)
00124 cpp_reader *pfile ATTRIBUTE_UNUSED;
00125 {
00126 tree decl, x;
00127 int tok;
00128
00129 if (c_lex (&x) != CPP_OPEN_PAREN)
00130 BAD ("missing '(' after '#pragma unused', ignoring");
00131
00132 while (1)
00133 {
00134 tok = c_lex (&decl);
00135 if (tok == CPP_NAME && decl)
00136 {
00137 tree local = IDENTIFIER_LOCAL_VALUE (decl);
00138 if (local && (TREE_CODE (local) == PARM_DECL
00139 || TREE_CODE (local) == VAR_DECL))
00140 TREE_USED (local) = 1;
00141 tok = c_lex (&x);
00142 if (tok != CPP_COMMA)
00143 break;
00144 }
00145 }
00146
00147 if (tok != CPP_CLOSE_PAREN)
00148 BAD ("missing ')' after '#pragma unused', ignoring");
00149
00150 if (c_lex (&x) != CPP_EOF)
00151 warning ("junk at end of '#pragma unused'");
00152 }