|
|
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: ! 24: #ifdef HANDLE_SYSV_PRAGMA ! 25: ! 26: /* Support #pragma weak by default if WEAK_ASM_OP is defined. */ ! 27: #if !defined (HANDLE_PRAGMA_WEAK) && defined (WEAK_ASM_OP) && defined (SET_ASM_OP) ! 28: #define HANDLE_PRAGMA_WEAK 1 ! 29: #endif ! 30: ! 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. */ ! 34: ! 35: extern int maximum_field_alignment; ! 36: ! 37: /* File used for outputting assembler code. */ ! 38: extern FILE *asm_out_file; ! 39: ! 40: /* Handle one token of a pragma directive. TOKEN is the ! 41: current token, and STRING is its printable form. */ ! 42: ! 43: void ! 44: handle_pragma_token (string, token) ! 45: char *string; ! 46: tree token; ! 47: { ! 48: static enum pragma_state ! 49: { ! 50: ps_start, ! 51: ps_done, ! 52: ps_bad, ! 53: ps_weak, ! 54: ps_name, ! 55: ps_equals, ! 56: ps_value, ! 57: ps_pack, ! 58: ps_left, ! 59: ps_align, ! 60: ps_right ! 61: } state = ps_start, type; ! 62: static char *name; ! 63: static char *value; ! 64: static int align; ! 65: ! 66: if (string == 0) ! 67: { ! 68: if (type == ps_pack) ! 69: { ! 70: if (state == ps_right) ! 71: maximum_field_alignment = align * 8; ! 72: else ! 73: warning ("malformed `#pragma pack'"); ! 74: } ! 75: else if (type == ps_weak) ! 76: { ! 77: #ifdef HANDLE_PRAGMA_WEAK ! 78: if (HANDLE_PRAGMA_WEAK) ! 79: { ! 80: if (state == ps_name || state == ps_value) ! 81: { ! 82: fprintf (asm_out_file, "\t%s\t", WEAK_ASM_OP); ! 83: ASM_OUTPUT_LABELREF (asm_out_file, name); ! 84: fputc ('\n', asm_out_file); ! 85: if (state == ps_value) ! 86: { ! 87: fprintf (asm_out_file, "\t%s\t", SET_ASM_OP); ! 88: ASM_OUTPUT_LABELREF (asm_out_file, name); ! 89: fputc (',', asm_out_file); ! 90: ASM_OUTPUT_LABELREF (asm_out_file, value); ! 91: fputc ('\n', asm_out_file); ! 92: } ! 93: } ! 94: else if (! (state == ps_done || state == ps_start)) ! 95: warning ("malformed `#pragma weak'"); ! 96: } ! 97: #endif /* HANDLE_PRAMA_WEAK */ ! 98: } ! 99: ! 100: type = state = ps_start; ! 101: return; ! 102: } ! 103: ! 104: switch (state) ! 105: { ! 106: case ps_start: ! 107: if (token && TREE_CODE (token) == IDENTIFIER_NODE) ! 108: { ! 109: if (strcmp (IDENTIFIER_POINTER (token), "pack") == 0) ! 110: type = state = ps_pack; ! 111: else if (strcmp (IDENTIFIER_POINTER (token), "weak") == 0) ! 112: type = state = ps_weak; ! 113: else ! 114: type = state = ps_done; ! 115: } ! 116: else ! 117: type = state = ps_done; ! 118: break; ! 119: ! 120: case ps_weak: ! 121: if (token && TREE_CODE (token) == IDENTIFIER_NODE) ! 122: { ! 123: name = IDENTIFIER_POINTER (token); ! 124: state = ps_name; ! 125: } ! 126: else ! 127: state = ps_bad; ! 128: break; ! 129: ! 130: case ps_name: ! 131: state = (strcmp (string, "=") ? ps_bad : ps_equals); ! 132: break; ! 133: ! 134: case ps_equals: ! 135: if (token && TREE_CODE (token) == IDENTIFIER_NODE) ! 136: { ! 137: value = IDENTIFIER_POINTER (token); ! 138: state = ps_value; ! 139: } ! 140: else ! 141: state = ps_bad; ! 142: break; ! 143: ! 144: case ps_value: ! 145: state = ps_bad; ! 146: break; ! 147: ! 148: case ps_pack: ! 149: if (strcmp (string, "(") == 0) ! 150: state = ps_left; ! 151: else ! 152: state = ps_bad; ! 153: break; ! 154: ! 155: case ps_left: ! 156: if (token && TREE_CODE (token) == INTEGER_CST ! 157: && TREE_INT_CST_HIGH (token) == 0) ! 158: switch (TREE_INT_CST_LOW (token)) ! 159: { ! 160: case 1: ! 161: case 2: ! 162: case 4: ! 163: align = TREE_INT_CST_LOW (token); ! 164: state = ps_align; ! 165: break; ! 166: ! 167: default: ! 168: state = ps_bad; ! 169: } ! 170: else if (! token && strcmp (string, ")") == 0) ! 171: { ! 172: align = 0; ! 173: state = ps_right; ! 174: } ! 175: else ! 176: state = ps_bad; ! 177: break; ! 178: ! 179: case ps_align: ! 180: if (strcmp (string, ")") == 0) ! 181: state = ps_right; ! 182: else ! 183: state = ps_bad; ! 184: break; ! 185: ! 186: case ps_right: ! 187: state = ps_bad; ! 188: break; ! 189: ! 190: case ps_bad: ! 191: case ps_done: ! 192: break; ! 193: ! 194: default: ! 195: abort (); ! 196: } ! 197: } ! 198: #endif /* HANDLE_SYSV_PRAGMA */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.