Annotation of gcc/c-pragma.c, revision 1.1.1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.