|
|
1.1 ! root 1: /* Handle #pragma, system V.4 style. Supports #pragma weak and #pragma pack. ! 2: Copyright (C) 1992 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 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. ! 10: ! 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. ! 15: ! 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: #include <stdio.h> ! 21: #include "config.h" ! 22: #include "tree.h" ! 23: #include "function.h" ! 24: ! 25: #ifdef HANDLE_SYSV_PRAGMA ! 26: ! 27: /* Support #pragma weak by default if WEAK_ASM_OP is defined. */ ! 28: #if !defined (HANDLE_PRAGMA_WEAK) && defined (WEAK_ASM_OP) && defined (SET_ASM_OP) ! 29: #define HANDLE_PRAGMA_WEAK 1 ! 30: #endif ! 31: ! 32: /* See varasm.c for an identical definition. */ ! 33: enum pragma_state ! 34: { ! 35: ps_start, ! 36: ps_done, ! 37: ps_bad, ! 38: ps_weak, ! 39: ps_name, ! 40: ps_equals, ! 41: ps_value, ! 42: ps_pack, ! 43: ps_left, ! 44: ps_align, ! 45: ps_right ! 46: }; ! 47: ! 48: /* When structure field packing is in effect, this variable is the ! 49: number of bits to use as the maximum alignment. When packing is not ! 50: in effect, this is zero. */ ! 51: ! 52: extern int maximum_field_alignment; ! 53: ! 54: /* File used for outputting assembler code. */ ! 55: extern FILE *asm_out_file; ! 56: ! 57: /* Handle one token of a pragma directive. TOKEN is the ! 58: current token, and STRING is its printable form. */ ! 59: ! 60: void ! 61: handle_pragma_token (string, token) ! 62: char *string; ! 63: tree token; ! 64: { ! 65: static enum pragma_state state = ps_start, type; ! 66: static char *name; ! 67: static char *value; ! 68: static int align; ! 69: ! 70: if (string == 0) ! 71: { ! 72: if (type == ps_pack) ! 73: { ! 74: if (state == ps_right) ! 75: maximum_field_alignment = align * 8; ! 76: else ! 77: warning ("malformed `#pragma pack'"); ! 78: } ! 79: else if (type == ps_weak) ! 80: { ! 81: #ifdef HANDLE_PRAGMA_WEAK ! 82: if (HANDLE_PRAGMA_WEAK) ! 83: handle_pragma_weak (state, asm_out_file, name, value); ! 84: ! 85: #endif /* HANDLE_PRAMA_WEAK */ ! 86: } ! 87: ! 88: type = state = ps_start; ! 89: return; ! 90: } ! 91: ! 92: switch (state) ! 93: { ! 94: case ps_start: ! 95: if (token && TREE_CODE (token) == IDENTIFIER_NODE) ! 96: { ! 97: if (strcmp (IDENTIFIER_POINTER (token), "pack") == 0) ! 98: type = state = ps_pack; ! 99: else if (strcmp (IDENTIFIER_POINTER (token), "weak") == 0) ! 100: type = state = ps_weak; ! 101: else ! 102: type = state = ps_done; ! 103: } ! 104: else ! 105: type = state = ps_done; ! 106: break; ! 107: ! 108: case ps_weak: ! 109: if (token && TREE_CODE (token) == IDENTIFIER_NODE) ! 110: { ! 111: name = IDENTIFIER_POINTER (token); ! 112: state = ps_name; ! 113: } ! 114: else ! 115: state = ps_bad; ! 116: break; ! 117: ! 118: case ps_name: ! 119: state = (strcmp (string, "=") ? ps_bad : ps_equals); ! 120: break; ! 121: ! 122: case ps_equals: ! 123: if (token && TREE_CODE (token) == IDENTIFIER_NODE) ! 124: { ! 125: value = IDENTIFIER_POINTER (token); ! 126: state = ps_value; ! 127: } ! 128: else ! 129: state = ps_bad; ! 130: break; ! 131: ! 132: case ps_value: ! 133: state = ps_bad; ! 134: break; ! 135: ! 136: case ps_pack: ! 137: if (strcmp (string, "(") == 0) ! 138: state = ps_left; ! 139: else ! 140: state = ps_bad; ! 141: break; ! 142: ! 143: case ps_left: ! 144: if (token && TREE_CODE (token) == INTEGER_CST ! 145: && TREE_INT_CST_HIGH (token) == 0) ! 146: switch (TREE_INT_CST_LOW (token)) ! 147: { ! 148: case 1: ! 149: case 2: ! 150: case 4: ! 151: align = TREE_INT_CST_LOW (token); ! 152: state = ps_align; ! 153: break; ! 154: ! 155: default: ! 156: state = ps_bad; ! 157: } ! 158: else if (! token && strcmp (string, ")") == 0) ! 159: { ! 160: align = 0; ! 161: state = ps_right; ! 162: } ! 163: else ! 164: state = ps_bad; ! 165: break; ! 166: ! 167: case ps_align: ! 168: if (strcmp (string, ")") == 0) ! 169: state = ps_right; ! 170: else ! 171: state = ps_bad; ! 172: break; ! 173: ! 174: case ps_right: ! 175: state = ps_bad; ! 176: break; ! 177: ! 178: case ps_bad: ! 179: case ps_done: ! 180: break; ! 181: ! 182: default: ! 183: abort (); ! 184: } ! 185: } ! 186: #endif /* HANDLE_SYSV_PRAGMA */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.